/******************************************************************************* * Copyright (c) 2000, 2006 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.update.internal.core; import java.io.*; import java.net.*; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.StringTokenizer; import org.eclipse.core.runtime.*; import org.eclipse.update.configuration.*; import org.eclipse.update.configurator.*; import org.eclipse.update.core.*; import org.eclipse.update.internal.operations.*; /** * Parses the installation log and creates installation configuration objects */ public class InstallLogParser { private IPath logPath; private BufferedReader buffRead; private InstallConfiguration currentConfiguration; private HashMap installConfigMap; private Comparator comparator; private static final String FEATURE_INSTALL = "feature-install"; //$NON-NLS-1$ private static final String FEATURE_REMOVE = "feature-remove"; //$NON-NLS-1$ private static final String SITE_INSTALL = "site-install"; //$NON-NLS-1$ private static final String SITE_REMOVE = "site-remove"; //$NON-NLS-1$ private static final String UNCONFIGURE = "feature-disable"; //$NON-NLS-1$ private static final String CONFIGURE = "feature-enable"; //$NON-NLS-1$ private static final String REVERT = "revert"; //$NON-NLS-1$ private static final String RECONCILIATION = "reconciliation"; //$NON-NLS-1$ private static final String PRESERVED = "preserve-configuration"; //$NON-NLS-1$ private static final String ACTIVITY = "!ACTIVITY"; //$NON-NLS-1$ public static final String SUCCESS = "success"; //$NON-NLS-1$ public static final String FAILURE = "failure"; //$NON-NLS-1$ public InstallLogParser(){ String loc = ConfiguratorUtils.getCurrentPlatformConfiguration().getConfigurationLocation().getFile(); logPath = new Path(loc).removeLastSegments(1).append("install.log"); //$NON-NLS-1$ installConfigMap = new HashMap(); try { InstallConfiguration[] configs = (InstallConfiguration[])SiteManager.getLocalSite().getConfigurationHistory(); for (int i=0;i<configs.length; i++){ if (!configs[i].isCurrent()) installConfigMap.put(new Long(configs[i].getCreationDate().getTime()), configs[i]); } // Need to make a copy of the current config instead InstallConfiguration config = getConfigCopy((InstallConfiguration)SiteManager.getLocalSite().getCurrentConfiguration()); installConfigMap.put(new Long(config.getCreationDate().getTime()), config); } catch (CoreException e) { UpdateCore.log(e); } catch (MalformedURLException e){ UpdateCore.log(e); } comparator = new Comparator(){ public int compare(Object e1, Object e2) { Date date1 = ((InstallConfiguration)e1).getCreationDate(); Date date2 = ((InstallConfiguration)e2).getCreationDate(); return date1.before(date2) ? 1 : -1; } }; } private InstallConfiguration getConfigCopy(InstallConfiguration origConfig) throws CoreException, MalformedURLException{ InstallConfiguration config = new InstallConfiguration(origConfig, origConfig.getURL(), origConfig.getLabel() ); config.setCreationDate(origConfig.getCreationDate()); return config; } public void parseInstallationLog(){ try { openLog(); parseLog(); } catch (CoreException e) { UpdateUtils.logException(e); } finally { closeLog(); } } private void openLog() throws CoreException { try { // throws FileNotFoundException, IOException InputStream is = new FileInputStream(logPath.toOSString()); // throws UnsupportedEncodingException InputStreamReader isr = new InputStreamReader(is,"UTF-8"); //$NON-NLS-1$ buffRead = new BufferedReader(isr); } catch (Exception e) { throwCoreException(e); } } private void throwCoreException(Throwable e) throws CoreException { throw new CoreException( new Status( IStatus.ERROR, UpdateUtils.getPluginId(), IStatus.ERROR, Messages.InstallLogParser_errors, e)); } private void parseLog() throws CoreException { // .install-log template // !CONFIGURATION <configuration-date> // !ACTIVITY <date> <target> <action> <status> try { String type, status, action; StringTokenizer htmlCode; while (buffRead.ready()) { htmlCode = new StringTokenizer(buffRead.readLine()); while (!(htmlCode.hasMoreElements())) { if (!buffRead.ready()) return; htmlCode = new StringTokenizer(buffRead.readLine()); } type = htmlCode.nextToken().trim(); if (type.equals(ACTIVITY)) { String time = htmlCode.nextToken(); String date; StringBuffer target = new StringBuffer(); date = htmlCode.nextToken("."); //$NON-NLS-1$ htmlCode.nextToken(" "); //$NON-NLS-1$ while (htmlCode.countTokens() > 2){ target.append(" "); //$NON-NLS-1$ target.append(htmlCode.nextToken()); } action = htmlCode.nextToken(); status = htmlCode.nextToken(); createActivity(action, time, date, status, target.toString(), currentConfiguration); } else { String time = htmlCode.nextToken(); StringBuffer date; date = new StringBuffer(); while (htmlCode.countTokens() > 0){ if (date.length() != 0) date.append(" "); //$NON-NLS-1$ date.append(htmlCode.nextToken()); } currentConfiguration = (InstallConfiguration)installConfigMap.get(new Long(time)); } } } catch (Exception e) { throwCoreException(e); } } private void closeLog() { try { if (buffRead != null) buffRead.close(); } catch (IOException e) { } finally { buffRead = null; } } private IActivity createActivity(String action, String time, String date, String status, String target, InstallConfiguration config){ ConfigurationActivity a = new ConfigurationActivity(); int code = 0; if (FEATURE_INSTALL.equals(action)) code = IActivity.ACTION_FEATURE_INSTALL; else if (FEATURE_REMOVE.equals(action)) code = IActivity.ACTION_FEATURE_REMOVE; else if (SITE_INSTALL.equals(action)) code = IActivity.ACTION_SITE_INSTALL; else if (SITE_REMOVE.equals(action)) code = IActivity.ACTION_SITE_REMOVE; else if (UNCONFIGURE.equals(action)) code = IActivity.ACTION_UNCONFIGURE; else if (CONFIGURE.equals(action)) code = IActivity.ACTION_CONFIGURE; else if (REVERT.equals(action)) code = IActivity.ACTION_REVERT; else if (RECONCILIATION.equals(action)) code = IActivity.ACTION_RECONCILIATION; else if (PRESERVED.equals(action)) code = IActivity.ACTION_ADD_PRESERVED; a.setAction(code); try { long activityTime = Long.parseLong(time); a.setDate(new Date(activityTime)); } catch (NumberFormatException e) { //PAL foundation //a.setDate(new Date(date)); try { a.setDate(new SimpleDateFormat().parse(date)); } catch (ParseException e1) { //ignore } } a.setStatus(SUCCESS.equals(status) ? IActivity.STATUS_OK : IActivity.STATUS_NOK); a.setLabel(target); a.setInstallConfigurationModel(config); if (config != null && !configContainsActivity(config, a)){ config.addActivity(a); } return a; } private boolean configContainsActivity(InstallConfiguration c, IActivity a){ IActivity[] activities = c.getActivities(); for (int i = 0 ; i<activities.length; i++){ if (a.equals(activities[i])) return true; } return false; } public InstallConfiguration[] getConfigurations(){ Collection configSet = installConfigMap.values(); InstallConfiguration[] configs = (InstallConfiguration[]) configSet.toArray(new InstallConfiguration[configSet.size()]); Arrays.sort(configs, comparator); return configs; } }