package it.unito.geosummly.api.cli; import it.unito.geosummly.OptimizationOperator; import java.util.ArrayList; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.OptionBuilder; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; public class Optimization { private String type=""; private String inGeo=null; //private String inLog=null; private String outDir=null; private ArrayList<Double> fWeights=new ArrayList<Double>(); private int topCat=10; public void run (String[] args) { Options options= initOptions(); //define list of options CommandLineParser parser=new PosixParser(); //create the command line parser HelpFormatter formatter = new HelpFormatter(); Boolean mandatory=false; //check the presence of mandatory options String helpUsage="geosummly optimization -type pareto -input <path/to/file.geojson> -infos <path/to/file.log> -output <path/to/dir> [options]"; String helpFooter="\n------------------------------------------------------------------" + "\nThe options type, input, output are mandatory." + "\nTwo optimization methods are provided: pareto, linear (alternatively)." + "\nInput file has to be a geojson file, output of the clustering state." + "\nThe output consists of a geojson file with the clustering result after the optimization, a log file." + "\n------------------------------------------------------------------" + "\nExamples:" + "\ngeosummly optimization -type pareto -input path/to/file.geojson -output path/to/dir"; try { CommandLine line = parser.parse(options, args); if( line.hasOption("type") && line.hasOption("input") && line.hasOption("output")) { type = line.getOptionValue("type"); if(!type.equals("pareto") && !type.equals("linear")) { formatter.printHelp(helpUsage, "\ncommands list:", options, helpFooter); System.exit(-1); } inGeo=line.getOptionValue("input"); //file extension has to be geojson if(!inGeo.endsWith("geojson")) { formatter.printHelp(helpUsage, "\ncommands list:", options, helpFooter); System.exit(-1); } // inLog=line.getOptionValue("infos"); // //file extension has to be geojson // if(!inLog.endsWith("log")) { // formatter.printHelp(helpUsage, "\ncommands list:", options, helpFooter); // System.exit(-1); // } outDir=line.getOptionValue("output"); mandatory=true; } if(line.hasOption("weight")) { String[] c=line.getOptionValues("weight"); for(String s: c) fWeights.add(Double.parseDouble(s)); } else { int i=0; while(i<3) { fWeights.add(0.3); i++; } } if(line.hasOption("top")) { topCat=Integer.parseInt(line.getOptionValue("top")); if(topCat<0) { formatter.printHelp(helpUsage, "\ncommands list:", options, helpFooter); System.exit(-1); } } if (line.hasOption("help") || !mandatory) { formatter.printHelp(helpUsage,"\ncommands list:", options, helpFooter); System.exit(-1); } OptimizationOperator o=new OptimizationOperator(); switch (type) { case "linear": o.executeLinear(inGeo, outDir, fWeights, topCat); break; case "pareto": o.executePareto(inGeo, outDir); break; default: formatter.printHelp(helpUsage,"\ncommands list:", options, helpFooter); System.exit(-1); } } catch(Exception e) { System.out.println("Unexpected exception: " + e.getMessage()); e.printStackTrace(); } } @SuppressWarnings("static-access") private Options initOptions() { Options options = new Options(); //define list of options //option input options.addOption(OptionBuilder.withLongOpt("type") .withDescription("set the optimization function to use") .hasArg().withArgName("pareto").create("T")); //option input options.addOption(OptionBuilder.withLongOpt("input").withDescription("set the geojson input file") .hasArg().withArgName("path/to/file").create("I")); // //option infos // options.addOption(OptionBuilder.withLongOpt("infos").withDescription("set the log input file") // .hasArg().withArgName("path/to/file").create("i")); //option top options.addOption(OptionBuilder.withLongOpt("top").withDescription("set the number of clusters to hold in the fingerprint. Default 10. Valid only for type=linear") .hasArg().withArgName("arg").create("t")); //option weight options.addOption(OptionBuilder.withLongOpt("weight").withDescription("set the weights to assign to each optimization function. Default 0.3. Valid only for type=linear") .hasArgs(3).withValueSeparator(',').withArgName("w1,w2,w3").create("w")); //option output options.addOption(OptionBuilder.withLongOpt("output").withDescription("set the output directory") .hasArg().withArgName("path/to/dir").create("O")); //more options options.addOption("H", "help", false, "print the command list"); return options; } }