// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved. // Released under the terms of the CPL Common Public License version 1.0. package fitnesse.updates; import fitnesse.FitNesse; import fitnesse.FitNesseContext; import util.FileUtil; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class UpdaterImplementation extends UpdaterBase { public static boolean testing = false; private ArrayList<String> updateDoNotCopyOver = new ArrayList<String>(); private ArrayList<String> updateList = new ArrayList<String>(); private String fitNesseVersion = FitNesse.VERSION.toString(); public UpdaterImplementation(FitNesseContext context) throws IOException { super(context); createUpdateAndDoNotCopyOverLists(); updates = makeAllUpdates(); } private Update[] makeAllUpdates() { List<Update> updates = new ArrayList<Update>(); addAllFilesToBeReplaced(updates); addAllFilesThatShouldNotBeCopiedOver(updates); return updates.toArray(new Update[updates.size()]); } private void addAllFilesThatShouldNotBeCopiedOver(List<Update> updates) { for (String nonCopyableFile : updateDoNotCopyOver) { String path = getCorrectPathForTheDestination(nonCopyableFile); String source = getCorrectPathFromJar(nonCopyableFile); updates.add(new FileUpdate(context.rootPath, source, path)); } } private void addAllFilesToBeReplaced(List<Update> updates) { for (String updateableFile : updateList) { String path = getCorrectPathForTheDestination(updateableFile); String source = getCorrectPathFromJar(updateableFile); updates.add(new ReplacingFileUpdate(context.rootPath, source, path)); } } public String getCorrectPathFromJar(String updateableFile) { return "Resources/" + updateableFile; } public String getCorrectPathForTheDestination(String updateableFile) { if (updateableFile.startsWith("FitNesseRoot")) updateableFile = updateableFile.replace("FitNesseRoot", context.rootDirectoryName); return FileUtil.getPathOfFile(updateableFile); } private void createUpdateAndDoNotCopyOverLists() { tryToGetUpdateFilesFromJarFile(); File updateFileList = new File(context.rootPagePath, "updateList"); File updateDoNotCopyOverFileList = new File(context.rootPagePath, "updateDoNotCopyOverList"); tryToParseTheFileIntoTheList(updateFileList, updateList); tryToParseTheFileIntoTheList(updateDoNotCopyOverFileList, updateDoNotCopyOver); } private void tryToGetUpdateFilesFromJarFile() { try { getUpdateFilesFromJarFile(); } catch (Exception e) { throw new RuntimeException(e); } } public void getUpdateFilesFromJarFile() throws IOException { Update update = new FileUpdate(context.rootPagePath, "Resources/updateList", "."); update.doUpdate(); update = new FileUpdate(this.context.rootPagePath, "Resources/updateDoNotCopyOverList", "."); update.doUpdate(); } public void tryToParseTheFileIntoTheList(File updateFileList, ArrayList<String> list) { if (updateFileList.exists() == false) throw new RuntimeException("Could Not Find UpdateList"); try { parseTheFileContentToAList(updateFileList, list); } catch (Exception e) { throw new RuntimeException(e); } } private void parseTheFileContentToAList(File updateFileList, ArrayList<String> list) throws IOException { String content = FileUtil.getFileContent(updateFileList); String[] filePaths = content.split("\n"); for (String path : filePaths) list.add(path); } public void update() throws IOException { if (shouldUpdate()) { System.err.println("Unpacking new version of FitNesse resources. Please be patient."); super.update(); System.err.println("\n\n" + "********************************************************************************\n" + " Files have been updated to a new version. Please read the release notes\n" + " on http://localhost:" + context.getPort() + "/FitNesse.ReleaseNotes to find out about the new\n" + " features and fixes.\n" + "********************************************************************************\n\n"); getProperties().put("Version", fitNesseVersion); saveProperties(); } } private void exit() { if (!testing) System.exit(0); } private boolean shouldUpdate() { String versionProperty = getProperties().getProperty("Version"); return versionProperty == null || !versionProperty.equals(fitNesseVersion); } public void setFitNesseVersion(String version) { fitNesseVersion = version; } }