Java tutorial
/* * Copyright (C) 2012 The Serval Project * * This file is part of the Serval Maps Data Manipulator Software * * Serval Maps Data Manipulator Software is free software; you can * redistribute it and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This source code is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this source code; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.servalproject.maps.dataman; import java.io.File; import java.io.IOException; import java.text.ParseException; import java.util.HashMap; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Option; import org.apache.commons.cli.OptionBuilder; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; import org.servalproject.maps.dataman.tasks.LocationsToKml; import org.servalproject.maps.dataman.tasks.TaskException; import org.servalproject.maps.dataman.types.KmlStyle; import org.servalproject.maps.dataman.types.TaskTypes; /** * main driving class for the command line interface entry * point to the application */ public class DataManCli { /* * class level constants */ /** * name of the app */ public static final String APP_NAME = "Serval Maps Data Manipulator"; /** * version of the app */ public static final String APP_VERSION = "1.0"; /** * url for more information about the app */ public static final String MORE_INFO = "http://bytechxplorer.com/development/serval-project/#servalmaps"; /** * url for the license info */ public static final String LICENSE_INFO = "http://www.gnu.org/licenses/gpl-3.0.txt"; /** * @param args */ public static void main(String[] args) { // parse the command line options CommandLineParser parser = new PosixParser(); CommandLine cmd = null; try { cmd = parser.parse(createOptions(), args); } catch (org.apache.commons.cli.ParseException e) { // something bad happened so output help message printCliHelp("Error in parsing arguments:\n" + e.getMessage()); } /* * get and test the command line arguments */ // input path String inputPath = cmd.getOptionValue("input"); if (Utils.isEmpty(inputPath)) { printCliHelp("Error: the path to the input file is required"); } if (Utils.isFileAccessible(inputPath) == false) { printCliHelp("Error: the input file is not accessible"); } File inputFile = new File(inputPath); // output path String outputPath = cmd.getOptionValue("output"); if (Utils.isEmpty(outputPath)) { printCliHelp("Error: the path to the output file is required"); } if (Utils.isFileAccessible(outputPath) == true) { printCliHelp("Error: the output file already exists"); } // create output directory if needed if (outputPath.contains("/")) { int last = outputPath.lastIndexOf("/"); if (last >= 0) { String dir = outputPath.substring(0, last); boolean success = (new File(dir)).mkdirs(); if (!success) { System.err.println("Unable to create directory " + dir); } } } File outputFile = new File(outputPath); // task type String taskType = cmd.getOptionValue("task"); if (Utils.isEmpty(taskType)) { printCliHelp("Error: the task type is required"); } HashMap<String, String> taskTypes = TaskTypes.getTaskTypes(); if (taskTypes.containsKey(taskType) == false) { printCliHelp( "Error: the task type was not recognised.\nKnown task types are:" + TaskTypes.getTaskList()); } // style information String style = cmd.getOptionValue("style"); KmlStyle kmlStyle = null; // expand on the list of styles if (style != null) { try { kmlStyle = new KmlStyle(style); } catch (ParseException e) { System.err.println("unable to parse the style definition\n" + e.toString()); System.exit(-1); } } // verbose output boolean verbose = cmd.hasOption("verbose"); // output info if required if (verbose) { System.out.println(APP_NAME); System.out.println("Version: " + APP_VERSION); System.out.println("More info: " + MORE_INFO + "\n"); System.out.println("License info: " + LICENSE_INFO + "\n"); try { System.out.println("Input file: " + inputFile.getCanonicalPath()); System.out.println("Output file: " + outputFile.getCanonicalPath()); } catch (IOException e) { } System.out.println("Undertaking the task to: " + taskTypes.get(taskType)); } // undertake the specific task if (taskType.startsWith("binloctokml") == true) { LocationsToKml task = new LocationsToKml(inputFile, outputFile, LocationsToKml.BINARY_FILE_TYPE, verbose, kmlStyle); try { task.undertakeTask(taskType); } catch (TaskException e) { System.err.println("Error: Task execution failed\n" + e.toString()); } } } /* * output the command line options help */ private static void printCliHelp(String message) { System.out.println(message); HelpFormatter formatter = new HelpFormatter(); formatter.printHelp("java -jar ServalMapsDataMan.jar", createOptions()); System.exit(-1); } /* * create the command line options used by the app */ private static Options createOptions() { Options options = new Options(); // path to the input file OptionBuilder.withArgName("path"); OptionBuilder.hasArg(true); OptionBuilder.withDescription("path to the input file"); OptionBuilder.isRequired(true); options.addOption(OptionBuilder.create("input")); // path to the output file OptionBuilder.withArgName("path"); OptionBuilder.hasArg(true); OptionBuilder.withDescription("path to the output file"); OptionBuilder.isRequired(true); options.addOption(OptionBuilder.create("output")); // task to undertake OptionBuilder.withArgName("text"); OptionBuilder.hasArg(true); OptionBuilder.withDescription("manipulation task to undertake"); OptionBuilder.isRequired(true); options.addOption(OptionBuilder.create("task")); // style information OptionBuilder.withArgName("text"); OptionBuilder.hasArg(true); OptionBuilder.withDescription("style definition information"); OptionBuilder.isRequired(false); options.addOption(OptionBuilder.create("style")); // verbose output or not options.addOption(new Option("verbose", "use verbose output")); return options; } }