| /******************************************************************************* |
| * 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.BufferedWriter; |
| import java.io.File; |
| import java.io.FileOutputStream; |
| import java.io.IOException; |
| import java.io.OutputStream; |
| import java.io.OutputStreamWriter; |
| import java.io.UnsupportedEncodingException; |
| import java.io.Writer; |
| import java.text.DateFormat; |
| import java.text.SimpleDateFormat; |
| import java.util.Date; |
| |
| import org.eclipse.core.runtime.FileLocator; |
| import org.eclipse.update.configuration.IActivity; |
| import org.eclipse.update.configuration.IInstallConfiguration; |
| import org.eclipse.update.configurator.ConfiguratorUtils; |
| import org.eclipse.update.configurator.IPlatformConfiguration; |
| |
| |
| /** |
| * A log writer that writes update manager log entries. |
| */ |
| public class UpdateManagerLogWriter { |
| private File logFile = null; |
| private Writer log = null; |
| |
| private static final String CONFIGURATION = "!CONFIGURATION"; //$NON-NLS-1$ |
| private static final String ACTIVITY = "!ACTIVITY"; //$NON-NLS-1$ |
| |
| private static final String SUCCESS = "success"; //$NON-NLS-1$ |
| private static final String FAILURE = "failure"; //$NON-NLS-1$ |
| |
| 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 UNKNOWN = "unknown"; //$NON-NLS-1$ |
| |
| private static final String LINE_SEPARATOR; |
| |
| static { |
| String s = System.getProperty("line.separator"); //$NON-NLS-1$ |
| LINE_SEPARATOR = s == null ? "\n" : s; //$NON-NLS-1$ |
| } |
| |
| /* |
| * |
| */ |
| public UpdateManagerLogWriter(File file) { |
| this.logFile = file; |
| UpdateCore.warn("UPDATE MANAGER LOG Location: "+file.getAbsolutePath()); //$NON-NLS-1$ |
| |
| // If the file does not exist, prime it with the sites in the exisiting config |
| if (!file.exists()) |
| initLog(); |
| } |
| |
| /* |
| * Initializes the log with the original configuration |
| */ |
| private void initLog() { |
| try { |
| IPlatformConfiguration runtimeConfig = ConfiguratorUtils.getCurrentPlatformConfiguration(); |
| IPlatformConfiguration.ISiteEntry[] sites = runtimeConfig.getConfiguredSites(); |
| ConfigurationActivity[] activities = new ConfigurationActivity[sites.length]; |
| for (int i=0; i<sites.length; i++) { |
| activities[i] = new ConfigurationActivity(IActivity.ACTION_SITE_INSTALL); |
| activities[i].setLabel(FileLocator.toFileURL(sites[i].getURL()).toExternalForm()); |
| activities[i].setDate(new Date()); |
| activities[i].setStatus(IActivity.STATUS_OK); |
| } |
| Date date = new Date(runtimeConfig.getChangeStamp()); |
| safeWriteConfiguration(date, activities); |
| } catch (Exception e) { |
| // silently ignore errors |
| } |
| } |
| |
| /* |
| * |
| */ |
| private void closeLogFile() throws IOException { |
| try { |
| if (log != null) { |
| log.flush(); |
| log.close(); |
| } |
| } finally { |
| log = null; |
| } |
| } |
| |
| /* |
| * |
| */ |
| public void log(IInstallConfiguration installConfig) { |
| safeWriteConfiguration(installConfig.getCreationDate(), installConfig.getActivities()); |
| } |
| |
| |
| /* |
| * |
| */ |
| private void openLogFile() { |
| try { |
| log = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(logFile.getAbsolutePath(), true), "UTF-8")); //$NON-NLS-1$ |
| } catch (IOException e) { |
| // there was a problem opening the log file so log to the console |
| log = logForStream(System.err); |
| } |
| } |
| |
| /* |
| * |
| */ |
| private String getFormattedDate(Date date) { |
| try { |
| DateFormat formatter = new SimpleDateFormat("MMM dd, yyyy kk:mm:ss.SS"); //$NON-NLS-1$ |
| return formatter.format(date); |
| } catch (Exception e) { |
| // If there were problems writing out the date, ignore and |
| // continue since that shouldn't stop us from losing the rest |
| // of the information |
| } |
| return Long.toString(System.currentTimeMillis()); |
| } |
| |
| /* |
| * |
| */ |
| private Writer logForStream(OutputStream output) { |
| try { |
| return new BufferedWriter(new OutputStreamWriter(output, "UTF-8")); //$NON-NLS-1$ |
| } catch (UnsupportedEncodingException e) { |
| return new BufferedWriter(new OutputStreamWriter(output)); |
| } |
| } |
| |
| |
| /* |
| * Shuts down the update manager log. |
| */ |
| public synchronized void shutdown() { |
| try { |
| if (logFile != null) { |
| closeLogFile(); |
| logFile = null; |
| } else { |
| if (log != null) { |
| Writer old = log; |
| log = null; |
| old.flush(); |
| old.close(); |
| } |
| } |
| } catch (IOException e) { |
| //we've shutdown the log, so not much else we can do! |
| e.printStackTrace(); |
| } |
| } |
| |
| /* |
| * |
| */ |
| private synchronized void safeWriteConfiguration(Date date, IActivity[] activities) { |
| // thread safety: (Concurrency003) |
| if (logFile != null) |
| openLogFile(); |
| if (log == null) |
| log = logForStream(System.err); |
| try { |
| try { |
| write(date, activities); |
| } finally { |
| if (logFile != null) |
| closeLogFile(); |
| else |
| log.flush(); |
| } |
| } catch (Exception e) { |
| System.err.println("An exception occurred while writing to the update manager log:"); //$NON-NLS-1$ |
| e.printStackTrace(System.err); |
| System.err.println("Logging to the console instead."); //$NON-NLS-1$ |
| //we failed to write, so dump log entry to console instead |
| try { |
| log = logForStream(System.err); |
| write(date, activities); |
| log.flush(); |
| } catch (Exception e2) { |
| System.err.println("An exception occurred while logging to the console:"); //$NON-NLS-1$ |
| e2.printStackTrace(System.err); |
| } |
| } finally { |
| log = null; |
| } |
| } |
| |
| |
| /* |
| * !CONFIGURATION <label> |
| */ |
| private void write(Date date, IActivity[] activities) throws IOException { |
| writeln(); |
| write(CONFIGURATION); |
| writeSpace(); |
| write(String.valueOf(date.getTime())); |
| writeSpace(); |
| write(date.toString()); |
| writeln(); |
| for (int i = 0; i < activities.length; i++) { |
| write(activities[i]); |
| } |
| } |
| |
| /* |
| * !ACTIVITY <date> <target> <action> <status> |
| */ |
| private void write(IActivity activity) throws IOException { |
| write(ACTIVITY); |
| writeSpace(); |
| write(String.valueOf(activity.getDate().getTime())); |
| writeSpace(); |
| write(getFormattedDate(activity.getDate())); |
| writeSpace(); |
| write(activity.getLabel()); |
| writeSpace(); |
| write(getAction(activity.getAction())); |
| writeSpace(); |
| write((activity.getStatus()==IActivity.STATUS_OK)?SUCCESS:FAILURE); |
| writeln(); |
| } |
| |
| /* |
| * |
| */ |
| private String getAction(int i) { |
| switch (i) { |
| case IActivity.ACTION_FEATURE_INSTALL : |
| return FEATURE_INSTALL; |
| case IActivity.ACTION_FEATURE_REMOVE : |
| return FEATURE_REMOVE; |
| case IActivity.ACTION_SITE_INSTALL : |
| return SITE_INSTALL; |
| case IActivity.ACTION_SITE_REMOVE : |
| return SITE_REMOVE; |
| case IActivity.ACTION_UNCONFIGURE : |
| return UNCONFIGURE; |
| case IActivity.ACTION_CONFIGURE : |
| return CONFIGURE; |
| case IActivity.ACTION_REVERT : |
| return REVERT; |
| case IActivity.ACTION_RECONCILIATION : |
| return RECONCILIATION; |
| case IActivity.ACTION_ADD_PRESERVED : |
| return PRESERVED; |
| |
| default : |
| return UNKNOWN+" ["+i+"]"; //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| } |
| |
| |
| /* |
| * |
| */ |
| private void writeln() throws IOException { |
| write(LINE_SEPARATOR); |
| } |
| |
| /* |
| * |
| */ |
| private void write(String message) throws IOException { |
| if (message != null) |
| log.write(message); |
| } |
| |
| /* |
| * |
| */ |
| private void writeSpace() throws IOException { |
| write(" "); //$NON-NLS-1$ |
| } |
| } |