blob: bfb714a6c62f79a4f2b7649f46a44764e0190750 [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.ui.views;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.util.Date;
import java.util.StringTokenizer;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.update.configurator.ConfiguratorUtils;
import org.eclipse.update.internal.ui.UpdateUI;
import org.eclipse.update.internal.ui.UpdateUIMessages;
public class InstallationHistoryAction extends Action {
//private Shell shell;
private BufferedReader buffRead;
private PrintWriter htmlLog;
private File tempFile;
private String rowType;
private IPath path;
private static final String lightBlue = "#EEEEFF"; //$NON-NLS-1$
private static final String white = "#FFFFFF"; //$NON-NLS-1$
private static final String darkBlue = "#99AADD"; //$NON-NLS-1$
// private static final String CONFIGURATION = "CONFIGURATION"; //$NON-NLS-1$
private static final String ACTIVITY = "ACTIVITY"; //$NON-NLS-1$
public InstallationHistoryAction(Shell shell, String text, ImageDescriptor desc) {
super(text, desc);
//this.shell = shell;
String location =
ConfiguratorUtils
.getCurrentPlatformConfiguration()
.getConfigurationLocation()
.getFile();
path = new Path(location).removeLastSegments(1).append("install.log"); //$NON-NLS-1$
rowType = "light-row"; //$NON-NLS-1$
}
public void run() {
try {
openLog();
parseLog();
UpdateUI.showURL("file:" + getTempFile().getPath().toString()); //$NON-NLS-1$
} catch (CoreException e) {
UpdateUI.logException(e);
} finally {
closeLog();
}
}
private void openLog() throws CoreException {
try {
// throws FileNotFoundException, IOException
InputStream is = new FileInputStream(path.toOSString());
// throws UnsupportedEncodingException
InputStreamReader isr = new InputStreamReader(is,"UTF-8"); //$NON-NLS-1$
buffRead = new BufferedReader(isr);
htmlLog = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(getTempFile()), "UTF-8"))); //$NON-NLS-1$
} catch (Exception e) {
throwCoreException(e);
}
}
private File getTempFile() throws CoreException {
if (tempFile == null) {
try {
tempFile = File.createTempFile("install-log", ".html"); //$NON-NLS-1$ //$NON-NLS-2$
tempFile.deleteOnExit();
} catch (IOException e) {
throwCoreException(e);
}
}
return tempFile;
}
private void parseLog() throws CoreException {
// !CONFIGURATION <configuration-date>
// !ACTIVITY <date> <target> <action> <status>
try {
String type, date, status, target, action;
StringTokenizer htmlCode;
htmlLog.println("<html>"); //$NON-NLS-1$
htmlLog.println("<head>"); //$NON-NLS-1$
htmlLog.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"); //$NON-NLS-1$
htmlLog.println("<title>Install-Log</title>"); //$NON-NLS-1$
addCSS();
htmlLog.println("</head>"); //$NON-NLS-1$
htmlLog.println("<body>"); //$NON-NLS-1$
String title = UpdateUIMessages.InstallationHistoryAction_title;
String desc = UpdateUIMessages.InstallationHistoryAction_desc;
htmlLog.println("<h1 class=title>"+title+"</h1>"); //$NON-NLS-1$ //$NON-NLS-2$
htmlLog.println("<p class=bodyText>"+desc+"</p>"); //$NON-NLS-1$ //$NON-NLS-2$
htmlLog.println("<center>"); //$NON-NLS-1$
htmlLog.println("<table width =100% border=0 cellspacing=1 cellpadding=2>"); //$NON-NLS-1$
while (buffRead.ready()) {
htmlCode = new StringTokenizer(buffRead.readLine());
while (!(htmlCode.hasMoreElements())) {
if (!buffRead.ready())
return;
htmlCode = new StringTokenizer(buffRead.readLine());
}
type = htmlCode.nextToken();
type = type.substring(type.indexOf("!") + 1, type.length()); //$NON-NLS-1$
if (type.equals(ACTIVITY)) {
target = ""; //$NON-NLS-1$
Date d = new Date(new Long(htmlCode.nextToken()).longValue());
DateFormat df = DateFormat.getDateTimeInstance();
date = df.format(d);
// ignore string date
htmlCode.nextToken("."); //$NON-NLS-1$
htmlCode.nextToken(" "); //$NON-NLS-1$
while (htmlCode.countTokens() > 2)
target = target + " " + htmlCode.nextToken(); //$NON-NLS-1$
action = htmlCode.nextToken();
status = htmlCode.nextToken();
addActivity(action, date, status, target);
} else {
htmlLog.println();
htmlLog.println(
"<tr id=separator><td colspan=4></td></tr>"); //$NON-NLS-1$
htmlLog.println();
Date d = new Date(new Long(htmlCode.nextToken()).longValue());
DateFormat df = DateFormat.getDateTimeInstance();
date = df.format(d);
// date = ""; //$NON-NLS-1$
// while (htmlCode.countTokens() > 0)
// date = date + " " + htmlCode.nextToken(); //$NON-NLS-1$
addConfigurationHeader(date);
addActivityHeader();
}
}
htmlLog.println("</table>"); //$NON-NLS-1$
htmlLog.println("</body>"); //$NON-NLS-1$
htmlLog.println("</html>"); //$NON-NLS-1$
htmlLog.flush();
} catch (Exception e) {
throwCoreException(e);
}
}
private void addActivity(
String type,
String date,
String status,
String target) {
htmlLog.print("<tr class=" + rowType + ">"); //$NON-NLS-1$ //$NON-NLS-2$
htmlLog.print("<td class=log-text width=30%>"); //$NON-NLS-1$
htmlLog.print(date);
htmlLog.println("</td>"); //$NON-NLS-1$
htmlLog.print("<td class=log-text width=40%>"); //$NON-NLS-1$
htmlLog.print(target);
htmlLog.println("</td>"); //$NON-NLS-1$
htmlLog.print("<td class=log-text width=20%>"); //$NON-NLS-1$
htmlLog.print(type);
htmlLog.println("</td>"); //$NON-NLS-1$
htmlLog.print("<td class=log-text width=10%>"); //$NON-NLS-1$
htmlLog.print(status);
htmlLog.println("</td></tr>"); //$NON-NLS-1$
toggleRowColor();
}
private void addCSS() {
htmlLog.println("<STYLE type=\"text/css\">"); //$NON-NLS-1$
htmlLog.println("H1.title { font-family: sans-serif; color: #99AACC }"); //$NON-NLS-1$
htmlLog.println("P.bodyText { font-family: sans-serif; font-size: 9pt; }"); //$NON-NLS-1$
htmlLog.println(
"TD.log-header { font-family: sans-serif; font-style: normal; font-weight: bold; font-size: 9pt; color: white}"); //$NON-NLS-1$
htmlLog.println(
"TD.log-text { font-family: sans-serif; font-style: normal; font-weight: lighter; font-size: 8pt; color:black}"); //$NON-NLS-1$
htmlLog.println(
// "TD.config-log-header { font-family: sans-serif; font-style: normal; font-weight: bold; font-size: 9pt; color: white; ;text-align: right; border-top:10px solid white}");
"TD.config-log-header { font-family: sans-serif; font-style: normal; font-weight: bold; font-size: 9pt; color: white; border-top:10px solid white}"); //$NON-NLS-1$
htmlLog.println("TR.light-row {background:" + white + "}"); //$NON-NLS-1$ //$NON-NLS-2$
htmlLog.println("TR.dark-row {background:" + lightBlue + "}"); //$NON-NLS-1$ //$NON-NLS-2$
htmlLog.println("TR.header {background:" + darkBlue + "}"); //$NON-NLS-1$ //$NON-NLS-2$
htmlLog.println("</STYLE>"); //$NON-NLS-1$
}
private void addActivityHeader() {
htmlLog.print("<tr class=header>"); //$NON-NLS-1$
htmlLog.print("<td class=log-header>"); //$NON-NLS-1$
htmlLog.print(UpdateUIMessages.InstallationHistoryAction_dateTime);
htmlLog.print("</td>"); //$NON-NLS-1$
htmlLog.print("<td class=log-header>"); //$NON-NLS-1$
htmlLog.print(UpdateUIMessages.InstallationHistoryAction_target);
htmlLog.print("</td>"); //$NON-NLS-1$
htmlLog.print("<td class=log-header>"); //$NON-NLS-1$
htmlLog.print(UpdateUIMessages.InstallationHistoryAction_action);
htmlLog.print("</td>"); //$NON-NLS-1$
htmlLog.print("<td class=log-header>"); //$NON-NLS-1$
htmlLog.print(UpdateUIMessages.InstallationHistoryAction_status);
htmlLog.println("</td></tr>"); //$NON-NLS-1$
}
private void addConfigurationHeader(String date) {
if (date == null)
return;
htmlLog.print("<tr class=header>"); //$NON-NLS-1$
htmlLog.print("<td class=config-log-header colspan=4>"); //$NON-NLS-1$
htmlLog.print(date);
htmlLog.println("</td></tr>"); //$NON-NLS-1$
}
private void toggleRowColor() {
if (rowType.equals("light-row")) //$NON-NLS-1$
rowType = "dark-row"; //$NON-NLS-1$
else
rowType = "light-row"; //$NON-NLS-1$
}
private void throwCoreException(Throwable e) throws CoreException {
throw new CoreException(
new Status(
IStatus.ERROR,
UpdateUI.getPluginId(),
IStatus.ERROR,
UpdateUIMessages.InstallationHistoryAction_errors,
e));
}
private void closeLog() {
try {
if (buffRead != null)
buffRead.close();
if (htmlLog != null)
htmlLog.close();
} catch (IOException e) {
} finally {
buffRead = null;
htmlLog = null;
}
}
}