package tim.prune; import java.io.IOException; import tim.prune.config.Config; /** * Class to manage interfaces to external tools, like exiftool */ public abstract class ExternalTools { /** Constant for Exiftool */ public static final int TOOL_EXIFTOOL = 0; /** Constant for Gpsbabel */ public static final int TOOL_GPSBABEL = 1; /** Constant for Gnuplot */ public static final int TOOL_GNUPLOT = 2; /** Constant for Xerces xml library */ public static final int TOOL_XERCES = 3; /** Config keys in order that the tools are defined above */ private static final String[] CONFIG_KEYS = {Config.KEY_EXIFTOOL_PATH, Config.KEY_GPSBABEL_PATH, Config.KEY_GNUPLOT_PATH}; /** Verification flags for the tools in the order defined above */ private static final String[] VERIFY_FLAGS = {"-v", "-V", "-V"}; /** * Check if the selected tool is installed * @param inToolNum number of tool, from constants * @return true if selected tool is installed */ public static boolean isToolInstalled(int inToolNum) { switch (inToolNum) { case TOOL_EXIFTOOL: case TOOL_GPSBABEL: case TOOL_GNUPLOT: String toolPath = Config.getConfigString(CONFIG_KEYS[inToolNum]); if (toolPath != null && toolPath.length() > 0) { return check(toolPath + " " + VERIFY_FLAGS[inToolNum]); } break; case TOOL_XERCES: try { return Class.forName("org.apache.xerces.parsers.SAXParser").getClassLoader() != null; } catch (ClassNotFoundException e) { // System.err.println(e.getClass().getName() + " : " + e.getMessage()); } break; } // Not found return false; } /** * Check if the selected tool is installed using the given path * @param inToolNum number of tool, from constants * @param inPath selected path to use instead of configured one * @return true if selected tool is installed */ public static boolean isToolInstalled(int inToolNum, String inPath) { if (inPath == null || inPath.equals("")) {return false;} switch (inToolNum) { case TOOL_EXIFTOOL: case TOOL_GPSBABEL: case TOOL_GNUPLOT: return check(inPath + " " + VERIFY_FLAGS[inToolNum]); } // Not found return false; } /** * Attempt to call the specified command * @return true if found, false otherwise */ private static boolean check(String inCommand) { try { Runtime.getRuntime().exec(inCommand); return true; } catch (IOException ioe) { // exception thrown, command not found return false; } } }