blob: 295fa5c08b72a2ddf6698f5d087661a3a11e0d6d [file] [log] [blame]
/********************************************************************************
* Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
********************************************************************************/
package org.eclipse.mdm.mdfsorter;
import java.util.logging.Level;
/**
* Structure to store the program arguments.
*
* @author Tobias Leemann
*
*/
public class ArgumentStruct {
public String inputname;
public String outputname;
public boolean unzip = true;
public long maxblocksize = 2_147_483_648L; // 2GB
public String customVendorName;
public boolean overrideOldSize;
public boolean verbose;
private boolean zipflagset;
/**
* Parse Arguments given via the Command-Line-Inferface (only used for the
* "process" call.)
*
* @param argv
* The Arguments of the call.
* @return An ArgumentStruct containing all values for this call.
* @throws IllegalArgumentException
* If the arguments are not valid.
*/
public static ArgumentStruct parseArgs(String[] argv) throws IllegalArgumentException {
if (argv.length < 3) {
throw new IllegalArgumentException("At least two arguments must be provided.");
} else {
ArgumentStruct args = new ArgumentStruct();
args.inputname = argv[1];
args.outputname = argv[2];
for (int i = 3; i < argv.length; i++) {
String[] splitted = argv[i].split("=");
switch (splitted[0]) {
case "-unzip":
if (args.zipflagset) {
throw new MDFSorterArgException("Ambigous zip flags.");
}
args.unzip = true;
args.zipflagset = true;
break;
case "-overridesize":
args.overrideOldSize = true;
break;
case "-verbose":
args.verbose = true;
break;
case "-zip":
if (args.zipflagset) {
throw new MDFSorterArgException("Ambigous zip flags.");
}
args.unzip = false;
args.zipflagset = true;
if (args.zipflagset) {
break;
}
case "-maxblocksize":
if (splitted.length < 2) {
throw new MDFSorterArgException("Argument must be provided after \"-maxblocksize=\" flag.");
} else {
args.maxblocksize = parseLong(splitted[1]);
}
break;
case "vendor":
if (splitted.length < 2) {
throw new MDFSorterArgException("Argument must be provided after \"-vendor=\" flag.");
} else {
args.customVendorName = splitted[1];
}
break;
default:
throw new MDFSorterArgException("Unknown Argument " + splitted[0]);
}
}
if (!args.unzip && args.maxblocksize > 4 * 1024L * 1024L) {
MDFSorter.log.log(Level.WARNING,
"Setting maxblocksize to 4MB. Larger blocks are not allowed for zipped data.");
args.maxblocksize = 4 * 1024L * 1024L;
}
return args;
}
}
public static ArgumentStruct parseArgsCheck(String[] argv) throws IllegalArgumentException {
ArgumentStruct args = new ArgumentStruct();
if (argv.length < 1) {
throw new MDFSorterArgException("At least one arguments must be provided.");
}
args.inputname = argv[1];
if (argv.length <= 2) {
args.maxblocksize = parseLong(argv[1]);
if (argv.length == 3) {
if (argv[2].equals("-unzip")) {
args.unzip = true;
} else if (argv[2].equals("-zip")) {
args.unzip = false;
} else {
throw new MDFSorterArgException("Unknown zipflag");
}
} else if (argv.length > 3) {
throw new MDFSorterArgException("Too many arguments.");
}
}
return args;
}
/**
* Parse a long from a String with decimal prefix, e.g. "100M", "2G", ...
*
* @param arg
* The String to parse.
* @return The value of the String as long.
*/
static long parseLong(String arg) {
char c = arg.charAt(arg.length() - 1);
// Numerical value only
if (c > 47 && c < 58) {
return Long.parseLong(arg);
} else if (c == 'M' || c == 'm' || c == 'K' || c == 'k' || c == 'G' || c == 'g') {
String numval = arg.substring(0, arg.length() - 1);
long l = Long.parseLong(numval);
switch (c) {
case 'G':
case 'g':
l *= 1024L;
case 'M':
case 'm':
l *= 1024L;
case 'k':
case 'K':
l *= 1024L;
break;
default:
l = 2_000_000_000L;
}
return l;
} else {
throw new MDFSorterArgException("Illegal numerical value");
}
}
}