[183914] Mask preview server's implementation
diff --git a/plugins/org.eclipse.wst.server.preview/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.server.preview/META-INF/MANIFEST.MF
index 2b9ae14..00fcc59 100644
--- a/plugins/org.eclipse.wst.server.preview/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.server.preview/META-INF/MANIFEST.MF
@@ -8,6 +8,7 @@
 Bundle-Localization: plugin
 Export-Package: org.eclipse.wst.server.preview.internal
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.mortbay.jetty
+ org.mortbay.jetty,
+ org.apache.commons.logging
 Eclipse-LazyStart: true
 Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/IMemento.java b/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/IMemento.java
index b7a09ce..7992520 100644
--- a/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/IMemento.java
+++ b/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/IMemento.java
@@ -1,5 +1,5 @@
 /**********************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
+ * Copyright (c) 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
diff --git a/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/Messages.properties b/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/Messages.properties
index 97f0fe5..185c621 100644
--- a/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/Messages.properties
+++ b/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/Messages.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2004, 2005 IBM Corporation and others.
+# Copyright (c) 2007 IBM Corporation and others.
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License v1.0
 # which accompanies this distribution, and is available at
diff --git a/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/PreviewStarter.java b/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/PreviewStarter.java
index d589036..9d5cad8 100644
--- a/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/PreviewStarter.java
+++ b/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/PreviewStarter.java
@@ -11,6 +11,9 @@
 package org.eclipse.wst.server.preview.internal;
 
 import java.io.File;
+import java.util.logging.Filter;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
 
 import org.mortbay.http.HttpContext;
 import org.mortbay.http.handler.ResourceHandler;
@@ -18,6 +21,12 @@
 import org.mortbay.jetty.servlet.WebApplicationContext;
 
 public class PreviewStarter {
+	private static final String[] avertedLogs = new String[] {
+		"org.mortbay.util.Container", "org.mortbay.http.HttpServer",
+		"org.mortbay.util.Credential", "org.mortbay.http.SocketListener",
+		"org.mortbay.http.HttpServer", "org.mortbay.jetty.Server"
+	};
+
 	protected String configPath;
 	protected Server server;
 
@@ -46,8 +55,44 @@
 				System.out.println();
 			}
 			
+			for (int i = 0; i < avertedLogs.length; i++) {
+				Logger logger = Logger.getLogger(avertedLogs[i]);
+				logger.setFilter(new Filter() {
+					public boolean isLoggable(LogRecord record) {
+						//Trace.trace(Trace.FINEST, "Averted Jetty log: " + record.getMessage());
+						//System.out.println("averted: " + record.getLoggerName() + ": " + record.getMessage());
+						return false;
+					}
+				});
+			}
+			
+			// helper code to find jetty loggers
+			/*Logger logger = Logger.getLogger("org.mortbay.http.HttpServer");
+			logger.addHandler(new java.util.logging.Handler() {
+				public void close() throws SecurityException {
+					// ignore
+				}
+
+				public void flush() {
+					// ignore
+				}
+
+				public void publish(LogRecord record) {
+					System.out.println("Logger found: " + record.getLoggerName());
+				}
+			});*/
+			
 			server = new Server();
 			server.addListener(":" + config.getPort());
+			server.setTrace(false);
+			server.setStatsOn(false);
+			
+			/*HttpContext context2 = new HttpContext();
+			context2.setContextPath("/");
+			context2.addHandler(new WTPErrorPageHandler());
+			context2.setAttribute(HttpContext.__ErrorHandler, new WTPErrorPageHandler());
+			server.addContext(context2);
+			server.setRootWebApp("/");*/
 			
 			for (int i = 0; i < size; i++) {
 				Module module = m[i];
@@ -56,11 +101,19 @@
 					context.setContextPath(module.getContext());
 					context.setResourceBase(module.getPath());
 					context.addHandler(new ResourceHandler());
+					context.addHandler(new WTPErrorPageHandler());
+					context.setAttribute(HttpContext.__ErrorHandler, new WTPErrorPageHandler());
 					server.addContext(context);
 				} else {
-					//System.out.println(module.getContext() + " - " + module.getPath());
-					WebApplicationContext context = server.addWebApplication(module.getContext(), module.getPath() + File.separator);
-					context.setResourceBase(module.getPath() + File.separator);
+					WebApplicationContext context = server.addWebApplication(module.getContext(), module.getPath());
+					context.setResourceBase(module.getPath());
+					//context.addHandler(new ResourceHandler());
+					context.addHandler(new WTPErrorPageHandler());
+					context.setAttribute(HttpContext.__ErrorHandler, new WTPErrorPageHandler());
+					
+					//context.setClassLoader(getClass().getClassLoader());
+					//context.start();
+					
 					//WebApplicationContext context = server.addWebApplication("/", module.getPath() + "/");
 					/*context.setConfigurationClassNames(new String[] { "org.mortbay.jetty.servlet.XMLConfiguration" });
 					context.setResourceBase(module.getPath());
diff --git a/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/WTPErrorPageHandler.java b/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/WTPErrorPageHandler.java
new file mode 100644
index 0000000..4b49da5
--- /dev/null
+++ b/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/WTPErrorPageHandler.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.server.preview.internal;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.net.URLDecoder;
+
+import org.mortbay.http.HttpException;
+import org.mortbay.http.HttpFields;
+import org.mortbay.http.HttpRequest;
+import org.mortbay.http.HttpResponse;
+import org.mortbay.http.handler.AbstractHttpHandler;
+import org.mortbay.util.ByteArrayISO8859Writer;
+import org.mortbay.util.StringUtil;
+
+public class WTPErrorPageHandler extends AbstractHttpHandler {
+	private static final long serialVersionUID = 1L;
+
+	public void handle(String pathInContext, String pathParams, HttpRequest request,
+			HttpResponse response) throws HttpException, IOException {
+		response.setContentType(HttpFields.__TextHtml);
+		ByteArrayISO8859Writer writer = new ByteArrayISO8859Writer(2048);
+		writeErrorPage(request, writer, response.getStatus(), response.getReason());
+		writer.flush();
+		response.setContentLength(writer.size());
+		writer.writeTo(response.getOutputStream());
+		writer.destroy();
+	}
+
+	protected void writeErrorPage(HttpRequest request, Writer writer, int code,
+			String message) throws IOException {
+		if (message != null) {
+			message = URLDecoder.decode(message, "UTF-8");
+			message = StringUtil.replace(message, "<", "&lt;");
+			message = StringUtil.replace(message, ">", "&gt;");
+		}
+		String uri = request.getPath();
+		uri = StringUtil.replace(uri, "<", "&lt;");
+		uri = StringUtil.replace(uri, ">", "&gt;");
+		writer.write("<html>\n<head>\n<title>Error ");
+		writer.write(Integer.toString(code));
+		writer.write(' ');
+		writer.write(message);
+		writer.write("</title>\n</head>\n<body>\n<h2>HTTP ERROR: ");
+		writer.write(Integer.toString(code));
+		writer.write("</h2><pre>");
+		writer.write(message);
+		writer.write("</pre>\n");
+		writer.write("<p>RequestURI=");
+		writer.write(uri);
+		writer.write("</p>");
+		writer.write("\n</body>\n</html>\n");
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/XMLMemento.java b/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/XMLMemento.java
index 9281c2a..a6b4bfb 100644
--- a/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/XMLMemento.java
+++ b/plugins/org.eclipse.wst.server.preview/src/org/eclipse/wst/server/preview/internal/XMLMemento.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
+ * Copyright (c) 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at