From: axelcl <axelcl>
Date: Mon, 25 Oct 2004 18:43:03 +0000 (+0000)
Subject: inital plugin from webtools project
X-Git-Url: http://git.phpeclipse.com?hp=a6ed2b371bd3377ddd086a415b506c1f41fe46ac

inital plugin from webtools project
---

diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/.classpath b/archive/net.sourceforge.phpeclipse.monitor.core/.classpath
new file mode 100644
index 0000000..065ac06
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/.project b/archive/net.sourceforge.phpeclipse.monitor.core/.project
new file mode 100644
index 0000000..fe0dafd
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>net.sourceforge.phpeclipse.monitor.core</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/build.properties b/archive/net.sourceforge.phpeclipse.monitor.core/build.properties
new file mode 100644
index 0000000..32a2141
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/build.properties
@@ -0,0 +1,10 @@
+bin.includes = plugin.xml,\
+               *.jar,\
+               monitorcore.jar,\
+               plugin.properties,\
+               .options
+jars.compile.order = 
+src.includes = build.properties,\
+               schema/
+output.monitorcore.jar = bin/
+source.monitorcore.jar = monitorcore/
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/plugin.properties b/archive/net.sourceforge.phpeclipse.monitor.core/plugin.properties
new file mode 100644
index 0000000..3b31ca7
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/plugin.properties
@@ -0,0 +1,12 @@
+pluginName=Monitor
+providerName=IBM
+
+# --------------- Errors ---------------
+errorPortInUse=The TCP/IP monitor could not start because the port is in use.
+
+extensionPointProtocolAdapters=Protocol Adapters
+extensionPointContentFilters=Content Filters
+extensionPointRequestListeners=Request Listeners
+
+HTTP=HTTP
+TCPIP=TCP/IP
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/plugin.xml b/archive/net.sourceforge.phpeclipse.monitor.core/plugin.xml
new file mode 100644
index 0000000..f536ed5
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/plugin.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<plugin id="net.sourceforge.phpeclipse.monitor.core"
+  name="%pluginName"
+  version="3.0.0"
+  provider-name="%providerName"
+  class="net.sourceforge.phpdt.monitor.core.internal.MonitorPlugin">
+
+<requires>
+  <import plugin="org.eclipse.core.runtime" version="3.0.0" match="equivalent"/>
+  <import plugin="org.eclipse.ui" version="3.0.0" match="equivalent"/>
+</requires>
+
+<runtime>
+  <library name="monitorcore.jar">
+    <export name="*"/>
+    <packages prefixes="net.sourceforge.phpdt.monitor.core"/>
+  </library>
+</runtime>
+
+<extension-point name="%extensionPointProtocolAdapters" id="protocolAdapters" schema="schema/protocolAdapters.exsd"/>
+<extension-point name="%extensionPointContentFilters" id="contentFilters" schema="schema/contentFilters.exsd"/>
+<extension-point name="%extensionPointRequestListeners" id="requestListeners" schema="schema/requestListeners.exsd"/>
+
+<extension point="net.sourceforge.phpeclipse.monitor.core.protocolAdapters">
+  <protocolAdapter
+    id="TCPIP"
+    class="net.sourceforge.phpdt.monitor.core.internal.TCPIPProtocolAdapter"
+    name="%TCPIP"/>
+  <protocolAdapter
+    id="HTTP"
+    class="net.sourceforge.phpdt.monitor.core.internal.http.HTTPProtocolAdapter"
+    name="%HTTP"/>
+</extension>
+
+</plugin>
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/schema/contentFilters.exsd b/archive/net.sourceforge.phpeclipse.monitor.core/schema/contentFilters.exsd
new file mode 100644
index 0000000..49fd747
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/schema/contentFilters.exsd
@@ -0,0 +1,127 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="net.sourceforge.phpeclipse.monitor.core">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="net.sourceforge.phpeclipse.monitor.core" id="contentFilters" name="Content Filters"/>
+      </appInfo>
+      <documentation>
+         This extension point is used to filter content received in a monitor.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="filter" minOccurs="0" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="filter">
+      <annotation>
+         <appInfo>
+            <meta.element labelAttribute="name"/>
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+         </sequence>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  specifies a unique identifier for this extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  specifies the fully qualified name of a Java class that implements &lt;samp&gt;net.sourceforge.phpeclipse.monitor.core.IContentFilterDelegate&lt;/samp&gt;.
+Content filter instances of this type will delegate to instances of this class.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="net.sourceforge.phpeclipse.monitor.core.Idd"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a translatable name used to identify the filter
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="order" type="string">
+            <annotation>
+               <documentation>
+                  a integer used to order filters relative to each other
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         The following is an example of a content filter extension point:
+
+&lt;p&gt;
+&lt;pre&gt;
+ &lt;extension point=&quot;net.sourceforge.phpeclipse.monitor.core.contentFilter&quot;&gt;
+  &lt;filter
+   id=&quot;com.example.ExampleIdentifier&quot;
+   name=&quot;%exampleName&quot;
+   class=&quot;com.example.ExampleContentFilter&quot;/&gt;
+ &lt;/extension&gt;
+&lt;/pre&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;org.eclipse.monitor.core.IContentFilterDelegate&lt;/b&gt;.
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2000, 2003 IBM Corporation and others.&lt;br&gt;
+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 
+&lt;a href=&quot;http://www.eclipse.org/legal/cpl-v10.html&quot;&gt;http://www.eclipse.org/legal/cpl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/schema/protocolAdapters.exsd b/archive/net.sourceforge.phpeclipse.monitor.core/schema/protocolAdapters.exsd
new file mode 100644
index 0000000..f6ae97a
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/schema/protocolAdapters.exsd
@@ -0,0 +1,123 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="net.sourceforge.phpeclipse.monitor.core">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="net.sourceforge.phpeclipse.monitor.core" id="protocolAdapters" name="Protocol Adapters"/>
+      </appInfo>
+      <documentation>
+         This extension point is used to provide an adapter for a new protocol (e.g. HTTP). This allows different types of protocols to be monitored.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="protocolAdapter" minOccurs="0" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="protocolAdapter">
+      <annotation>
+         <appInfo>
+            <meta.element labelAttribute="name"/>
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+         </sequence>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  specifies a unique identifier for this extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  specifies the fully qualified name of the Java class that implements &lt;samp&gt;net.sourceforge.phpeclipse.monitor.core.IProtocolAdapter&lt;/samp&gt;
+Protocol adapter instances of this type will delegate to instances of this class.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="net.sourceforge.phpdteclipse.monitor.core.IParser"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a translatable name used to identify the protocol adapter
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         The following is an example of a protocol adapter extension point:
+
+&lt;p&gt;
+&lt;pre&gt;
+&lt;extension point=&quot;net.sourceforge.phpeclipse.monitor.core.protocolAdapters&quot;&gt;
+  &lt;protocolAdapter
+    id=&quot;TCPIP&quot;
+    class=&quot;com.example.TCPIPProtocolAdapter&quot;
+    name=&quot;%TCPIP&quot;/&gt;
+&lt;/extension&gt;
+&lt;/pre&gt;
+&lt;/p&gt;
+
+In the example above,
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;net.sourceforge.phpeclipse.monitor.core.IProtocolAdapterDelegate&lt;/b&gt;.
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2000, 2003 IBM Corporation and others.&lt;br&gt;
+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 
+&lt;a href=&quot;http://www.eclipse.org/legal/cpl-v10.html&quot;&gt;http://www.eclipse.org/legal/cpl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/schema/requestListeners.exsd b/archive/net.sourceforge.phpeclipse.monitor.core/schema/requestListeners.exsd
new file mode 100644
index 0000000..cf4c0c5
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/schema/requestListeners.exsd
@@ -0,0 +1,115 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="net.sourceforge.phpeclipse.monitor.core">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="net.sourceforge.phpeclipse.monitor.core" id="requestListeners" name="Request Listeners"/>
+      </appInfo>
+      <documentation>
+         This extension point is used to listen for new monitor traffic (requests), or changes to existing requests. The extension point will be called whenever the monitor adds, changes, or removes a request.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="requestListener" minOccurs="0" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="requestListener">
+      <annotation>
+         <appInfo>
+            <meta.element labelAttribute="name"/>
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+         </sequence>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  specifies a unique identifier for this extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  specifies the fully qualified name of the Java class that implements &lt;samp&gt;net.sourceforge.phpdt.monitor.core.IRequestListener&lt;/samp&gt;
+RequestListener instances of this type will delegate to instances of this class.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="net.sourceforge.phpdt.monitor.core.IParser"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         The following is an example of a request listener extension point:
+
+&lt;p&gt;
+&lt;pre&gt;
+&lt;extension point=&quot;net.sourceforge.phpdt.monitor.core.requestListeners&quot;&gt;
+  &lt;requestListener
+    id=&quot;com.example.requestListener&quot;
+    class=&quot;com.example.MyRequestListener&quot;/&gt;
+&lt;/extension&gt;
+&lt;/pre&gt;
+&lt;/p&gt;
+
+In the example above,
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;net.sourceforge.phpdt.monitor.core.IRequestListener&lt;/b&gt;.
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2000, 2003 IBM Corporation and others.&lt;br&gt;
+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 
+&lt;a href=&quot;http://www.eclipse.org/legal/cpl-v10.html&quot;&gt;http://www.eclipse.org/legal/cpl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IContentFilter.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IContentFilter.java
new file mode 100644
index 0000000..06e8b35
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IContentFilter.java
@@ -0,0 +1,25 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core;
+
+import java.io.IOException;
+/**
+ * 
+ */
+public interface IContentFilter {
+	public String getId();
+
+	public String getName();
+	
+	public int getOrder();
+
+	public byte[] filter(IRequest request, boolean isRequest, byte[] b) throws IOException;
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IContentFilterDelegate.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IContentFilterDelegate.java
new file mode 100644
index 0000000..5e6a6fd
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IContentFilterDelegate.java
@@ -0,0 +1,19 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core;
+
+import java.io.IOException;
+/**
+ * 
+ */
+public interface IContentFilterDelegate {
+	public byte[] filter(IRequest request, boolean isRequest, byte[] b) throws IOException;
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IMonitor.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IMonitor.java
new file mode 100644
index 0000000..6effe53
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IMonitor.java
@@ -0,0 +1,33 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core;
+/**
+ * 
+ */
+public interface IMonitor {
+	public String getId();
+
+	public String getRemoteHost();
+	
+	public int getRemotePort();
+	
+	public int getLocalPort();
+	
+	public IProtocolAdapter getProtocolAdapter();
+	
+	public boolean isRunning();
+	
+	public void delete();
+	
+	public boolean isWorkingCopy();
+	
+	public IMonitorWorkingCopy getWorkingCopy();
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IMonitorListener.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IMonitorListener.java
new file mode 100644
index 0000000..7e12601
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IMonitorListener.java
@@ -0,0 +1,21 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core;
+/**
+ * 
+ */
+public interface IMonitorListener {
+	public void monitorAdded(IMonitor monitor);
+	
+	public void monitorChanged(IMonitor monitor);
+	
+	public void monitorRemoved(IMonitor monitor);
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IMonitorWorkingCopy.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IMonitorWorkingCopy.java
new file mode 100644
index 0000000..f7f0c05
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IMonitorWorkingCopy.java
@@ -0,0 +1,27 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core;
+/**
+ * 
+ */
+public interface IMonitorWorkingCopy extends IMonitor {
+	public void setId(String id);
+
+	public void setRemoteHost(String host);
+	
+	public void setRemotePort(int port);
+	
+	public void setLocalPort(int port);
+	
+	public void setProtocolAdapter(IProtocolAdapter type);
+	
+	public IMonitor save();
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IProtocolAdapter.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IProtocolAdapter.java
new file mode 100644
index 0000000..04b96b1
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IProtocolAdapter.java
@@ -0,0 +1,19 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core;
+/**
+ * 
+ */
+public interface IProtocolAdapter {
+	public String getId();
+	
+	public String getName();
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IProtocolAdapterDelegate.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IProtocolAdapterDelegate.java
new file mode 100644
index 0000000..1394d59
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IProtocolAdapterDelegate.java
@@ -0,0 +1,20 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core;
+
+import java.io.IOException;
+import java.net.Socket;
+/**
+ * 
+ */
+public interface IProtocolAdapterDelegate {
+	public void parse(IMonitor monitor, Socket in, Socket out) throws IOException;
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IRequest.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IRequest.java
new file mode 100644
index 0000000..b60f970
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IRequest.java
@@ -0,0 +1,109 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core;
+
+import java.util.Date;
+/**
+ * 
+ */
+public interface IRequest {
+	public static final byte TRANSPORT = 1;
+	public static final byte CONTENT = 2;
+	public static final byte ALL = 3;
+
+	/**
+	 * Return the type of the request.
+	 * 
+	 * @return net.sourceforge.phpdt.monitor.core.IType
+	 */
+	public IProtocolAdapter getType();
+
+	/**
+	 * Return the date/time of this request.
+	 *
+	 * @return java.util.Date
+	 */
+	public Date getDate();
+
+	/**
+	 * Returns the local port.
+	 *
+	 * @return int
+	 */
+	public int getLocalPort();
+
+	/**
+	 * Returns the remote host.
+	 *
+	 * @return java.lang.String
+	 */
+	public String getRemoteHost();
+
+	/**
+	 * Returns the remote port.
+	 *
+	 * @return int
+	 */
+	public int getRemotePort();
+
+	/**
+	 * Returns the request as a byte array.
+	 *
+	 * @return byte[]
+	 */
+	public byte[] getRequest(byte type);
+
+	/**
+	 * Returns the response as a byte array.
+	 *
+	 * @return byte[]
+	 */
+	public byte[] getResponse(byte type);
+
+	/**
+	 * Returns the response time in milliseconds.
+	 *
+	 * @return long
+	 */
+	public long getResponseTime();
+
+	/**
+	 * Returns a label for this request.
+	 *
+	 * @return java.lang.String
+	 */
+	public String getLabel();
+
+	/**
+	 * 
+	 */
+	public void addProperty(String key, Object value);
+
+	/**
+	 * 
+	 */
+	public String getStringProperty(String key);
+
+	/**
+	 * 
+	 */
+	public Integer getIntegerProperty(String key);
+
+	/**
+	 * 
+	 */
+	public Object getObjectProperty(String key);
+	
+	/**
+	 * 
+	 */
+	public void fireChangedEvent();
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IRequestListener.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IRequestListener.java
new file mode 100644
index 0000000..9e3dc96
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/IRequestListener.java
@@ -0,0 +1,36 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core;
+/**
+ * A listener for changes to the requests.
+ */
+public interface IRequestListener {
+	/**
+	 * The given request has been added to the list.
+	 * 
+	 * @param rr
+	 */
+	public void requestAdded(IRequest rr);
+	
+	/**
+	 * The given request has been changed.
+	 * 
+	 * @param rr
+	 */
+	public void requestChanged(IRequest rr);
+	
+	/**
+	 * The given request is been removed from the list.
+	 * 
+	 * @param rr
+	 */
+	public void requestRemoved(IRequest rr);
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/MonitorCore.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/MonitorCore.java
new file mode 100644
index 0000000..13d92ea
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/MonitorCore.java
@@ -0,0 +1,186 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.InputStreamReader;
+import java.util.List;
+
+import net.sourceforge.phpdt.monitor.core.internal.MonitorManager;
+import net.sourceforge.phpdt.monitor.core.internal.MonitorPlugin;
+import net.sourceforge.phpdt.monitor.core.internal.Trace;
+/**
+ * 
+ */
+public class MonitorCore {
+	public static String TCPIP_PROTOCOL_ID = "TCPIP";
+	public static String HTTP_PROTOCOL_ID = "HTTP";
+
+	private static MonitorManager manager = MonitorManager.getInstance();
+	
+	private static final String lineSeparator = System.getProperty("line.separator");
+	
+	/**
+	 * Return a list of all the existing monitors.
+	 * 
+	 * @return java.util.List
+	 */
+	public static List getMonitors() {
+		return manager.getMonitors();
+	}
+	
+	/**
+	 * Create a new monitor.
+	 * 
+	 * @return working copy
+	 */
+	public static IMonitorWorkingCopy createMonitor() {
+		return manager.createMonitor();
+	}
+	
+	/**
+	 * Start the given monitor.
+	 * 
+	 * @param monitor
+	 * @throws Exception
+	 */
+	public static void startMonitor(IMonitor monitor) throws Exception {
+		manager.startMonitor(monitor);
+	}
+	
+	/**
+	 * Stop the given monitor.
+	 * 
+	 * @param monitor
+	 */
+	public static void stopMonitor(IMonitor monitor) {
+		manager.stopMonitor(monitor);
+	}
+	
+	/**
+	 * Return the protocol adapters.
+	 * 
+	 * @return array of protocol adapters
+	 */
+	public static IProtocolAdapter[] getProtocolAdapters() {
+		return MonitorPlugin.getInstance().getProtocolAdapters();
+	}
+	
+	/**
+	 * Return the protocol adapter with the given id.
+	 * 
+	 * @return protocol adapter
+	 */
+	public static IProtocolAdapter getProtocolAdapter(String id) {
+		return MonitorPlugin.getInstance().getProtocolAdapter(id);
+	}
+	
+	/**
+	 * Return the content filters.
+	 * 
+	 * @return array of content filters
+	 */
+	public static IContentFilter[] getContentFilters() {
+		return MonitorPlugin.getInstance().getContentFilters();
+	}
+	
+	/**
+	 * Return the content filter with the given id.
+	 * 
+	 * @return content filter
+	 */
+	public static IContentFilter getContentFilter(String id) {
+		return MonitorPlugin.getInstance().getContentFilter(id);
+	}
+	
+	/**
+	 * Add monitor listener.
+	 * 
+	 * @param listener
+	 */
+	public static void addMonitorListener(IMonitorListener listener) {
+		manager.addMonitorListener(listener);
+	}
+
+	/**
+	 * Remove monitor listener.
+	 * 
+	 * @param listener
+	 */
+	public static void removeMonitorListener(IMonitorListener listener) {
+		manager.removeMonitorListener(listener);
+	}
+
+	/**
+	 * Return all requests.
+	 * 
+	 * @return
+	 */
+	public static List getRequests() {
+		return manager.getRequests();
+	}
+	
+	/**
+	 * Remove all requests.
+	 */
+	public static void removeAllRequests() {
+		manager.removeAllRequests();
+	}
+	
+	/**
+	 * Add request listener.
+	 * 
+	 * @param listener
+	 */
+	public static void addRequestListener(IRequestListener listener) {
+		manager.addRequestListener(listener);
+	}
+
+	/**
+	 * Remove request listener.
+	 * 
+	 * @param listener
+	 */
+	public static void removeRequestListener(IRequestListener listener) {
+		manager.removeRequestListener(listener);
+	}
+	
+	/**
+	 * Parse the given bytes into String form.
+	 * 
+	 * @param b
+	 * @return
+	 */
+	public static String parse(byte[] b) {
+		if (b == null)
+			return "";
+
+		ByteArrayInputStream bin = new ByteArrayInputStream(b);
+		BufferedReader br = new BufferedReader(new InputStreamReader(bin));
+		StringBuffer sb = new StringBuffer();
+		try {
+			String s = br.readLine();
+			
+			while (s != null) {
+				sb.append(s);
+				s = br.readLine();
+				if (s != null)
+					sb.append(lineSeparator);
+			}
+			sb.append(lineSeparator);
+		} catch (Exception e) {
+			Trace.trace(Trace.SEVERE, "Error parsing input", e);
+		}
+		
+		return sb.toString();
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/AcceptThread.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/AcceptThread.java
new file mode 100644
index 0000000..0b2d08d
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/AcceptThread.java
@@ -0,0 +1,123 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core.internal;
+
+import java.io.InterruptedIOException;
+import java.net.*;
+
+import net.sourceforge.phpdt.monitor.core.IMonitor;
+/**
+ * The actual TCP/IP monitoring server. This is a thread that
+ * listens on a port and relays a call to another server.
+ */
+public class AcceptThread {
+	protected IMonitor monitor;
+
+	protected boolean alive = true;
+	protected ServerSocket serverSocket;
+	
+	protected Thread thread;
+	
+	class ServerThread extends Thread {
+		/**
+		 * Actual running of the server proxy.
+		 */
+	   public void run() {
+		   // create a new server socket
+		   try {
+			   serverSocket = new ServerSocket(monitor.getLocalPort());
+			   serverSocket.setSoTimeout(2000);
+			   
+			   Trace.trace(Trace.FINEST, "Monitoring localhost:" + monitor.getLocalPort() + " -> " + monitor.getRemoteHost() + ":" + monitor.getRemotePort());
+		   } catch (Exception e) {
+			   Trace.trace(Trace.SEVERE, "Could not start monitoring");
+			   return;
+		   }
+		
+		   while (alive) {
+			   try {
+				   // accept the connection from the client
+				   Socket localSocket = serverSocket.accept();
+		
+				   // connect to the remote server
+				   Socket remoteSocket = new Socket(monitor.getRemoteHost(), monitor.getRemotePort());
+		
+				   // relay the call through
+				   ProtocolAdapter adapter = (ProtocolAdapter) monitor.getProtocolAdapter();
+				   adapter.parse(monitor, localSocket, remoteSocket);
+			   } catch (InterruptedIOException e) {
+			   	// do nothing
+			   } catch (Exception e) {
+				   if (alive)
+						Trace.trace(Trace.SEVERE, "Error while monitoring", e);
+			   }
+		   }
+	   }
+	}
+
+	/**
+	 * ServerMonitorThread constructor comment.
+	 */
+	public AcceptThread(IMonitor monitor) {
+		super();
+		this.monitor = monitor;
+	}
+	
+	public void startServer() {
+		if (thread != null)
+			return;
+		thread = new ServerThread();
+		thread.setDaemon(true);
+		thread.start();
+	}
+
+	public boolean isRunning() {
+		return (thread != null);
+	}
+
+	/**
+	 * Correctly close the server socket and shut down the server.
+	 */
+	public void stopServer() {
+		try {
+			alive = false;
+			thread = null;
+			serverSocket.close();
+		} catch (Exception e) {
+			Trace.trace(Trace.SEVERE, "Error stopping server", e);
+		}
+	}
+	
+	/**
+	 * Returns true if this port is in use.
+	 *
+	 * @return boolean
+	 * @param port int
+	 */
+	public static boolean isPortInUse(int port) {
+		ServerSocket s = null;
+		try {
+			s = new ServerSocket(port);
+		} catch (SocketException e) {
+			return true;
+		} catch (Exception e) {
+			return true;
+		} finally {
+			if (s != null) {
+				try {
+					s.close();
+				} catch (Exception e) { }
+			}
+		}
+
+		return false;
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/Connection.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/Connection.java
new file mode 100644
index 0000000..ef7eadc
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/Connection.java
@@ -0,0 +1,31 @@
+package net.sourceforge.phpdt.monitor.core.internal;
+
+import java.net.Socket;
+/**
+ * 
+ */
+public class Connection {
+	protected Socket in;
+	protected Socket out;
+	
+	public Connection(Socket in, Socket out) {
+		this.in = in;
+		this.out = out;
+	}
+
+	public void close() {
+		Trace.trace(Trace.FINEST, "Closing connection");
+		try {
+			in.getOutputStream().flush();
+			in.shutdownInput();
+			in.shutdownOutput();
+			
+			out.getOutputStream().flush();
+			out.shutdownInput();
+			out.shutdownOutput();
+			Trace.trace(Trace.FINEST, "Connection closed");
+		} catch (Exception ex) {
+			Trace.trace(Trace.WARNING, "Error closing connection " + this + " " + ex.getMessage());
+		}
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/ContentFilter.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/ContentFilter.java
new file mode 100644
index 0000000..f682619
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/ContentFilter.java
@@ -0,0 +1,58 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core.internal;
+
+import java.io.IOException;
+
+import net.sourceforge.phpdt.monitor.core.IContentFilter;
+import net.sourceforge.phpdt.monitor.core.IContentFilterDelegate;
+import net.sourceforge.phpdt.monitor.core.IRequest;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+/**
+ * 
+ */
+public class ContentFilter implements IContentFilter {
+	protected IConfigurationElement element;
+	protected IContentFilterDelegate delegate;
+	
+	protected ContentFilter(IConfigurationElement element) {
+		this.element = element;
+	}
+
+	public String getId() {
+		return element.getAttribute("id");
+	}
+	
+	public int getOrder() {
+		try {
+			return Integer.parseInt(element.getAttribute("order"));
+		} catch (Exception e) {
+			return 0;
+		}
+	}
+
+	public String getName() {
+		return element.getAttribute("name");
+	}
+
+	public byte[] filter(IRequest request, boolean isRequest, byte[] b) throws IOException {
+		if (delegate == null) {
+			try {
+				delegate = (IContentFilterDelegate) element.createExecutableExtension("class");
+			} catch (Exception e) {
+				Trace.trace(Trace.SEVERE, "Could not create content filter delegate: " + getId(), e);
+				return new byte[0];
+			}
+		}
+		return delegate.filter(request, isRequest, b);
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/DefaultThread.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/DefaultThread.java
new file mode 100644
index 0000000..bd8c2a3
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/DefaultThread.java
@@ -0,0 +1,73 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core.internal;
+
+import java.io.*;
+/**
+ * Monitor server I/O thread.
+ */
+public class DefaultThread extends Thread {
+	private static final int BUFFER = 2048;
+	protected InputStream in;
+	protected OutputStream out;
+	protected boolean isRequest;
+	
+	protected Connection conn;
+	protected Request request;
+
+	/**
+	 * MonitorThread constructor comment.
+	 */
+	public DefaultThread(Connection conn, Request request, InputStream in, OutputStream out, boolean isRequest) {
+		super();
+		this.conn = conn;
+		this.request = request;
+		this.in = in;
+		this.out = out;
+		this.isRequest = isRequest;
+		setPriority(Thread.NORM_PRIORITY + 1);
+		setDaemon(true);
+	}
+
+	/**
+	 * Listen for input, save it, and pass to the output stream.
+	 */
+	public void run() {
+		try {
+			byte[] b = new byte[BUFFER];
+			int n = in.read(b);
+			while (n > 0) {
+				out.write(b, 0, n);
+				if (b != null && n > 0) {
+					byte[] x = null;
+					if (n == BUFFER)
+						x = b;
+					else {
+						x = new byte[n];
+						System.arraycopy(b, 0, x, 0, n);
+					}
+					if (isRequest)
+						request.addToRequest(x);
+					else
+						request.addToResponse(x);
+				}
+				n = in.read(b);
+				Thread.yield();
+			}
+			out.flush();
+		} catch (IOException e) {
+		} finally {
+			request.fireChangedEvent();
+			if (!isRequest)
+				conn.close();
+		}
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/IMemento.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/IMemento.java
new file mode 100644
index 0000000..25f0e77
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/IMemento.java
@@ -0,0 +1,192 @@
+/**********************************************************************
+ * Copyright (c) 2003 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.phpdt.monitor.core.internal;
+
+import java.util.List;
+/**
+ * Interface to a memento used for saving the important state of an object
+ * in a form that can be persisted in the file system.
+ * <p>
+ * Mementos were designed with the following requirements in mind:
+ * <ol>
+ *  <li>Certain objects need to be saved and restored across platform sessions.
+ *    </li>
+ *  <li>When an object is restored, an appropriate class for an object might not
+ *    be available. It must be possible to skip an object in this case.</li>
+ *  <li>When an object is restored, the appropriate class for the object may be
+ *    different from the one when the object was originally saved. If so, the
+ *    new class should still be able to read the old form of the data.</li>
+ * </ol>
+ * </p>
+ * <p>
+ * Mementos meet these requirements by providing support for storing a
+ * mapping of arbitrary string keys to primitive values, and by allowing
+ * mementos to have other mementos as children (arranged into a tree).
+ * A robust external storage format based on XML is used.
+ * </p><p>
+ * The key for an attribute may be any alpha numeric value.  However, the
+ * value of <code>TAG_ID</code> is reserved for internal use.
+ * </p><p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ *
+ * @see IPersistableElement
+ * @see IElementFactory
+ */
+public interface IMemento {
+	/**
+	 * Special reserved key used to store the memento id 
+	 * (value <code>"org.eclipse.ui.id"</code>).
+	 *
+	 * @see #getId
+	 */
+	public static final String TAG_ID = "IMemento.internal.id"; //$NON-NLS-1$
+
+	/**
+	 * Creates a new child of this memento with the given type.
+	 * <p>
+	 * The <code>getChild</code> and <code>getChildren</code> methods
+	 * are used to retrieve children of a given type.
+	 * </p>
+	 *
+	 * @param type the type
+	 * @return a new child memento
+	 * @see #getChild
+	 * @see #getChildren
+	 */
+	public IMemento createChild(String type);
+	
+	/**
+	 * Creates a new child of this memento with the given type and id.
+	 * The id is stored in the child memento (using a special reserved
+	 * key, <code>TAG_ID</code>) and can be retrieved using <code>getId</code>.
+	 * <p>
+	 * The <code>getChild</code> and <code>getChildren</code> methods
+	 * are used to retrieve children of a given type.
+	 * </p>
+	 *
+	 * @param type the type
+	 * @param id the child id
+	 * @return a new child memento with the given type and id
+	 * @see #getId
+	 */
+	public IMemento createChild(String type, String id);
+	
+	/**
+	 * Returns the first child with the given type id.
+	 *
+	 * @param type the type id
+	 * @return the first child with the given type
+	 */
+	public IMemento getChild(String type);
+	
+	/**
+	 * Returns all children with the given type id.
+	 *
+	 * @param type the type id
+	 * @return the list of children with the given type
+	 */
+	public IMemento[] getChildren(String type);
+	
+	/**
+	 * Returns the floating point value of the given key.
+	 *
+	 * @param key the key
+	 * @return the value, or <code>null</code> if the key was not found or was found
+	 *   but was not a floating point number
+	 */
+	public Float getFloat(String key);
+	
+	/**
+	 * Returns the id for this memento.
+	 *
+	 * @return the memento id, or <code>null</code> if none
+	 * @see #createChild(java.lang.String,java.lang.String)
+	 */
+	public String getId();
+	
+	/**
+	 * Returns the name for this memento.
+	 *
+	 * @return the memento name, or <code>null</code> if none
+	 * @see #createChild(java.lang.String,java.lang.String)
+	 */
+	public String getName();
+
+	/**
+	 * Returns the integer value of the given key.
+	 *
+	 * @param key the key
+	 * @return the value, or <code>null</code> if the key was not found or was found
+	 *   but was not an integer
+	 */
+	public Integer getInteger(String key);
+
+	/**
+	 * Returns the string value of the given key.
+	 *
+	 * @param key the key
+	 * @return the value, or <code>null</code> if the key was not found or was found
+	 *  but was not an integer
+	 */
+	public String getString(String key);
+
+	/**
+	 * Returns the boolean value of the given key.
+	 *
+	 * @param key the key
+	 * @return the value, or <code>null</code> if the key was not found or was found
+	 *  but was not a boolean
+	 */
+	public Boolean getBoolean(String key);
+	
+	public List getNames();
+	
+	/**
+	 * Sets the value of the given key to the given floating point number.
+	 *
+	 * @param key the key
+	 * @param value the value
+	 */
+	public void putFloat(String key, float value);
+	
+	/**
+	 * Sets the value of the given key to the given integer.
+	 *
+	 * @param key the key
+	 * @param value the value
+	 */
+	public void putInteger(String key, int value);
+	
+	/**
+	 * Sets the value of the given key to the given boolean value.
+	 *
+	 * @param key the key
+	 * @param value the value
+	 */
+	public void putBoolean(String key, boolean value);
+
+	/**
+	 * Copy the attributes and children from  <code>memento</code>
+	 * to the receiver.
+	 *
+	 * @param memento the IMemento to be copied.
+	 */
+	public void putMemento(IMemento memento);
+
+	/**
+	 * Sets the value of the given key to the given string.
+	 *
+	 * @param key the key
+	 * @param value the value
+	 */
+	public void putString(String key, String value);
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/Monitor.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/Monitor.java
new file mode 100644
index 0000000..4271d1c
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/Monitor.java
@@ -0,0 +1,115 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core.internal;
+
+import net.sourceforge.phpdt.monitor.core.*;
+/**
+ * 
+ */
+public class Monitor implements IMonitor {
+	private static final String MEMENTO_ID = "id";
+	private static final String MEMENTO_LOCAL_PORT = "local-port";
+	private static final String MEMENTO_REMOTE_HOST = "remote-host";
+	private static final String MEMENTO_REMOTE_PORT = "remote-port";
+	private static final String MEMENTO_TYPE_ID = "type-id";
+
+	protected String id;
+	protected String remoteHost;
+	protected int remotePort = 80;
+	protected int localPort = 80;
+	protected IProtocolAdapter type;
+	
+	public Monitor() {
+		type = MonitorPlugin.getInstance().getDefaultType();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.monitor.internal.IMonitor#getId()
+	 */
+	public String getId() {
+		return id;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.monitor.internal.IMonitor#getRemoteHost()
+	 */
+	public String getRemoteHost() {
+		return remoteHost;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.monitor.internal.IMonitor#getRemotePort()
+	 */
+	public int getRemotePort() {
+		return remotePort;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.monitor.internal.IMonitor#getLocalPort()
+	 */
+	public int getLocalPort() {
+		return localPort;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.monitor.internal.IMonitor#isHTTPEnabled()
+	 */
+	public IProtocolAdapter getProtocolAdapter() {
+		return type;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.monitor.internal.IMonitor#isRunning()
+	 */
+	public boolean isRunning() {
+		return MonitorManager.getInstance().isRunning(this);
+	}
+	
+	public void delete() {
+		MonitorManager.getInstance().removeMonitor(this);
+	}
+
+	public boolean isWorkingCopy() {
+		return false;
+	}
+	
+	public IMonitorWorkingCopy getWorkingCopy() {
+		return new MonitorWorkingCopy(this);
+	}
+	
+	protected void setInternal(IMonitor monitor) {
+		id = monitor.getId();
+		remoteHost = monitor.getRemoteHost();
+		remotePort = monitor.getRemotePort();
+		localPort = monitor.getLocalPort();
+		type = monitor.getProtocolAdapter();
+	}
+	
+	protected void save(IMemento memento) {
+		memento.putString(MEMENTO_ID, id);
+		memento.putString(MEMENTO_TYPE_ID, type.getId());
+		memento.putInteger(MEMENTO_LOCAL_PORT, localPort);
+		memento.putString(MEMENTO_REMOTE_HOST, remoteHost);
+		memento.putInteger(MEMENTO_REMOTE_PORT, remotePort);
+	}
+
+	protected void load(IMemento memento) {
+		id = memento.getString(MEMENTO_ID);
+		type = MonitorPlugin.getInstance().getProtocolAdapter(memento.getString(MEMENTO_TYPE_ID));
+		Integer temp = memento.getInteger(MEMENTO_LOCAL_PORT);
+		if (temp != null)
+			localPort = temp.intValue();
+		remoteHost = memento.getString(MEMENTO_REMOTE_HOST);
+		temp = memento.getInteger(MEMENTO_REMOTE_PORT);
+		if (temp != null)
+			remotePort = temp.intValue();
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/MonitorManager.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/MonitorManager.java
new file mode 100644
index 0000000..f846947
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/MonitorManager.java
@@ -0,0 +1,302 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core.internal;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import net.sourceforge.phpdt.monitor.core.*;
+
+import org.eclipse.core.runtime.Preferences;
+/**
+ * 
+ */
+public class MonitorManager {
+	private static final int ADD = 0;
+	private static final int CHANGE = 1;
+	private static final int REMOVE = 2;
+
+	// monitors
+	protected List monitors;
+	protected Map threads = new HashMap();
+	
+	protected List monitorListeners = new ArrayList();
+	
+	// requests
+	protected List requests = new ArrayList();
+	
+	protected List requestListeners = new ArrayList();
+	
+	private Preferences.IPropertyChangeListener pcl;
+	protected boolean ignorePreferenceChanges = false;
+	
+	protected static MonitorManager instance;
+	
+	public static MonitorManager getInstance() {
+		if (instance == null)
+			instance = new MonitorManager();
+		return instance;
+	}
+	
+	private MonitorManager() {
+		loadMonitors();
+		
+		pcl = new Preferences.IPropertyChangeListener() {
+			public void propertyChange(Preferences.PropertyChangeEvent event) {
+				if (ignorePreferenceChanges)
+					return;
+				String property = event.getProperty();
+				if (property.equals("monitors")) {
+					loadMonitors();
+				}
+			}
+		};
+		
+		MonitorPlugin.getInstance().getPluginPreferences().addPropertyChangeListener(pcl);
+	}
+	
+	protected void dispose() {
+		MonitorPlugin.getInstance().getPluginPreferences().removePropertyChangeListener(pcl);
+	}
+	
+	public IMonitorWorkingCopy createMonitor() {
+		return new MonitorWorkingCopy();
+	}
+	
+	public List getMonitors() {
+		return new ArrayList(monitors);
+	}
+
+	protected void addMonitor(IMonitor monitor) {
+		if (!monitors.contains(monitor))
+			monitors.add(monitor);
+		fireMonitorEvent(monitor, ADD);
+		saveMonitors();
+	}
+	
+	protected boolean isRunning(IMonitor monitor) {
+		return (threads.get(monitor) != null);
+	}
+
+	public void startMonitor(IMonitor monitor) throws Exception {
+		if (!monitors.contains(monitor))
+			return;
+		
+		if (AcceptThread.isPortInUse(monitor.getLocalPort()))
+			throw new Exception(MonitorPlugin.getString("%errorPortInUse"));
+		
+		AcceptThread thread = new AcceptThread(monitor);
+		thread.startServer();
+		threads.put(monitor, thread);
+	}
+	
+	public void stopMonitor(IMonitor monitor) {
+		if (!monitors.contains(monitor))
+			return;
+		
+		AcceptThread thread = (AcceptThread) threads.get(monitor);
+		if (thread != null) {
+			thread.stopServer();
+			threads.remove(monitor);
+		}
+	}
+	
+	protected void removeMonitor(IMonitor monitor) {
+		if (monitor.isRunning())
+			stopMonitor(monitor);
+		monitors.remove(monitor);
+		fireMonitorEvent(monitor, REMOVE);
+		saveMonitors();
+	}
+	
+	protected void monitorChanged(IMonitor monitor) {
+		fireMonitorEvent(monitor, CHANGE);
+		saveMonitors();
+	}
+	
+	/**
+	 * Add monitor listener.
+	 * 
+	 * @param listener
+	 */
+	public void addMonitorListener(IMonitorListener listener) {
+		monitorListeners.add(listener);
+	}
+
+	/**
+	 * Remove monitor listener.
+	 * 
+	 * @param listener
+	 */
+	public void removeMonitorListener(IMonitorListener listener) {
+		monitorListeners.remove(listener);
+	}
+	
+	/**
+	 * Fire a monitor event.
+	 * @param rr
+	 * @param type
+	 */
+	protected void fireMonitorEvent(IMonitor monitor, int type) {
+		Object[] obj = monitorListeners.toArray();
+		
+		int size = obj.length;
+		for (int i = 0; i < size; i++) {
+			IMonitorListener listener = (IMonitorListener) obj[i];
+			if (type == ADD)
+				listener.monitorAdded(monitor);
+			else if (type == CHANGE)
+				listener.monitorChanged(monitor);
+			else if (type == REMOVE)
+				listener.monitorRemoved(monitor);
+		}
+	}
+	
+	/**
+	 * Returns a list of the current requests.
+	 *
+	 * @return java.util.List
+	 */
+	public List getRequests() {
+		return requests;
+	}
+	
+	/**
+	 * Add a new request response pair.
+	 *
+	 * @param pair org.eclipse.tcpip.monitor.RequestResponse
+	 */
+	public void addRequest(IRequest rr) {
+		if (requests.contains(rr))
+			return;
+
+		requests.add(rr);
+		fireRequestEvent(rr, ADD);
+	}
+	
+	public void requestChanged(IRequest rr) {
+		fireRequestEvent(rr, CHANGE);
+	}
+	
+	public void removeRequest(IRequest rr) {
+		if (!requests.contains(rr))
+			return;
+
+		requests.remove(rr);
+		fireRequestEvent(rr, REMOVE);
+	}
+	
+	public void removeAllRequests() {
+		int size = requests.size();
+		IRequest[] rrs = new IRequest[size];
+		requests.toArray(rrs);
+		
+		for (int i = 0; i < size; i++) {
+			removeRequest(rrs[i]);
+		}
+	}
+	
+	/**
+	 * Add request listener.
+	 * 
+	 * @param listener
+	 */
+	public void addRequestListener(IRequestListener listener) {
+		requestListeners.add(listener);
+	}
+
+	/**
+	 * Remove request listener.
+	 * 
+	 * @param listener
+	 */
+	public void removeRequestListener(IRequestListener listener) {
+		requestListeners.remove(listener);
+	}
+
+	/**
+	 * Fire a request event.
+	 * @param rr
+	 * @param type
+	 */
+	protected void fireRequestEvent(IRequest rr, int type) {
+		int size = requestListeners.size();
+		IRequestListener[] xrl = MonitorPlugin.getInstance().getRequestListeners();
+		int size2 = xrl.length;
+		
+		IRequestListener[] rl = new IRequestListener[size + size2];
+		System.arraycopy(xrl, 0, rl, 0, size2);
+		for (int i = 0; i < size; i++)
+			rl[size2 + i] = (IRequestListener) requestListeners.get(i);
+
+		for (int i = 0; i < size + size2; i++) {
+			IRequestListener listener = rl[i];
+			if (type == ADD)
+				listener.requestAdded(rr);
+			else if (type == CHANGE)
+				listener.requestChanged(rr);
+			else if (type == REMOVE)
+				listener.requestRemoved(rr);
+		}
+	}
+	
+	protected void loadMonitors() {
+		Trace.trace(Trace.FINEST, "Loading monitors");
+		
+		monitors = new ArrayList();
+		Preferences prefs = MonitorPlugin.getInstance().getPluginPreferences();
+		String xmlString = prefs.getString("monitors");
+		if (xmlString != null && xmlString.length() > 0) {
+			try {
+				ByteArrayInputStream in = new ByteArrayInputStream(xmlString.getBytes());
+				IMemento memento = XMLMemento.loadMemento(in);
+		
+				IMemento[] children = memento.getChildren("monitor");
+				if (children != null) {
+					int size = children.length;
+					for (int i = 0; i < size; i++) {
+						Monitor monitor = new Monitor();
+						monitor.load(children[i]);
+						monitors.add(monitor);
+					}
+				}
+			} catch (Exception e) {
+				Trace.trace(Trace.WARNING, "Could not load monitors: " + e.getMessage());
+			}
+		}
+	}
+	
+	protected void saveMonitors() {
+		try {
+			ignorePreferenceChanges = true;
+			XMLMemento memento = XMLMemento.createWriteRoot("monitors");
+
+			Iterator iterator = monitors.iterator();
+			while (iterator.hasNext()) {
+				Monitor monitor = (Monitor) iterator.next();
+				IMemento child = memento.createChild("monitor");
+				monitor.save(child);
+			}
+			
+			String xmlString = memento.saveToString();
+			Preferences prefs = MonitorPlugin.getInstance().getPluginPreferences();
+			prefs.setValue("monitors", xmlString);
+			MonitorPlugin.getInstance().savePluginPreferences();
+		} catch (Exception e) {
+			Trace.trace(Trace.SEVERE, "Could not save browsers", e);
+		}
+		ignorePreferenceChanges = false;
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/MonitorPlugin.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/MonitorPlugin.java
new file mode 100644
index 0000000..d62498b
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/MonitorPlugin.java
@@ -0,0 +1,156 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core.internal;
+
+import java.util.*;
+
+import net.sourceforge.phpdt.monitor.core.IContentFilter;
+import net.sourceforge.phpdt.monitor.core.IProtocolAdapter;
+import net.sourceforge.phpdt.monitor.core.IRequestListener;
+
+import org.eclipse.core.runtime.*;
+/**
+ * The monitor core plugin.
+ */
+public class MonitorPlugin extends Plugin {
+	public static final String PLUGIN_ID = "net.sourceforge.phpeclipse.monitor.core";
+
+	private static MonitorPlugin singleton;
+	
+	protected Map protocolAdapters;
+	protected Map contentFilters;
+	protected IRequestListener[] requestListeners;
+
+	/**
+	 * MonitorPlugin constructor comment.
+	 */
+	public MonitorPlugin() {
+		super();
+		singleton = this;
+		loadProtocolAdapters();
+		loadContentFilters();
+	}
+
+	/**
+	 * Returns the singleton instance of this plugin.
+	 *
+	 * @return net.sourceforge.phpdt.monitor.core.MonitorPlugin
+	 */
+	public static MonitorPlugin getInstance() {
+		return singleton;
+	}
+
+	/**
+	 * Returns the translated String found with the given key.
+	 *
+	 * @return java.lang.String
+	 * @param key java.lang.String
+	 */
+	public static String getString(String key) {
+		try {
+			return Platform.getResourceString(getInstance().getBundle(), key);
+		} catch (Exception e) {
+			return key;
+		}
+	}
+	
+	public IProtocolAdapter getDefaultType() {
+		return (ProtocolAdapter) protocolAdapters.get("HTTP");
+	}
+	
+	public IProtocolAdapter getProtocolAdapter(String id) {
+		return (ProtocolAdapter) protocolAdapters.get(id);
+	}
+
+	public IProtocolAdapter[] getProtocolAdapters() {
+		List list = new ArrayList();
+		Iterator iterator = protocolAdapters.values().iterator();
+		while (iterator.hasNext()) {
+			list.add(iterator.next());
+		}
+		IProtocolAdapter[] types = new IProtocolAdapter[list.size()];
+		list.toArray(types);
+		return types;
+	}
+
+	public IContentFilter[] getContentFilters() {
+		List list = new ArrayList();
+		Iterator iterator = contentFilters.values().iterator();
+		while (iterator.hasNext()) {
+			list.add(iterator.next());
+		}
+		IContentFilter[] cf = new IContentFilter[list.size()];
+		list.toArray(cf);
+		return cf;
+	}
+	
+	public IContentFilter getContentFilter(String id) {
+		return (IContentFilter) contentFilters.get(id);
+	}
+	
+	public IRequestListener[] getRequestListeners() {
+		if (requestListeners == null)
+			loadRequestListeners();
+		return requestListeners;
+	}
+
+	public void loadProtocolAdapters() {
+		Trace.trace(Trace.CONFIG, "Loading protocol adapters"); 
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IConfigurationElement[] cf = registry.getConfigurationElementsFor(MonitorPlugin.PLUGIN_ID, "protocolAdapters");
+
+		int size = cf.length;
+		protocolAdapters = new HashMap(size);
+		for (int i = 0; i < size; i++) {
+			String id = cf[i].getAttribute("id");
+			Trace.trace(Trace.CONFIG, "Loading adapter: " + id);
+			protocolAdapters.put(id, new ProtocolAdapter(cf[i]));
+		}
+	}
+	
+	public void loadContentFilters() {
+		Trace.trace(Trace.CONFIG, "Loading content filters"); 
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IConfigurationElement[] cf = registry.getConfigurationElementsFor(MonitorPlugin.PLUGIN_ID, "contentFilters");
+
+		int size = cf.length;
+		contentFilters = new HashMap(size);
+		for (int i = 0; i < size; i++) {
+			String id = cf[i].getAttribute("id");
+			Trace.trace(Trace.CONFIG, "Loading filter: " + id);
+			contentFilters.put(id, new ContentFilter(cf[i]));
+		}
+	}
+	
+	public void loadRequestListeners() {
+		Trace.trace(Trace.CONFIG, "Loading request listeners"); 
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IConfigurationElement[] cf = registry.getConfigurationElementsFor(MonitorPlugin.PLUGIN_ID, "requestListeners");
+
+		int size = cf.length;
+		List list = new ArrayList();
+		for (int i = 0; i < size; i++) {
+			String id = cf[i].getAttribute("id");
+			Trace.trace(Trace.CONFIG, "Loading request listener: " + id);
+			try {
+				IRequestListener rl = (IRequestListener) cf[i].createExecutableExtension("class");
+				list.add(rl);
+			} catch (Exception e) {
+				Trace.trace(Trace.SEVERE, "Could not create request listener: " + id, e);
+				return;
+			}
+		}
+		
+		size = list.size();
+		requestListeners = new IRequestListener[size];
+		list.toArray(requestListeners);
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/MonitorWorkingCopy.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/MonitorWorkingCopy.java
new file mode 100644
index 0000000..ecca3dc
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/MonitorWorkingCopy.java
@@ -0,0 +1,91 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core.internal;
+
+import net.sourceforge.phpdt.monitor.core.*;
+/**
+ * 
+ */
+public class MonitorWorkingCopy extends Monitor implements IMonitorWorkingCopy {
+	protected Monitor monitor;
+	
+	// creation
+	public MonitorWorkingCopy() { }
+
+	// working copy
+	public MonitorWorkingCopy(Monitor monitor) {
+		this.monitor = monitor;
+		setInternal(monitor);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.monitor.internal.IMonitorWorkingCopy#setRemoteHost(java.lang.String)
+	 */
+	public void setId(String newId) {
+		id = newId;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.monitor.internal.IMonitorWorkingCopy#setRemoteHost(java.lang.String)
+	 */
+	public void setRemoteHost(String host) {
+		remoteHost = host;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.monitor.internal.IMonitorWorkingCopy#setRemotePort(int)
+	 */
+	public void setRemotePort(int port) {
+		remotePort = port;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.monitor.internal.IMonitorWorkingCopy#setLocalPort(int)
+	 */
+	public void setLocalPort(int port) {
+		localPort = port;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.monitor.internal.IMonitorWorkingCopy#setType(IType)
+	 */
+	public void setProtocolAdapter(IProtocolAdapter t) {
+		type = t;
+	}
+	
+	public boolean isWorkingCopy() {
+		return true;
+	}
+	
+	public IMonitorWorkingCopy getWorkingCopy() {
+		return this;
+	}
+	
+	public IMonitor save() {
+		MonitorManager mm = MonitorManager.getInstance();
+		if (monitor != null) {
+			//boolean restart = false;
+			if (monitor.isRunning()) {
+				//restart = true;
+				mm.stopMonitor(monitor);
+			}
+			monitor.setInternal(this);
+			mm.monitorChanged(monitor);
+			//if (restart)
+			//	mm.startMonitor(monitor);
+		} else {
+			monitor = new Monitor();
+			monitor.setInternal(this);
+			mm.addMonitor(monitor);
+		}
+		return monitor;
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/ProtocolAdapter.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/ProtocolAdapter.java
new file mode 100644
index 0000000..ee4e6be
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/ProtocolAdapter.java
@@ -0,0 +1,51 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core.internal;
+
+import java.io.IOException;
+import java.net.Socket;
+
+import net.sourceforge.phpdt.monitor.core.IMonitor;
+import net.sourceforge.phpdt.monitor.core.IProtocolAdapter;
+import net.sourceforge.phpdt.monitor.core.IProtocolAdapterDelegate;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+/**
+ * 
+ */
+public class ProtocolAdapter implements IProtocolAdapter {
+	protected IConfigurationElement element;
+	protected IProtocolAdapterDelegate delegate;
+	
+	protected ProtocolAdapter(IConfigurationElement element) {
+		this.element = element;
+	}
+
+	public String getId() {
+		return element.getAttribute("id");
+	}
+	
+	public String getName() {
+		return element.getAttribute("name");
+	}
+	
+	public void parse(IMonitor monitor, Socket in, Socket out) throws IOException {
+		if (delegate == null) {
+			try {
+				delegate = (IProtocolAdapterDelegate) element.createExecutableExtension("class");
+			} catch (Exception e) {
+				Trace.trace(Trace.SEVERE, "Could not create protocol adapter delegate: " + getId(), e);
+				return;
+			}
+		}
+		delegate.parse(monitor, in, out);
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/Request.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/Request.java
new file mode 100644
index 0000000..208b00b
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/Request.java
@@ -0,0 +1,263 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core.internal;
+
+import java.util.Date;
+import java.util.Properties;
+
+import net.sourceforge.phpdt.monitor.core.IProtocolAdapter;
+import net.sourceforge.phpdt.monitor.core.IRequest;
+/**
+ * A single TCP/IP request/response pair.
+ */
+public class Request implements IRequest {
+	protected Date date;
+	protected long responseTime = -1;
+	protected int localPort;
+	protected String remoteHost;
+	protected int remotePort;
+	protected byte[] request;
+	protected byte[] response;
+	
+	protected String label;
+	protected IProtocolAdapter type;
+
+	protected Properties properties;
+
+	/**
+	 * RequestResponse constructor comment.
+	 */
+	public Request(IProtocolAdapter type, int localPort, String remoteHost, int remotePort) {
+		super();
+		this.type = type;
+		this.localPort = localPort;
+		this.remoteHost = remoteHost;
+		this.remotePort = remotePort;
+		date = new Date();
+		properties = new Properties();
+		MonitorManager.getInstance().addRequest(this);
+	}
+	
+	public IProtocolAdapter getType() {
+		return type;
+	}
+
+	/**
+	 * Add to the request.
+	 *
+	 * @param addRequest byte[]
+	 */
+	public void addToRequest(byte[] addRequest) {
+		if (addRequest == null || addRequest.length == 0)
+			return;
+	
+		if (request == null || request.length == 0) {
+			setRequest(addRequest);
+			return;
+		}
+	
+		int size = request.length + addRequest.length;
+		byte[] b = new byte[size];
+		System.arraycopy(request, 0, b, 0, request.length);
+		System.arraycopy(addRequest, 0, b, request.length, addRequest.length);
+		request = b;
+	}
+
+	/**
+	 * Add to the response.
+	 *
+	 * @param addResponse byte[]
+	 */
+	public void addToResponse(byte[] addResponse) {
+		if (addResponse == null || addResponse.length == 0)
+			return;
+	
+		if (response == null || response.length == 0) {
+			setResponse(addResponse);
+			return;
+		}
+	
+		int size = response.length + addResponse.length;
+		byte[] b = new byte[size];
+		System.arraycopy(response, 0, b, 0, response.length);
+		System.arraycopy(addResponse, 0, b, response.length, addResponse.length);
+		response = b;
+	}
+
+	/**
+	 * Return the date/time of this request.
+	 *
+	 * @return java.util.Date
+	 */
+	public Date getDate() {
+		return date;
+	}
+
+	/**
+	 * Returns the local port.
+	 *
+	 * @return int
+	 */
+	public int getLocalPort() {
+		return localPort;
+	}
+
+	/**
+	 * Returns the remote host.
+	 *
+	 * @return java.lang.String
+	 */
+	public String getRemoteHost() {
+		return remoteHost;
+	}
+
+	/**
+	 * Returns the remote port.
+	 *
+	 * @return int
+	 */
+	public int getRemotePort() {
+		return remotePort;
+	}
+
+	/**
+	 * Returns the request as a byte array.
+	 *
+	 * @return byte[]
+	 */
+	public byte[] getRequest(byte type2) {
+		return request;
+	}
+
+	/**
+	 * Returns the response as a byte array.
+	 *
+	 * @return byte[]
+	 */
+	public byte[] getResponse(byte type2) {
+		return response;
+	}
+
+	/**
+	 * Returns the response time in milliseconds.
+	 *
+	 * @return long
+	 */
+	public long getResponseTime() {
+		return responseTime;
+	}
+
+	/**
+	 * Returns the title, if one exists.
+	 *
+	 * @return java.lang.String
+	 */
+	public String getLabel() {
+		if (label == null)
+			return getRemoteHost() + ":" + getRemotePort();
+		else
+			return label;
+	}
+
+	/**
+	 * Set the request.
+	 *
+	 * @param request byte[]
+	 */
+	protected void setRequest(byte[] request) {
+		if (request == null || request.length == 0)
+			return;
+	
+		this.request = request;
+	
+		MonitorManager.getInstance().requestChanged(this);
+	}
+
+	/**
+	 * Set the response.
+	 *
+	 * @param response byte[]
+	 */
+	protected void setResponse(byte[] response) {
+		if (response == null || response.length == 0)
+			return;
+	
+		this.response = response;
+	
+		responseTime = System.currentTimeMillis() - date.getTime();
+	
+		MonitorManager.getInstance().requestChanged(this);
+	}
+
+	/**
+	 * Sets the title.
+	 *
+	 * @param s java.lang.String
+	 */
+	public void setLabel(String s) {
+		// property can only be set once
+		if (label != null)
+			return;
+	
+		label = s;
+		MonitorManager.getInstance().requestChanged(this);
+	}
+	
+	/**
+	 * 
+	 */
+	public void addProperty(String key, Object value) {
+		try {
+			if (properties.containsKey(key))
+				properties.remove(key);
+			properties.put(key, value);
+		} catch (Exception e) {
+			Trace.trace(Trace.SEVERE, "Could not add property", e);
+		}
+	}
+	
+	/**
+	 * 
+	 */
+	public String getStringProperty(String key) {
+		try {
+			return (String) properties.get(key);
+		} catch (Exception e) {
+			return "";
+		}
+	}
+	
+	/**
+	 * 
+	 */
+	public Integer getIntegerProperty(String key) {
+		try {
+			return (Integer) properties.get(key);
+		} catch (Exception e) {
+			return null;
+		}
+	}
+	
+	/**
+	 * 
+	 */
+	public Object getObjectProperty(String key) {
+		try {
+			return properties.get(key);
+		} catch (Exception e) {
+			return null;
+		}
+	}
+	
+	public void fireChangedEvent() {
+		MonitorManager.getInstance().requestChanged(this);
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/TCPIPProtocolAdapter.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/TCPIPProtocolAdapter.java
new file mode 100644
index 0000000..7d28d15
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/TCPIPProtocolAdapter.java
@@ -0,0 +1,30 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core.internal;
+
+import java.io.IOException;
+import java.net.Socket;
+
+import net.sourceforge.phpdt.monitor.core.IMonitor;
+import net.sourceforge.phpdt.monitor.core.IProtocolAdapterDelegate;
+import net.sourceforge.phpdt.monitor.core.MonitorCore;
+/**
+ * 
+ */
+public class TCPIPProtocolAdapter implements IProtocolAdapterDelegate {
+	public void parse(IMonitor monitor, Socket in, Socket out) throws IOException {
+		Request request = new Request(MonitorCore.getProtocolAdapter("TCPIP"), monitor.getLocalPort(), monitor.getRemoteHost(), monitor.getRemotePort());
+		Connection conn = new Connection(in, out);
+		DefaultThread requestThread = new DefaultThread(conn, request, in.getInputStream(), out.getOutputStream(), true);
+		requestThread.start();
+		new DefaultThread(conn, request, out.getInputStream(), in.getOutputStream(), false).start();
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/Trace.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/Trace.java
new file mode 100644
index 0000000..a530662
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/Trace.java
@@ -0,0 +1,53 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core.internal;
+/**
+ * Helper class to route trace output.
+ */
+public class Trace {
+	public static byte CONFIG = 0;
+	public static byte WARNING = 1;
+	public static byte SEVERE = 2;
+	public static byte FINEST = 3;
+	
+	public static byte PARSING = 4;
+
+	/**
+	 * Trace constructor comment.
+	 */
+	private Trace() {
+		super();
+	}
+	
+	/**
+	 * Trace the given text.
+	 *
+	 * @param s java.lang.String
+	 */
+	public static void trace(byte level, String s) {
+		trace(level, s, null);
+	}
+	
+	/**
+	 * Trace the given message and exception.
+	 *
+	 * @param s java.lang.String
+	 * @param t java.lang.Throwable
+	 */
+	public static void trace(byte level, String s, Throwable t) {
+		if (!MonitorPlugin.getInstance().isDebugging())
+			return;
+
+		System.out.println(s);
+		if (t != null)
+			t.printStackTrace();
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/XMLMemento.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/XMLMemento.java
new file mode 100644
index 0000000..bd4f98d
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/XMLMemento.java
@@ -0,0 +1,448 @@
+/**********************************************************************
+ * Copyright (c) 2003 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.phpdt.monitor.core.internal;
+
+import java.io.*;
+import java.util.*;
+import java.net.URL;
+import org.w3c.dom.*;
+import org.xml.sax.*;
+
+import javax.xml.parsers.*;
+import javax.xml.transform.*;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+/**
+ * A Memento is a class independent container for persistence
+ * info.  It is a reflection of 3 storage requirements.
+ *
+ * 1)   We need the ability to persist an object and restore it.  
+ * 2)   The class for an object may be absent.  If so we would 
+ *      like to skip the object and keep reading. 
+ * 3)   The class for an object may change.  If so the new class 
+ *      should be able to read the old persistence info.
+ *
+ * We could ask the objects to serialize themselves into an 
+ * ObjectOutputStream, DataOutputStream, or Hashtable.  However 
+ * all of these approaches fail to meet the second requirement.
+ *
+ * Memento supports binary persistance with a version ID.
+ */
+public final class XMLMemento implements IMemento {
+	private Document factory;
+	private Element element;
+
+	/**
+	 * Answer a memento for the document and element.  For simplicity
+	 * you should use createReadRoot and createWriteRoot to create the initial
+	 * mementos on a document.
+	 */
+	public XMLMemento(Document doc, Element el) {
+		factory = doc;
+		element = el;
+	}
+
+	/**
+	 * @see IMemento.
+	 */
+	public IMemento createChild(String type) {
+		Element child = factory.createElement(type);
+		element.appendChild(child);
+		return new XMLMemento(factory, child);
+	}
+
+	/**
+	 * @see IMemento.
+	 */
+	public IMemento createChild(String type, String id) {
+		Element child = factory.createElement(type);
+		child.setAttribute(TAG_ID, id);
+		element.appendChild(child);
+		return new XMLMemento(factory, child);
+	}
+
+	/**
+	 * Create a Document from a Reader and answer a root memento for reading 
+	 * a document.
+	 */
+	protected static XMLMemento createReadRoot(Reader reader) {
+		Document document = null;
+		try {
+			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+			DocumentBuilder parser = factory.newDocumentBuilder();
+			document = parser.parse(new InputSource(reader));
+			Node node = document.getFirstChild();
+			if (node instanceof Element)
+				return new XMLMemento(document, (Element) node);
+		} catch (ParserConfigurationException e) {
+		} catch (IOException e) {
+		} catch (SAXException e) {
+		} finally {
+			try {
+				reader.close();
+			} catch (Exception e) { }
+		}
+		return null;
+	}
+	
+	/**
+	 * Answer a root memento for writing a document.
+	 */
+	public static XMLMemento createWriteRoot(String type) {
+		Document document;
+		try {
+			document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+			Element element = document.createElement(type);
+			document.appendChild(element);
+			return new XMLMemento(document, element);            
+		} catch (ParserConfigurationException e) {
+			throw new Error(e);
+		}
+	}
+	
+	/**
+	 * @see IMemento.
+	 */
+	public IMemento getChild(String type) {
+		// Get the nodes.
+		NodeList nodes = element.getChildNodes();
+		int size = nodes.getLength();
+		if (size == 0)
+			return null;
+	
+		// Find the first node which is a child of this node.
+		for (int nX = 0; nX < size; nX ++) {
+			Node node = nodes.item(nX);
+			if (node instanceof Element) {
+				Element element2 = (Element)node;
+				if (element2.getNodeName().equals(type))
+					return new XMLMemento(factory, element2);
+			}
+		}
+	
+		// A child was not found.
+		return null;
+	}
+
+	/**
+	 * @see IMemento.
+	 */
+	public IMemento [] getChildren(String type) {
+		// Get the nodes.
+		NodeList nodes = element.getChildNodes();
+		int size = nodes.getLength();
+		if (size == 0)
+			return new IMemento[0];
+	
+		// Extract each node with given type.
+		ArrayList list = new ArrayList(size);
+		for (int nX = 0; nX < size; nX ++) {
+			Node node = nodes.item(nX);
+			if (node instanceof Element) {
+				Element element2 = (Element)node;
+				if (element2.getNodeName().equals(type))
+					list.add(element2);
+			}
+		}
+	
+		// Create a memento for each node.
+		size = list.size();
+		IMemento [] results = new IMemento[size];
+		for (int x = 0; x < size; x ++) {
+			results[x] = new XMLMemento(factory, (Element)list.get(x));
+		}
+		return results;
+	}
+
+	/**
+	 * Return the contents of this memento as a byte array.
+	 *
+	 * @return byte[]
+	 */
+	public byte[] getContents() throws IOException {
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		save(out);
+		return out.toByteArray();
+	}
+
+	/**
+	 * Returns an input stream for writing to the disk with a local locale.
+	 *
+	 * @return java.io.InputStream
+	 */
+	public InputStream getInputStream() throws IOException {
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		save(out);
+		return new ByteArrayInputStream(out.toByteArray());
+	}
+
+	/**
+	 * @see IMemento.
+	 */
+	public Float getFloat(String key) {
+		Attr attr = element.getAttributeNode(key);
+		if (attr == null)
+			return null; 
+		String strValue = attr.getValue();
+		try {
+			return new Float(strValue);
+		} catch (NumberFormatException e) {
+			return null;
+		}
+	}
+
+	/**
+	 * @see IMemento.
+	 */
+	public String getId() {
+		return element.getAttribute(TAG_ID);
+	}
+	
+	/**
+	 * @see IMemento.
+	 */
+	public String getName() {
+		return element.getNodeName();
+	}
+
+	/**
+	 * @see IMemento.
+	 */
+	public Integer getInteger(String key) {
+		Attr attr = element.getAttributeNode(key);
+		if (attr == null)
+			return null; 
+		String strValue = attr.getValue();
+		try {
+			return new Integer(strValue);
+		} catch (NumberFormatException e) {
+			return null;
+		}
+	}
+
+	/**
+	 * @see IMemento.
+	 */
+	public String getString(String key) {
+		Attr attr = element.getAttributeNode(key);
+		if (attr == null)
+			return null; 
+		return attr.getValue();
+	}
+	
+	public List getNames() {
+		NamedNodeMap map = element.getAttributes();
+		int size = map.getLength();
+		List list = new ArrayList();
+		for (int i = 0; i < size; i++) {
+			Node node = map.item(i);
+			String name = node.getNodeName();
+			list.add(name);
+		}
+		return list;
+	}
+
+	/**
+	 * Loads a memento from the given filename.
+	 *
+	 * @param in java.io.InputStream
+	 * @return org.eclipse.ui.IMemento
+	 * @exception java.io.IOException
+	 */
+	public static IMemento loadMemento(InputStream in) {
+		return createReadRoot(new InputStreamReader(in));
+	}
+	
+	/**
+	 * Loads a memento from the given filename.
+	 *
+	 * @param in java.io.InputStream
+	 * @return org.eclipse.ui.IMemento
+	 * @exception java.io.IOException
+	 */
+	public static IMemento loadCorruptMemento(InputStream in) {
+		Document document = null;
+		try {
+			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+			DocumentBuilder parser = factory.newDocumentBuilder();
+			document = parser.parse(in);
+			Node node = document.getFirstChild();
+			if (node instanceof Element)
+				return new XMLMemento(document, (Element) node);
+		} catch (ParserConfigurationException e) {
+		} catch (IOException e) {
+		} catch (SAXException e) {
+		} finally {
+			try {
+				in.close();
+			} catch (Exception e) { }
+		}
+		return null;
+	}
+
+	/**
+	 * Loads a memento from the given filename.
+	 *
+	 * @param filename java.lang.String
+	 * @return org.eclipse.ui.IMemento
+	 * @exception java.io.IOException
+	 */
+	public static IMemento loadMemento(String filename) throws IOException {
+		return XMLMemento.createReadRoot(new FileReader(filename));
+	}
+
+	/**
+	 * Loads a memento from the given filename.
+	 *
+	 * @param url java.net.URL
+	 * @return org.eclipse.ui.IMemento
+	 * @exception java.io.IOException
+	 */
+	public static IMemento loadMemento(URL url) throws IOException {
+		return XMLMemento.createReadRoot(new InputStreamReader(url.openStream()));
+	}
+
+	/**
+	 * @see IMemento.
+	 */
+	private void putElement(Element element2) {
+		NamedNodeMap nodeMap = element2.getAttributes();
+		int size = nodeMap.getLength();
+		for (int i = 0; i < size; i++){
+			Attr attr = (Attr)nodeMap.item(i);
+			putString(attr.getName(),attr.getValue());
+		}
+		
+		NodeList nodes = element2.getChildNodes();
+		size = nodes.getLength();
+		for (int i = 0; i < size; i ++) {
+			Node node = nodes.item(i);
+			if (node instanceof Element) {
+				XMLMemento child = (XMLMemento)createChild(node.getNodeName());
+				child.putElement((Element)node);
+			}
+		}
+	}
+
+	/**
+	 * @see IMemento.
+	 */
+	public void putFloat(String key, float f) {
+		element.setAttribute(key, String.valueOf(f));
+	}
+
+	/**
+	 * @see IMemento.
+	 */
+	public void putInteger(String key, int n) {
+		element.setAttribute(key, String.valueOf(n));
+	}
+
+	/**
+	 * @see IMemento.
+	 */
+	public void putMemento(IMemento memento) {
+		XMLMemento xmlMemento = (XMLMemento) memento;
+		putElement(xmlMemento.element);
+	}
+
+	/**
+	 * @see IMemento.
+	 */
+	public void putString(String key, String value) {
+		if (value == null)
+			return;
+		element.setAttribute(key, value);
+	}
+
+	/**
+	 * Save this Memento to a Writer.
+	 */
+	public void save(Writer writer) throws IOException {
+		Result result = new StreamResult(writer);
+		Source source = new DOMSource(factory);
+		try {
+			Transformer transformer = TransformerFactory.newInstance().newTransformer();
+			transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
+			transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
+			transformer.transform(source, result);            
+		} catch (Exception e) {
+			throw (IOException) (new IOException().initCause(e));
+		}
+	}
+	
+	/**
+	 * Save this Memento to a Writer.
+	 */
+	public void save(OutputStream os) throws IOException {
+		Result result = new StreamResult(os);
+		Source source = new DOMSource(factory);
+		try {
+			Transformer transformer = TransformerFactory.newInstance().newTransformer();
+			transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
+			transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
+			transformer.transform(source, result);            
+		} catch (Exception e) {
+			throw (IOException) (new IOException().initCause(e));
+		}
+	}
+
+	/**
+	 * Saves the memento to the given file.
+	 *
+	 * @param filename java.lang.String
+	 * @exception java.io.IOException
+	 */
+	public void saveToFile(String filename) throws IOException {
+		Writer w = null;
+		try {
+			w = new FileWriter(filename);
+			save(w);
+		} catch (IOException e) {
+			throw e;
+		} catch (Exception e) {
+			throw new IOException(e.getLocalizedMessage());
+		} finally {
+			if (w != null) {
+				try {
+					w.close();
+				} catch (Exception e) { }
+			}
+		}
+	}
+	
+	public String saveToString() throws IOException {
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		save(out);
+		return out.toString("UTF-8");
+	}
+	
+	/*
+	 * @see IMemento#getBoolean(String)
+	 */
+	public Boolean getBoolean(String key) {
+		Attr attr = element.getAttributeNode(key);
+		if (attr == null)
+			return null;
+		String strValue = attr.getValue();
+		if ("true".equalsIgnoreCase(strValue))
+			return new Boolean(true);
+		else
+			return new Boolean(false);
+	}
+
+	/*
+	 * @see IMemento#putBoolean(String, boolean)
+	 */
+	public void putBoolean(String key, boolean value) {
+		element.setAttribute(key, value ? "true" : "false");
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/http/HTTPConnection.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/http/HTTPConnection.java
new file mode 100644
index 0000000..f6ab4c3
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/http/HTTPConnection.java
@@ -0,0 +1,110 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core.internal.http;
+
+import net.sourceforge.phpdt.monitor.core.IMonitor;
+import net.sourceforge.phpdt.monitor.core.IRequest;
+import net.sourceforge.phpdt.monitor.core.internal.Request;
+import net.sourceforge.phpdt.monitor.core.internal.Trace;
+
+
+import java.util.List;
+import java.util.ArrayList;
+/**
+ * Manages a monitor server connection between two hosts. This
+ * connection may spawn one or more TCP/IP pairs to be displayed
+ * in the monitor server view.
+ */
+public class HTTPConnection {
+	protected IMonitor monitor;
+
+	protected int req = -1;
+	protected int resp = -1;
+
+	protected List calls = new ArrayList();
+
+	/**
+	 * MonitorHTTPConnection constructor comment.
+	 */
+	public HTTPConnection(IMonitor monitor) {
+		super();
+		this.monitor = monitor;
+		Trace.trace(Trace.PARSING, "TCP/IP monitor connection opened " + monitor);
+	}
+
+	/**
+	 * Add a request.
+	 * @param req byte[]
+	 * @param isNew boolean
+	 */
+	public void addRequest(byte[] request, boolean isNew) {
+		if (isNew)
+			req ++;
+		Request pair = (Request) getRequestResponse(req);
+		pair.addToRequest(request);
+	}
+
+	/**
+	 * Add a response.
+	 * @param req byte[]
+	 * @param isNew boolean
+	 */
+	public void addResponse(byte[] response, boolean isNew) {
+		if (isNew)
+			resp ++;
+		Request pair = (Request) getRequestResponse(resp);
+		pair.addToResponse(response);
+	}
+
+	/**
+	 * 
+	 */
+	public void addProperty(String key, Object value) {
+		IRequest pair = getRequestResponse(req);
+		pair.addProperty(key, value);
+	}
+
+	/**
+	 * 
+	 */
+	public IRequest getRequestResponse(boolean isRequest) {
+		if (isRequest)
+			return getRequestResponse(req);
+		else
+			return getRequestResponse(resp);
+	}
+
+	/**
+	 * 
+	 */
+	protected IRequest getRequestResponse(int i) {
+		synchronized (this) {
+			while (i >= calls.size()) {
+				Request rr = new HTTPRequest(monitor.getLocalPort(), monitor.getRemoteHost(), monitor.getRemotePort());
+				calls.add(rr);
+				return rr;
+			}
+			return (Request) calls.get(i);
+		}
+	}
+
+	/**
+	 * Set the title
+	 * @param req byte[]
+	 * @param isNew boolean
+	 */
+	public void setLabel(String title, boolean isNew) {
+		if (isNew)
+			req ++;
+		Request pair = (Request) getRequestResponse(req);
+		pair.setLabel(title);
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/http/HTTPProtocolAdapter.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/http/HTTPProtocolAdapter.java
new file mode 100644
index 0000000..4e47e84
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/http/HTTPProtocolAdapter.java
@@ -0,0 +1,32 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core.internal.http;
+
+import java.io.IOException;
+import java.net.Socket;
+
+import net.sourceforge.phpdt.monitor.core.IMonitor;
+import net.sourceforge.phpdt.monitor.core.IProtocolAdapterDelegate;
+import net.sourceforge.phpdt.monitor.core.internal.Connection;
+
+/**
+ * 
+ */
+public class HTTPProtocolAdapter implements IProtocolAdapterDelegate {
+	public void parse(IMonitor monitor, Socket in, Socket out) throws IOException {
+		Connection conn2 = new Connection(in, out);
+		HTTPConnection conn = new HTTPConnection(monitor);
+		HTTPThread request = new HTTPThread(conn2, in.getInputStream(), out.getOutputStream(), conn, true, monitor.getRemoteHost(), monitor.getRemotePort());
+		HTTPThread response = new HTTPThread(conn2, out.getInputStream(), in.getOutputStream(), conn, false, "localhost", monitor.getLocalPort(), request);
+		request.start();
+		response.start();
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/http/HTTPRequest.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/http/HTTPRequest.java
new file mode 100644
index 0000000..af0c664
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/http/HTTPRequest.java
@@ -0,0 +1,84 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core.internal.http;
+
+import net.sourceforge.phpdt.monitor.core.MonitorCore;
+import net.sourceforge.phpdt.monitor.core.internal.Request;
+
+/**
+ * 
+ */
+public class HTTPRequest extends Request {
+	protected static final String HTTP_REQUEST_HEADER = "request-header";
+	protected static final String HTTP_RESPONSE_HEADER = "response-header";
+
+	protected static final String HTTP_REQUEST_BODY = "request-body";
+	protected static final String HTTP_RESPONSE_BODY = "response-body";
+	
+	protected static final byte[] EMPTY = new byte[0];
+
+	/**
+	 * HTTPRequestResponse constructor comment.
+	 */
+	public HTTPRequest(int localPort, String remoteHost, int remotePort) {
+		super(MonitorCore.getProtocolAdapter(MonitorCore.HTTP_PROTOCOL_ID), localPort, remoteHost, remotePort);
+	}
+	
+	public byte[] getRequest(byte type2) {
+		if (type2 == ALL)
+			return request;
+		else if (type2 == TRANSPORT)
+			return getRequestHeader();
+		else
+			return getRequestContent();
+	}
+	
+	public byte[] getResponse(byte type2) {
+		if (type2 == ALL)
+			return response;
+		else if (type2 == TRANSPORT)
+			return getResponseHeader();
+		else
+			return getResponseContent();
+	}
+	
+	protected byte[] getRequestHeader() {
+		Object obj = getObjectProperty(HTTP_REQUEST_HEADER);
+		if (obj == null || !(obj instanceof byte[]))
+			return null;
+		else
+			return (byte[]) obj;
+	}
+	
+	protected byte[] getRequestContent() {
+		Object obj = getObjectProperty(HTTP_REQUEST_BODY);
+		if (obj == null || !(obj instanceof byte[]))
+			return null;
+		else
+			return (byte[]) obj;
+	}
+	
+	protected byte[] getResponseHeader() {
+		Object obj = getObjectProperty(HTTP_RESPONSE_HEADER);
+		if (obj == null || !(obj instanceof byte[]))
+			return null;
+		else
+			return (byte[]) obj;
+	}
+	
+	protected byte[] getResponseContent() {
+		Object obj = getObjectProperty(HTTP_RESPONSE_BODY);
+		if (obj == null || !(obj instanceof byte[]))
+			return null;
+		else
+			return (byte[]) obj;
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/http/HTTPThread.java b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/http/HTTPThread.java
new file mode 100644
index 0000000..1530d89
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.core/src/net/sourceforge/phpdt/monitor/core/internal/http/HTTPThread.java
@@ -0,0 +1,602 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.core.internal.http;
+
+import java.io.*;
+
+import net.sourceforge.phpdt.monitor.core.IRequest;
+import net.sourceforge.phpdt.monitor.core.internal.Connection;
+import net.sourceforge.phpdt.monitor.core.internal.Trace;
+
+/**
+ * Monitor server I/O thread.
+ */
+public class HTTPThread extends Thread {
+	private static final int BUFFER = 2048;
+	private static final byte CR = (byte) '\r';
+	private static final byte LF = (byte) '\n';
+	protected static int threadCount = 0;
+
+	private byte[] readBuffer = new byte[BUFFER];
+
+	// buffer and index
+	protected byte[] buffer = new byte[0];
+	protected int bufferIndex = 0;
+
+	protected InputStream in;
+	protected OutputStream out;
+	protected HTTPConnection conn;
+	protected boolean isRequest;
+	protected Connection conn2;
+	
+	protected HTTPThread request;
+	protected boolean isWaiting;
+	
+	// user to translate the Host: header
+	protected String host;
+	protected int port;
+
+	protected int contentLength = -1;
+	protected byte transferEncoding = -1;
+	protected String responseType = null;
+	protected boolean keepAlive = false;
+
+	protected static final String[] ENCODING_STRING = new String[] {
+		"chunked", "identity", "gzip", "compressed", "deflate"};
+
+	protected static final byte ENCODING_CHUNKED = 0;
+	protected static final byte ENCODING_IDENTITY = 1;
+	protected static final byte ENCODING_GZIP = 2;
+	protected static final byte ENCODING_COMPRESSED = 3;
+	protected static final byte ENCODING_DEFLATE = 4;
+
+/* change:
+Referer: http://localhost:8081/index.html
+Host: localhost:8081
+*/
+/* The Connection header has the following grammar:
+
+	   Connection = "Connection" ":" 1#(connection-token)
+	   connection-token  = token
+
+   HTTP/1.1 proxies MUST parse the Connection header field before a
+   message is forwarded and, for each connection-token in this field,
+   remove any header field(s) from the message with the same name as the
+   connection-token. */
+
+	/**
+	 * MonitorThread constructor comment.
+	 */
+	public HTTPThread(Connection conn2, InputStream in, OutputStream out, HTTPConnection conn, boolean isRequest, String host, int port) {
+		super();
+		this.conn2 = conn2;
+		this.in = in;
+		this.out = out;
+		this.conn = conn;
+		this.isRequest = isRequest;
+		this.host = host;
+		this.port = port;
+	
+		setName("HTTP (" + host + ":" + port + ") " + (isRequest ? "REQUEST" : "RESPONSE") + " " + (threadCount++));
+		setPriority(Thread.NORM_PRIORITY + 1);
+		setDaemon(true);
+		
+		Trace.trace(Trace.PARSING, "Started: " + this);
+	}
+	
+	/**
+	 * MonitorThread constructor comment.
+	 */
+	public HTTPThread(Connection conn2, InputStream in, OutputStream out, HTTPConnection conn, boolean isRequest, String host, int port, HTTPThread request) {
+		this(conn2, in, out, conn, isRequest, host, port);
+		
+		this.request = request;
+	}
+
+	/**
+	 * Add a line feed to the end of the byte array.
+	 * @return byte[]
+	 * @param b byte[]
+	 */
+	protected static byte[] convert(byte[] b) {
+		if (b == null || b.length == 0)
+			return b;
+	
+		int size = b.length;
+		byte[] x = new byte[size + 2];
+		System.arraycopy(b, 0, x, 0, size);
+		x[size] = (byte) '\r';     // CR
+		x[size + 1] = (byte) '\n'; // LF
+		return x;
+	}
+
+	/**
+	 * Read more data into the buffer.
+	 *
+	 * @return byte[]
+	 */
+	protected void fillBuffer() throws IOException {
+		int n = in.read(readBuffer);
+	
+		if (n <= 0)
+			throw new IOException("End of input");
+	
+		// add to full buffer
+		int len = buffer.length - bufferIndex;
+		if (len < 0)
+			len = 0;
+		byte[] x = new byte[n + len];
+		System.arraycopy(buffer, bufferIndex, x, 0, len);
+		System.arraycopy(readBuffer, 0, x, len, n);
+		bufferIndex = 0;
+		buffer = x;
+	}
+
+	/**
+	 * Returns the first location of a CRLF.
+	 *
+	 * @return int
+	 */
+	protected int getFirstCRLF() {
+		int size = buffer.length;
+		int i = bufferIndex + 1;
+		while (i < size) {
+			if (buffer[i - 1] == CR && buffer[i] == LF)
+				return i;
+			i++;
+		}
+		return -1;
+	}
+
+	/**
+	 * Output the given bytes.
+	 * @param b byte[]
+	 */
+	protected void outputBytes(byte[] b, boolean isNew) throws IOException {
+		out.write(b);
+		if (isRequest)
+			conn.addRequest(b, isNew);
+		else
+			conn.addResponse(b, isNew);
+	}
+
+	/**
+	 * Parse the HTTP body.
+	 */
+	public void parseBody() throws IOException {
+		Trace.trace(Trace.PARSING, "Parsing body for: " + this);
+		
+		if (isRequest) {
+			if (contentLength != -1) {
+				byte[] b = readBytes(contentLength);
+				out.write(b);
+				conn.addRequest(b, false);
+				setHTTPBody(b);
+			} else if (transferEncoding != -1 && transferEncoding != ENCODING_IDENTITY) {
+				parseChunk();
+			}
+			
+			Trace.trace(Trace.PARSING, "Done parsing request body for: " + this);
+			return;
+		}
+	
+		// just return body for HTTP 1.0 responses
+		if (!isRequest && !keepAlive && contentLength == -1 && transferEncoding == -1) {
+			Trace.trace(Trace.PARSING, "Assuming HTTP 1.0 for: " + this);
+			int n = buffer.length - bufferIndex;
+			byte[] b = readBytes(n);
+			byte[] body = new byte[0];
+			while (n >= 0) {
+				Trace.trace(Trace.PARSING, "Bytes read: " + n + " " + this);
+				if (b != null && n > 0) {
+					byte[] x = null;
+					if (n == b.length)
+						x = b;
+					else {
+						x = new byte[n];
+						System.arraycopy(b, 0, x, 0, n);
+					}
+					outputBytes(x, false);
+					
+					// copy to HTTP body
+					byte[] temp = new byte[body.length + x.length];
+					System.arraycopy(body, 0, temp, 0, body.length);
+					System.arraycopy(x, 0, temp, body.length, x.length);
+					body = temp;
+				}
+				if (b.length < BUFFER)
+					b = new byte[BUFFER];
+				n = in.read(b);
+				Thread.yield();
+			}
+			out.flush();
+			setHTTPBody(body);
+			return;
+		}
+	
+		// spec 4.4.1
+		if (responseType != null &&	(responseType.startsWith("1") || "204".equals(responseType) || "304".equals(responseType))) {
+			setHTTPBody(new byte[0]);
+			return;
+		}
+	
+		// spec 4.4.2
+		if (transferEncoding != -1 && transferEncoding != ENCODING_IDENTITY) {
+			parseChunk();
+			return;
+		}
+	
+		// spec 4.4.3
+		if (contentLength != -1) {
+			byte[] b = readBytes(contentLength);
+			out.write(b);
+			if (isRequest)
+				conn.addRequest(b, false);
+			else
+				conn.addResponse(b, false);
+			setHTTPBody(b);
+			return;
+		}
+		
+		// spec 4.4.4 (?)
+		
+		Trace.trace(Trace.PARSING, "Unknown body for: " + this);
+	}
+
+	/**
+	 * Parse an HTTP chunk.
+	 */
+	public void parseChunk() throws IOException {
+		Trace.trace(Trace.PARSING, "Parsing chunk for: " + this);
+		boolean done = false;
+		byte[] body = new byte[0];
+	
+		while (!done) {
+			// read chunk size
+			byte[] b = readLine();
+	
+			String s = new String(b);
+			int index = s.indexOf(" ");
+			int length = -1;
+			try {
+				if (index > 0)
+					s = s.substring(0, index);
+				length = Integer.parseInt(s.trim(), 16);
+			} catch (Exception e) {
+				Trace.trace(Trace.PARSING, "Error chunk for: " + this, e);
+			}
+	
+			// output bytes
+			outputBytes(b, false);
+	
+			if (length <= 0)
+				done = true;
+			else {
+				// read and output chunk data plus CRLF
+				b = readBytes(length + 2);
+				outputBytes(b, false);
+				
+				// copy to HTTP body
+				byte[] temp = new byte[body.length + b.length - 2];
+				System.arraycopy(body, 0, temp, 0, body.length);
+				System.arraycopy(b, 0, temp, body.length, b.length - 2);
+				body = temp;
+			}
+		}
+	
+		// read trailer
+		byte[] b = readLine();
+		while (b.length > 2) {
+			outputBytes(b, false);
+			b = readLine();
+		}
+	
+		outputBytes(b, false);
+		setHTTPBody(body);
+	}
+
+	/**
+	 * Parse an HTTP header.
+	 */
+	public void parseHeader() throws IOException {
+		Trace.trace(Trace.PARSING, "Parsing header for: " + this);
+	
+		// read until first blank line
+		boolean isFirstLine = true;
+		boolean isNew = true;
+	
+		byte[] b = readLine();
+		while (b.length > 5) {
+			Trace.trace(Trace.PARSING, "Parsing header line: '" + new String(b) + "'");
+			
+			if (isFirstLine) {
+				String s = new String(b);
+				if (isRequest) {
+					setLabel(s);
+					isNew = false;
+				}
+	
+				if (!isRequest) {
+					int index1 = s.indexOf(' ');
+					int index2 = s.indexOf(' ', index1 + 1);
+	
+					try {
+						responseType = s.substring(index1 + 1, index2).trim();
+						Trace.trace(Trace.PARSING, "Response Type: " + this + " " + responseType);
+					} catch (Exception e) {
+						Trace.trace(Trace.PARSING, "Error parsing response type for: " + this, e);
+					}
+					if (responseType != null && responseType.equals("100")) {
+						outputBytes(b, isNew);
+						isNew = false;
+
+						b = readLine();
+						outputBytes(b, false);
+
+						b = readLine();
+
+						index1 = s.indexOf(' ');
+						index2 = s.indexOf(' ', index1 + 1);
+
+						try {
+							responseType = s.substring(index1 + 1, index2).trim();
+							Trace.trace(Trace.PARSING, "Response Type: " + this + " " + responseType);
+						} catch (Exception e) {
+							Trace.trace(Trace.PARSING, "Error parsing response type for: " + this, e);
+						}
+					}
+				}
+				isFirstLine = false;
+			}
+	
+			// translate
+			b = translateHeaderLine(b);
+			
+			outputBytes(b, isNew);
+			isNew = false;
+	
+			b = readLine();
+		}
+
+		Trace.trace(Trace.PARSING, "Parsing final header line: '" + new String(b) + "'");
+
+		outputBytes(b, false);
+
+		IRequest rr = conn.getRequestResponse(isRequest);
+		Trace.trace(Trace.PARSING, "Setting header length: " + rr.getRequest(IRequest.ALL).length);
+		
+		setHTTPHeader(rr);
+	}
+
+	/**
+	 * Read bytes from the stream.
+	 * @return byte[]
+	 */
+	protected byte[] readBytes(int n) throws IOException {
+		Trace.trace(Trace.PARSING, "readBytes() " + n + " for: " + this);
+		while (buffer.length - bufferIndex < n)
+			fillBuffer();
+	
+		return removeFromBuffer(bufferIndex + n);
+	}
+
+	/**
+	 * Read and return the next full line.
+	 *
+	 * @return byte[]
+	 */
+	protected byte[] readLine() throws IOException {
+		Trace.trace(Trace.PARSING, "readLine() for: " + this);
+	
+		int n = getFirstCRLF();
+		while (n < 0) {
+			fillBuffer();
+			n = getFirstCRLF();
+		}
+		return removeFromBuffer(n + 1);
+	}
+
+	/**
+	 * Remove data from the buffer up to the absolute index n.
+	 * Return the data from between bufferIndex and n.
+	 *
+	 * @return byte[]
+	 * @param index int
+	 */
+	protected byte[] removeFromBuffer(int n) {
+		// copy line out of buffer
+		byte[] b = new byte[n - bufferIndex];
+		System.arraycopy(buffer, bufferIndex, b, 0, n - bufferIndex);
+	
+		if (buffer.length > BUFFER * 2 || bufferIndex > BUFFER) {
+			// remove line from buffer
+			int size = buffer.length;
+			byte[] x = new byte[size - n];
+			System.arraycopy(buffer, n, x, 0, size - n);
+			buffer = x;
+			bufferIndex = 0;
+		} else
+			bufferIndex = n;
+	
+		return b;
+	}
+
+	/**
+	 * Listen for input, save it, and pass to the output stream.
+	 * Philosophy: Read a single line separately and translate.
+	 * When blank line is reached, just pass all other data through.
+	 */
+	public void run() {
+		try {
+			try {
+				while (true) {
+					contentLength = -1;
+					transferEncoding = -1;
+					keepAlive = false;
+
+					parseHeader();
+					parseBody();
+					
+					if (isRequest && keepAlive)
+						waitForResponse();
+					
+					IRequest r = conn.getRequestResponse(true);
+					r.fireChangedEvent();
+
+					Trace.trace(Trace.PARSING, "Done HTTP request for " + this + " " + keepAlive);
+					if (!isRequest && !keepAlive) {
+						conn2.close();
+						break;
+					}
+					
+					if (!isRequest)
+						notifyRequest();
+					
+					Thread.yield();
+				}
+			} catch (IOException e) {
+				// reached end of input
+				Trace.trace(Trace.PARSING, "End of buffer for: " + this + " " + e.getMessage());
+			}
+
+			// send rest of buffer
+			out.write(buffer, bufferIndex, buffer.length - bufferIndex);
+			out.flush();
+		} catch (IOException e) {
+			Trace.trace(Trace.PARSING, "Error in: " + this, e);
+		}
+		Trace.trace(Trace.PARSING, "Closing thread " + this);
+	}
+
+	/**
+	 * Sets the title of the call.
+	 *
+	 * @param s java.lang.String
+	 */
+	protected void setLabel(String s) {
+		try {
+			int index1 = s.indexOf(' ');
+			if (index1 < 0 || index1 > 15)
+				return;
+			int index2 = s.indexOf(' ', index1 + 1);
+			if (index2 < 0)
+				return;
+	
+			conn.setLabel(s.substring(index1 + 1, index2), true);
+		} catch (Exception e) { }
+	}
+
+	/**
+	 * Translate the header line.
+	 * 
+	 * @return byte[]
+	 * @param b byte[]
+	 */
+	protected byte[] translateHeaderLine(byte[] b) {
+		String s = new String(b);
+	
+		if (isRequest && s.startsWith("Host: ")) {
+			String t = "Host: " + host;
+			if (port != 80)
+				t += ":" + port;
+			return convert(t.getBytes());
+		} else if (s.startsWith("Content-Length: ")) {
+			try {
+				contentLength = Integer.parseInt(s.substring(16).trim());
+				Trace.trace(Trace.PARSING, "Content length: " + this + " " + contentLength);
+			} catch (Exception e) {
+				Trace.trace(Trace.PARSING, "Content length error", e);
+			}
+		} else if (s.startsWith("Connection: ")) {
+			try {
+				String t = s.substring(11).trim();
+				if (t.equalsIgnoreCase("Keep-Alive"))
+					keepAlive = true;
+				Trace.trace(Trace.PARSING, "Keep alive: " + keepAlive);
+			} catch (Exception e) {
+				Trace.trace(Trace.PARSING, "Error getting Connection: from header", e);
+			}
+		} else if (s.startsWith("Transfer-Encoding: ")) {
+			String t = s.substring(19).trim();
+			int size = ENCODING_STRING.length;
+			for (int i = 0; i < size; i++) {
+				if (ENCODING_STRING[i].equalsIgnoreCase(t)) {
+					transferEncoding = (byte) i;
+					Trace.trace(Trace.PARSING, "Transfer encoding: " + ENCODING_STRING[i]);
+				}
+			}
+		}
+	
+		return b;
+	}
+	
+	protected void close() {
+		try {
+			out.close();
+		} catch (Exception e) {
+			Trace.trace(Trace.PARSING, "Error closing connection " + this + " " + e.getMessage());
+		}
+	}
+	
+	protected void waitForResponse() {
+		Trace.trace(Trace.PARSING, "Waiting for response " + this);
+		synchronized (this) {
+			try {
+				isWaiting = true;
+				wait();
+			} catch (Exception e) {
+				Trace.trace(Trace.PARSING, "Error in waitForResponse() " + this + " " + e.getMessage());
+			}
+			isWaiting = false;
+		}
+		Trace.trace(Trace.PARSING, "Done waiting for response " + this);
+	}
+
+	protected void notifyRequest() {
+		Trace.trace(Trace.PARSING, "Notifying request " + this);
+		while (request.keepAlive && !request.isWaiting) {
+			Trace.trace(Trace.PARSING, "Waiting for request " + this);
+			try {
+				Thread.sleep(100);
+			} catch (Exception e) { }
+		}
+		synchronized (request) {
+			try {
+				request.notify();
+			} catch (Exception e) {
+				Trace.trace(Trace.PARSING, "Error in notifyRequest() " + this + " " + e.getMessage());
+			}
+		}
+		Trace.trace(Trace.PARSING, "Done notifying request " + this);
+	}
+	
+	protected void setHTTPHeader(IRequest rr) {
+		if (isRequest) {
+			byte[] b = rr.getRequest(IRequest.ALL);
+			byte[] h = new byte[b.length];
+			System.arraycopy(b, 0, h, 0, b.length);
+			rr.addProperty(HTTPRequest.HTTP_REQUEST_HEADER, h);
+		} else {
+			byte[] b = rr.getResponse(IRequest.ALL);
+			byte[] h = new byte[b.length];
+			System.arraycopy(b, 0, h, 0, b.length);
+			rr.addProperty(HTTPRequest.HTTP_RESPONSE_HEADER, h);
+		}
+	}
+	
+	protected void setHTTPBody(byte[] b) {
+		IRequest rr = conn.getRequestResponse(isRequest);
+		if (isRequest)
+			rr.addProperty(HTTPRequest.HTTP_REQUEST_BODY, b);
+		else
+			rr.addProperty(HTTPRequest.HTTP_RESPONSE_BODY, b);
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/.classpath b/archive/net.sourceforge.phpeclipse.monitor.ui/.classpath
new file mode 100644
index 0000000..065ac06
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/.project b/archive/net.sourceforge.phpeclipse.monitor.ui/.project
new file mode 100644
index 0000000..eb4b5b5
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>net.sourceforge.phpeclipse.monitor.ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/build.properties b/archive/net.sourceforge.phpeclipse.monitor.ui/build.properties
new file mode 100644
index 0000000..142800d
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/build.properties
@@ -0,0 +1,10 @@
+bin.includes = plugin.xml,\
+               *.jar,\
+               monitorui.jar,\
+               plugin.properties,\
+               icons/
+jars.compile.order = 
+src.includes = schema/,\
+               build.properties
+output.monitorui.jar = bin/
+source.monitorui.jar = monitorui/
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/icons/clcl16/clear.gif b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/clcl16/clear.gif
new file mode 100644
index 0000000..389954f
Binary files /dev/null and b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/clcl16/clear.gif differ
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/icons/clcl16/httpHeader.gif b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/clcl16/httpHeader.gif
new file mode 100644
index 0000000..fb20c38
Binary files /dev/null and b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/clcl16/httpHeader.gif differ
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/icons/clcl16/sortResponseTime.gif b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/clcl16/sortResponseTime.gif
new file mode 100644
index 0000000..e334e9f
Binary files /dev/null and b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/clcl16/sortResponseTime.gif differ
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/icons/cview16/monitorView.gif b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/cview16/monitorView.gif
new file mode 100644
index 0000000..c374f13
Binary files /dev/null and b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/cview16/monitorView.gif differ
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/icons/dlcl16/clear.gif b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/dlcl16/clear.gif
new file mode 100644
index 0000000..3bf98c0
Binary files /dev/null and b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/dlcl16/clear.gif differ
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/icons/dlcl16/httpHeader.gif b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/dlcl16/httpHeader.gif
new file mode 100644
index 0000000..6d71a8b
Binary files /dev/null and b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/dlcl16/httpHeader.gif differ
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/icons/dlcl16/sortResponseTime.gif b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/dlcl16/sortResponseTime.gif
new file mode 100644
index 0000000..06e0c73
Binary files /dev/null and b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/dlcl16/sortResponseTime.gif differ
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/icons/elcl16/clear.gif b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/elcl16/clear.gif
new file mode 100644
index 0000000..389954f
Binary files /dev/null and b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/elcl16/clear.gif differ
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/icons/elcl16/httpHeader.gif b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/elcl16/httpHeader.gif
new file mode 100644
index 0000000..fb20c38
Binary files /dev/null and b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/elcl16/httpHeader.gif differ
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/icons/elcl16/sortResponseTime.gif b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/elcl16/sortResponseTime.gif
new file mode 100644
index 0000000..e334e9f
Binary files /dev/null and b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/elcl16/sortResponseTime.gif differ
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/icons/eview16/monitorView.gif b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/eview16/monitorView.gif
new file mode 100644
index 0000000..c374f13
Binary files /dev/null and b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/eview16/monitorView.gif differ
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/icons/obj16/host.gif b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/obj16/host.gif
new file mode 100644
index 0000000..b51ae39
Binary files /dev/null and b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/obj16/host.gif differ
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/icons/obj16/monitorOff.gif b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/obj16/monitorOff.gif
new file mode 100644
index 0000000..42e5f31
Binary files /dev/null and b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/obj16/monitorOff.gif differ
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/icons/obj16/monitorOn.gif b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/obj16/monitorOn.gif
new file mode 100644
index 0000000..2ff3974
Binary files /dev/null and b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/obj16/monitorOn.gif differ
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/icons/obj16/tcp.gif b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/obj16/tcp.gif
new file mode 100644
index 0000000..8a6e219
Binary files /dev/null and b/archive/net.sourceforge.phpeclipse.monitor.ui/icons/obj16/tcp.gif differ
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/plugin.properties b/archive/net.sourceforge.phpeclipse.monitor.ui/plugin.properties
new file mode 100644
index 0000000..9ab09e7
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/plugin.properties
@@ -0,0 +1,68 @@
+pluginName=TCP/IP Monitor
+providerName=IBM
+
+# --------------- TCP/IP Monitor view ---------------
+
+# Labels
+viewTitle=TCP/IP Monitor
+viewRequest=Request: {0}
+viewResponse=Response: {0}
+viewTime=Time of request: {0}
+viewType=Type: {0}
+viewResponseTime=Response Time: {0}
+viewSize=Size: {0}
+viewResponseTimeFormat={0} ms
+viewSizeFormat={0} ({1}) bytes
+viewDateFormat=h:mm.s.S a
+viewResponseTypeUnknown=Unknown
+
+# Actions
+actionSortByResponseTime=Sort by response time
+actionClearToolTip=Clear
+actionShowHeader=Show header
+actionProperties=Properties...
+
+
+# --------------- RequestResponse Viewers ---------------
+byteView=Byte View
+imageView=Image View
+xmlView=XML View
+headerLabel=Header
+imageViewInvalid=Not a valid image file
+xmlViewInvalid=Not a valid XML file
+
+# --------------- Errors ---------------
+errorPortInUse=The TCP/IP monitor could not start because the port is in use.
+errorCouldNotStart=TCP/IP monitor could not start correctly.
+errorGeneral=Error: {0}
+errorInvalidRemotePort=The remote port number is invalid.
+errorInvalidLocalPort=The local port number is invalid.
+errorDialogTitle=Error
+
+# --------------- General UI ---------------
+monitorList=TCP/IP Monitors:
+columnLocal=Local Port
+columnRemote=Host name
+columnType=Type
+columnStatus=Status
+add=Add...
+edit=Edit...
+remove=Remove
+start=Start
+stop=Stop
+started=Started
+stopped=Stopped
+
+newMonitor=New Monitor
+editMonitor=Edit Monitor
+
+localPort=Local monitoring port:
+remoteGroup=Monitor
+remoteHost=Host name:
+remotePort=Port:
+parseType=Type:
+
+preferenceTitle=TCP/IP Monitor
+preferenceDescription=Configure TCP/IP monitors on local and remote ports.
+
+prefShowView=&Show the TCP/IP Monitor view when there is activity
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/plugin.xml b/archive/net.sourceforge.phpeclipse.monitor.ui/plugin.xml
new file mode 100644
index 0000000..da8d607
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/plugin.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<plugin id="net.sourceforge.phpeclipse.monitor.ui"
+  name="%pluginName"
+  version="3.0.0"
+  provider-name="%providerName"
+  class="net.sourceforge.phpdt.monitor.ui.internal.MonitorUIPlugin">
+
+<requires>
+  <import plugin="org.eclipse.core.runtime" version="3.0.0" match="equivalent"/>
+  <import plugin="org.eclipse.core.resources" version="3.0.0" match="equivalent"/>
+  <import plugin="org.eclipse.ui.ide" version="3.0.0" match="equivalent"/>
+  <import plugin="org.eclipse.ui.views" version="3.0.0" match="equivalent"/>
+  <import plugin="org.eclipse.ui" version="3.0.0" match="equivalent"/>
+  <import plugin="net.sourceforge.phpeclipse.monitor.core" version="3.0.0" match="equivalent"/>
+</requires>
+
+<runtime>
+  <library name="monitorui.jar">
+    <export name="*"/>
+    <packages prefixes="net.sourceforge.phpdt.monitor.ui"/>
+  </library>
+</runtime>
+
+<extension-point name="%extensionPointViewers" id="viewers" schema="schema/viewers.exsd"/>
+
+
+<extension point="net.sourceforge.phpeclipse.monitor.core.requestListeners">
+  <requestListener
+    id="net.sourceforge.phpdt.monitor.ui.requestListener"
+    class="net.sourceforge.phpdt.monitor.ui.internal.RequestListener"/>
+</extension>
+
+<extension point="org.eclipse.ui.views"> 
+  <view
+    id="net.sourceforge.phpeclipse.monitor.core.view"
+    name="%viewTitle"
+    category="org.eclipse.debug.ui"
+    class="net.sourceforge.phpdt.monitor.ui.internal.view.MonitorView"
+    icon="icons/cview16/monitorView.gif">
+  </view>
+</extension>
+
+<extension point="org.eclipse.ui.preferencePages">
+  <page
+    id="net.sourceforge.phpeclipse.monitor.core.preferencePage"
+    name="%preferenceTitle"
+    category="net.sourceforge.phpeclipse.preference.PHPEclipsePreferencePage"
+    class="net.sourceforge.phpdt.monitor.ui.internal.MonitorPreferencePage"/>
+</extension>
+
+<extension point="net.sourceforge.phpeclipse.monitor.ui.viewers">
+  <viewer
+    id="net.sourceforge.phpeclipse.monitor.viewers.byteviewer"
+    class="net.sourceforge.phpdt.monitor.ui.internal.viewers.ByteViewer"
+    type="requestresponse"
+    label="%byteView"/>
+  <viewer
+    id="net.sourceforge.phpeclipse.monitor.viewers.imageviewer"
+    class="net.sourceforge.phpdt.monitor.ui.internal.viewers.ImageViewer"
+    type="requestresponse"
+    label="%imageView"/>
+  <viewer
+    id="net.sourceforge.phpeclipse.monitor.viewers.XMLViewer"
+    class="net.sourceforge.phpdt.monitor.ui.internal.viewers.XMLViewer"
+    type="requestresponse"
+    label="%xmlView"/>
+</extension>
+
+</plugin>
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/schema/viewers.exsd b/archive/net.sourceforge.phpeclipse.monitor.ui/schema/viewers.exsd
new file mode 100644
index 0000000..a175038
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/schema/viewers.exsd
@@ -0,0 +1,128 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="net.sourceforge.phpeclipse.monitor.ui">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="net.sourceforge.phpeclipse.monitor.ui" id="viewers" name="Content Viewers"/>
+      </appInfo>
+      <documentation>
+         This extension point is used to provide a viewer for a specific type of content. (e.g. a viewer for a particular image format)
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="viewer" minOccurs="0" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="viewer">
+      <annotation>
+         <appInfo>
+            <meta.element labelAttribute="name"/>
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+         </sequence>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  specifies a unique identifier for this extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  specifies the fully qualified name of the Java class that implements &lt;samp&gt;IContentViewer&lt;/samp&gt;
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.wtp.server.core.model.IStartup"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="label" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a translatable name used to identify the content viewer
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="type" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         The following is an example of a content viewer extension point:
+
+&lt;p&gt;
+&lt;pre&gt;
+&lt;extension point=&quot;net.sourceforge.phpeclipse.monitor.ui.viewers&quot;&gt;
+  &lt;viewer
+    id=&quot;com.example.byteviewer&quot;
+    class=&quot;com.example.ByteContentViewer&quot;
+    type=&quot;requestresponse&quot;
+    label=&quot;%byteView&quot;/&gt;
+&lt;/extension&gt;
+&lt;/pre&gt;
+&lt;/p&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that implements the interface &lt;b&gt;net.sourceforge.phpdt.monitor.ui.IContentViewer&lt;/b&gt;.
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2000, 2003 IBM Corporation and others.&lt;br&gt;
+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 
+&lt;a href=&quot;http://www.eclipse.org/legal/cpl-v10.html&quot;&gt;http://www.eclipse.org/legal/cpl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/IContentViewer.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/IContentViewer.java
new file mode 100644
index 0000000..05316c2
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/IContentViewer.java
@@ -0,0 +1,46 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui;
+
+import org.eclipse.swt.widgets.Composite;
+/**
+ * Viewer interface for displaying request and response messages
+ */
+public interface IContentViewer {
+	//message to display
+	//public static final byte REQUEST_MSG = 0;
+	//public static final byte RESPONSE_MSG = 1;
+
+	/**
+	 * Initializes the viewer so it can be used to display 
+	 * TCP/IP messages.  Requires the parent Composite that the
+	 * viewer will display its information in, and a byte message
+	 * (IRequestResponseViewer.REQUEST_MSG or IRequestResponseViewer.RESPONSE_MSG)
+	 * to display either the tcpip request information, or the tcpip response
+	 * information
+	 * @param parent org.eclipse.widgets.Composite
+	 * @param message byte
+	 */
+	public void init(Composite parent);
+	
+	/**
+	 * Sets the IRequest object that the viewer is
+	 * currently displaying.  The parameter should be null if
+	 * no IRequest object is to be displayed.
+	 * @param reqresp org.eclipse.tcpip.monitor.IRequest
+	 */
+	public void setContent(byte[] b);
+		
+	/**
+	 * Disposes the Composite containing this viewer's TCP/IP message display
+	 */
+	public void dispose(); 
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/ContextIds.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/ContextIds.java
new file mode 100644
index 0000000..56dd2f1
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/ContextIds.java
@@ -0,0 +1,25 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal;
+/**
+ * Constant ids for context help.
+ */
+public interface ContextIds {
+	public static final String VIEW = MonitorUIPlugin.PLUGIN_ID + ".tmvw0000";
+	public static final String VIEW_TREE = MonitorUIPlugin.PLUGIN_ID + ".tmvw0002";
+	public static final String VIEW_REQUEST = MonitorUIPlugin.PLUGIN_ID + ".tmvw0004";
+	public static final String VIEW_RESPONSE = MonitorUIPlugin.PLUGIN_ID + ".tmvw0006";
+
+	public static final String PREF = MonitorUIPlugin.PLUGIN_ID + ".tmpr0000";
+	public static final String PREF_SHOW = MonitorUIPlugin.PLUGIN_ID + ".tmpr0002";
+	public static final String PREF_MONITORS = MonitorUIPlugin.PLUGIN_ID + ".tmpr0004";
+	public static final String PREF_DIALOG = MonitorUIPlugin.PLUGIN_ID + ".tmpr0006";
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorComposite.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorComposite.java
new file mode 100644
index 0000000..ec1d9a6
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorComposite.java
@@ -0,0 +1,254 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List; 
+
+import net.sourceforge.phpdt.monitor.core.IMonitor;
+import net.sourceforge.phpdt.monitor.core.IMonitorWorkingCopy;
+import net.sourceforge.phpdt.monitor.core.MonitorCore;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.help.WorkbenchHelp;
+/**
+ * 
+ */
+public class MonitorComposite extends Composite {
+	protected Table table;
+	protected TableViewer tableViewer;
+	
+	protected Button edit;
+	protected Button remove;
+	protected Button start;
+	protected Button stop;
+	
+	protected List selection2;
+	
+	public MonitorComposite(Composite parent, int style) {
+		super(parent, style);
+		
+		createWidgets();
+	}
+	
+	protected void createWidgets() {
+		GridLayout layout = new GridLayout();
+		layout.horizontalSpacing = 6;
+		layout.verticalSpacing = 6;
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		layout.numColumns = 2;
+		setLayout(layout);
+
+		GridData data = new GridData(GridData.FILL_BOTH);
+		setLayoutData(data);
+		
+		Label label = new Label(this, SWT.WRAP);
+		label.setText(MonitorUIPlugin.getResource("%monitorList"));
+		label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER));
+		
+		label = new Label(this, SWT.NONE);
+
+		table = new Table(this, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
+		data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL);
+		data.widthHint = 300;
+		WorkbenchHelp.setHelp(table, ContextIds.PREF_MONITORS);
+		
+		table.setLayoutData(data);
+		table.setHeaderVisible(true);
+		table.setLinesVisible(true);
+		
+		TableLayout tableLayout = new TableLayout();
+		
+		TableColumn statusColumn = new TableColumn(table, SWT.NONE);
+		statusColumn.setText(MonitorUIPlugin.getResource("%columnStatus"));
+		ColumnWeightData colData = new ColumnWeightData(6, 60, true);
+		tableLayout.addColumnData(colData);
+		
+		TableColumn remoteColumn = new TableColumn(table, SWT.NONE);
+		remoteColumn.setText(MonitorUIPlugin.getResource("%columnRemote"));
+		colData = new ColumnWeightData(12, 120, true);
+		tableLayout.addColumnData(colData);
+		
+		TableColumn httpColumn = new TableColumn(table, SWT.NONE);
+		httpColumn.setText(MonitorUIPlugin.getResource("%columnType"));
+		colData = new ColumnWeightData(5, 55, true);
+		tableLayout.addColumnData(colData);
+		
+		TableColumn localColumn = new TableColumn(table, SWT.NONE);
+		localColumn.setText(MonitorUIPlugin.getResource("%columnLocal"));
+		colData = new ColumnWeightData(5, 50, true);
+		tableLayout.addColumnData(colData);
+		
+		table.setLayout(tableLayout);
+		
+		tableViewer = new TableViewer(table);
+		tableViewer.setContentProvider(new MonitorContentProvider());
+		tableViewer.setLabelProvider(new MonitorTableLabelProvider());
+		tableViewer.setInput("root");
+		
+		tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				setSelection(event.getSelection());
+			}
+		});
+		
+		Composite buttonComp = new Composite(this, SWT.NONE);
+		layout = new GridLayout();
+		layout.horizontalSpacing = 0;
+		layout.verticalSpacing = 8;
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		layout.numColumns = 1;
+		buttonComp.setLayout(layout);
+		data = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_FILL);
+		buttonComp.setLayoutData(data);
+		
+		Button add = SWTUtil.createButton(buttonComp, MonitorUIPlugin.getResource("%add"));
+		add.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				MonitorDialog dialog = new MonitorDialog(getShell());
+				if (dialog.open() == Window.CANCEL)
+					return;
+				tableViewer.refresh();
+				
+				List list = MonitorCore.getMonitors();
+				Object monitor = list.get(list.size() - 1);
+				tableViewer.setSelection(new StructuredSelection(monitor));
+			}
+		});		
+		
+		edit = SWTUtil.createButton(buttonComp, MonitorUIPlugin.getResource("%edit"));
+		edit.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				IMonitor monitor = (IMonitor) getSelection().get(0);
+				IMonitorWorkingCopy wc = monitor.getWorkingCopy();
+				
+				MonitorDialog dialog = new MonitorDialog(getShell(), wc);
+				if (dialog.open() != Window.CANCEL) {
+					try {
+						tableViewer.refresh(wc.save());
+					} catch (Exception ex) { }
+				}
+			}
+		});
+		edit.setEnabled(false);
+		
+		remove = SWTUtil.createButton(buttonComp, MonitorUIPlugin.getResource("%remove"));
+		remove.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				Iterator iterator = getSelection().iterator();
+				while (iterator.hasNext()) {
+					IMonitor monitor = (IMonitor) iterator.next();
+					try {
+						monitor.delete();
+					} catch (Exception ex) { }
+					tableViewer.remove(monitor);
+					
+					List list = MonitorCore.getMonitors();
+					Object monitor2 = list.get(list.size() - 1);
+					tableViewer.setSelection(new StructuredSelection(monitor2));
+				}
+			}
+		});
+		remove.setEnabled(false);
+		
+		start = SWTUtil.createButton(buttonComp, MonitorUIPlugin.getResource("%start"));
+		start.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				Iterator iterator = getSelection().iterator();
+				while (iterator.hasNext()) {
+					IMonitor monitor = (IMonitor) iterator.next();
+					try {
+						MonitorCore.startMonitor(monitor);
+					} catch (CoreException ce) {
+						MessageDialog.openError(getShell(), MonitorUIPlugin.getResource("%errorDialogTitle"), ce.getStatus().getMessage());
+					} catch (Exception ce) {
+						MessageDialog.openError(getShell(), MonitorUIPlugin.getResource("%errorDialogTitle"), ce.getMessage());
+					}
+					tableViewer.refresh(monitor, true);
+				}
+				tableViewer.setSelection(tableViewer.getSelection());
+			}
+		});
+		start.setEnabled(false);
+		
+		stop = SWTUtil.createButton(buttonComp, MonitorUIPlugin.getResource("%stop"));
+		stop.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				Iterator iterator = getSelection().iterator();
+				while (iterator.hasNext()) {
+					IMonitor monitor = (IMonitor) iterator.next();
+					try {
+						MonitorCore.stopMonitor(monitor);
+					} catch (Exception ex) { }
+					tableViewer.refresh(monitor, true);
+				}
+				tableViewer.setSelection(tableViewer.getSelection());
+			}
+		});
+		stop.setEnabled(false);
+	}
+
+	protected List getSelection() {
+		return selection2;
+	}
+
+	protected void setSelection(ISelection sel2) {
+		IStructuredSelection sel = (IStructuredSelection) sel2;
+		Iterator iterator = sel.iterator();
+		selection2 = new ArrayList();
+		
+		while (iterator.hasNext()) {
+			Object obj = iterator.next();
+			if (obj instanceof IMonitor)
+				selection2.add(obj);
+		}
+		
+		if (!selection2.isEmpty()) {
+			remove.setEnabled(true);
+			
+			boolean allStopped = true;
+			boolean allStarted = true;
+			
+			iterator = selection2.iterator();
+			while (iterator.hasNext()) {
+				IMonitor monitor = (IMonitor) iterator.next();
+				if (monitor.isRunning())
+					allStopped = false;
+				else
+					allStarted = false;
+			}
+			start.setEnabled(allStopped);
+			stop.setEnabled(allStarted);
+			edit.setEnabled(selection2.size() == 1 && allStopped);
+		} else {
+			edit.setEnabled(false);
+			remove.setEnabled(false);
+			start.setEnabled(false);
+			stop.setEnabled(false);
+		}
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorContentProvider.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorContentProvider.java
new file mode 100644
index 0000000..aa08b4f
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorContentProvider.java
@@ -0,0 +1,73 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal;
+
+import java.util.*;
+
+import net.sourceforge.phpdt.monitor.core.IMonitor;
+import net.sourceforge.phpdt.monitor.core.MonitorCore;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+/**
+ * Monitor content provider.
+ */
+public class MonitorContentProvider implements IStructuredContentProvider {
+	/**
+	 * MonitorContentProvider constructor comment.
+	 */
+	public MonitorContentProvider() {
+		super();
+	}
+
+	/**
+	 * Disposes of this content provider.  
+	 * This is called by the viewer when it is disposed.
+	 */
+	public void dispose() { }
+
+	/**
+	 * Returns the elements to display in the viewer 
+	 * when its input is set to the given element. 
+	 * These elements can be presented as rows in a table, items in a list, etc.
+	 * The result is not modified by the viewer.
+	 *
+	 * @param inputElement the input element
+	 * @return the array of elements to display in the viewer
+	 */
+	public Object[] getElements(Object inputElement) {
+		List list = new ArrayList();
+		Iterator iterator = MonitorCore.getMonitors().iterator();
+		while (iterator.hasNext()) {
+			IMonitor monitor = (IMonitor) iterator.next();
+			list.add(monitor);
+		}
+		return list.toArray();
+	}
+
+	/**
+	 * Notifies this content provider that the given viewer's input
+	 * has been switched to a different element.
+	 * <p>
+	 * A typical use for this method is registering the content provider as a listener
+	 * to changes on the new input (using model-specific means), and deregistering the viewer 
+	 * from the old input. In response to these change notifications, the content provider
+	 * propagates the changes to the viewer.
+	 * </p>
+	 *
+	 * @param viewer the viewer
+	 * @param oldInput the old input element, or <code>null</code> if the viewer
+	 *   did not previously have an input
+	 * @param newInput the new input element, or <code>null</code> if the viewer
+	 *   does not have an input
+	 */
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorDialog.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorDialog.java
new file mode 100644
index 0000000..9ef6c99
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorDialog.java
@@ -0,0 +1,266 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal;
+
+import java.net.InetAddress;
+
+import net.sourceforge.phpdt.monitor.core.IMonitorWorkingCopy;
+import net.sourceforge.phpdt.monitor.core.IProtocolAdapter;
+import net.sourceforge.phpdt.monitor.core.MonitorCore;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.help.WorkbenchHelp;
+/**
+ * 
+ */
+public class MonitorDialog extends Dialog {
+	protected IMonitorWorkingCopy monitor;
+	protected boolean isEdit;
+	
+	private Button okButton;
+	private Text monitorPort;
+	private Text remoteHostname;
+	private Text remotePort;
+	
+	interface StringModifyListener {
+		public void valueChanged(String s);
+	}
+	
+	interface BooleanModifyListener {
+		public void valueChanged(boolean b);
+	}
+	
+	interface TypeModifyListener {
+		public void valueChanged(IProtocolAdapter type);
+	}
+
+	/**
+	 * @param parentShell
+	 */
+	public MonitorDialog(Shell parentShell, IMonitorWorkingCopy monitor) {
+		super(parentShell);
+		this.monitor = monitor;
+		isEdit = true;
+	}
+	
+	public MonitorDialog(Shell parentShell) {
+		super(parentShell);
+		monitor = MonitorCore.createMonitor();
+		isEdit = false;
+	}
+	
+	protected void configureShell(Shell shell) {
+		super.configureShell(shell);
+		if (isEdit)
+			shell.setText(MonitorUIPlugin.getResource("%editMonitor"));
+		else
+			shell.setText(MonitorUIPlugin.getResource("%newMonitor"));
+	}
+	
+	protected Label createLabel(Composite comp, String txt) {
+		Label label = new Label(comp, SWT.NONE);
+		label.setText(txt);
+		label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING));
+		return label;
+	}
+	
+	protected Text createText(Composite comp, String txt, final StringModifyListener listener) {
+		final Text text = new Text(comp, SWT.BORDER);
+		if (txt != null)
+			text.setText(txt);
+		GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
+		data.widthHint = 150;
+		text.setLayoutData(data);
+		if (listener != null)
+			text.addModifyListener(new ModifyListener() {
+				public void modifyText(ModifyEvent e) {	
+					listener.valueChanged(text.getText());
+				}
+			});
+		return text;
+	}
+	
+	protected Combo createTypeCombo(Composite comp, final IProtocolAdapter[] types, IProtocolAdapter sel, final TypeModifyListener listener) {
+		final Combo combo = new Combo(comp, SWT.DROP_DOWN | SWT.READ_ONLY);
+		int size = types.length;
+		String[] items = new String[size];
+		int index = -1;
+		for (int i = 0; i < size; i++) {
+			items[i] = types[i].getName();
+			if (types[i].equals(sel))
+				index = i;
+		}
+		combo.setItems(items);
+		if (index >= 0)
+			combo.select(index);
+		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
+		data.widthHint = 150;
+		combo.setLayoutData(data);
+		if (listener != null)
+			combo.addSelectionListener(new SelectionListener() {
+				public void widgetSelected(SelectionEvent e) {	
+					listener.valueChanged(types[combo.getSelectionIndex()]);
+				}
+				public void widgetDefaultSelected(SelectionEvent e) {
+					widgetSelected(e);
+				}
+			});
+		return combo;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		Composite composite = (Composite) super.createDialogArea(parent);
+		((GridLayout)composite.getLayout()).numColumns = 2;
+		
+		WorkbenchHelp.setHelp(composite, ContextIds.PREF_DIALOG);
+		
+		createLabel(composite, MonitorUIPlugin.getResource("%localPort"));		
+		monitorPort = createText(composite, monitor.getLocalPort() + "", new StringModifyListener() {
+			public void valueChanged(String s) {
+				try {
+					monitor.setLocalPort(Integer.parseInt(s));
+				} catch (Exception e) { }
+				validateFields();
+			}
+		});
+		
+		Group group = new Group(composite, SWT.NONE);
+		GridLayout layout = new GridLayout(2, false);
+		group.setLayout(layout);
+		GridData data = new GridData(GridData.FILL_HORIZONTAL);
+		data.horizontalSpan = 2;
+		group.setLayoutData(data);
+		group.setText(MonitorUIPlugin.getResource("%remoteGroup"));
+		
+		createLabel(group, MonitorUIPlugin.getResource("%remoteHost"));		
+		remoteHostname = createText(group, monitor.getRemoteHost(), new StringModifyListener() {
+			public void valueChanged(String s) {
+				monitor.setRemoteHost(s);
+				validateFields();
+			}
+		});
+		
+		createLabel(group, MonitorUIPlugin.getResource("%remotePort"));		
+		remotePort = createText(group, monitor.getRemotePort() + "", new StringModifyListener() {
+			public void valueChanged(String s) {
+				try {
+					monitor.setRemotePort(Integer.parseInt(s));
+				} catch (Exception e) { }
+				validateFields();
+			}
+		});
+		
+		createLabel(group, MonitorUIPlugin.getResource("%parseType"));		
+		createTypeCombo(group, MonitorCore.getProtocolAdapters(), monitor.getProtocolAdapter(), new TypeModifyListener() {
+			public void valueChanged(IProtocolAdapter type) {
+				monitor.setProtocolAdapter(type);
+			}
+		});
+		
+		return composite;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+	 */
+	protected void okPressed() {
+		monitor.save();
+		super.okPressed();
+	}
+
+	protected Control createButtonBar(Composite parent) {
+		Control buttonControl = super.createButtonBar(parent);
+		validateFields();
+		return buttonControl;
+	}
+
+	private void setOKButtonEnabled(boolean curIsEnabled) {
+		if (okButton == null)
+			okButton = getButton(IDialogConstants.OK_ID);
+		
+		if (okButton != null)
+			okButton.setEnabled(curIsEnabled);
+	}
+
+	protected void validateFields() {
+		if (monitorPort == null)
+			return;
+		
+		boolean result = true;
+
+		String currHostname = remoteHostname.getText();
+		if (!isValidHostname(currHostname))
+			result = false;
+		
+		String currHostnamePort = remotePort.getText();
+		try {
+			Integer.parseInt(currHostnamePort);
+		} catch (Exception any) {
+			result = false;
+		}
+		
+		String currMonitorPort = monitorPort.getText();
+		try {
+			Integer.parseInt(currMonitorPort);
+		} catch (Exception any) {
+			result = false;
+		}
+		
+		if (result && isLocalhost(currHostname)) {
+			if (currHostnamePort.equals(currMonitorPort))
+				result = false;
+		}
+		setOKButtonEnabled(result);
+	}
+	
+	protected static boolean isValidHostname(String host) {
+		if (host == null || host.trim().length() < 1)
+			return false;
+		if (host.indexOf("/") >= 0)
+			return false;
+		if (host.indexOf("\\") >= 0)
+			return false;
+		if (host.indexOf(" ") >= 0)
+			return false;
+		return true;
+	}
+	
+	protected static boolean isLocalhost(String host) {
+		if (host == null)
+			return false;
+		try {
+			if ("localhost".equals(host) || "127.0.0.1".equals(host))
+				return true;
+			InetAddress localHostaddr = InetAddress.getLocalHost();
+			if (localHostaddr.getHostName().equals(host))
+				return true;
+		} catch (Exception e) {
+			Trace.trace(Trace.WARNING, "Error checking for localhost", e);
+		}
+		return false;
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorPreferencePage.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorPreferencePage.java
new file mode 100644
index 0000000..86ba1aa
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorPreferencePage.java
@@ -0,0 +1,111 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal;
+
+import org.eclipse.swt.*;
+import org.eclipse.swt.layout.*;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.help.WorkbenchHelp;
+/**
+ * The preference page that holds monitor properties.
+ */
+public class MonitorPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+	protected Button displayButton;
+
+	/**
+	 * MonitorPreferencePage constructor comment.
+	 */
+	public MonitorPreferencePage() {
+		super();
+		noDefaultAndApplyButton();
+	}
+
+	/**
+	 * Create the preference options.
+	 *
+	 * @param parent org.eclipse.swt.widgets.Composite
+	 * @return org.eclipse.swt.widgets.Control
+	 */
+	protected Control createContents(Composite parent) {
+		initializeDialogUnits(parent);
+		
+		Composite composite = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 1;
+		layout.horizontalSpacing = convertHorizontalDLUsToPixels(4);
+		layout.verticalSpacing = convertVerticalDLUsToPixels(4);
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		composite.setLayout(layout);
+		GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL);
+		composite.setLayoutData(data);
+		WorkbenchHelp.setHelp(composite, ContextIds.PREF);
+		
+		Label label = new Label(composite, SWT.WRAP);
+		label.setText(MonitorUIPlugin.getResource("%preferenceDescription"));
+		data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+		label.setLayoutData(data);
+	
+		displayButton = new Button(composite, SWT.CHECK);
+		displayButton.setText(MonitorUIPlugin.getResource("%prefShowView"));
+		displayButton.setSelection(MonitorUIPlugin.getShowOnActivityPreference());
+		WorkbenchHelp.setHelp(displayButton, ContextIds.PREF_SHOW);
+		
+		label = new Label(composite, SWT.NONE);
+		label.setText("");
+	
+		MonitorComposite monitorComp = new MonitorComposite(composite, SWT.NONE);
+		data = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
+		monitorComp.setLayoutData(data);
+		
+		Dialog.applyDialogFont(composite);
+	
+		return composite;
+	}
+
+	/**
+	 * Initializes this preference page using the passed desktop.
+	 *
+	 * @param desktop the current desktop
+	 */
+	public void init(IWorkbench workbench) {
+	}
+
+	/**
+	 * Performs special processing when this page's Defaults button has been pressed.
+	 * <p>
+	 * This is a framework hook method for sublcasses to do special things when
+	 * the Defaults button has been pressed.
+	 * Subclasses may override, but should call <code>super.performDefaults</code>.
+	 * </p>
+	 */
+	protected void performDefaults() {
+		displayButton.setSelection(MonitorUIPlugin.getDefaultShowOnActivityPreference());
+		super.performDefaults();
+	}
+
+	/** 
+	 * Method declared on IPreferencePage.
+	 * Subclasses should override
+	 */
+	public boolean performOk() {
+		MonitorUIPlugin.setShowOnActivityPreference(displayButton.getSelection());
+		MonitorUIPlugin.getInstance().savePluginPreferences();
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorPrefrencesDialog.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorPrefrencesDialog.java
new file mode 100644
index 0000000..8e50b5a
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorPrefrencesDialog.java
@@ -0,0 +1,82 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal;
+
+import net.sourceforge.phpdt.monitor.core.IMonitorWorkingCopy;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.help.WorkbenchHelp;
+/**
+ * 
+ */
+public class MonitorPrefrencesDialog extends Dialog {
+	protected IMonitorWorkingCopy monitor;
+	protected boolean isEdit;
+
+	/**
+	 * @param parentShell
+	 */
+	public MonitorPrefrencesDialog(Shell parentShell, IMonitorWorkingCopy monitor) {
+		super(parentShell);
+		this.monitor = monitor;
+		isEdit = true;
+	}
+	
+	public MonitorPrefrencesDialog(Shell composite) {
+		super(composite);
+		isEdit=false;
+	}
+	
+	protected void configureShell(Shell shell) {
+		super.configureShell(shell);
+		shell.setText(MonitorUIPlugin.getResource("%preferenceTitle"));
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createDialogArea(Composite parent) {
+		Composite compositeParent = (Composite) super.createDialogArea(parent);
+		
+		Composite composite = new Composite(compositeParent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.marginHeight = convertHorizontalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+		layout.marginWidth = convertVerticalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+		layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+		composite.setLayout(layout);
+		GridData data = new GridData(GridData.FILL_BOTH);
+		composite.setLayoutData(data);
+		WorkbenchHelp.setHelp(composite, ContextIds.PREF);
+		
+		MonitorComposite monitorComp = new MonitorComposite(composite, SWT.NONE);
+		data = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
+		monitorComp.setLayoutData(data);
+		
+		Dialog.applyDialogFont(composite);
+		
+		return composite;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+	 */
+	protected void okPressed() {
+		MonitorUIPlugin.getInstance().savePluginPreferences();	
+		super.okPressed();
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorTableLabelProvider.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorTableLabelProvider.java
new file mode 100644
index 0000000..0832a84
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorTableLabelProvider.java
@@ -0,0 +1,127 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal;
+
+import net.sourceforge.phpdt.monitor.core.IMonitor;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+/**
+ * Monitor table label provider.
+ */
+public class MonitorTableLabelProvider implements ITableLabelProvider {
+	/**
+	 * MonitorTableLabelProvider constructor comment.
+	 */
+	public MonitorTableLabelProvider() {
+		super();
+	}
+
+	/**
+	 * Adds a listener to this label provider. 
+	 * Has no effect if an identical listener is already registered.
+	 * <p>
+	 * Label provider listeners are informed about state changes 
+	 * that affect the rendering of the viewer that uses this label provider.
+	 * </p>
+	 *
+	 * @param listener a label provider listener
+	 */
+	public void addListener(ILabelProviderListener listener) { }
+
+	/**
+	 * Disposes of this label provider.  When a label provider is
+	 * attached to a viewer, the viewer will automatically call
+	 * this method when the viewer is being closed.  When label providers
+	 * are used outside of the context of a viewer, it is the client's
+	 * responsibility to ensure that this method is called when the
+	 * provider is no longer needed.
+	 */
+	public void dispose() { }
+
+	/**
+	 * Returns the label image for the given column of the given element.
+	 *
+	 * @param element the object representing the entire row, or 
+	 *    <code>null</code> indicating that no input object is set
+	 *    in the viewer
+	 * @param columnIndex the zero-based index of the column in which
+	 *   the label appears
+	 */
+	public Image getColumnImage(Object element, int columnIndex) {
+		if (columnIndex == 0) {
+			IMonitor monitor = (IMonitor) element;
+			if (monitor.isRunning())
+				return MonitorUIPlugin.getImage(MonitorUIPlugin.IMG_MONITOR_ON);
+			else
+				return MonitorUIPlugin.getImage(MonitorUIPlugin.IMG_MONITOR_OFF);
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the label text for the given column of the given element.
+	 *
+	 * @param element the object representing the entire row, or
+	 *   <code>null</code> indicating that no input object is set
+	 *   in the viewer
+	 * @param columnIndex the zero-based index of the column in which the label appears
+	 */
+	public String getColumnText(Object element, int columnIndex) {
+		IMonitor monitor = (IMonitor) element;
+		if (columnIndex == 0) {
+			if (monitor.isRunning())
+				return MonitorUIPlugin.getResource("%started");
+			else
+				return MonitorUIPlugin.getResource("%stopped");
+		} else if (columnIndex == 1)
+			return monitor.getRemoteHost() + ":" + monitor.getRemotePort();
+		else if (columnIndex == 2)
+			return monitor.getProtocolAdapter().getName();
+		else if (columnIndex == 3)
+			return monitor.getLocalPort() + "";
+		else
+			return "X";
+	}
+	
+	protected String notNull(String s) {
+		if (s != null)
+			return s;
+		else
+			return "";
+	}
+
+	/**
+	 * Returns whether the label would be affected 
+	 * by a change to the given property of the given element.
+	 * This can be used to optimize a non-structural viewer update.
+	 * If the property mentioned in the update does not affect the label,
+	 * then the viewer need not update the label.
+	 *
+	 * @param element the element
+	 * @param property the property
+	 * @return <code>true</code> if the label would be affected,
+	 *    and <code>false</code> if it would be unaffected
+	 */
+	public boolean isLabelProperty(Object element, String property) {
+		return false;
+	}
+
+	/**
+	 * Removes a listener to this label provider.
+	 * Has no affect if an identical listener is not registered.
+	 *
+	 * @param listener a label provider listener
+	 */
+	public void removeListener(ILabelProviderListener listener) { }
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorUIPlugin.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorUIPlugin.java
new file mode 100644
index 0000000..0f9f5f3
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/MonitorUIPlugin.java
@@ -0,0 +1,225 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal;
+
+import java.util.*;
+import java.net.URL;
+import java.text.MessageFormat;
+
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.core.runtime.*;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+/**
+ * The TCP/IP monitor UI plugin.
+ */
+public class MonitorUIPlugin extends AbstractUIPlugin {
+	private static MonitorUIPlugin singleton;
+
+	protected Map imageDescriptors = new HashMap();
+
+	private static URL ICON_BASE_URL;
+	
+	private static final String URL_CLCL = "clcl16/";
+	private static final String URL_ELCL = "elcl16/";
+	private static final String URL_DLCL = "dlcl16/";
+	private static final String URL_OBJ = "obj16/";
+
+	public static final String PLUGIN_ID = "net.sourceforge.phpeclipse.monitor.ui";
+
+	public static final String IMG_ELCL_SORT_RESPONSE_TIME = "IMG_ELCL_SORT_RESPONSE_TIME";
+	public static final String IMG_ELCL_CLEAR = "IMG_ELCL_CLEAR";
+	public static final String IMG_ELCL_HTTP_HEADER = "IMG_ELCL_HTTP_HEADER";
+	public static final String IMG_CLCL_SORT_RESPONSE_TIME = "IMG_CLCL_SORT_RESPONSE_TIME";
+	public static final String IMG_CLCL_CLEAR = "IMG_CLCL_CLEAR";
+	public static final String IMG_CLCL_HTTP_HEADER = "IMG_CLCL_HTTP_HEADER";
+	public static final String IMG_DLCL_SORT_RESPONSE_TIME = "IMG_DLCL_SORT_RESPONSE_TIME";
+	public static final String IMG_DLCL_CLEAR = "IMG_DLCL_CLEAR";
+	public static final String IMG_DLCL_HTTP_HEADER = "IMG_DLCL_HTTP_HEADER";
+		
+	public static final String IMG_REQUEST_RESPONSE = "requestResponse";
+	public static final String IMG_HOST = "host";
+	public static final String IMG_MONITOR_ON = "monitorOn";
+	public static final String IMG_MONITOR_OFF = "monitorOff";
+	
+	private static final String SHOW_VIEW_ON_ACTIVITY = "show-view";
+	private static final String SHOW_HEADER = "show-header";
+
+	/**
+	 * MonitorUIPlugin constructor comment.
+	 */
+	public MonitorUIPlugin() {
+		super();
+		singleton = this;
+	}
+	
+	/**
+	 * Creates and pre-loads the image registry.
+	 *
+	 * @return ImageRegistry
+	 */
+	protected ImageRegistry createImageRegistry() {
+		ImageRegistry registry = super.createImageRegistry();
+	
+		registerImage(registry, IMG_REQUEST_RESPONSE, URL_OBJ + "tcp.gif");
+		registerImage(registry, IMG_HOST, URL_OBJ + "host.gif");
+		registerImage(registry, IMG_MONITOR_ON, URL_OBJ + "monitorOn.gif");
+		registerImage(registry, IMG_MONITOR_OFF, URL_OBJ + "monitorOff.gif");
+	
+		registerImage(registry, IMG_CLCL_CLEAR, URL_CLCL + "clear.gif");
+		registerImage(registry, IMG_CLCL_SORT_RESPONSE_TIME, URL_CLCL + "sortResponseTime.gif");
+		registerImage(registry, IMG_CLCL_HTTP_HEADER, URL_CLCL + "httpHeader.gif");
+		
+		registerImage(registry, IMG_ELCL_CLEAR, URL_ELCL + "clear.gif");
+		registerImage(registry, IMG_ELCL_SORT_RESPONSE_TIME, URL_ELCL + "sortResponseTime.gif");
+		registerImage(registry, IMG_ELCL_HTTP_HEADER, URL_ELCL + "httpHeader.gif");
+		
+		registerImage(registry, IMG_DLCL_CLEAR, URL_DLCL + "clear.gif");
+		registerImage(registry, IMG_DLCL_SORT_RESPONSE_TIME, URL_DLCL + "sortResponseTime.gif");
+		registerImage(registry, IMG_DLCL_HTTP_HEADER, URL_DLCL + "httpHeader.gif");
+		
+		return registry;
+	}
+
+	/**
+	 * Return the image with the given key from the image registry.
+	 *
+	 * @param key java.lang.String
+	 * @return org.eclipse.jface.parts.IImage
+	 */
+	public static Image getImage(String key) {
+		return getInstance().getImageRegistry().get(key);
+	}
+
+	/**
+	 * Return the image with the given key from the image registry.
+	 *
+	 * @param key java.lang.String
+	 * @return org.eclipse.jface.parts.IImage
+	 */
+	public static ImageDescriptor getImageDescriptor(String key) {
+		try {
+			getInstance().getImageRegistry();
+			return (ImageDescriptor) getInstance().imageDescriptors.get(key);
+		} catch (Exception e) {
+			return null;
+		}
+	}
+
+	/**
+	 * Returns the singleton instance of this plugin.
+	 *
+	 * @return org.eclipse.tcpip.monitor.MonitorServerPlugin
+	 */
+	public static MonitorUIPlugin getInstance() {
+		return singleton;
+	}
+
+	/**
+	 * Returns the translated String found with the given key.
+	 *
+	 * @return java.lang.String
+	 * @param key java.lang.String
+	 */
+	public static String getResource(String key) {
+		try {
+			return Platform.getResourceString(getInstance().getBundle(), key);
+		} catch (Exception e) {
+			return key;
+		}
+	}
+
+	/**
+	 * Returns the translated String found with the given key,
+	 * and formatted with the given object.
+	 *
+	 * @param key java.lang.String
+	 * @param obj java.lang.Object[]
+	 * @return java.lang.String
+	 */
+	public static String getResource(String key, Object[] obj) {
+		try {
+			return MessageFormat.format(getResource(key), obj);
+		} catch (Exception e) {
+			return key;
+		}
+	}
+
+	/**
+	 * Returns the translated String found with the given key,
+	 * and formatted with the given object.
+	 *
+	 * @param key java.lang.String
+	 * @param s java.lang.String
+	 * @return java.lang.String
+	 */
+	public static String getResource(String key, String s) {
+		try {
+			return MessageFormat.format(getResource(key), new String[] {s});
+		} catch (Exception e) {
+			return key;
+		}
+	}
+
+	/**
+	 * Register an image with the registry.
+	 *
+	 * @param key java.lang.String
+	 * @param partialURL java.lang.String
+	 */
+	private void registerImage(ImageRegistry registry, String key, String partialURL) {
+		if (ICON_BASE_URL == null) {
+			String pathSuffix = "icons/";
+			ICON_BASE_URL = singleton.getBundle().getEntry(pathSuffix);
+		}
+		
+		try {
+			ImageDescriptor id = ImageDescriptor.createFromURL(new URL(ICON_BASE_URL, partialURL));
+			registry.put(key, id);
+			imageDescriptors.put(key, id);
+		} catch (Exception e) {
+			Trace.trace(Trace.SEVERE, "Error registering image", e);
+		}
+	}
+
+	/**
+	 * Start this plug-in.
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		
+		getPreferenceStore().setDefault(MonitorUIPlugin.SHOW_VIEW_ON_ACTIVITY, true);
+	}
+	
+	public static boolean getDefaultShowOnActivityPreference() {
+		return getInstance().getPreferenceStore().getDefaultBoolean(SHOW_VIEW_ON_ACTIVITY);
+	}
+	
+	public static boolean getShowOnActivityPreference() {
+		return getInstance().getPreferenceStore().getBoolean(SHOW_VIEW_ON_ACTIVITY);
+	}
+	
+	public static void setShowOnActivityPreference(boolean b) {
+		getInstance().getPreferenceStore().setValue(SHOW_VIEW_ON_ACTIVITY, b);
+		getInstance().savePluginPreferences();
+	}
+	
+	public static boolean getShowHeaderPreference() {
+		return getInstance().getPreferenceStore().getBoolean(SHOW_HEADER);
+	}
+	
+	public static void setShowHeaderPreference(boolean b) {
+		getInstance().getPreferenceStore().setValue(SHOW_HEADER, b);
+		getInstance().savePluginPreferences();
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/RequestListener.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/RequestListener.java
new file mode 100644
index 0000000..d176f71
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/RequestListener.java
@@ -0,0 +1,30 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal;
+
+import net.sourceforge.phpdt.monitor.core.IRequest;
+import net.sourceforge.phpdt.monitor.core.IRequestListener;
+import net.sourceforge.phpdt.monitor.ui.internal.view.MonitorView;
+
+/**
+ * Open the monitor view if there is new activity.
+ */
+public class RequestListener implements IRequestListener {
+	public void requestAdded(IRequest rr) {
+		if (MonitorUIPlugin.getShowOnActivityPreference()) {
+			MonitorView.open(rr);
+		}
+	}
+
+	public void requestChanged(IRequest rr) { }
+
+	public void requestRemoved(IRequest rr) { }
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/SWTUtil.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/SWTUtil.java
new file mode 100644
index 0000000..3e4dbb9
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/SWTUtil.java
@@ -0,0 +1,77 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+/**
+ * SWT Utility class.
+ */
+public class SWTUtil {
+	private static FontMetrics fontMetrics;
+
+	protected static void initializeDialogUnits(Control testControl) {
+		// Compute and store a font metric
+		GC gc = new GC(testControl);
+		gc.setFont(JFaceResources.getDialogFont());
+		fontMetrics = gc.getFontMetrics();
+		gc.dispose();
+	}
+
+	/**
+	 * Returns a width hint for a button control.
+	 */
+	protected static int getButtonWidthHint(Button button) {
+		int widthHint = Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.BUTTON_WIDTH);
+		return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
+	}
+	
+	public static Button createButton(Composite comp, String label) {
+		Button b = new Button(comp, SWT.PUSH);
+		b.setText(label);
+		if (fontMetrics == null)
+			initializeDialogUnits(comp);
+		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
+		data.widthHint = getButtonWidthHint(b);
+		data.heightHint = Dialog.convertVerticalDLUsToPixels(fontMetrics, IDialogConstants.BUTTON_HEIGHT);
+		b.setLayoutData(data);
+		return b;
+	}
+	
+	public static Button createCheckbox(Composite comp, String txt, boolean isSelected){
+		Button button = new Button(comp, SWT.CHECK);
+		button.setText(txt);
+		GridLayout layout = new GridLayout();
+		comp.setLayout(layout);
+		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
+		data.horizontalIndent = 10;
+		button.setLayoutData(data);
+		button.setSelection(isSelected);
+		return button;
+	}
+	
+	public static Label createLabel(Composite comp, String txt) {
+		Label label = new Label(comp, SWT.NONE);
+		label.setText(txt);
+		label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING));
+		return label;
+	}
+}
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/Trace.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/Trace.java
new file mode 100644
index 0000000..8358b1d
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/Trace.java
@@ -0,0 +1,51 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal;
+/**
+ * Helper class to route trace output.
+ */
+public class Trace {
+	public static byte CONFIG = 0;
+	public static byte WARNING = 1;
+	public static byte SEVERE = 2;
+	public static byte FINEST = 3;
+
+	/**
+	 * Trace constructor comment.
+	 */
+	private Trace() {
+		super();
+	}
+	
+	/**
+	 * Trace the given text.
+	 *
+	 * @param s java.lang.String
+	 */
+	public static void trace(byte level, String s) {
+		trace(level, s, null);
+	}
+	
+	/**
+	 * Trace the given message and exception.
+	 *
+	 * @param s java.lang.String
+	 * @param t java.lang.Throwable
+	 */
+	public static void trace(byte level, String s, Throwable t) {
+		if (!MonitorUIPlugin.getInstance().isDebugging())
+			return;
+
+		System.out.println(s);
+		if (t != null)
+			t.printStackTrace();
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/FilterAction.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/FilterAction.java
new file mode 100644
index 0000000..43075aa
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/FilterAction.java
@@ -0,0 +1,27 @@
+package net.sourceforge.phpdt.monitor.ui.internal.view;
+
+import net.sourceforge.phpdt.monitor.core.IContentFilter;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+/**
+ * 
+ */
+public class FilterAction extends Action {
+	protected IViewerManager vm;
+	protected IContentFilter filter;
+	protected boolean enabled;
+
+	public FilterAction(IViewerManager vm, IContentFilter filter) {
+		super(filter.getName(), IAction.AS_CHECK_BOX);
+		this.vm = vm;
+		this.filter = filter;
+	}
+	
+	public void run() {
+		if (!isChecked())
+			vm.removeFilter(filter);
+		else
+			vm.addFilter(filter);
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/IViewerManager.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/IViewerManager.java
new file mode 100644
index 0000000..18a21d7
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/IViewerManager.java
@@ -0,0 +1,82 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal.view;
+
+import java.util.List;
+
+import net.sourceforge.phpdt.monitor.core.IContentFilter;
+import net.sourceforge.phpdt.monitor.core.IRequest;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+
+/**
+ * Manager interface for TCP/IP request and response message viewers
+ */
+public interface IViewerManager {
+	/**
+	 * Displays the HTTP header viewers if they are hidden.
+	 * If the viewers are not hidden, do nothing.
+	 */
+	//public void showHeader();
+	
+	/**
+	 * Hides the HTTP header viewers if they are showing.
+	 * If the viewers are already hidden, do nothing.
+	 */
+	//public void hideHeader();
+	
+	/**
+	 * Set whether or not to show HTTP header details
+	 * @param b boolean
+	 */
+	public void setDisplayHeaderInfo(boolean b);
+	
+	/**
+	 * Returns whether or not HTTP header details is showing
+	 * @return boolean
+	 */
+	public boolean getDisplayHeaderInfo();
+	
+	/**
+	 * Show the TCP/IP request message in a parent Composite
+	 * @param rr org.eclipse.tcpip.monitor.internal.RequestResponse
+	 * @param parent org.eclipse.swt.widgets.Composite
+	 */
+	public void setRequest(IRequest rr);
+	
+	/**
+	 * Returns an array of the available TCP/IP request viewer ids
+	 * @return java.lang.String[]
+	 */
+	public List getRequestViewers();
+	
+	/**
+	 * Returns an array of the available TCP/IP response viewer ids
+	 * @return java.lang.String[]
+	 */
+	public List getResponseViewers();
+	
+	/**
+	 * Set the TCP/IP request message viewer
+	 * @param id java.lang.String
+	 */
+	public void setRequestViewer(IConfigurationElement element);
+	
+	/**
+	 * Set the TCP/IP response message viewer
+	 * @param id java.lang.String
+	 */
+	public void setResponseViewer(IConfigurationElement element);
+	
+	public void addFilter(IContentFilter filter);
+	
+	public void removeFilter(IContentFilter filter);
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/MonitorTreeContentProvider.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/MonitorTreeContentProvider.java
new file mode 100644
index 0000000..b73ed65
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/MonitorTreeContentProvider.java
@@ -0,0 +1,213 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal.view;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import net.sourceforge.phpdt.monitor.core.IRequest;
+import net.sourceforge.phpdt.monitor.core.MonitorCore;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+/**
+ * Content provider for the monitor server view.
+ */
+public class MonitorTreeContentProvider implements ITreeContentProvider {
+	protected static final String ROOT = "root";
+
+	protected boolean sortByResponseTime;
+
+	/**
+	 * ProxyTreeContentProvider constructor comment.
+	 */
+	public MonitorTreeContentProvider() {
+		super();
+	}
+	
+	/**
+	 * Disposes of this content provider.
+	 * <p>
+	 * [Issue: This method should be changed to take a Viewer,
+	 * renamed and repurposed to disconnect a content provider from
+	 * a viewer. This is over and above what inputChanged does,
+	 * which is disconnecting a content provider from the viewer's
+	 * input (but not the viewer itself).
+	 * ]
+	 * </p>
+	 */
+	public void dispose() { }
+	
+	/**
+	 * Returns an iterator over the child elements of the given element.
+	 * <p>
+	 * Note: The difference between this method and 
+	 * <code>IStructuredContentProvider.getElements</code> is
+	 * that <code>getElements</code> is called to obtain the 
+	 * tree viewer's root elements, whereas <code>getChildren</code> is used
+	 * to obtain the children of a given node in the tree
+	 * (including a root).
+	 * </p>
+	 * <p>
+	 * [Issue: Don't know what above is trying to say.
+	 *  See IStructuredContentProvider.getElements.
+	 * ]
+	 * </p>
+	 *
+	 * @param element the element
+	 * @return an iterator over the child elements 
+	 *    (element type: <code>Object</code>)
+	 */
+	public Object[] getChildren(Object element) {
+		if (element instanceof Integer) {
+			Integer in = (Integer) element;
+			List list = new ArrayList();
+			Iterator iterator = MonitorCore.getRequests().iterator();
+			while (iterator.hasNext()) {
+				IRequest call = (IRequest) iterator.next();
+				if (call.getLocalPort() == in.intValue())
+					list.add(call);
+			}
+			if (sortByResponseTime)
+				sortByResponseTime(list);
+			return list.toArray();
+		}
+		return null;
+	}
+	
+	/**
+	 * Returns an iterator over the elements belonging to the
+	 * given element. These elements can be presented as rows in a table,
+	 * items in a list, etc.
+	 * <p>
+	 * [Issue: Should return Object[] rather than Iterator.
+	 * ]
+	 * </p>
+	 * <p>
+	 * [Issue: Not clear what "belonging to the given element"
+	 *  means. See ITreeContentProvider.getChildren.
+	 * ]
+	 * </p>
+	 *
+	 * @param element the element
+	 * @return an iterator over the elements 
+	 *    (element type: <code>Object</code>)
+	 */
+	public Object[] getElements(Object element) {
+		if (ROOT.equals(element)) {
+			List list = new ArrayList();
+			Iterator iterator = MonitorCore.getRequests().iterator();
+			while (iterator.hasNext()) {
+				IRequest call = (IRequest) iterator.next();
+				Integer in = new Integer(call.getLocalPort());
+				if (!list.contains(in))
+					list.add(in);
+			}
+	
+			if (sortByResponseTime)
+				sortByResponseTime(list);
+	
+			return list.toArray();
+		} else
+			return null;
+	}
+	
+	/**
+	 * Returns the parent for the given element, or <code>null</code> 
+	 * indicating that the parent can't be computed. 
+	 * In this case the tree-structured viewer can't expand
+	 * a given node correctly if requested.
+	 *
+	 * @param element the element
+	 * @return the parent element, or <code>null</code> if it
+	 *   has none or if the parent cannot be computed
+	 */
+	public Object getParent(Object element) {
+		if (element != null) {
+			if (element instanceof Integer)
+				return ROOT;
+			else {
+				IRequest call = (IRequest) element;
+				return new Integer(call.getLocalPort());
+			}
+		} else
+			return null;
+	}
+	
+	/**
+	 * Returns true if the elements are currently being sorted by response time.
+	 * @return boolean
+	 */
+	public boolean getSortByResponseTime() {
+		return sortByResponseTime;
+	}
+	
+	/**
+	 * Returns whether the given element has children.
+	 * <p>
+	 * [Issue: This method may not be warranted if getChildren
+	 *  return Object[].
+	 * ]
+	 * </p>
+	 *
+	 * @param element the element
+	 * @return <code>true</code> if the given element has children,
+	 *  and <code>false</code> if it has no children
+	 */
+	public boolean hasChildren(Object element) {
+		return (element instanceof Integer);
+	}
+	
+	/**
+	 * Notifies this content provider that the given viewer's input
+	 * has been switched to a different element.
+	 * <p>
+	 * A typical use for this method is registering the content provider as a listener
+	 * to changes on the new input (using model-specific means), and deregistering the viewer 
+	 * from the old input. In response to these change notifications, the content provider
+	 * propagates the changes to the viewer.
+	 * </p>
+	 *
+	 * @param viewer the viewer
+	 * @param oldInput the old input element, or <code>null</code> if the viewer
+	 *   did not previously have an input
+	 * @param newInput the new input element, or <code>null</code> if the viewer
+	 *   does not have an input
+	 */
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
+	
+	/**
+	 * Sets the sort by response time option.
+	 * @param b boolean
+	 */
+	public void setSortByResponseTime(boolean b) {
+		sortByResponseTime = b;
+	}
+	
+	/**
+	 * 
+	 */
+	protected void sortByResponseTime(List list) {
+		int size = list.size();
+		for (int i = 0; i < size - 1; i++) {
+			for (int j = i + 1; j < size; j++) {
+				IRequest c1 = (IRequest) list.get(i);
+				IRequest c2 = (IRequest) list.get(j);
+				if (c1.getResponseTime() < c2.getResponseTime()) {
+					list.set(i, c2);
+					list.set(j, c1);
+				}
+			}
+		}
+		
+	}
+}
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/MonitorView.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/MonitorView.java
new file mode 100644
index 0000000..1fe3a56
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/MonitorView.java
@@ -0,0 +1,540 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal.view;
+
+import java.text.SimpleDateFormat;
+import java.util.Iterator;
+import java.util.List;
+
+import net.sourceforge.phpdt.monitor.core.*;
+import net.sourceforge.phpdt.monitor.ui.internal.*;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.help.WorkbenchHelp;
+import org.eclipse.ui.part.ViewPart;
+/**
+ * View of TCP/IP activity.
+ */
+public class MonitorView extends ViewPart {
+	protected Tree tree;
+	protected TreeViewer treeViewer;
+	protected MonitorTreeContentProvider contentProvider;
+
+	protected IRequestListener listener;
+	protected IViewerManager vm;
+	protected List requestViewers;
+	protected List responseViewers;
+
+	protected static SimpleDateFormat format = new SimpleDateFormat(MonitorUIPlugin.getResource("%viewDateFormat"));
+	protected static final String VIEW_ID = "net.sourceforge.phpeclipse.monitor.core.view";
+	protected static final String DEFAULT_VIEWER = "net.sourceforge.phpeclipse.monitor.core.viewers.byteviewer";
+
+	protected IAction httpHeaderAction;
+	
+	protected static MonitorView view;
+
+	/**
+	 * MonitorView constructor comment.
+	 */
+	public MonitorView() {
+		super();
+		view = this;
+	}
+	
+	protected void addListener() {
+		listener = new IRequestListener() {
+			public void requestAdded(final IRequest rr) {
+				Display.getDefault().asyncExec(new Runnable() {
+					public void run() {
+						Integer in = new Integer(rr.getLocalPort());
+						treeViewer.add(MonitorTreeContentProvider.ROOT, in);
+						treeViewer.add(in, rr);
+						treeViewer.setSelection(new StructuredSelection(rr), true);
+					}
+				});
+			}
+
+			public void requestChanged(final IRequest rr) {
+				Display.getDefault().asyncExec(new Runnable() {
+					public void run() {
+						IStructuredSelection sel = (IStructuredSelection) treeViewer.getSelection();
+						
+						treeViewer.refresh(rr);
+						if (!sel.isEmpty())
+							treeViewer.setSelection(sel);
+					}
+				});
+			}
+
+			public void requestRemoved(final IRequest rr) {
+				Display.getDefault().asyncExec(new Runnable() {
+					public void run() {
+						treeViewer.remove(rr);
+					}
+				});
+			}
+		};
+	
+		MonitorCore.addRequestListener(listener);
+	}
+
+	/**
+	 * Clear the view.
+	 */
+	protected void clear() {
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {
+				treeViewer.setSelection(null);
+				treeViewer.setInput(MonitorTreeContentProvider.ROOT);
+			}
+		});
+	}
+	
+	protected void setSelection(IRequest request) {
+		if (treeViewer != null)
+			treeViewer.setSelection(new StructuredSelection(request));
+	}
+	
+
+	/**
+	 * Returns the inner component in a desktop part.
+	 */
+	public void createPartControl(Composite parent) {
+		SashForm sashFparent = new SashForm(parent, SWT.VERTICAL);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.horizontalSpacing = 4;
+		layout.verticalSpacing = 4;
+		sashFparent.setLayout(layout);
+		sashFparent.setLayoutData(new GridData(GridData.FILL_BOTH));
+		WorkbenchHelp.setHelp(sashFparent, ContextIds.VIEW);
+		
+		// create tree panel
+		Composite treePanel = new Composite(sashFparent, SWT.NONE);
+		layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		treePanel.setLayout(layout);
+		GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
+		data.heightHint = 110;
+		data.horizontalSpan = 2;
+		treePanel.setLayoutData(data);
+	
+		tree = new Tree(treePanel, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.SINGLE);
+		data = new GridData(GridData.FILL_BOTH);
+		//data.widthHint = 120;
+		tree.setLayoutData(data);
+		treeViewer = new TreeViewer(tree);
+		contentProvider = new MonitorTreeContentProvider();
+		treeViewer.setContentProvider(contentProvider);
+		treeViewer.setInput(MonitorTreeContentProvider.ROOT);
+		treeViewer.setLabelProvider(new TreeLabelProvider());
+		WorkbenchHelp.setHelp(tree, ContextIds.VIEW_TREE);
+	
+		Composite detailsPanel = new Composite(treePanel, SWT.NONE);
+		layout = new GridLayout();
+		layout.numColumns = 1;
+		layout.marginHeight = 2;
+		layout.marginWidth = 0;
+		detailsPanel.setLayout(layout);
+		data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
+		data.widthHint = 200;
+		detailsPanel.setLayoutData(data);
+
+		final Label label = new Label(detailsPanel, SWT.NONE);
+		label.setText(MonitorUIPlugin.getResource("%viewTime", ""));
+		label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
+
+		final Label label2 = new Label(detailsPanel, SWT.NONE);
+		label2.setText(MonitorUIPlugin.getResource("%viewResponseTime", ""));
+		label2.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
+
+		final Label label3 = new Label(detailsPanel, SWT.NONE);
+		label3.setText(MonitorUIPlugin.getResource("%viewType", ""));
+		label3.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
+
+		// create center and right panels
+		SashForm sashFchild = new SashForm(sashFparent, SWT.NONE);
+		layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.horizontalSpacing = 2;
+		layout.verticalSpacing = 4;
+		sashFchild.setLayout(layout);
+		sashFparent.setWeights(new int[] { 30, 70 });
+	
+		// request panel
+		Composite request = new Composite(sashFchild, SWT.NONE);
+		layout = new GridLayout();
+		layout.verticalSpacing = 3;
+		layout.marginHeight = 2;
+		layout.marginWidth = 0;
+		request.setLayout(layout);
+		request.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		Composite requestHeader = new Composite(request, SWT.NONE);
+		layout = new GridLayout();
+		layout.verticalSpacing = 0;
+		layout.numColumns = 2;
+		layout.marginHeight = 0;
+		layout.marginWidth = 2;
+		data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
+		data.heightHint = 30;
+		requestHeader.setLayout(layout);
+		requestHeader.setLayoutData(data);
+
+		Composite requestHeaderLeft = new Composite(requestHeader, SWT.NONE);
+		layout = new GridLayout();
+		layout.verticalSpacing = 2;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		data = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
+		data.heightHint = 30;
+		requestHeaderLeft.setLayout(layout);
+		requestHeaderLeft.setLayoutData(data);
+
+		Label empty1 = new Label(requestHeaderLeft, SWT.NONE);
+		empty1.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL));
+		
+		final Label requestLabel = new Label(requestHeaderLeft, SWT.NONE);
+		requestLabel.setText(MonitorUIPlugin.getResource("%viewRequest", ""));
+		requestLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_END));
+
+		final Label requestSizeLabel = new Label(requestHeaderLeft, SWT.NONE);
+		requestSizeLabel.setText(MonitorUIPlugin.getResource("%viewSize", ""));
+		requestSizeLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_END));
+
+		Composite requestHeaderRight = new Composite(requestHeader, SWT.NONE);
+		layout = new GridLayout();
+		layout.verticalSpacing = 0;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		data = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.FILL_VERTICAL);
+		data.heightHint = 30;
+		requestHeaderRight.setLayout(layout);
+		requestHeaderRight.setLayoutData(data);
+		
+		Label empty2 = new Label(requestHeaderRight, SWT.NONE);
+		empty2.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL));
+		
+		Combo requestViewerCombo = new Combo(requestHeaderRight, SWT.DROP_DOWN | SWT.READ_ONLY);	
+		requestViewerCombo.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_END));
+
+		// response panel
+		Composite response = new Composite(sashFchild, SWT.NONE);
+		layout = new GridLayout();
+		layout.verticalSpacing = 3;
+		layout.marginHeight = 2;
+		layout.marginWidth = 0;
+		response.setLayout(layout);
+		response.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		Composite responseHeader = new Composite(response, SWT.NONE);
+		layout = new GridLayout();
+		layout.verticalSpacing = 0;
+		layout.numColumns = 2;
+		layout.marginHeight = 0;
+		layout.marginWidth = 2;
+		data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
+		data.heightHint = 30;
+		responseHeader.setLayout(layout);
+		responseHeader.setLayoutData(data);
+
+		Composite responseHeaderLeft = new Composite(responseHeader, SWT.NONE);
+		layout = new GridLayout();
+		layout.verticalSpacing = 2;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		data = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
+		data.heightHint = 30;
+		responseHeaderLeft.setLayout(layout);
+		responseHeaderLeft.setLayoutData(data);
+
+		Label empty3 = new Label(responseHeaderLeft, SWT.NONE);
+		empty3.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL));
+	
+		final Label responseLabel = new Label(responseHeaderLeft, SWT.NONE);
+		responseLabel.setText(MonitorUIPlugin.getResource("%viewResponse", ""));
+		responseLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
+	
+		final Label responseSizeLabel = new Label(responseHeaderLeft, SWT.NONE);
+		responseSizeLabel.setText(MonitorUIPlugin.getResource("%viewSize", ""));
+		responseSizeLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_END));
+
+		Composite responseHeaderRight = new Composite(responseHeader, SWT.NONE);
+		layout = new GridLayout();
+		layout.verticalSpacing = 0;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		data = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.FILL_VERTICAL);
+		data.heightHint = 30;
+		responseHeaderRight.setLayout(layout);
+		responseHeaderRight.setLayoutData(data);
+		
+		Label empty4 = new Label(responseHeaderRight, SWT.NONE);
+		empty4.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL));
+		
+		Combo responseViewerCombo = new Combo(responseHeaderRight, SWT.DROP_DOWN | SWT.READ_ONLY);	
+		responseViewerCombo.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_END));
+	
+		//Viewer manager
+		vm = new ViewerManager(request, request, response, response);
+		requestViewers = vm.getRequestViewers();
+		responseViewers = vm.getResponseViewers();
+
+		//Set up the viewer combo boxes
+		Iterator iterator = requestViewers.iterator();
+		int ctr = 0;
+		while(iterator.hasNext()) {
+			IConfigurationElement element = (IConfigurationElement) iterator.next();
+			requestViewerCombo.add(element.getAttribute("label"), ctr);
+			if (element.getAttribute("id").equals(DEFAULT_VIEWER)) {
+				requestViewerCombo.select(ctr); 
+				vm.setRequestViewer(element);
+			}  
+			ctr++;	
+		}
+		requestViewerCombo.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent arg0) {
+				Combo rvCombo = (Combo) arg0.getSource();
+				vm.setRequestViewer((IConfigurationElement) requestViewers.get(rvCombo.getSelectionIndex()));
+			}
+		});
+		requestHeader.layout(true);
+		
+		iterator = responseViewers.iterator();
+		ctr = 0;
+		while(iterator.hasNext()) {
+			IConfigurationElement element = (IConfigurationElement) iterator.next();
+			responseViewerCombo.add(element.getAttribute("label"), ctr);
+			if(element.getAttribute("id").equals(DEFAULT_VIEWER)) {
+				responseViewerCombo.select(ctr); 
+				vm.setResponseViewer(element);
+			} 
+			ctr++;
+		}
+		responseViewerCombo.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent arg0) {
+				Combo rvCombo = (Combo) arg0.getSource();
+				vm.setResponseViewer((IConfigurationElement) requestViewers.get(rvCombo.getSelectionIndex()));
+			}
+		});
+		responseHeader.layout(true);
+
+		// selection listener
+		treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				ISelection selection = event.getSelection();
+
+				IRequest req = null;
+				if (selection != null && !selection.isEmpty()) {
+					StructuredSelection sel = (StructuredSelection) selection;
+					Object obj = sel.iterator().next();
+					if (obj instanceof IRequest)
+						req = (IRequest) obj;
+				}
+	
+				if (req != null) {
+					label.setText(MonitorUIPlugin.getResource("%viewTime", format.format(req.getDate())));
+	
+					if (req.getResponseTime() == -1)
+						label2.setText(MonitorUIPlugin.getResource("%viewResponseTime", ""));
+					else {
+						String time = MonitorUIPlugin.getResource("%viewResponseTimeFormat", req.getResponseTime() + "");
+						label2.setText(MonitorUIPlugin.getResource("%viewResponseTime", time));
+					}
+					label3.setText(MonitorUIPlugin.getResource("%viewType", req.getType().getName()));
+	
+					// request information
+					requestLabel.setText(MonitorUIPlugin.getResource("%viewRequest", "localhost:" + req.getLocalPort()));
+					requestSizeLabel.setText(getSizeString(req.getRequest(IRequest.CONTENT), req.getRequest(IRequest.ALL)));
+	
+					// response information
+					responseLabel.setText(MonitorUIPlugin.getResource("%viewResponse", req.getRemoteHost() + ":" + req.getRemotePort()));
+					responseSizeLabel.setText(getSizeString(req.getResponse(IRequest.CONTENT), req.getResponse(IRequest.ALL)));
+
+					vm.setRequest(req);
+				} else {
+					label.setText(MonitorUIPlugin.getResource("%viewTime", ""));
+					label2.setText(MonitorUIPlugin.getResource("%viewResponseTime", ""));
+					requestLabel.setText(MonitorUIPlugin.getResource("%viewRequest", ""));
+					requestSizeLabel.setText(MonitorUIPlugin.getResource("%viewSize", ""));
+					responseLabel.setText(MonitorUIPlugin.getResource("%viewResponse", ""));
+					responseSizeLabel.setText(MonitorUIPlugin.getResource("%viewSize", ""));
+					vm.setRequest(req);
+				}
+			}
+		});
+		
+		treeViewer.expandToLevel(2);
+	
+		initializeActions();
+	
+		addListener();
+	}
+	
+	protected String getSizeString(byte[] a, byte[] b) {
+		String aa = "0";
+		String bb = "0";
+		if (a != null)
+			aa = a.length + "";
+		if (b != null)
+			bb = b.length + "";
+		String size = MonitorUIPlugin.getResource("%viewSizeFormat", new Object[] { aa, bb});
+		return MonitorUIPlugin.getResource("%viewSize", size);
+	}
+
+	public void dispose() {
+		super.dispose();
+		treeViewer = null;
+		MonitorCore.removeRequestListener(listener);
+	}
+
+	/**
+	 * 
+	 */
+	public void initializeActions() {
+		final IAction sortByResponseTimeAction = new Action() {
+			public void run() {
+				Display.getDefault().asyncExec(new Runnable() {
+					public void run() {
+						boolean b = contentProvider.getSortByResponseTime();
+						contentProvider.setSortByResponseTime(!b);
+						treeViewer.refresh();
+						setChecked(!b);
+					}
+				});
+			}
+		};
+		sortByResponseTimeAction.setChecked(false);
+		sortByResponseTimeAction.setToolTipText(MonitorUIPlugin.getResource("%actionSortByResponseTime"));
+		sortByResponseTimeAction.setImageDescriptor(MonitorUIPlugin.getImageDescriptor(MonitorUIPlugin.IMG_ELCL_SORT_RESPONSE_TIME));
+		sortByResponseTimeAction.setHoverImageDescriptor(MonitorUIPlugin.getImageDescriptor(MonitorUIPlugin.IMG_CLCL_SORT_RESPONSE_TIME));
+		sortByResponseTimeAction.setDisabledImageDescriptor(MonitorUIPlugin.getImageDescriptor(MonitorUIPlugin.IMG_DLCL_SORT_RESPONSE_TIME));
+	
+		IAction clearAction = new Action() {
+			public void run() {
+				MonitorCore.removeAllRequests();
+			}
+		};
+		clearAction.setToolTipText(MonitorUIPlugin.getResource("%actionClearToolTip"));
+		clearAction.setImageDescriptor(MonitorUIPlugin.getImageDescriptor(MonitorUIPlugin.IMG_ELCL_CLEAR));
+		clearAction.setHoverImageDescriptor(MonitorUIPlugin.getImageDescriptor(MonitorUIPlugin.IMG_CLCL_CLEAR));
+		clearAction.setDisabledImageDescriptor(MonitorUIPlugin.getImageDescriptor(MonitorUIPlugin.IMG_DLCL_CLEAR));
+
+		httpHeaderAction = new Action() {
+			public void run() {
+				Display.getDefault().asyncExec(new Runnable() {
+					public void run() {
+						boolean b = vm.getDisplayHeaderInfo();
+						vm.setDisplayHeaderInfo(!b);
+						setChecked(!b);
+					}
+				});
+			}
+		};
+		httpHeaderAction.setChecked(vm.getDisplayHeaderInfo());
+		httpHeaderAction.setText(MonitorUIPlugin.getResource("%actionShowHeader"));
+
+		IAction preferenceAction = new Action() {
+			public void run() {
+				IWorkbench workbench = PlatformUI.getWorkbench();
+				IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+								
+				MonitorPrefrencesDialog monitorPrefDialog = new MonitorPrefrencesDialog(workbenchWindow.getShell());
+				if (monitorPrefDialog.open() == Window.CANCEL)
+					return;
+			}
+		};
+		preferenceAction.setText(MonitorUIPlugin.getResource("%actionProperties"));
+		
+		
+		IToolBarManager tbm = getViewSite().getActionBars().getToolBarManager();
+		tbm.add(sortByResponseTimeAction);
+		tbm.add(clearAction);
+		
+		IContentFilter[] filters = MonitorCore.getContentFilters();
+		IMenuManager menuManager = getViewSite().getActionBars().getMenuManager();
+		menuManager.add(httpHeaderAction);
+		int size = filters.length;
+		for (int i = 0; i < size; i++) {
+			FilterAction action = new FilterAction(vm, filters[i]);
+			menuManager.add(action);
+		}
+		menuManager.add(preferenceAction);
+	}
+
+	/**
+	 * 
+	 */
+	public static void open(final IRequest request) {
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {
+				try {
+					IWorkbench workbench = MonitorUIPlugin.getInstance().getWorkbench();
+					IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+					//if (workbenchWindow == null)
+					//	workbenchWindow = workbench.getWorkbenchWindows()[0];
+	
+					IWorkbenchPage page = workbenchWindow.getActivePage();
+	
+					IViewPart view2 = page.findView(VIEW_ID);
+					
+					if (view2 != null)
+						page.bringToTop(view2);
+					else
+						page.showView(VIEW_ID);
+
+					if (view != null)
+						view.setSelection(request);
+				} catch (Exception e) {
+					Trace.trace(Trace.SEVERE, "Error opening TCP/IP view", e);
+				}
+			}
+		});
+	}
+
+	/**
+	 * 
+	 */
+	public void setFocus() {
+		if (tree != null)
+			tree.setFocus();
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/TreeLabelProvider.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/TreeLabelProvider.java
new file mode 100644
index 0000000..1a8cdb7
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/TreeLabelProvider.java
@@ -0,0 +1,108 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal.view;
+
+import net.sourceforge.phpdt.monitor.core.IRequest;
+import net.sourceforge.phpdt.monitor.ui.internal.*;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.swt.graphics.Image;
+/**
+ * A label provider for the monitor server view.
+ */
+public class TreeLabelProvider implements ILabelProvider {
+	/**
+	 * TreeLabelProvider constructor comment.
+	 */
+	public TreeLabelProvider() {
+		super();
+	}
+
+	/**
+	 * Adds a listener to this label provider. Label provider listeners are 
+	 * informed about state changes that affect the rendering of the viewer
+	 * that uses this label provider.
+	 *
+	 * @param listener a label provider listener
+	 */
+	public void addListener(ILabelProviderListener listener) {}
+
+	/**
+	 * Disposes of this label provider.
+	 * <p>
+	 * [Issue: This method should be changed to take a Viewer,
+	 * renamed and repurposed to disconnect a label provider from
+	 * a viewer.
+	 * ]
+	 * </p>
+	 */
+	public void dispose() {}
+
+	/**
+	 * Returns the image for the label of the given element for use
+	 * in the given viewer.
+	 *
+	 * @param element the element for which to provide the label image
+	 * @return the image used to label the element, or <code>null</code>
+	 *   if these is no image for the given object
+	 */
+	public Image getImage(Object element) {
+		if (element instanceof IRequest)
+			return MonitorUIPlugin.getImage(MonitorUIPlugin.IMG_REQUEST_RESPONSE);
+		else
+			return MonitorUIPlugin.getImage(MonitorUIPlugin.IMG_HOST);
+	}
+
+	/**
+	 * Returns the text for the label of the given element for use
+	 * in the given viewer.
+	 *
+	 * @param viewer the viewer that displays the element
+	 * @param element the element for which to provide the label text
+	 * @return the text string used to label the element, or <code>null</code>
+	 *   if these is no text label for the given object
+	 */
+	public String getText(Object element) {
+		if (element instanceof IRequest) {
+			IRequest call = (IRequest) element;
+			return call.getLabel();
+		} else if (element instanceof Integer) {
+			Integer in = (Integer) element;
+			return "localhost:" + in.intValue();
+		} else
+			return element.toString();
+	}
+
+	/**
+	 * Returns whether the label would be affected 
+	 * by a change to the given property of the given element.
+	 * This can be used to optimize a non-structural viewer update.
+	 * If the property mentioned in the update does not affect the label,
+	 * then the viewer need not update the label.
+	 *
+	 * @param element the element
+	 * @param property the property
+	 * @return <code>true</code> if the label would be affected,
+	 *    and <code>false</code> if it would be unaffected
+	 */
+	public boolean isLabelProperty(Object element, String property) {
+		return false;
+	}
+	
+	/**
+	 * Removes a listener to this label provider.
+	 * Has no affect if the listener is not registered.
+	 *
+	 * @param listener a label provider listener
+	 */
+	public void removeListener(ILabelProviderListener listener) {}
+}
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/ViewerManager.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/ViewerManager.java
new file mode 100644
index 0000000..039a376
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/view/ViewerManager.java
@@ -0,0 +1,226 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal.view;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import net.sourceforge.phpdt.monitor.core.IContentFilter;
+import net.sourceforge.phpdt.monitor.core.IRequest;
+import net.sourceforge.phpdt.monitor.ui.IContentViewer;
+import net.sourceforge.phpdt.monitor.ui.internal.MonitorUIPlugin;
+import net.sourceforge.phpdt.monitor.ui.internal.Trace;
+import net.sourceforge.phpdt.monitor.ui.internal.viewers.ByteViewer;
+import net.sourceforge.phpdt.monitor.ui.internal.viewers.HeaderViewer;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * 
+ */
+public class ViewerManager implements IViewerManager {
+	private boolean displayHeaderInf;
+	protected IContentViewer reqViewer;
+	protected IContentViewer respViewer;
+	protected HeaderViewer reqHeader;
+	protected HeaderViewer respHeader;
+	
+	protected Composite reqHComp;
+	protected Composite reqVComp;
+	protected Composite respHComp;
+	protected Composite respVComp;
+	
+	protected List viewers;
+	protected IRequest request;
+	protected List filters = new ArrayList();
+
+	public ViewerManager(Composite reqHeadParent, Composite reqViewParent, Composite respHeadParent, Composite respViewParent) {
+		reqHComp = reqHeadParent;
+		respHComp = respHeadParent;
+		reqVComp = reqViewParent;
+		respVComp = respViewParent;
+		reqHeader = new HeaderViewer(reqHComp, HeaderViewer.REQUEST_HEADER);
+		respHeader = new HeaderViewer(respHComp, HeaderViewer.RESPONSE_HEADER);
+		reqViewer = new ByteViewer();
+		reqViewer.init(reqVComp);
+		respViewer = new ByteViewer();
+		respViewer.init(respVComp);
+		setDisplayHeaderInfo(MonitorUIPlugin.getShowHeaderPreference());
+		setAvailableViewers();
+	}
+
+	private void setAvailableViewers() {
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IConfigurationElement[] cf = registry.getConfigurationElementsFor(MonitorUIPlugin.PLUGIN_ID, "viewers");
+
+		int size = cf.length;
+		viewers = new ArrayList(size);
+		for (int i = 0; i < size; i++) {
+			viewers.add(cf[i]);
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.monitor.internal.view.IViewerManager#hideHeader()
+	 */
+	/*public void hideHeader() {
+		displayHeaderInf = false;
+		if (!reqHeader.isHidden())
+			reqHeader.hideViewer();
+		if (!respHeader.isHidden())
+			respHeader.hideViewer();
+	}*/
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.monitor.internal.view.IViewerManager#showHeader()
+	 */
+	/*public void showHeader() {
+		if (reqHeader.isHidden())
+			reqHeader.showViewer();
+		if (respHeader.isHidden())
+			respHeader.showViewer();
+	}*/
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.monitor.internal.view.IViewerManager#setDisplayHeaderInfo(boolean)
+	 */
+	public void setDisplayHeaderInfo(boolean b) {
+		displayHeaderInf = b;
+		reqHeader.setDisplayHeader(b);
+		respHeader.setDisplayHeader(b);
+		MonitorUIPlugin.setShowHeaderPreference(b);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.monitor.internal.view.IViewerManager#getDisplayHeaderInfo()
+	 */
+	public boolean getDisplayHeaderInfo() {
+		return displayHeaderInf;
+	}
+	
+	public void setRequest(IRequest rr) {
+		reqHeader.setRequestResponse(rr);
+		respHeader.setRequestResponse(rr);
+		
+		byte[] b = null;
+		if (rr != null)
+			b = filter(rr.getRequest(IRequest.CONTENT));
+		reqViewer.setContent(b);
+		
+		b = null;
+		if (rr != null)
+			b = filter(rr.getResponse(IRequest.CONTENT));
+		respViewer.setContent(b);
+		
+		request = rr;
+	}
+	
+	public void addFilter(IContentFilter filter) {
+		filters.add(filter);
+		setRequest(request);
+	}
+	
+	public void removeFilter(IContentFilter filter) {
+		filters.remove(filter);
+		setRequest(request);
+	}
+	
+	protected byte[] filter(byte[] b) {
+		if (b == null)
+			return null;
+		
+		Iterator iterator = filters.iterator();
+		while (iterator.hasNext()) {
+			IContentFilter filter = (IContentFilter) iterator.next();
+			try {
+				b = filter.filter(request, false, b);
+			} catch (Exception e) {
+				Trace.trace(Trace.SEVERE, "Error while filtering with " + filter.getId(), e);
+			}
+		}
+		return b;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.tcpip.monitor.internal.view.IViewerManager#getRequestViewers()
+	 */
+	public List getRequestViewers() {
+		IConfigurationElement element;
+		Iterator iterator = viewers.iterator();
+		List temp = new ArrayList();
+		
+		while (iterator.hasNext()) {
+			element = (IConfigurationElement) iterator.next();
+			if (element.getAttribute("type").toLowerCase().indexOf("request") >= 0)
+				temp.add(element);
+		}
+		return temp;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.tcpip.monitor.internal.view.IViewerManager#getResponseViewers()
+	 */
+	public List getResponseViewers() {
+		IConfigurationElement element;
+		Iterator iterator = viewers.iterator();
+		List temp = new ArrayList();
+		
+ 		while (iterator.hasNext()) {
+ 			element = (IConfigurationElement) iterator.next();
+			if (element.getAttribute("type").toLowerCase().indexOf("response") >= 0)
+				temp.add(element);
+		}
+		return temp;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.tcpip.monitor.internal.view.IViewerManager#setRequestViewer(java.lang.String)
+	 */
+	public void setRequestViewer(IConfigurationElement element) {
+		reqViewer.dispose();
+		try {
+			reqViewer = (IContentViewer) element.createExecutableExtension("class");
+		} catch (CoreException e) {
+			Trace.trace(Trace.SEVERE, "Error", e);
+		}
+		reqViewer.init(reqVComp);
+		//reqViewer.setRequestResponse(rr);
+		byte[] b = null;
+		if (request != null)
+			b = filter(request.getRequest(IRequest.CONTENT));
+		reqViewer.setContent(b);
+		reqVComp.layout(true);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.tcpip.monitor.internal.view.IViewerManager#setResponseViewer(java.lang.String)
+	 */
+	public void setResponseViewer(IConfigurationElement element) {
+		respViewer.dispose();
+		try {
+			respViewer = (IContentViewer) element.createExecutableExtension("class");
+		} catch (CoreException e){
+			Trace.trace(Trace.SEVERE, "Error", e);
+		}
+		respViewer.init(respVComp);
+		//respViewer.setRequestResponse(rr);
+		byte[] b = null;
+		if (request != null)
+			b = filter(request.getResponse(IRequest.CONTENT));
+		respViewer.setContent(b);
+		respVComp.layout(true);
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/viewers/ByteViewer.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/viewers/ByteViewer.java
new file mode 100644
index 0000000..7684ed7
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/viewers/ByteViewer.java
@@ -0,0 +1,79 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal.viewers;
+ 
+import net.sourceforge.phpdt.monitor.core.MonitorCore;
+import net.sourceforge.phpdt.monitor.ui.IContentViewer;
+import net.sourceforge.phpdt.monitor.ui.internal.ContextIds;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.help.WorkbenchHelp;
+
+/**
+ * A basic byte viewer.
+ */
+public class ByteViewer implements IContentViewer {
+	protected Text text;
+	protected Composite comp;
+
+	/* (non-Javadoc)
+	 * @see net.sourceforge.phpdt.monitor.ui.IContentViewer#dispose()
+	 */
+	public void dispose() {
+		comp.dispose();
+	}
+
+	/* (non-Javadoc)
+	 * @see net.sourceforge.phpdt.monitor.ui.IContentViewer#setContent()
+	 */
+	public void setContent(byte[] b) {
+		String out = "";
+		if (b != null)
+			out = MonitorCore.parse(b);
+
+		String lineSeparator = System.getProperty("line.separator");
+		int ls = lineSeparator.length();
+		if (out.length() > ls) {
+			while (out.substring(0, ls).indexOf(lineSeparator) >= 0)
+				out = out.substring(ls, out.length()); 
+		}
+		
+		text.setText(out);
+	}
+
+	/* (non-Javadoc)
+	 * @see net.sourceforge.phpdt.monitor.ui.IContentViewer#init(Composite)
+	 */
+	public void init(Composite parent) {
+		comp = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 1;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		comp.setLayout(layout);
+		GridData data = new GridData(GridData.FILL_BOTH);
+		comp.setLayoutData(data);
+
+		text = new Text(comp, SWT.BORDER | SWT.MULTI | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL);
+		Display display = comp.getDisplay();
+		text.setBackground(display.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+		text.setForeground(display.getSystemColor(SWT.COLOR_LIST_FOREGROUND));
+		text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL));
+		text.setFont(JFaceResources.getTextFont());
+		WorkbenchHelp.setHelp(text, ContextIds.VIEW_RESPONSE);
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/viewers/HeaderViewer.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/viewers/HeaderViewer.java
new file mode 100644
index 0000000..e1f98dc
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/viewers/HeaderViewer.java
@@ -0,0 +1,202 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal.viewers;
+
+import net.sourceforge.phpdt.monitor.core.IRequest;
+import net.sourceforge.phpdt.monitor.core.MonitorCore;
+import net.sourceforge.phpdt.monitor.ui.internal.ContextIds;
+import net.sourceforge.phpdt.monitor.ui.internal.MonitorUIPlugin;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.help.WorkbenchHelp;
+
+/**
+ * An transport (header) viewer.
+ */
+public class HeaderViewer {
+	protected boolean displayHeader;
+
+	protected Composite headerComp;
+	protected Composite innerComp;
+	protected Composite rootComp;
+
+	protected Label headerLabel;
+	protected Text headerText;
+	protected IRequest rr;
+	protected byte msg;
+	protected GridLayout layout;
+	protected GridData data;
+
+	protected boolean hidden;
+
+	protected static int HEADER_LABEL_SIZE = 15;
+	protected static int HEADER_TEXT_SIZE = 110;
+	public static byte REQUEST_HEADER = 0;
+	public static byte RESPONSE_HEADER = 1;
+
+	public HeaderViewer(Composite parent, byte message) {
+		rootComp = parent;
+		displayHeader = true;
+		hidden = false;
+		
+		headerComp = new Composite(parent, SWT.NONE);
+		layout = new GridLayout();
+		layout.numColumns = 1;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		headerComp.setLayout(layout);
+		data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
+		headerComp.setLayoutData(data);
+
+		innerComp = new Composite(headerComp, SWT.NONE);
+		layout = new GridLayout();
+		layout.numColumns = 1;
+		layout.marginHeight = 0;
+		layout.marginWidth = 2;
+		innerComp.setLayout(layout);
+		data = new GridData(GridData.FILL_BOTH);
+		data.heightHint = HEADER_LABEL_SIZE;
+		innerComp.setLayoutData(data);
+
+		rr = null;
+		msg = message;
+
+		setDisplayHeader(false);
+	}
+	
+	/*public boolean isHidden() {
+		return hidden;
+	}*/
+	
+	/*public void hideViewer() {
+		hidden = true;
+		innerComp.dispose();
+		data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
+		data.heightHint = 0;
+		headerComp.setLayoutData(data);	
+		rootComp.layout(true);
+	}
+	
+	public void showViewer() {
+		hidden = false;
+		
+		innerComp = new Composite(headerComp, SWT.NONE);
+		layout = new GridLayout();
+		layout.numColumns = 1;
+		layout.marginHeight = 0;
+		layout.marginWidth = 2;
+		innerComp.setLayout(layout);
+		data = new GridData(GridData.FILL_BOTH);
+		data.heightHint = HEADER_LABEL_SIZE;
+		innerComp.setLayoutData(data);
+		
+		displayHeader = true;
+		setDisplayHeader(false);
+	}*/
+	
+	public void setRequestResponse(IRequest reqresp) {
+		rr = reqresp;
+		if (!hidden)
+			getView();
+	}
+	
+	public void setDisplayHeader(boolean b) {
+		if (displayHeader != b) {
+			displayHeader = b;
+			if (displayHeader) {
+				innerComp.dispose();
+
+				data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
+				data.heightHint = HEADER_TEXT_SIZE;
+				headerComp.setLayoutData(data);
+								
+				innerComp = new Composite(headerComp, SWT.NONE);
+				layout = new GridLayout();
+				layout.numColumns = 1;
+				layout.marginHeight = 0;
+				layout.marginWidth = 0;
+				innerComp.setLayout(layout);
+				data = new GridData(GridData.FILL_BOTH);
+				data.heightHint = HEADER_TEXT_SIZE;
+				innerComp.setLayoutData(data);
+								
+				headerText = new Text(innerComp, SWT.BORDER | SWT.MULTI | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL);
+				Display display = innerComp.getDisplay();
+				headerText.setBackground(display.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+				headerText.setForeground(display.getSystemColor(SWT.COLOR_LIST_FOREGROUND));
+				headerText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL));
+				headerText.setFont(JFaceResources.getTextFont());
+				WorkbenchHelp.setHelp(headerText, ContextIds.VIEW_RESPONSE);
+
+				rootComp.layout(true);
+			} else {
+				innerComp.dispose();
+
+				data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
+				data.heightHint = HEADER_LABEL_SIZE;
+				headerComp.setLayoutData(data);
+				
+				innerComp = new Composite(headerComp, SWT.NONE);
+				layout = new GridLayout();
+				layout.numColumns = 1;
+				layout.marginHeight = 0;
+				layout.marginWidth = 2;
+				innerComp.setLayout(layout);
+				data = new GridData(GridData.FILL_BOTH);
+				data.heightHint = HEADER_LABEL_SIZE;
+				innerComp.setLayoutData(data);
+
+				headerLabel = new Label(innerComp, SWT.NONE);
+				headerLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
+				
+				rootComp.layout(true);
+			}
+		}
+		getView();
+	}
+
+	/*public boolean getDisplayHeader() {
+		return displayHeader;
+	}*/
+
+	private void getView() {
+		String out = "";
+		if (rr != null) {
+			if (msg == REQUEST_HEADER) {
+				out = MonitorCore.parse(rr.getRequest(IRequest.TRANSPORT));
+			} else if (msg == RESPONSE_HEADER) {
+				out = MonitorCore.parse(rr.getResponse(IRequest.TRANSPORT));
+			}
+		}
+		
+		if (displayHeader) {
+			headerText.setText(out);
+		} else {
+			String lineSeparator = System.getProperty("line.separator");
+			int index = out.indexOf(lineSeparator);
+			if(index > 0)
+				headerLabel.setText(MonitorUIPlugin.getResource("%headerLabel") + ": " + out.substring(0, index));
+			else 
+				headerLabel.setText(MonitorUIPlugin.getResource("%headerLabel") + ":  " + out);
+		}
+	}
+
+	public void dispose() {
+		headerComp.dispose();
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/viewers/ImageViewer.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/viewers/ImageViewer.java
new file mode 100644
index 0000000..b8d5bb4
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/viewers/ImageViewer.java
@@ -0,0 +1,95 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal.viewers;
+
+import java.io.ByteArrayInputStream;
+
+import net.sourceforge.phpdt.monitor.ui.IContentViewer;
+import net.sourceforge.phpdt.monitor.ui.internal.MonitorUIPlugin;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * An image viewer.
+ */
+public class ImageViewer implements IContentViewer {
+	protected Composite rootComp;
+	protected Composite viewerComp;
+	protected Label messageLabel;
+
+	/* (non-Javadoc)
+	 * @see net.sourceforge.phpdt.monitor.ui.IContentViewer#init(Composite)
+	 */
+	public void init(Composite parent) {
+		rootComp = parent;
+		
+		viewerComp = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 1;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		viewerComp.setLayout(layout);
+		GridData data = new GridData(GridData.FILL_BOTH);
+		viewerComp.setLayoutData(data);
+
+		messageLabel = new Label(viewerComp, SWT.NONE);
+		messageLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING));
+	}
+	
+	/* (non-Javadoc)
+	 * @see net.sourceforge.phpdt.monitor.ui.IContentViewer#setContent()
+	 */
+	public void setContent(byte[] b) {
+		if (b == null || b.length == 0) {
+			messageLabel.setText("<" + MonitorUIPlugin.getResource("%imageViewInvalid") + ">");
+		} else {
+			byte cr = '\r';
+			byte lf = '\n';
+			int trimFront = 0;
+			int trimBack = 0;
+			int len = b.length - 1;
+			while(b[trimFront] == cr || b[trimFront] == lf)
+				trimFront++;
+			while(b[len - trimBack] == cr || b[len - trimBack] == lf)
+				trimBack++;
+				
+			if (trimFront + trimBack > 0) {
+				byte[] temp = b;
+				b = new byte[temp.length - trimBack - trimFront];
+				for(int i = trimFront; i < temp.length - trimBack; i++) {
+					b[i - trimFront] = temp[i];
+				}
+			}
+			try {
+				ImageData imgD = new ImageData(new ByteArrayInputStream(b));
+				Image img = new Image(null, imgD);
+				messageLabel.setImage(img);
+			} catch(Exception e) {
+				messageLabel.setText("<" + MonitorUIPlugin.getResource("%imageViewInvalid") + ">");
+			}
+		}
+		
+		viewerComp.layout(true);
+	}
+	
+	/* (non-Javadoc)
+	 * @see net.sourceforge.phpdt.monitor.ui.IContentViewer#dispose()
+	 */
+	public void dispose() {
+		viewerComp.dispose();
+	}
+}
\ No newline at end of file
diff --git a/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/viewers/XMLViewer.java b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/viewers/XMLViewer.java
new file mode 100644
index 0000000..a8a0a40
--- /dev/null
+++ b/archive/net.sourceforge.phpeclipse.monitor.ui/src/net/sourceforge/phpdt/monitor/ui/internal/viewers/XMLViewer.java
@@ -0,0 +1,227 @@
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpdt.monitor.ui.internal.viewers;
+ 
+import java.io.*;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import net.sourceforge.phpdt.monitor.core.MonitorCore;
+import net.sourceforge.phpdt.monitor.ui.IContentViewer;
+import net.sourceforge.phpdt.monitor.ui.internal.ContextIds;
+
+import org.eclipse.jface.resource.JFaceResources;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StackLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.help.WorkbenchHelp;
+
+
+import org.w3c.dom.*;
+import org.xml.sax.*;
+/**
+ * XML Viewer.
+ */
+public class XMLViewer implements IContentViewer {
+	protected GridData data;
+	protected StackLayout layout;
+	protected Text messageText;
+
+	protected Composite rootComp;
+	protected Composite viewerComp;
+	protected Label messageLabel;
+	
+	protected boolean xmlTagMissing = false;
+	protected boolean setEncoding = false;
+	protected boolean missingEncoding = false;
+	protected String originalEncoding;
+
+	/* (non-Javadoc)
+	 * @see net.sourceforge.phpdt.monitor.ui.IContentViewer#dispose()
+	 */
+	public void dispose() {
+		viewerComp.dispose();
+	}
+	
+	/* (non-Javadoc)
+	 * @see net.sourceforge.phpdt.monitor.ui.IContentViewer#setContent()
+	 */
+	public void setContent(byte[] b) {
+		String out = "";		
+		if (b != null)
+			out = MonitorCore.parse(b);
+				
+		String lineSeparator = System.getProperty("line.separator");
+		int ls = lineSeparator.length();
+		if (out.length() > ls) {
+			while (out.substring(0, ls).indexOf(lineSeparator) >= 0)
+			out = out.substring(ls, out.length()); 
+		}
+		
+		String out_temp = out.toLowerCase();
+		if (out_temp.indexOf("<?xml") < 0) 
+			xmlTagMissing = true;
+		
+		if (out.length() > 0) {		
+			byte[] b1 = createDocument(out);
+			String finalMsg = new String (b1);
+			if (finalMsg.startsWith("Invalid XML")) {
+				//case: error parsing
+				messageText.setVisible(false);
+				layout.topControl = messageLabel;
+				messageLabel.setVisible(true);
+				messageLabel.setText("<Not a valid XML file>");
+				
+			}
+			else if (xmlTagMissing && finalMsg.startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")) {
+				int x = finalMsg.indexOf("\n") + 1;
+				String Msg = finalMsg.substring(x);
+				finalMsg = Msg;
+				
+				messageText.setText(finalMsg);
+			}
+			
+			else if (setEncoding) {
+				//change back to original Encoding
+				int begin = finalMsg.indexOf("UTF-8"); //location of opening "
+				int last = begin + 5;  //location of closing "
+				String first_half = finalMsg.substring(0,begin);
+				String second_half = finalMsg.substring(last);
+				finalMsg = first_half + originalEncoding + second_half;	
+				
+				messageText.setText(finalMsg);
+			}
+			
+			else if (missingEncoding) {
+				//remove encoding completely
+				int begin = finalMsg.indexOf("encoding=\"UTF-8\""); //location of opening "
+				int last = begin + 16;  //location of closing "
+				String first_half = finalMsg.substring(0,begin);
+				String second_half = finalMsg.substring(last);
+				finalMsg = first_half + second_half;
+				
+				messageText.setText(finalMsg);	
+			}			
+		} else
+			messageText.setText(out);
+	}
+	
+	/* (non-Javadoc)
+	 * @see net.sourceforge.phpdt.monitor.ui.IContentViewer#init(Composite)
+	 */
+	public void init(Composite parent) {
+		rootComp = parent;
+		
+		viewerComp = new Composite(parent, SWT.NONE);
+		layout = new StackLayout();
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		viewerComp.setLayout(layout);
+		data = new GridData(GridData.FILL_BOTH);
+		viewerComp.setLayoutData(data);
+	
+		messageText = new Text(viewerComp, SWT.BORDER | SWT.MULTI | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL);
+		Display display = viewerComp.getDisplay();
+		messageText.setBackground(display.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+		messageText.setForeground(display.getSystemColor(SWT.COLOR_LIST_FOREGROUND));
+		messageText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL));
+		messageText.setFont(JFaceResources.getTextFont());
+		messageText.setVisible(true);
+		WorkbenchHelp.setHelp(messageText, ContextIds.VIEW_RESPONSE);
+		
+		messageLabel = new Label(viewerComp, SWT.NONE);
+		messageLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING));
+		messageLabel.setVisible(false);
+		
+		layout.topControl = messageText;
+	}
+	
+	/* (non-Javadoc)
+	 * @#createDocument(String)
+	 */
+	protected byte[] createDocument(String str) {
+		byte[] parseArray = null;
+		Document document = null;
+		byte[] result = null;	
+		
+		try {	
+			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+			try {
+				factory.setAttribute("http://apache.org/xml/features/allow-java-encodings", new Boolean(true));
+				factory.setAttribute("http://apache.org/xml/features/continue-after-fatal-error", new Boolean(true));
+			} catch (Exception e) { }
+			DocumentBuilder parser = factory.newDocumentBuilder();
+			
+			if (xmlTagMissing) {
+				str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + str;
+			} else {
+				String str_temp = str.toLowerCase();
+				
+				//if encoding present,then save original Encoding, change to UTF-8
+				if (str_temp.indexOf("encoding=") >= 0) {
+					setEncoding = true;
+					String temp1 = str.substring(str_temp.indexOf("encoding="));
+					int beginIndex = temp1.indexOf("\"") + 1;
+					String temp2 = temp1.substring(beginIndex);
+					int endIndex = temp2.indexOf("\"");
+					originalEncoding = temp2.substring(0, endIndex);
+				}	
+				
+				//if no encoding at all,then no changes to be made
+				else if (str_temp.indexOf("encoding") < 0) {
+					setEncoding = false;	
+					missingEncoding = true;		
+				}	
+			}
+			parseArray = str.getBytes();
+			document = parser.parse(new InputSource(new ByteArrayInputStream(parseArray)));  
+			result = getContents(document);
+			
+		} catch (Exception e) {
+			result = "Invalid XML".getBytes();
+		} 
+		return result;
+	}
+
+	protected byte[] getContents(Document document) throws IOException {
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		Result result = new StreamResult(out);
+		Source source = new DOMSource(document);
+		try {
+			Transformer transformer = TransformerFactory.newInstance().newTransformer();
+			transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
+			transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
+			transformer.transform(source, result);            
+		}
+		catch (TransformerConfigurationException e) {
+			throw (IOException) (new IOException().initCause(e));
+		}
+		catch (TransformerException e) {
+			throw (IOException) (new IOException().initCause(e));
+		}
+		return out.toByteArray();
+	}
+}
\ No newline at end of file