| /******************************************************************************* |
| * 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; |
| } |
| } |
| |
| } |