blob: 1daf0caef36075f551db8ed9bd0f4043e267598c [file] [log] [blame]
/*******************************************************************************
* 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$
}
}