package main;
import java.io.Serializable;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import gui.GUIOptions;
import hexcapture.HexOptions;
import hextostring.ConvertOptions;
import main.options.EncompassingOptions;
import main.options.Options;
import main.options.domain.ValueOutOfDomainException;
import main.options.parser.OptionsParser;
/**
* Contains all the options of the various parts of the program.
*
* @author Maxime PIA
*/
public class MainOptions extends Options implements Serializable,
EncompassingOptions {
/**
* Backward-compatible with 0.7.0
*/
private static final long serialVersionUID = 00000000007000000L;
private HexOptions hexOptions;
private ConvertOptions convertOptions;
private GUIOptions GUIOptions;
private Set<Options> subOptions = new HashSet<>();
public MainOptions() {
initSubOptions();
}
public MainOptions(String[] args) throws ValueOutOfDomainException {
this();
parseArgs(args);
}
private void initSubOptions() {
this.hexOptions = new HexOptions();
this.convertOptions = new ConvertOptions();
this.GUIOptions = new GUIOptions();
updateSubOptionsSet();
}
public void updateSubOptionsSet() {
subOptions.clear();
subOptions.add(this);
subOptions.add(this.hexOptions);
subOptions.add(this.convertOptions);
subOptions.add(this.GUIOptions);
}
/**
* Getter on the option objects contained in this class.
*
* @return The option objects contained in this class.
*/
public Set<Options> getSubOptions() {
return subOptions;
}
/**
* Getter on the options relative to the behavior of the main lua file.
*
* @return The options relative to the behavior of the main lua file.
*/
public synchronized HexOptions getHexOptions() {
return hexOptions;
}
/**
* Getter on the conversion options.
*
* @return The conversion options.
*/
public synchronized ConvertOptions getConvertOptions() {
return convertOptions;
}
/**
* Getter of the options for the GUI.
*
* @return The options for the GUI.
*/
public synchronized GUIOptions getGUIOptions() {
return GUIOptions;
}
/**
* Parses and applies the command line arguments.
*
* @param args
* The command line arguments.
* @throws ValueOutOfDomainException
*/
public final void parseArgs(String[] args)
throws ValueOutOfDomainException {
if (args.length == 1 && args[0].equals("--help")) {
System.out.println(usage(null, subOptions));
} else {
List<String> remainingArgs = Arrays.asList(args);
for (Options opts : subOptions) {
OptionsParser parser = new OptionsParser(opts);
remainingArgs = parser.parse(remainingArgs);
}
if (!remainingArgs.isEmpty()) {
throw new IllegalArgumentException(
"Illegal command line argument(s) or value(s): "
+ remainingArgs + "."
);
}
}
}
}