| /* |
| * ****************************************************************************** |
| * Copyright (C) 2007, International Business Machines Corporation and others. |
| * All Rights Reserved. |
| * ****************************************************************************** |
| */ |
| package com.ibm.icu.dev.tool.tzu; |
| |
| import java.io.File; |
| import java.io.FileNotFoundException; |
| import java.io.IOException; |
| |
| /** |
| * Loads the ICUTZU tool, command-line version. |
| */ |
| public class CLILoader { |
| /** |
| * The filename of the log file in patch mode. |
| */ |
| public static final String LOG_FILENAME_PATCH = "icutzu_patch.log"; |
| |
| /** |
| * The filename of the log file in discovery only mode. |
| */ |
| public static final String LOG_FILENAME_DISCOVERYONLY = "icutzu_discovery.log"; |
| |
| /** |
| * The backup directory to use in patch mode, or null if there should be no backups. |
| */ |
| private File backupDir = null; |
| |
| /** |
| * The current directory. |
| */ |
| private File curDir = null; |
| |
| /** |
| * A logger that manages both output to the screen and to the log file. |
| */ |
| private Logger logger; |
| |
| /** |
| * The file that stores the path list. |
| */ |
| private File pathFile = null; |
| |
| /** |
| * A glorified list of IncludePath objects representing the list of directories used in |
| * discovery mode. |
| */ |
| private PathModel pathModel; |
| |
| /** |
| * The file that stores the result list. |
| */ |
| private File resultFile = null; |
| |
| /** |
| * A glorified list of ICUFile objects representing the ICU4J jars found in discovery mode and |
| * used in patch mode. |
| */ |
| private ResultModel resultModel; |
| |
| /** |
| * A glorified map of Strings to URLs populated by parsing the directory structure in the ICU |
| * Time Zone repository online and used in patch mode. |
| */ |
| private SourceModel sourceModel; |
| |
| /** |
| * The local timezone resource file. |
| */ |
| private File tzFile = null; |
| |
| /** |
| * Entry point for the command-line version of the tool. |
| * |
| * @param curDir |
| * The base directory of the tool. |
| * @param backupDir |
| * The location to store backups. |
| * @param pathFile |
| * The file to load paths from. |
| * @param resultFile |
| * The file to load/save results to/from. |
| * @param tzFile |
| * The local timezone resource file. |
| */ |
| public CLILoader(File curDir, File backupDir, File pathFile, File resultFile, File tzFile) { |
| // determine whether we are running in discover only mode or patch mode |
| boolean discoverOnly = "true".equalsIgnoreCase(System.getProperty("discoveronly")); |
| boolean silentPatch = "true".equalsIgnoreCase(System.getProperty("silentpatch")); |
| File logFile = new File(curDir.getPath(), (discoverOnly ? "icutzu_discover.log" |
| : "icutzu_patch.log")); |
| |
| // create the logger based on the silentpatch option |
| try { |
| this.logger = Logger.getInstance(logFile, silentPatch ? Logger.QUIET : Logger.NORMAL); |
| } catch (FileNotFoundException ex) { |
| System.out.println("Could not open " + logFile.getPath() + " for writing."); |
| System.exit(-1); |
| } |
| |
| this.pathFile = pathFile; |
| this.resultFile = resultFile; |
| this.tzFile = tzFile; |
| this.backupDir = backupDir; |
| this.curDir = curDir; |
| |
| // if discoveryonly is enabled, call the search method |
| // otherwise, call the update method |
| try { |
| if (discoverOnly) |
| search(); |
| else |
| update(); |
| } catch (IllegalArgumentException ex) { |
| logger.errorln(ex.getMessage()); |
| } catch (IOException ex) { |
| logger.errorln(ex.getMessage()); |
| } catch (InterruptedException ex) { |
| logger.errorln(ex.getMessage()); |
| } |
| } |
| |
| /** |
| * Discover Only Mode. Load the path list from the path file and save the path of each updatable |
| * ICU jar files it finds to the result list |
| * |
| * @throws IOException |
| * @throws IllegalArgumentException |
| * @throws InterruptedException |
| */ |
| private void search() throws IOException, IllegalArgumentException, InterruptedException { |
| logger.printlnToScreen(""); |
| logger.printlnToScreen("*********** Command-Line \'Discover Only\'" |
| + " Mode Started ***********"); |
| logger.printlnToScreen(""); |
| logger.printlnToScreen("\'Discover Only\' Mode:"); |
| logger.printlnToScreen("In this mode, " + "the tool will search for ICU4J jars" |
| + " in the directories specified in DirectorySearch.txt" |
| + " and print the ICU4J jars detected and their respective" |
| + " time zone version to the file ICUList.txt"); |
| logger.printlnToScreen(""); |
| |
| // initialize the result model and the path model |
| resultModel = new ResultModel(logger, resultFile); |
| pathModel = new PathModel(logger, pathFile); |
| |
| // load paths stored in PathModel.PATHLIST_FILENAME |
| pathModel.loadPaths(); |
| |
| // perform the search, putting the the results in the result model, |
| // searching all subdirectories of the included path, using the backup |
| // directory specified, and without using a status bar (since this is |
| // command-line) |
| logger.printlnToScreen(""); |
| logger.printlnToScreen("Search started."); |
| pathModel.searchAll(resultModel, true, curDir, backupDir); |
| logger.printlnToScreen("Search ended."); |
| logger.printlnToScreen(""); |
| |
| // save the results in PathModel.RESULTLIST_FILENAME |
| resultModel.saveResults(); |
| |
| logger.printlnToScreen(""); |
| logger.printlnToScreen("Please run with DISCOVERYONLY=false" |
| + " in order to update ICU4J jars listed in ICUList.txt"); |
| logger.printlnToScreen("*********** Command-Line \'Discover Only\'" |
| + " Mode Ended ***********"); |
| logger.printlnToScreen(""); |
| } |
| |
| /** |
| * Patch Mode. Load all the results from resultFile, populate the tz version list via the web, |
| * and update all the results with the best available Time Zone data. |
| * |
| * @throws IOException |
| * @throws IllegalArgumentException |
| * @throws InterruptedException |
| */ |
| private void update() throws IOException, IllegalArgumentException, InterruptedException { |
| logger.printlnToScreen(""); |
| logger.printlnToScreen("*********** Command-Line \'Patch\'" + " Mode Started ***********"); |
| logger.printlnToScreen(""); |
| logger.printlnToScreen("\'Patch\' Mode:"); |
| logger.printlnToScreen("In this mode, the tool patches each of the" |
| + " ICU4J jars listed in ICUList.txt with the new time zone" + " information."); |
| logger.printlnToScreen(""); |
| |
| // initialize the result model and the source model |
| resultModel = new ResultModel(logger, resultFile); |
| sourceModel = new SourceModel(logger, tzFile); |
| |
| // load the results from the result list file |
| resultModel.loadResults(); |
| |
| // if the offline is not set to true, populate the list of available |
| // timezone resource versions |
| if (!"true".equalsIgnoreCase(System.getProperty("offline"))) |
| sourceModel.findSources(); |
| |
| // perform the updates using the best tz version available |
| resultModel.updateAll(sourceModel.getURL(sourceModel.getSelectedItem()), backupDir); |
| |
| logger.printlnToScreen(""); |
| logger.printlnToScreen("*********** Command-Line \'Patch\'" + " Mode Ended ***********"); |
| logger.printlnToScreen(""); |
| } |
| } |