content: 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 inConfig config object containing paths
  	 * @param inToolNum number of tool, from constants
  	 * @return true if selected tool is installed
  	 */
  	public static boolean isToolInstalled(Config inConfig, int inToolNum)
  	{
  		switch (inToolNum) {
  			case TOOL_EXIFTOOL:
  			case TOOL_GPSBABEL:
  			case TOOL_GNUPLOT:
  				String toolPath = inConfig.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;
  		}
  	}
  }
  