--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpeclipse.xdebug.ui.views.logview;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.StringTokenizer;
+
+import net.sourceforge.phpeclipse.xdebug.ui.XDebugUIPlugin;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.PlatformObject;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.model.IWorkbenchAdapter;
+
+public class LogEntry extends PlatformObject implements IWorkbenchAdapter {
+ private static final String KEY_ERROR = "LogView.severity.error"; //$NON-NLS-1$
+ private static final String KEY_WARNING = "LogView.severity.warning"; //$NON-NLS-1$
+ private static final String KEY_INFO = "LogView.severity.info"; //$NON-NLS-1$
+ private ArrayList children;
+ private LogEntry parent;
+ private String pluginId;
+ private int severity;
+ private int code;
+ private String date;
+ private String message;
+ private String stack;
+ private LogSession session;
+
+ public LogEntry() {
+ }
+
+ public LogSession getSession() {
+ return session;
+ }
+
+ void setSession(LogSession session) {
+ this.session = session;
+ }
+
+ public LogEntry(IStatus status) {
+ processStatus(status);
+ }
+ public int getSeverity() {
+ return severity;
+ }
+
+ public boolean isOK() {
+ return severity == IStatus.OK;
+ }
+ public int getCode() {
+ return code;
+ }
+ public String getPluginId() {
+ return pluginId;
+ }
+ public String getMessage() {
+ return message;
+ }
+ public String getStack() {
+ return stack;
+ }
+ public String getDate() {
+ return date;
+ }
+ public String getSeverityText() {
+ return getSeverityText(severity);
+ }
+ public boolean hasChildren() {
+ return children != null && children.size() > 0;
+ }
+ public String toString() {
+ return getSeverityText();
+ }
+ /**
+ * @see IWorkbenchAdapter#getChildren(Object)
+ */
+ public Object[] getChildren(Object parent) {
+ if (children == null)
+ return new Object[0];
+ return children.toArray();
+ }
+
+ /**
+ * @see IWorkbenchAdapter#getImageDescriptor(Object)
+ */
+ public ImageDescriptor getImageDescriptor(Object arg0) {
+ return null;
+ }
+
+ /**
+ * @see IWorkbenchAdapter#getLabel(Object)
+ */
+ public String getLabel(Object obj) {
+ return getSeverityText();
+ }
+
+ /**
+ * @see IWorkbenchAdapter#getParent(Object)
+ */
+ public Object getParent(Object obj) {
+ return parent;
+ }
+
+ void setParent(LogEntry parent) {
+ this.parent = parent;
+ }
+
+ private String getSeverityText(int severity) {
+ switch (severity) {
+ case IStatus.ERROR :
+ return XDebugUIPlugin.getString(KEY_ERROR);
+ case IStatus.WARNING :
+ return XDebugUIPlugin.getString(KEY_WARNING);
+ case IStatus.INFO :
+ return XDebugUIPlugin.getString(KEY_INFO);
+ }
+ return "?"; //$NON-NLS-1$
+ }
+
+ int processLogLine(String line, boolean root) {
+ //!ENTRY <pluginID> <severity> <code> <date>
+ //!SUBENTRY <depth> <pluginID> <severity> <code> <date>
+ StringTokenizer stok = new StringTokenizer(line, " ", true); //$NON-NLS-1$
+ StringBuffer dateBuffer = new StringBuffer();
+
+ int dateCount = 5;
+ int depth = 0;
+ for (int i = 0; stok.hasMoreTokens();) {
+ String token = stok.nextToken();
+ if (i >= dateCount) {
+ dateBuffer.append(token);
+ continue;
+ } else if (token.equals(" ")) //$NON-NLS-1$
+ continue;
+ switch (i) {
+ case 0 : // entry or subentry
+ if (root)
+ i += 2;
+ else
+ i++;
+ break;
+ case 1 : // depth
+ depth = parseInteger(token);
+ i++;
+ break;
+ case 2 :
+ pluginId = token;
+ i++;
+ break;
+ case 3 : // severity
+ severity = parseInteger(token);
+ i++;
+ break;
+ case 4 : // code
+ code = parseInteger(token);
+ i++;
+ break;
+ }
+ }
+ date = dateBuffer.toString().trim();
+ return depth;
+ }
+
+ private int parseInteger(String token) {
+ try {
+ return Integer.parseInt(token);
+ } catch (NumberFormatException e) {
+ return 0;
+ }
+ }
+
+ void setStack(String stack) {
+ this.stack = stack;
+ }
+ void setMessage(String message) {
+ this.message = message;
+ }
+
+ private void processStatus(IStatus status) {
+ pluginId = status.getPlugin();
+ severity = status.getSeverity();
+ code = status.getCode();
+ DateFormat formatter = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss.SS"); //$NON-NLS-1$
+ date = formatter.format(new Date());
+ message = status.getMessage();
+ Throwable throwable = status.getException();
+ if (throwable != null) {
+ StringWriter swriter = new StringWriter();
+ PrintWriter pwriter = new PrintWriter(swriter);
+ throwable.printStackTrace(pwriter);
+ pwriter.flush();
+ pwriter.close();
+ stack = swriter.toString();
+ }
+ IStatus[] schildren = status.getChildren();
+ if (schildren.length > 0) {
+ children = new ArrayList();
+ for (int i = 0; i < schildren.length; i++) {
+ LogEntry child = new LogEntry(schildren[i]);
+ addChild(child);
+ }
+ }
+ }
+ void addChild(LogEntry child) {
+ if (children == null)
+ children = new ArrayList();
+ children.add(child);
+ child.setParent(this);
+ }
+ public void write(PrintWriter writer) {
+ writer.print(getSeverityText());
+ if (date != null) {
+ writer.print(" "); //$NON-NLS-1$
+ writer.print(getDate());
+ }
+ if (message != null) {
+ writer.print(" "); //$NON-NLS-1$
+ writer.print(getMessage());
+ }
+ writer.println();
+ if (stack != null)
+ writer.println(stack);
+ }
+}