* upload or download operation when all the necessary parameters are provided.
* @throws Exception
*/
public static void main(String args[]) throws Exception {
// Load default JetS3t properties
Jets3tProperties myProperties =
Jets3tProperties.getInstance(Constants.JETS3T_PROPERTIES_FILENAME);
String propertiesFileName = "synchronize.properties";
boolean synchronizePropertiesLoaded = false;
// Required arguments
String actionCommand = null;
String s3Path = null;
int reqArgCount = 0;
List fileList = new ArrayList();
// Options
boolean doAction = true;
boolean isQuiet = false;
boolean isNoProgress = false;
boolean isForce = false;
boolean isKeepFiles = false;
boolean isNoDelete = false;
boolean isGzipEnabled = false;
boolean isEncryptionEnabled = false;
boolean isMoveEnabled = false;
boolean isBatchMode = false;
boolean isSkipMetadata = false;
String aclString = null;
int reportLevel = REPORT_LEVEL_ALL;
AWSCredentials awsCredentials = null;
// Parse arguments.
for (int i = 0; i < args.length; i++) {
String arg = args[i];
if (arg.startsWith("-")) {
// Argument is an option.
if (arg.equalsIgnoreCase("-h") || arg.equalsIgnoreCase("--help")) {
printHelpAndExit(true);
} else if (arg.equalsIgnoreCase("-n") || arg.equalsIgnoreCase("--noaction")) {
doAction = false;
} else if (arg.equalsIgnoreCase("-q") || arg.equalsIgnoreCase("--quiet")) {
isQuiet = true;
} else if (arg.equalsIgnoreCase("-p") || arg.equalsIgnoreCase("--noprogress")) {
isNoProgress = true;
} else if (arg.equalsIgnoreCase("-f") || arg.equalsIgnoreCase("--force")) {
isForce = true;
} else if (arg.equalsIgnoreCase("-k") || arg.equalsIgnoreCase("--keepfiles")) {
isKeepFiles = true;
} else if (arg.equalsIgnoreCase("-d") || arg.equalsIgnoreCase("--nodelete")) {
isNoDelete = true;
} else if (arg.equalsIgnoreCase("-g") || arg.equalsIgnoreCase("--gzip")) {
isGzipEnabled = true;
} else if (arg.equalsIgnoreCase("-c") || arg.equalsIgnoreCase("--crypto")) {
isEncryptionEnabled = true;
} else if (arg.equalsIgnoreCase("-m") || arg.equalsIgnoreCase("--move")) {
isMoveEnabled = true;
} else if (arg.equalsIgnoreCase("-s") || arg.equalsIgnoreCase("--skipmetadata")) {
isSkipMetadata = true;
} else if (arg.equalsIgnoreCase("-b") || arg.equalsIgnoreCase("--batch")) {
isBatchMode = true;
} else if (arg.equalsIgnoreCase("--properties")) {
if (i + 1 < args.length) {
// Read the Synchronize properties file from the specified file
i++;
propertiesFileName = args[i];
File propertiesFile = new File(propertiesFileName);
if (!propertiesFile.canRead()) {
System.err.println("ERROR: The properties file " + propertiesFileName + " could not be found");
System.exit(2);
}
myProperties.loadAndReplaceProperties(
new FileInputStream(propertiesFileName), propertiesFile.getName());
synchronizePropertiesLoaded = true;
} else {
System.err.println("ERROR: --properties option must be followed by a file path");
printHelpAndExit(false);
}
} else if (arg.equalsIgnoreCase("--acl")) {
if (i + 1 < args.length) {
// Read the acl setting string
i++;
aclString = args[i];
if (!"PUBLIC_READ".equalsIgnoreCase(aclString)
&& !"PUBLIC_READ_WRITE".equalsIgnoreCase(aclString)
&& !"PRIVATE".equalsIgnoreCase(aclString))
{
System.err.println("ERROR: Acess Control List setting \"acl\" must have one of the values "
+ "PRIVATE, PUBLIC_READ, PUBLIC_READ_WRITE");
printHelpAndExit(false);
}
} else {
System.err.println("ERROR: --acl option must be followed by an ACL string");
printHelpAndExit(false);
}
} else if (arg.equalsIgnoreCase("--reportlevel")) {
if (i + 1 < args.length) {
// Read the report level integer
i++;
try {
reportLevel = Integer.parseInt(args[i]);
if (reportLevel < 0 || reportLevel > 3) {
System.err.println("ERROR: Report Level setting \"reportlevel\" must have one of the values "
+ "0 (no reporting), 1 (actions only), 2 (differences only), 3 (DEFAULT - all reporting)");
printHelpAndExit(false);
}
} catch (NumberFormatException e) {
System.err.println("ERROR: --reportlevel option must be followed by 0, 1, 2 or 3");
printHelpAndExit(false);
}
} else {
System.err.println("ERROR: --reportlevel option must be followed by 0, 1, 2 or 3");
printHelpAndExit(false);
}
} else if (arg.equalsIgnoreCase("--credentials")) {
if (i + 1 < args.length) {
// Read the credentials file location
i++;
File credentialsFile = new File(args[i]);
if (!credentialsFile.canRead()) {
System.err.println("ERROR: Cannot read credentials file '" + credentialsFile + "'");
printHelpAndExit(false);
}
BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
while (awsCredentials == null) {
System.out.print("Password for credentials file '" + credentialsFile + "': ");
String credentialsPassword = inputReader.readLine();
try {
awsCredentials = AWSCredentials.load(credentialsPassword, credentialsFile);
// Set dummy accesskey and secretkey property values, to avoid prompting for these values later on.
myProperties.setProperty("accesskey", "");
myProperties.setProperty("secretkey", "");
} catch (S3ServiceException e) {
System.out.println("Failed to read AWS credentials from the file '" + credentialsFile + "'");
}
}
} else {
System.err.println("ERROR: --credentials option must be followed by a file path");
printHelpAndExit(false);
}
} else {
System.err.println("ERROR: Invalid option: " + arg);
printHelpAndExit(false);
}
} else {
// Argument is one of the required parameters.
if (reqArgCount == 0) {
actionCommand = arg.toUpperCase(Locale.getDefault());
if (!"UP".equals(actionCommand) && !"DOWN".equals(actionCommand)) {
System.err.println("ERROR: Invalid action command " + actionCommand
+ ". Valid values are 'UP' or 'DOWN'");
printHelpAndExit(false);
}
} else if (reqArgCount == 1) {
s3Path = arg;
} else if (reqArgCount > 1) {
File file = new File(arg);
if ("DOWN".equals(actionCommand)) {
if (reqArgCount > 2) {
System.err.println("ERROR: Only one target directory may be specified"
+ " for " + actionCommand);
printHelpAndExit(false);
}
if (file.exists() && !file.isDirectory()) {
System.err.println("ERROR: Target download location already exists but is not a directory: "
+ file);
}
} else {
if (!file.canRead()) {
if (myProperties != null && myProperties.getBoolProperty("upload.ignoreMissingPaths", false)) {
System.err.println("WARN: Ignoring missing upload path: " + file);
continue;
} else {
System.err.println("ERROR: Cannot read upload file/directory: "
+ file
+ "\n To ignore missing paths set the property upload.ignoreMissingPaths");
printHelpAndExit(false);
}
}
}
fileList.add(file);
}
reqArgCount++;
}
}
if (fileList.size() < 1) {
// Missing one or more required parameters.
System.err.println("ERROR: Missing required file path(s)");
printHelpAndExit(false);
}
if (isKeepFiles && isNoDelete) {
// Incompatible options.
System.err.println("ERROR: Options --keepfiles and --nodelete cannot be used at the same time");
printHelpAndExit(false);
}
if (isKeepFiles && isMoveEnabled) {
// Incompatible options.
System.err.println("ERROR: Options --keepfiles and --move cannot be used at the same time");
printHelpAndExit(false);
}
if (isSkipMetadata && (isGzipEnabled || isEncryptionEnabled)) {
// Incompatible options.
System.err.println("ERROR: The --skipmetadata option cannot be used with the --gzip or --crypto options");
printHelpAndExit(false);
}
if (!synchronizePropertiesLoaded) {
// Read the Synchronize properties file from the classpath
Jets3tProperties synchronizeProperties =
Jets3tProperties.getInstance(propertiesFileName);
if (synchronizeProperties.isLoaded()) {
myProperties.loadAndReplaceProperties(synchronizeProperties,
propertiesFileName + " in classpath");
}
}