Fix missed files from cvs to svn migration. again!
[phpeclipse.git] / net.sourceforge.phpeclipse.xdebug.ui / src / net / sourceforge / phpeclipse / xdebug / ui / views / logview / LogReader.java
diff --git a/net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/views/logview/LogReader.java b/net.sourceforge.phpeclipse.xdebug.ui/src/net/sourceforge/phpeclipse/xdebug/ui/views/logview/LogReader.java
new file mode 100644 (file)
index 0000000..7a33d18
--- /dev/null
@@ -0,0 +1,308 @@
+/*******************************************************************************
+ * 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.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.RandomAccessFile;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Date;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.ui.IMemento;
+
+class LogReader {
+       private static final int SESSION_STATE = 10;
+       public static final long MAX_FILE_LENGTH = 1024*1024;
+       private static final int ENTRY_STATE = 20;
+       private static final int SUBENTRY_STATE = 30;
+       private static final int MESSAGE_STATE = 40;
+       private static final int STACK_STATE = 50;
+       private static final int TEXT_STATE = 60;
+       private static final int UNKNOWN_STATE = 70;
+       
+       private static LogSession currentSession;
+       
+       public static void parseLargeFile(File file, ArrayList entries, IMemento memento) {
+               ArrayList parents = new ArrayList();
+               LogEntry current = null;
+               LogSession session = null;
+               int writerState = UNKNOWN_STATE;
+               StringWriter swriter = null;
+               PrintWriter writer = null;
+               int state = UNKNOWN_STATE;
+               currentSession = null;
+               RandomAccessFile random = null;
+               try {
+                       random = new RandomAccessFile(file, "r"); //$NON-NLS-1$
+                       random.seek(file.length() - MAX_FILE_LENGTH);
+                       for (;;) {
+                               String line = random.readLine();
+                               if (line == null)
+                                       break;
+                               
+                               line = line.trim();
+                               if (line.length() == 0)
+                                       continue;
+
+                               if (line.startsWith("!SESSION")) { //$NON-NLS-1$
+                                       state = SESSION_STATE;
+                               } else if (line.startsWith("!ENTRY")) { //$NON-NLS-1$
+                                       state = ENTRY_STATE;
+                               } else if (line.startsWith("!SUBENTRY")) { //$NON-NLS-1$
+                                       state = SUBENTRY_STATE;
+                               } else if (line.startsWith("!MESSAGE")) { //$NON-NLS-1$
+                                       state = MESSAGE_STATE;
+                               } else if (line.startsWith("!STACK")) { //$NON-NLS-1$
+                                       state = STACK_STATE;
+                               } else
+                                       state = TEXT_STATE;
+                       
+                               if (state == TEXT_STATE) {
+                                       if (writer != null)
+                                               writer.println(line);
+                                       continue;
+                               }
+                       
+                               if (writer != null) {
+                                       if (writerState == STACK_STATE && current != null) {
+                                               current.setStack(swriter.toString());
+                                       } else if (writerState == SESSION_STATE && session != null) {
+                                               session.setSessionData(swriter.toString());
+                                       } else if (writerState == MESSAGE_STATE && current != null){
+                                               String message = current.getMessage() + swriter.toString();
+                                               message = message.trim();
+                                               current.setMessage(message);
+                                       }
+                                       writerState = UNKNOWN_STATE;
+                                       swriter = null;
+                                       writer.close();
+                                       writer = null;
+                               }
+                       
+                               if (state == STACK_STATE) {
+                                       swriter = new StringWriter();
+                                       writer = new PrintWriter(swriter, true);
+                                       writerState = STACK_STATE;
+                               } else if (state == SESSION_STATE) {
+                                       session = new LogSession();
+                                       session.processLogLine(line);
+                                       swriter = new StringWriter();
+                                       writer = new PrintWriter(swriter, true);
+                                       writerState = SESSION_STATE;
+                                       updateCurrentSession(session);
+                                       if (currentSession.equals(session) && !memento.getString(LogView.P_SHOW_ALL_SESSIONS).equals("true")) //$NON-NLS-1$
+                                               entries.clear();
+                               } else if (state == ENTRY_STATE) {
+                                       LogEntry entry = new LogEntry();
+                                       entry.setSession(session);
+                                       entry.processLogLine(line, true);
+                                       setNewParent(parents, entry, 0);
+                                       current = entry;
+                                       addEntry(current, entries, memento, false);
+                               } else if (state == SUBENTRY_STATE) {
+                                       LogEntry entry = new LogEntry();
+                                       entry.setSession(session);
+                                       int depth = entry.processLogLine(line, false);
+                                       setNewParent(parents, entry, depth);
+                                       current = entry;
+                                       LogEntry parent = (LogEntry) parents.get(depth - 1);
+                                       parent.addChild(entry);
+                               } else if (state == MESSAGE_STATE) {
+                                       swriter = new StringWriter();
+                                       writer = new PrintWriter(swriter, true);
+                                       String message = ""; //$NON-NLS-1$
+                                       if (line.length() > 8)
+                                               message = line.substring(9).trim();
+                                       message = message.trim();
+                                       if (current != null)
+                                               current.setMessage(message);
+                                       writerState = MESSAGE_STATE;
+                               }
+                       }
+               } catch (FileNotFoundException e) {
+               } catch (IOException e) {
+               } finally {
+                       try {
+                               if (random != null)
+                                       random.close();
+                       } catch (IOException e1) {
+                       }
+               }
+       }
+       
+       public static void parseLogFile(File file, ArrayList entries, IMemento memento) {
+               ArrayList parents = new ArrayList();
+               LogEntry current = null;
+               LogSession session = null;
+               int writerState = UNKNOWN_STATE;
+               StringWriter swriter = null;
+               PrintWriter writer = null;
+               int state = UNKNOWN_STATE;
+               currentSession = null;
+               BufferedReader reader = null;
+               try {
+                                       
+                       reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); //$NON-NLS-1$
+                       while(reader.ready()) {
+                               String line = reader.readLine();
+                               if (line == null)
+                                       continue;
+                               line = line.trim();
+                               if (line.length() == 0)
+                                       continue;
+
+                               if (line.startsWith("!SESSION")) { //$NON-NLS-1$
+                                       state = SESSION_STATE;
+                               } else if (line.startsWith("!ENTRY")) { //$NON-NLS-1$
+                                       state = ENTRY_STATE;
+                               } else if (line.startsWith("!SUBENTRY")) { //$NON-NLS-1$
+                                       state = SUBENTRY_STATE;
+                               } else if (line.startsWith("!MESSAGE")) { //$NON-NLS-1$
+                                       state = MESSAGE_STATE;
+                               } else if (line.startsWith("!STACK")) { //$NON-NLS-1$
+                                       state = STACK_STATE;
+                               } else
+                                       state = TEXT_STATE;
+                       
+                               if (state == TEXT_STATE) {
+                                       if (writer != null)
+                                               writer.println(line);
+                                       continue;
+                               }
+                       
+                               if (writer != null) {
+                                       if (writerState == STACK_STATE && current != null) {
+                                               current.setStack(swriter.toString());
+                                       } else if (writerState == SESSION_STATE && session != null) {
+                                               session.setSessionData(swriter.toString());
+                                       } else if (writerState == MESSAGE_STATE && current != null){
+                                               String message = current.getMessage() + swriter.toString();
+                                               message = message.trim();
+                                               current.setMessage(message);
+                                       }
+                                       writerState = UNKNOWN_STATE;
+                                       swriter = null;
+                                       writer.close();
+                                       writer = null;
+                               }
+                       
+                               if (state == STACK_STATE) {
+                                       swriter = new StringWriter();
+                                       writer = new PrintWriter(swriter, true);
+                                       writerState = STACK_STATE;
+                               } else if (state == SESSION_STATE) {
+                                       session = new LogSession();
+                                       session.processLogLine(line);
+                                       swriter = new StringWriter();
+                                       writer = new PrintWriter(swriter, true);
+                                       writerState = SESSION_STATE;
+                                       updateCurrentSession(session);
+                                       if (currentSession.equals(session) && !memento.getString(LogView.P_SHOW_ALL_SESSIONS).equals("true")) //$NON-NLS-1$
+                                               entries.clear();
+                               } else if (state == ENTRY_STATE) {
+                                       LogEntry entry = new LogEntry();
+                                       entry.setSession(session);
+                                       entry.processLogLine(line, true);
+                                       setNewParent(parents, entry, 0);
+                                       current = entry;
+                                       addEntry(current, entries, memento, false);
+                               } else if (state == SUBENTRY_STATE) {
+                                       LogEntry entry = new LogEntry();
+                                       entry.setSession(session);
+                                       int depth = entry.processLogLine(line, false);
+                                       setNewParent(parents, entry, depth);
+                                       current = entry;
+                                       LogEntry parent = (LogEntry) parents.get(depth - 1);
+                                       parent.addChild(entry);
+                               } else if (state == MESSAGE_STATE) {
+                                       swriter = new StringWriter();
+                                       writer = new PrintWriter(swriter, true);
+                                       String message = ""; //$NON-NLS-1$
+                                       if (line.length() > 8)
+                                               message = line.substring(9).trim();
+                                       message = message.trim();
+                                       if (current != null)
+                                               current.setMessage(message);
+                                       writerState = MESSAGE_STATE;
+                               }
+                       }
+               } catch (FileNotFoundException e) {
+               } catch (IOException e) {
+               } finally {
+                       try {
+                               if (reader != null)
+                                       reader.close();
+                       } catch (IOException e1) {
+                       }
+               }
+       }
+               
+       private static void updateCurrentSession(LogSession session) {
+               if (currentSession == null) {
+                       currentSession = session;
+                       return;
+               }               
+               Date currentDate = currentSession.getDate();
+               Date sessionDate = session.getDate();           
+               if (currentDate == null && sessionDate != null)
+                       currentSession = session;
+               else if (currentDate != null && sessionDate == null)
+                       currentSession = session;
+               else if (currentDate != null && sessionDate != null && sessionDate.after(currentDate))
+                       currentSession = session;       
+       }
+       
+       public static void addEntry(LogEntry current, ArrayList entries, IMemento memento, boolean useCurrentSession) {
+               int severity = current.getSeverity();
+               boolean doAdd = true;
+               switch(severity) {
+                       case IStatus.INFO:
+                               doAdd = memento.getString(LogView.P_LOG_INFO).equals("true"); //$NON-NLS-1$
+                               break;
+                       case IStatus.WARNING:
+                               doAdd = memento.getString(LogView.P_LOG_WARNING).equals("true"); //$NON-NLS-1$
+                               break;
+                       case IStatus.ERROR:
+                               doAdd = memento.getString(LogView.P_LOG_ERROR).equals("true"); //$NON-NLS-1$
+                               break;
+               }
+               if (doAdd) {
+                       if (useCurrentSession)
+                               current.setSession(currentSession);
+                       entries.add(0, current);
+                       
+                       if (memento.getString(LogView.P_USE_LIMIT).equals("true") //$NON-NLS-1$
+                               && entries.size() > memento.getInteger(LogView.P_LOG_LIMIT).intValue())
+                               entries.remove(entries.size() - 1);
+               }
+       }
+
+       private static void setNewParent(
+               ArrayList parents,
+               LogEntry entry,
+               int depth) {
+               if (depth + 1 > parents.size())
+                       parents.add(entry);
+               else
+                       parents.set(depth, entry);
+       }
+       
+       public static void reset() {
+               currentSession = null;
+       }
+}