From 5d977af9576fb86f82cb08840356be670c7f1d10 Mon Sep 17 00:00:00 2001 From: costin Date: Thu, 26 Nov 2009 06:48:42 +0000 Subject: [PATCH] Moved the old coyote-specific servlet api impl to coyote/servlet Added (10% working) coyote connector that uses the new http impl git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@884418 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/coyote/lite/LiteProtocolHandler.java | 151 ++++++++ .../lite => coyote/servlet}/BodyReader.java | 2 +- .../lite => coyote/servlet}/BodyWriter.java | 4 +- .../servlet}/CharsetMapperDefault.properties | 0 .../servlet}/ClientAbortException.java | 2 +- .../{tomcat/lite => coyote/servlet}/Connector.java | 2 +- .../coyote => coyote/servlet}/CoyoteConnector.java | 11 +- .../lite => coyote/servlet}/FilterChainImpl.java | 2 +- .../lite => coyote/servlet}/FilterConfigImpl.java | 2 +- .../java/org/apache/coyote/servlet/JspLoader.java | 31 ++ .../lite => coyote/servlet}/Locale2Charset.java | 4 +- .../lite => coyote/servlet}/ParameterMap.java | 2 +- .../servlet}/RequestDispatcherImpl.java | 2 +- .../lite => coyote/servlet}/ServletConfigImpl.java | 22 +- .../servlet}/ServletContextImpl.java | 145 ++++++-- .../servlet}/ServletInputStreamImpl.java | 2 +- .../servlet}/ServletOutputStreamImpl.java | 2 +- .../lite => coyote/servlet}/ServletReaderImpl.java | 2 +- .../servlet}/ServletRequestImpl.java | 4 +- .../servlet}/ServletRequestWrapperImpl.java | 4 +- .../servlet}/ServletResponseImpl.java | 2 +- .../servlet}/ServletResponseIncludeWrapper.java | 2 +- .../lite => coyote/servlet}/ServletWriterImpl.java | 2 +- .../lite => coyote/servlet}/TomcatLite.java | 4 +- .../servlet}/WebappContextMapper.java | 8 +- .../servlet}/WebappFilterMapper.java | 2 +- .../servlet}/WebappServletMapper.java | 2 +- .../lite => coyote/servlet}/config.properties | 17 +- .../apache/tomcat/lite/ContextPreinitListener.java | 38 -- .../org/apache/tomcat/lite/service/IOStatus.java | 59 ++++ .../org/apache/tomcat/lite/service/JMXProxy.java | 240 +++++++++++++ .../org/apache/tomcat/lite/service/LogConfig.java | 64 ++++ .../tomcat/lite/webxml/ServletContextConfig.java | 158 --------- .../tomcat/lite/webxml/TomcatLiteWebXmlConfig.java | 79 ----- .../java/org/apache/tomcat/lite/webxml/WebXml.java | 388 --------------------- 35 files changed, 697 insertions(+), 764 deletions(-) create mode 100644 modules/tomcat-lite/java/org/apache/coyote/lite/LiteProtocolHandler.java rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/BodyReader.java (99%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/BodyWriter.java (99%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/CharsetMapperDefault.properties (100%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/ClientAbortException.java (99%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/Connector.java (98%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite/coyote => coyote/servlet}/CoyoteConnector.java (97%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/FilterChainImpl.java (99%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/FilterConfigImpl.java (99%) create mode 100644 modules/tomcat-lite/java/org/apache/coyote/servlet/JspLoader.java rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/Locale2Charset.java (97%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/ParameterMap.java (99%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/RequestDispatcherImpl.java (99%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/ServletConfigImpl.java (97%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/ServletContextImpl.java (93%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/ServletInputStreamImpl.java (98%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/ServletOutputStreamImpl.java (98%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/ServletReaderImpl.java (99%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/ServletRequestImpl.java (99%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/ServletRequestWrapperImpl.java (99%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/ServletResponseImpl.java (99%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/ServletResponseIncludeWrapper.java (98%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/ServletWriterImpl.java (99%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/TomcatLite.java (99%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/WebappContextMapper.java (96%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/WebappFilterMapper.java (99%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/WebappServletMapper.java (99%) rename modules/tomcat-lite/java/org/apache/{tomcat/lite => coyote/servlet}/config.properties (51%) delete mode 100644 modules/tomcat-lite/java/org/apache/tomcat/lite/ContextPreinitListener.java create mode 100644 modules/tomcat-lite/java/org/apache/tomcat/lite/service/IOStatus.java create mode 100644 modules/tomcat-lite/java/org/apache/tomcat/lite/service/JMXProxy.java create mode 100644 modules/tomcat-lite/java/org/apache/tomcat/lite/service/LogConfig.java delete mode 100644 modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/ServletContextConfig.java delete mode 100644 modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/TomcatLiteWebXmlConfig.java delete mode 100644 modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/WebXml.java diff --git a/modules/tomcat-lite/java/org/apache/coyote/lite/LiteProtocolHandler.java b/modules/tomcat-lite/java/org/apache/coyote/lite/LiteProtocolHandler.java new file mode 100644 index 000000000..1c6da20ef --- /dev/null +++ b/modules/tomcat-lite/java/org/apache/coyote/lite/LiteProtocolHandler.java @@ -0,0 +1,151 @@ +package org.apache.coyote.lite; + + + +import java.io.IOException; +import java.util.Iterator; + +import org.apache.coyote.Adapter; +import org.apache.coyote.InputBuffer; +import org.apache.coyote.OutputBuffer; +import org.apache.coyote.ProtocolHandler; +import org.apache.coyote.Request; +import org.apache.coyote.Response; +import org.apache.tomcat.lite.http.HttpConnector; +import org.apache.tomcat.lite.http.HttpRequest; +import org.apache.tomcat.lite.http.HttpResponse; +import org.apache.tomcat.lite.http.HttpChannel.HttpService; +import org.apache.tomcat.lite.io.CBuffer; +import org.apache.tomcat.lite.io.SocketConnector; +import org.apache.tomcat.util.buf.ByteChunk; +import org.apache.tomcat.util.buf.MessageBytes; + +/** + * Work in progress - use the refactored http as a coyote connector. + * Just basic requests work right now - need to implement all the + * methods of coyote. + * + * + * @author Costin Manolache + */ +public class LiteProtocolHandler implements ProtocolHandler { + + Adapter adapter; + + @Override + public void destroy() throws Exception { + } + + @Override + public Adapter getAdapter() { + return adapter; + } + + @Override + public Object getAttribute(String name) { + return null; + } + + @Override + public Iterator getAttributeNames() { + return null; + } + + @Override + public void init() throws Exception { + } + + @Override + public void pause() throws Exception { + } + + @Override + public void resume() throws Exception { + } + + @Override + public void setAdapter(Adapter adapter) { + this.adapter = adapter; + + } + + int port = 8999; + + public void setPort(int port) { + this.port = port; + } + + @Override + public void setAttribute(String name, Object value) { + System.err.println("setAttribute " + name + " " + value); + } + + @Override + public void start() throws Exception { + HttpConnector c = new HttpConnector(new SocketConnector()); + c.setPort(port); + +// c.setDebug(true); +// c.setDebugHttp(true); + + c.getDispatcher().setDefaultService(new HttpService() { + @Override + public void service(HttpRequest httpReq, HttpResponse httpRes) + throws IOException { + coyoteService(httpReq, httpRes); + } + + }); + c.start(); + } + + private void wrap(MessageBytes dest, CBuffer buffer) { + dest.setChars(buffer.array(), buffer.position(), + buffer.length()); + } + + private void coyoteService(HttpRequest httpReq, final HttpResponse httpRes) { + Request req = new Request(); + req.setInputBuffer(new InputBuffer() { + @Override + public int doRead(ByteChunk chunk, Request request) + throws IOException { + // TODO + return 0; + } + }); + Response res = new Response(); + res.setOutputBuffer(new OutputBuffer() { + + @Override + public int doWrite(org.apache.tomcat.util.buf.ByteChunk chunk, + Response response) throws IOException { + httpRes.getBody().append(chunk.getBuffer(), chunk.getStart(), + chunk.getLength()); + return chunk.getLength(); + } + + }); + + // TODO: turn http request into a coyote request - copy all fields, + // add hooks where needed. + + wrap(req.decodedURI(), httpReq.decodedURI()); + wrap(req.method(), httpReq.method()); + wrap(req.protocol(), httpReq.protocol()); + wrap(req.requestURI(), httpReq.requestURI()); + // Same for response. + + try { + + adapter.service(req, res); + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + +} diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/BodyReader.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/BodyReader.java similarity index 99% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/BodyReader.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/BodyReader.java index e8f8a6be5..228edeade 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/BodyReader.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/BodyReader.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.IOException; import java.io.InputStream; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/BodyWriter.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/BodyWriter.java similarity index 99% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/BodyWriter.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/BodyWriter.java index 5e09ae77f..e88097f1b 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/BodyWriter.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/BodyWriter.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.IOException; import java.io.Writer; @@ -457,7 +457,7 @@ public class BodyWriter extends Writer { int len = sb.length(); charsWritten += len; - cb.append(sb); + cb.append(sb.toString()); } diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/CharsetMapperDefault.properties b/modules/tomcat-lite/java/org/apache/coyote/servlet/CharsetMapperDefault.properties similarity index 100% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/CharsetMapperDefault.properties rename to modules/tomcat-lite/java/org/apache/coyote/servlet/CharsetMapperDefault.properties diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/ClientAbortException.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/ClientAbortException.java similarity index 99% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/ClientAbortException.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/ClientAbortException.java index ab395a3a7..b4c6909bc 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/ClientAbortException.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/ClientAbortException.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.IOException; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/Connector.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/Connector.java similarity index 98% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/Connector.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/Connector.java index b5a4fdf66..3a997a907 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/Connector.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/Connector.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.IOException; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/coyote/CoyoteConnector.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/CoyoteConnector.java similarity index 97% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/coyote/CoyoteConnector.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/CoyoteConnector.java index 1a69269c8..4e8cd528d 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/coyote/CoyoteConnector.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/CoyoteConnector.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.tomcat.lite.coyote; +package org.apache.coyote.servlet; import java.io.IOException; @@ -30,13 +30,6 @@ import org.apache.coyote.Request; import org.apache.coyote.Response; import org.apache.coyote.http11.Http11NioProtocol; import org.apache.tomcat.integration.ObjectManager; -import org.apache.tomcat.lite.BodyReader; -import org.apache.tomcat.lite.BodyWriter; -import org.apache.tomcat.lite.ClientAbortException; -import org.apache.tomcat.lite.Connector; -import org.apache.tomcat.lite.ServletRequestImpl; -import org.apache.tomcat.lite.ServletResponseImpl; -import org.apache.tomcat.lite.TomcatLite; import org.apache.tomcat.util.buf.ByteChunk; import org.apache.tomcat.util.buf.UriNormalizer; import org.apache.tomcat.util.http.HttpRequest; @@ -422,7 +415,7 @@ public class CoyoteConnector implements Adapter, Connector { proto.setCompression("on"); proto.setCompressionMinSize(32); proto.setPort(port); - proto.getEndpoint().setDaemon(daemon); + //proto.getEndpoint().setDaemon(daemon); setConnector(proto); setPort(port); setDaemon(daemon); diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/FilterChainImpl.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/FilterChainImpl.java similarity index 99% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/FilterChainImpl.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/FilterChainImpl.java index 7d3569b6b..7cbb54af8 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/FilterChainImpl.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/FilterChainImpl.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.IOException; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/FilterConfigImpl.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/FilterConfigImpl.java similarity index 99% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/FilterConfigImpl.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/FilterConfigImpl.java index b3b595140..2baf77af9 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/FilterConfigImpl.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/FilterConfigImpl.java @@ -15,7 +15,7 @@ */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.util.ArrayList; diff --git a/modules/tomcat-lite/java/org/apache/coyote/servlet/JspLoader.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/JspLoader.java new file mode 100644 index 000000000..d07644da6 --- /dev/null +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/JspLoader.java @@ -0,0 +1,31 @@ +/* + * Copyright 1999,2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.coyote.servlet; + +import javax.servlet.ServletContext; + +import org.apache.tomcat.servlets.jsp.BaseJspLoader; + +public class JspLoader extends BaseJspLoader { + + public ClassLoader getClassLoader(ServletContext ctx) { + return ((ServletContextImpl) ctx).getClassLoader(); + } + + public String getClassPath(ServletContext ctx) { + return ((ServletContextImpl) ctx).getClassPath(); + } +} diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/Locale2Charset.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/Locale2Charset.java similarity index 97% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/Locale2Charset.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/Locale2Charset.java index 0a9d73a6a..84a644c8a 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/Locale2Charset.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/Locale2Charset.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.InputStream; @@ -45,7 +45,7 @@ public class Locale2Charset { * Default properties resource name. */ public static final String DEFAULT_RESOURCE = - "/org/apache/tomcat/lite/CharsetMapperDefault.properties"; + "/org/apache/coyote/servlet/CharsetMapperDefault.properties"; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/ParameterMap.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/ParameterMap.java similarity index 99% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/ParameterMap.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/ParameterMap.java index 045ecfb00..eb05317b7 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/ParameterMap.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/ParameterMap.java @@ -15,7 +15,7 @@ */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.util.HashMap; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/RequestDispatcherImpl.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/RequestDispatcherImpl.java similarity index 99% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/RequestDispatcherImpl.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/RequestDispatcherImpl.java index 6ec239739..fbbbfef0e 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/RequestDispatcherImpl.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/RequestDispatcherImpl.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.IOException; import java.io.PrintWriter; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletConfigImpl.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletConfigImpl.java similarity index 97% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/ServletConfigImpl.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/ServletConfigImpl.java index dee9826d1..c8ef7ca6d 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletConfigImpl.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletConfigImpl.java @@ -15,8 +15,9 @@ */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; +import java.io.IOException; import java.io.PrintStream; import java.lang.reflect.Method; import java.util.Collection; @@ -29,7 +30,6 @@ import java.util.Stack; import java.util.logging.Level; import java.util.logging.Logger; - import javax.servlet.MultipartConfigElement; import javax.servlet.Servlet; import javax.servlet.ServletConfig; @@ -40,7 +40,7 @@ import javax.servlet.ServletSecurityElement; import javax.servlet.SingleThreadModel; import javax.servlet.UnavailableException; -import org.apache.tomcat.addons.UserTemplateClassMapper; +import org.apache.tomcat.servlets.jsp.BaseJspLoader; import org.apache.tomcat.servlets.util.Enumerator; import org.apache.tomcat.util.IntrospectionUtils; @@ -390,20 +390,12 @@ public class ServletConfigImpl implements ServletConfig, ServletRegistration { if (jspFile != null) { // Named JSPs can be handled by a servlet or by the mapper. - Servlet res = (Servlet) ctx.getObjectManager().get("filetemplate-servlet"); - if (res != null) { - servletClass = res.getClass(); - actualClass = servletClass.getName(); - initParams.put("jsp-file", jspFile); - return res; - } else { - UserTemplateClassMapper mapper = - (UserTemplateClassMapper) ctx.getObjectManager().get( - UserTemplateClassMapper.class); - if (mapper != null) { + BaseJspLoader mapper = new JspLoader(); + try { return mapper.loadProxy(jspFile, ctx, this); + } catch (IOException e) { + throw new ServletException(e); } - } } if (actualClass == null) { // Covers 'default-" and "jspwildcard-" servlets as well diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletContextImpl.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletContextImpl.java similarity index 93% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/ServletContextImpl.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/ServletContextImpl.java index 7157cded9..85a5883de 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletContextImpl.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletContextImpl.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.File; @@ -23,6 +23,7 @@ import java.io.FileNotFoundException; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; @@ -42,6 +43,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; +import javax.naming.NamingException; import javax.servlet.DispatcherType; import javax.servlet.Filter; import javax.servlet.FilterRegistration; @@ -60,12 +62,15 @@ import javax.servlet.SessionTrackingMode; import javax.servlet.FilterRegistration.Dynamic; import javax.servlet.descriptor.JspConfigDescriptor; -import org.apache.tomcat.addons.UserSessionManager; +import org.apache.tomcat.InstanceManager; +import org.apache.tomcat.servlets.session.UserSessionManager; import org.apache.tomcat.integration.ObjectManager; -import org.apache.tomcat.lite.webxml.ServletContextConfig; -import org.apache.tomcat.lite.webxml.ServletContextConfig.FilterData; -import org.apache.tomcat.lite.webxml.ServletContextConfig.FilterMappingData; -import org.apache.tomcat.lite.webxml.ServletContextConfig.ServletData; +import org.apache.tomcat.servlets.config.ConfigLoader; +import org.apache.tomcat.servlets.config.ServletContextConfig; +import org.apache.tomcat.servlets.config.ServletContextConfig.FilterData; +import org.apache.tomcat.servlets.config.ServletContextConfig.FilterMappingData; +import org.apache.tomcat.servlets.config.ServletContextConfig.ServletData; +import org.apache.tomcat.servlets.config.deploy.WarDeploy; import org.apache.tomcat.servlets.util.Enumerator; import org.apache.tomcat.servlets.util.RequestUtil; import org.apache.tomcat.servlets.util.UrlUtils; @@ -153,6 +158,9 @@ public class ServletContextImpl implements ServletContext { boolean initDone = false; boolean startDone = false; + + String jspcServlet = "org.apache.tomcat.servlets.jspc.JspcServlet"; + // ------------------------------------------------- ServletContext Methods public ServletContextImpl() { @@ -439,7 +447,7 @@ public class ServletContextImpl implements ServletContext { * Return the major version of the Java Servlet API that we implement. */ public int getMajorVersion() { - return 2; + return 3; } @@ -447,7 +455,7 @@ public class ServletContextImpl implements ServletContext { * Return the minor version of the Java Servlet API that we implement. */ public int getMinorVersion() { - return 4; + return 0; } @@ -522,6 +530,8 @@ public class ServletContextImpl implements ServletContext { ThreadLocal requestDispatcherStack = new ThreadLocal(); + private String classPath; + protected ClassLoader classLoader; // protected RequestDispatcherImpl getRequestDispatcher() { @@ -966,22 +976,22 @@ public class ServletContextImpl implements ServletContext { Iterator i2 = d.filters.values().iterator(); while (i2.hasNext()) { FilterData fd = (FilterData)i2.next(); - addFilter(fd.filterName, fd.filterClass, fd.initParams); + addFilter(fd.name, fd.className, fd.initParams); } Iterator i3 = d.servlets.values().iterator(); while (i3.hasNext()) { ServletData sd = (ServletData) i3.next(); // jsp-file - if (sd.servletClass == null) { + if (sd.className == null) { if (sd.jspFile == null) { - log.log(Level.WARNING, "Missing servlet class for " + sd.servletName); + log.log(Level.WARNING, "Missing servlet class for " + sd.name); continue; } } ServletConfigImpl sw = - new ServletConfigImpl(this, sd.servletName, sd.servletClass); + new ServletConfigImpl(this, sd.name, sd.className); sw.setConfig(sd.initParams); sw.setJspFile(sd.jspFile); sw.setLoadOnStartup(sd.loadOnStartup); @@ -1076,13 +1086,9 @@ public class ServletContextImpl implements ServletContext { // Merge in web.xml - or other config source ( programmatic, etc ) - ContextPreinitListener cfg = - (ContextPreinitListener) getObjectManager().get( - ContextPreinitListener.class); - if (cfg != null) { - cfg.preInit(this); - } - + ConfigLoader cfg = new WarDeploy(); + contextConfig = cfg.loadConfig(getBasePath()); + processWebAppData(contextConfig); // if not defined yet: @@ -1120,9 +1126,14 @@ public class ServletContextImpl implements ServletContext { if (servlets.get("jspwildcard") == null) { ServletConfigImpl fileS = new ServletConfigImpl(this, "jspwildcard", null); + fileS.initParams.put("mapper", JspLoader.class.getName()); addServletConfig(fileS); addMapping("*.jsp", fileS); } + + ServletConfigImpl jspcS = new ServletConfigImpl(this, + "jspc", jspcServlet); + addServletConfig(jspcS); } protected void initEngineDefaults() throws ServletException { @@ -1145,30 +1156,26 @@ public class ServletContextImpl implements ServletContext { ServletConfigImpl servletConfig = getServletConfig(sname); addMapping(path, servletConfig); } - } + // JSP support + setAttribute(InstanceManager.class.getName(), + new LiteInstanceManager(getObjectManager())); + + } - public ArrayList getClasspath(File directory, File classesDir) { - ArrayList res = new ArrayList(); - if (classesDir.isDirectory() && classesDir.exists() && - classesDir.canRead()) { - try { - URL url = classesDir.toURL(); - res.add(url); - } catch (MalformedURLException e) { - } - } + private void addClasspathLib(ArrayList res, File directory) { + if (!directory.isDirectory() || !directory.exists() || !directory.canRead()) { - return res; + return; } - + File[] jars = directory.listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".jar"); } }); - + for (int j = 0; j < jars.length; j++) { try { URL url = jars[j].toURL(); @@ -1176,9 +1183,22 @@ public class ServletContextImpl implements ServletContext { } catch (MalformedURLException e) { } } - return res; } - + + private void addClasspathDir(ArrayList res, File classesDir) { + + if (classesDir.isDirectory() && classesDir.exists() && + classesDir.canRead()) { + try { + URL url = classesDir.toURL(); + res.add(url); + } catch (MalformedURLException e) { + } + } + } + public String getClassPath() { + return classPath; + } public void start() throws ServletException { if (startDone) { @@ -1186,8 +1206,12 @@ public class ServletContextImpl implements ServletContext { } String base = getBasePath(); - ArrayList urls = getClasspath(new File(base + "/WEB-INF/lib"), - new File(base + "/WEB-INF/classes")); + ArrayList urls = new ArrayList(); + + addClasspathDir(urls, new File(base + "/WEB-INF/classes")); + addClasspathDir(urls, new File(base + "/WEB-INF/tmp")); + addClasspathLib(urls, new File(base + "/WEB-INF/lib")); + URL[] urlsA = new URL[urls.size()]; urls.toArray(urlsA); @@ -1204,6 +1228,13 @@ public class ServletContextImpl implements ServletContext { repository = ctxRepo; */ + StringBuilder cp = new StringBuilder(); + + for (URL cpUrl : urlsA) { + cp.append(":").append(cpUrl.getFile()); + } + classPath = cp.toString(); + classLoader = new URLClassLoader(urlsA, parentLoader); // JMX should know about us ( TODO: is it too early ? ) @@ -1624,5 +1655,45 @@ public class ServletContextImpl implements ServletContext { return -1; } + private final class LiteInstanceManager implements InstanceManager { + private ObjectManager om; + + public LiteInstanceManager(ObjectManager objectManager) { + this.om = objectManager; + } + + @Override + public void destroyInstance(Object o) + throws IllegalAccessException, + InvocationTargetException { + } + + @Override + public Object newInstance(String className) + throws IllegalAccessException, + InvocationTargetException, NamingException, + InstantiationException, + ClassNotFoundException { + return om.get(className); + } + + @Override + public Object newInstance(String fqcn, + ClassLoader classLoader) + throws IllegalAccessException, + InvocationTargetException, NamingException, + InstantiationException, + ClassNotFoundException { + return om.get(fqcn); + } + + @Override + public void newInstance(Object o) + throws IllegalAccessException, + InvocationTargetException, NamingException { + om.bind(o.getClass().getName(), o); + } + } + } diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletInputStreamImpl.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletInputStreamImpl.java similarity index 98% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/ServletInputStreamImpl.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/ServletInputStreamImpl.java index 5f5d914bc..c566dc579 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletInputStreamImpl.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletInputStreamImpl.java @@ -15,7 +15,7 @@ */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.IOException; import java.io.InputStream; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletOutputStreamImpl.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletOutputStreamImpl.java similarity index 98% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/ServletOutputStreamImpl.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/ServletOutputStreamImpl.java index 53ae9d04a..5f2225ae7 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletOutputStreamImpl.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletOutputStreamImpl.java @@ -15,7 +15,7 @@ */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.IOException; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletReaderImpl.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletReaderImpl.java similarity index 99% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/ServletReaderImpl.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/ServletReaderImpl.java index 3bb3308b4..62bfb2e6a 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletReaderImpl.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletReaderImpl.java @@ -15,7 +15,7 @@ */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.BufferedReader; import java.io.IOException; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletRequestImpl.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletRequestImpl.java similarity index 99% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/ServletRequestImpl.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/ServletRequestImpl.java index 4d9a6224e..ef22f6f7b 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletRequestImpl.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletRequestImpl.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.BufferedReader; import java.io.IOException; @@ -52,7 +52,7 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.http.Part; -import org.apache.tomcat.addons.UserSessionManager; +import org.apache.tomcat.servlets.session.UserSessionManager; import org.apache.tomcat.servlets.util.Enumerator; import org.apache.tomcat.servlets.util.LocaleParser; import org.apache.tomcat.servlets.util.RequestUtil; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletRequestWrapperImpl.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletRequestWrapperImpl.java similarity index 99% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/ServletRequestWrapperImpl.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/ServletRequestWrapperImpl.java index af400d8ca..908b3c6bf 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletRequestWrapperImpl.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletRequestWrapperImpl.java @@ -15,7 +15,7 @@ */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.IOException; @@ -31,7 +31,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpSession; -import org.apache.tomcat.addons.UserSessionManager; +import org.apache.tomcat.servlets.session.UserSessionManager; import org.apache.tomcat.servlets.util.Enumerator; import org.apache.tomcat.servlets.util.RequestUtil; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletResponseImpl.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletResponseImpl.java similarity index 99% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/ServletResponseImpl.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/ServletResponseImpl.java index d876697ec..eab7af941 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletResponseImpl.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletResponseImpl.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.IOException; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletResponseIncludeWrapper.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletResponseIncludeWrapper.java similarity index 98% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/ServletResponseIncludeWrapper.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/ServletResponseIncludeWrapper.java index 6f8b26077..4c10b647a 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletResponseIncludeWrapper.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletResponseIncludeWrapper.java @@ -15,7 +15,7 @@ */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.IOException; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletWriterImpl.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletWriterImpl.java similarity index 99% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/ServletWriterImpl.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/ServletWriterImpl.java index a27d69301..82e3e2069 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletWriterImpl.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/ServletWriterImpl.java @@ -15,7 +15,7 @@ */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.IOException; import java.io.PrintWriter; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/TomcatLite.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/TomcatLite.java similarity index 99% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/TomcatLite.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/TomcatLite.java index b01220543..87e04b8b0 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/TomcatLite.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/TomcatLite.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.File; import java.io.IOException; @@ -109,7 +109,7 @@ public class TomcatLite implements Runnable { public static ObjectManager defaultObjectManager() { SimpleObjectManager cfg = new SimpleObjectManager(); - cfg.loadResource("org/apache/tomcat/lite/config.properties"); + cfg.loadResource("org/apache/coyote/servlet/config.properties"); return cfg; } /** diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/WebappContextMapper.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/WebappContextMapper.java similarity index 96% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/WebappContextMapper.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/WebappContextMapper.java index ae0d9698e..d9abbd8e5 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/WebappContextMapper.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/WebappContextMapper.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.IOException; import java.util.HashMap; @@ -49,7 +49,7 @@ import org.apache.tomcat.util.http.mapper.MappingData; public class WebappContextMapper implements Filter { ServletContext rootContext; - Map contexts = new HashMap(); + Map contexts = new HashMap(); public WebappContextMapper() { } @@ -79,7 +79,7 @@ public class WebappContextMapper implements Filter { } MessageBytes mb = MessageBytes.newInstance(); mb.setChars(path.toCharArray(), 0, path.length()); - contexts.put(mb, context); + contexts.put(mb.toString(), context); } @@ -121,7 +121,7 @@ public class WebappContextMapper implements Filter { nextSlash = uri.length(); } mappingData.contextPath.setChars(uri.getChars(), 0, nextSlash); - ServletContext servletContext = contexts.get(mappingData.contextPath); + ServletContext servletContext = contexts.get(mappingData.contextPath.toString()); if (servletContext != null) { mappingData.context = servletContext; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/WebappFilterMapper.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/WebappFilterMapper.java similarity index 99% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/WebappFilterMapper.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/WebappFilterMapper.java index f6cfaedad..305b245c4 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/WebappFilterMapper.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/WebappFilterMapper.java @@ -15,7 +15,7 @@ */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.IOException; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/WebappServletMapper.java b/modules/tomcat-lite/java/org/apache/coyote/servlet/WebappServletMapper.java similarity index 99% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/WebappServletMapper.java rename to modules/tomcat-lite/java/org/apache/coyote/servlet/WebappServletMapper.java index a6eb28438..8e2f307f8 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/WebappServletMapper.java +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/WebappServletMapper.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.apache.tomcat.lite; +package org.apache.coyote.servlet; import java.io.File; import java.io.IOException; diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/config.properties b/modules/tomcat-lite/java/org/apache/coyote/servlet/config.properties similarity index 51% rename from modules/tomcat-lite/java/org/apache/tomcat/lite/config.properties rename to modules/tomcat-lite/java/org/apache/coyote/servlet/config.properties index c1ef53d41..0a5d65840 100644 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/config.properties +++ b/modules/tomcat-lite/java/org/apache/coyote/servlet/config.properties @@ -2,29 +2,24 @@ # If tomcat is used with a proper framework, you need to bind and configure # those objects in the framework. -Main.(class)=org.apache.tomcat.lite.TomcatLite +Main.(class)=org.apache.coyote.servlet.TomcatLite Jmx.(class)=org.apache.tomcat.integration.jmx.JmxObjectManagerSpi # --- Class names for required plugin interfaces --- -org.apache.tomcat.lite.WebappServletMapper.(class)=org.apache.tomcat.lite.WebappServletMapper -org.apache.tomcat.lite.WebappFilterMapper.(class)=org.apache.tomcat.lite.WebappFilterMapper +org.apache.coyote.servlet.WebappServletMapper.(class)=org.apache.coyote.servlet.WebappServletMapper +org.apache.coyote.servlet.WebappFilterMapper.(class)=org.apache.coyote.servlet.WebappFilterMapper # Sessions -org.apache.tomcat.addons.UserSessionManager.(class)=org.apache.tomcat.servlets.session.SimpleSessionManager - -# *.jsp support -org.apache.tomcat.addons.UserTemplateClassMapper.(class)=org.apache.tomcat.servlets.jsp.JasperCompilerTemplateClassMapper - -org.apache.tomcat.addons.Filesystem.(class)=org.apache.tomcat.integration.simple.LocalFilesystem +org.apache.tomcat.servlets.session.UserSessionManager.(class)=org.apache.tomcat.servlets.session.SimpleSessionManager # Loader for web.xml - you can have your own custom class using a more efficient # or hardcoded. -org.apache.tomcat.lite.ContextPreinitListener.(class)=org.apache.tomcat.lite.webxml.TomcatLiteWebXmlConfig +org.apache.coyote.servlet.ContextPreinitListener.(class)=org.apache.coyote.servlet.webxml.TomcatLiteWebXmlConfig # Connector class -org.apache.tomcat.lite.Connector.(class)=org.apache.tomcat.lite.coyote.CoyoteConnector +org.apache.coyote.servlet.Connector.(class)=org.apache.coyote.servlet.CoyoteConnector # JMX jmx-connector.(class)=org.apache.tomcat.integration.jmx.JmxObjectManagerSpi diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/ContextPreinitListener.java b/modules/tomcat-lite/java/org/apache/tomcat/lite/ContextPreinitListener.java deleted file mode 100644 index 663266e3b..000000000 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/ContextPreinitListener.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.tomcat.lite; - -import javax.servlet.ServletContext; - -/** - * Tomcat-lite specific interface ( could be moved to addons ). - * This class will be called before initialization - implementations - * can add servlets, filters, etc. In particular web.xml parsing - * is done implementing this interface. - * - * On a small server you could remove web.xml support to reduce - * footprint, and either hardcode this class or use properties. - * Same if you already use a framework and you inject settings - * or use framework's registry (OSGI). - * - * @author Costin Manolache - */ -public interface ContextPreinitListener { - - public void preInit(ServletContext ctx); -} diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/service/IOStatus.java b/modules/tomcat-lite/java/org/apache/tomcat/lite/service/IOStatus.java new file mode 100644 index 000000000..fee4d188b --- /dev/null +++ b/modules/tomcat-lite/java/org/apache/tomcat/lite/service/IOStatus.java @@ -0,0 +1,59 @@ +/* + */ +package org.apache.tomcat.lite.service; + +import java.io.IOException; +import java.util.Map; + +import org.apache.tomcat.lite.http.HttpRequest; +import org.apache.tomcat.lite.http.HttpResponse; +import org.apache.tomcat.lite.http.HttpWriter; +import org.apache.tomcat.lite.http.HttpChannel.HttpService; +import org.apache.tomcat.lite.http.HttpConnector.ConnectionPool; +import org.apache.tomcat.lite.http.HttpConnector.RemoteServer; +import org.apache.tomcat.lite.io.IOChannel; + +/** + * Dump status of a connection pool. + */ +public class IOStatus implements HttpService { + + private ConnectionPool pool; + + public IOStatus() { + + } + + public IOStatus(ConnectionPool pool) { + this.pool = pool; + } + + @Override + public void service(HttpRequest httpReq, HttpResponse httpRes) + throws IOException { + ConnectionPool sc = pool == null ? + httpReq.getHttpChannel().getConnector().cpool : + pool; + HttpWriter out = httpRes.getBodyWriter(); + + httpRes.setContentType("text/plain"); + out.println("hosts=" + sc.getTargetCount()); + out.println("waiting=" + sc.getSocketCount()); + out.println("closed=" + sc.getClosedSockets()); + out.println(); + + for (Map.Entry e: sc.hosts.entrySet()) { + out.append(e.getKey()); + out.append("="); + out.println(Integer.toString(e.getValue().connections.size())); + + for (IOChannel ch: e.getValue().connections) { + out.println(ch.getId() + + " " + ch.toString()); + } + out.println(); + } + + } + +} diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/service/JMXProxy.java b/modules/tomcat-lite/java/org/apache/tomcat/lite/service/JMXProxy.java new file mode 100644 index 000000000..284ee2577 --- /dev/null +++ b/modules/tomcat-lite/java/org/apache/tomcat/lite/service/JMXProxy.java @@ -0,0 +1,240 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.apache.tomcat.lite.service; + + +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.logging.Logger; + +import org.apache.tomcat.integration.DynamicObject; +import org.apache.tomcat.integration.ObjectManager; + +/** + * Send all registered JMX objects and properties as JSON. + * + * Based on JMXProxy servlet, but: + * - Async handler instead of servlet - so it works with 'raw' connector + * - doesn't use JMX - integrates with the ObjectManager ( assuming OM + * provies a list of managed objects ) + * - all the reflection magic from modeler is implemented here. + * + * @author Costin Manolache + */ +public class JMXProxy extends ObjectManager implements Runnable { + + static Logger log = Logger.getLogger(JMXProxy.class.getName()); + + protected ObjectManager om; + + Map types = new HashMap(); + + Map objects = new HashMap(); + + + public void bind(String name, Object o) { + objects.put(name, o); + } + + public void unbind(String name) { + objects.remove(name); + } + + + public void setObjectManager(ObjectManager om) { + this.om = om; + } + + + private DynamicObject getClassInfo(Class beanClass) { + if (types.get(beanClass) != null) { + return types.get(beanClass); + } + DynamicObject res = new DynamicObject(beanClass); + types.put(beanClass, res); + return res; + } + + + // --------------------------------------------------------- Public Methods + + public void getAttribute(PrintWriter writer, String onameStr, String att) { + try { + + Object bean = objects.get(onameStr); + Class beanClass = bean.getClass(); + DynamicObject ci = getClassInfo(beanClass); + + Object value = ci.getAttribute(bean, att); + writer.println("OK - Attribute get '" + onameStr + "' - " + att + + "= " + escape(value.toString())); + } catch (Exception ex) { + writer.println("Error - " + ex.toString()); + } + } + + + public void setAttribute( PrintWriter writer, + String onameStr, String att, String val ) + { + try { + Object bean = objects.get(onameStr); + Class beanClass = bean.getClass(); + DynamicObject ci = getClassInfo(beanClass); + + ci.setProperty(bean, att, val); + writer.println("OK - Attribute set"); + } catch( Exception ex ) { + writer.println("Error - " + ex.toString()); + } + } + + public void listBeans( PrintWriter writer, String qry, boolean json ) + { + if (json) { + listBeansJson(writer, qry); + return; + } + Set names = objects.keySet(); + writer.println("OK - Number of results: " + names.size()); + writer.println(); + + Iterator it=names.iterator(); + while( it.hasNext()) { + String oname=it.next(); + writer.println( "Name: " + oname); + + try { + Object bean = objects.get(oname); + Class beanClass = bean.getClass(); + DynamicObject ci = getClassInfo(beanClass); + writer.println("modelerType: " + beanClass.getName()); + + Object value=null; + for (String attName: ci.attributeNames()) { + try { + value = ci.getAttribute(bean, attName); + } catch( Throwable t) { + System.err.println("Error getting attribute " + oname + + " " + attName + " " + t.toString()); + continue; + } + if( value==null ) continue; + String valueString=value.toString(); + writer.println( attName + ": " + escape(valueString)); + } + } catch (Exception e) { + // Ignore + } + writer.println(); + } + + } + + private static void json(PrintWriter writer, String name, String value) { + writer.write("\"" + name +"\":" + "\"" + escapeJson(value) + "\","); + } + + private void listBeansJson(PrintWriter writer, String qry) { + Set names = objects.keySet(); + writer.println("["); + + Iterator it=names.iterator(); + while( it.hasNext()) { + writer.print("{"); + String oname=it.next(); + json(writer, "name", oname); + + try { + Object bean = objects.get(oname); + Class beanClass = bean.getClass(); + DynamicObject ci = getClassInfo(beanClass); + json(writer, "modelerType", beanClass.getName()); + + Object value=null; + for (String attName: ci.attributeNames()) { + try { + value = ci.getAttribute(bean, attName); + } catch( Throwable t) { + System.err.println("Error getting attribute " + oname + + " " + attName + " " + t.toString()); + continue; + } + if( value==null ) continue; + String valueString=value.toString(); + json(writer, attName, valueString); + } + writer.println("}"); + } catch (Exception e) { + // Ignore + } + } + writer.println("]"); + } + + public static String escapeJson(String value) { + return value; + } + + public static String escape(String value) { + // The only invalid char is \n + // We also need to keep the string short and split it with \nSPACE + // XXX TODO + int idx=value.indexOf( "\n" ); + if( idx < 0 ) return value; + + int prev=0; + StringBuffer sb=new StringBuffer(); + while( idx >= 0 ) { + appendHead(sb, value, prev, idx); + + sb.append( "\\n\n "); + prev=idx+1; + if( idx==value.length() -1 ) break; + idx=value.indexOf('\n', idx+1); + } + if( prev < value.length() ) + appendHead( sb, value, prev, value.length()); + return sb.toString(); + } + + private static void appendHead( StringBuffer sb, String value, int start, int end) { + if (end < 1) return; + + int pos=start; + while( end-pos > 78 ) { + sb.append( value.substring(pos, pos+78)); + sb.append( "\n "); + pos=pos+78; + } + sb.append( value.substring(pos,end)); + } + + public boolean isSupported( String type ) { + return true; + } + + @Override + public void run() { + + } +} diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/service/LogConfig.java b/modules/tomcat-lite/java/org/apache/tomcat/lite/service/LogConfig.java new file mode 100644 index 000000000..bbb52246a --- /dev/null +++ b/modules/tomcat-lite/java/org/apache/tomcat/lite/service/LogConfig.java @@ -0,0 +1,64 @@ +/* + * Copyright 2001-2004 The Apache Software Foundation. + * Copyright 2004 Costin Manolache + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.tomcat.lite.service; + +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.apache.tomcat.lite.http.HttpRequest; +import org.apache.tomcat.lite.http.HttpResponse; +import org.apache.tomcat.lite.http.HttpChannel.HttpService; + +/** + * Log configuration + * + */ +public class LogConfig implements HttpService { + + /** + * Framework can set this attribute with comma separated + * list of loggers to set to debug level. + * This is used at startup. + */ + public void setDebug(String debug) { + for (String log : debug.split(",")) { + Logger logger = Logger.getLogger(log); + logger.setLevel(Level.INFO); + } + } + + /** + * + */ + public void setWarn(String nodebug) { + for (String log : nodebug.split(",")) { + Logger logger = Logger.getLogger(log); + logger.setLevel(Level.WARNING); + } + } + + @Override + public void service(HttpRequest httpReq, HttpResponse httpRes) + throws IOException { + String debug = httpReq.getParameter("debug"); + setDebug(debug); + String warn = httpReq.getParameter("warn"); + setWarn(warn); + } +} diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/ServletContextConfig.java b/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/ServletContextConfig.java deleted file mode 100644 index 59dbd62e9..000000000 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/ServletContextConfig.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.tomcat.lite.webxml; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; - -/** - * All the data in web.xml, annotations, etc should be represented - * here. This class is serializable. - * - * Public fields to make it easy to access it. - * Naming should match the web.xml element name. - * - * @author Costin Manolache - */ -public class ServletContextConfig implements Serializable { - - private static final long serialVersionUID = 1728492145981883124L; - - public String fileName; - public long timestamp; - - public boolean full; - - public String displayName; - - public HashMap contextParam = new HashMap(); - - public HashMap mimeMapping = new HashMap(); // extension -> mime-type - - public ArrayList listenerClass = new ArrayList(); - - public ArrayList welcomeFileList = new ArrayList(); - - // code -> location - public HashMap errorPageCode= new HashMap(); - - // exception -> location - public HashMap errorPageException= new HashMap(); - - public HashMap localeEncodingMapping= new HashMap(); // locale -> encoding - - // public HashMap tagLibs; // uri->location - // jsp-property-group - - // securityConstraint - public ArrayList securityConstraint = new ArrayList(); - - // loginConfig - public String authMethod; - public String realmName; - public String formLoginPage; - public String formErrorPage; - - public ArrayList securityRole = new ArrayList(); - - // envEntry - public ArrayList envEntry = new ArrayList(); - - // ejbRef - // ejbLocalRef - // serviceRef - // resourceRef - // resourceEnvRef - // message-destination - // message-destinationRef - public HashMap filters = new HashMap(); - public HashMap servlets = new HashMap(); - - public int sessionTimeout; - public boolean distributable; - - public HashMap servletMapping = new HashMap(); // url -> servlet - public ArrayList filterMappings = new ArrayList(); - - - public static class FilterData implements Serializable { - private static final long serialVersionUID = -535820271746973166L; - - public HashMap initParams = new HashMap(); - public String filterClass; - public String filterName; - } - - // Normalized - public static class FilterMappingData implements Serializable { - private static final long serialVersionUID = -4533568066713041994L; - public String filterName; - - // Only one of the 2 - public String urlPattern; - public String servletName; - - // REQUEST, FORWARD, INCLUDE, ERROR, ASYNC - public ArrayList dispatcher = new ArrayList(); - } - - public static class EnvEntryData implements Serializable { - private static final long serialVersionUID = 7023847615343715257L; - public String envEntryName; - public String envEntryType; - public String envEntryValue; - } - - public static class ServletData implements Serializable { - private static final long serialVersionUID = -3216904178501185930L; - - public ServletData() { - } - public ServletData(String servletName, String servletClass) { - this.servletClass = servletClass; - this.servletName = servletName; - } - - public HashMap initParams = new HashMap(); - public String servletName; - public String servletClass; - public String jspFile; - public int loadOnStartup = -1; - public String runAs; - public HashMap securityRoleRef = new HashMap(); // roleName -> [roleLink] - - } - - public static class WebResourceCollectionData implements Serializable { - public String webResourceName; - public ArrayList urlPattern = new ArrayList(); - public ArrayList httpMethod = new ArrayList(); - } - - public static class SecurityConstraintData implements Serializable { - private static final long serialVersionUID = -4780214921810871769L; - - public ArrayList roleName = new ArrayList(); // auth-constraint/role - - public ArrayList webResourceCollection = - new ArrayList(); - public String transportGuarantee; - - } -} \ No newline at end of file diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/TomcatLiteWebXmlConfig.java b/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/TomcatLiteWebXmlConfig.java deleted file mode 100644 index c79fa14ce..000000000 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/TomcatLiteWebXmlConfig.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.tomcat.lite.webxml; - -import javax.servlet.ServletContext; -import javax.servlet.ServletException; - -import org.apache.tomcat.lite.ContextPreinitListener; -import org.apache.tomcat.lite.ServletContextImpl; - -/** - * Default configurator - parse web.xml, init the context. - * - * Will be executed first - if set as the default config addon. - * - * Possible extensions: - * - read from a .ser file instead of web.xml - * - custom code for manual/extra config - * - read from a central repo - * - * @author Costin Manolache - */ -public class TomcatLiteWebXmlConfig implements ContextPreinitListener { - - protected void readWebXml(ServletContextImpl ctx, - String base) throws ServletException { - // TODO: .ser, reloading, etc -// if (contextConfig != null && contextConfig.fileName != null) { -// // TODO: this should move to deploy - if not set, there is no point -// File f = new File(contextConfig.fileName); -// if (f.exists()) { -// if (f.lastModified() > contextConfig.timestamp + 1000) { -// log("Reloading web.xml"); -// contextConfig = null; -// } -// } else { -// log("Old web.xml"); -// contextConfig = null; -// } -// } - if (base != null) { - WebXml webXml = new WebXml(ctx.getContextConfig()); - webXml.readWebXml(base); - } - } - - @Override - public void preInit(ServletContext ctx) { - ServletContextImpl servletContext = - (ServletContextImpl) ctx; - - String base = servletContext.getBasePath(); - if (base == null) { - return; // nothing we can do - } - try { - readWebXml(servletContext, base); - } catch (ServletException e) { - // TODO Auto-generated catch block - throw new RuntimeException(e); - } - } - -} diff --git a/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/WebXml.java b/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/WebXml.java deleted file mode 100644 index 6f4c08a12..000000000 --- a/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/WebXml.java +++ /dev/null @@ -1,388 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.tomcat.lite.webxml; - -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; - -import javax.servlet.ServletException; - -import org.apache.tomcat.lite.webxml.ServletContextConfig.EnvEntryData; -import org.apache.tomcat.lite.webxml.ServletContextConfig.FilterData; -import org.apache.tomcat.lite.webxml.ServletContextConfig.FilterMappingData; -import org.apache.tomcat.lite.webxml.ServletContextConfig.SecurityConstraintData; -import org.apache.tomcat.lite.webxml.ServletContextConfig.ServletData; -import org.apache.tomcat.lite.webxml.ServletContextConfig.WebResourceCollectionData; -import org.apache.tomcat.util.DomUtil; -import org.w3c.dom.Document; -import org.w3c.dom.Node; - -/** - * General-purpose utility to process an web.xml file. Result - * is a tree of objects starting with WebAppData. - * - * TODO: allow writting of web.xml, allow modification ( preserving - * comments ) - * - * @author costin - */ -public class WebXml { - ServletContextConfig d; - - public WebXml(ServletContextConfig cfg) { - d = cfg; - } - - public ServletContextConfig getWebAppData() { - return d; - } - - public void readWebXml(String baseDir) throws ServletException { - try { - File webXmlFile = new File( baseDir + "/WEB-INF/web.xml"); - if (!webXmlFile.exists()) { - return; - } - d.fileName = webXmlFile.getCanonicalPath(); - d.timestamp = webXmlFile.lastModified(); - - FileInputStream fileInputStream = new FileInputStream(webXmlFile); - readWebXml(fileInputStream); - } catch (Exception e) { - e.printStackTrace(); - throw new ServletException(e); - } - } - - public void readWebXml(InputStream fileInputStream) - throws ServletException { - try { - - Document document = DomUtil.readXml(fileInputStream); - Node webappNode = DomUtil.getChild(document, "web-app"); - - String fullS = DomUtil.getAttribute(webappNode, "full"); - if (fullS != null && fullS.equalsIgnoreCase("true")) { - d.full = true; - } - - d.displayName = DomUtil.getAttribute(webappNode, "display-name"); - - // Process each child of web-app - Node confNode = DomUtil.getChild(webappNode, "filter"); - while (confNode != null ) { - processFilter(confNode); - confNode = DomUtil.getNext(confNode); - } - - confNode = DomUtil.getChild(webappNode, "filter-mapping"); - while (confNode != null ) { - processFilterMapping(confNode); - confNode = DomUtil.getNext(confNode); - } - - confNode = DomUtil.getChild(webappNode, "context-param"); - while (confNode != null ) { - String n = DomUtil.getChildContent(confNode, "param-name").trim(); - String v = DomUtil.getChildContent(confNode, "param-value").trim(); - d.contextParam.put(n, v); - confNode = DomUtil.getNext(confNode); - } - - confNode = DomUtil.getChild(webappNode, "mime-mapping"); - while (confNode != null ) { - String n = DomUtil.getChildContent(confNode, "extension"); - String t = DomUtil.getChildContent(confNode, "mime-type"); - d.mimeMapping.put(n, t); - confNode = DomUtil.getNext(confNode); - } - - confNode = DomUtil.getChild(webappNode, "error-page"); - while (confNode != null ) { - processErrorPage(confNode); - confNode = DomUtil.getNext(confNode); - } - - confNode = DomUtil.getChild(webappNode, "jsp-config"); - while (confNode != null ) { - processJspConfig(confNode); - confNode = DomUtil.getNext(confNode); - } - - confNode = DomUtil.getChild(webappNode, "servlet"); - while (confNode != null ) { - processServlet(confNode); - confNode = DomUtil.getNext(confNode); - } - - confNode = DomUtil.getChild(webappNode, "servlet-mapping"); - while (confNode != null ) { - processServletMapping(confNode); - confNode = DomUtil.getNext(confNode); - } - - confNode = DomUtil.getChild(webappNode, "listener"); - while (confNode != null ) { - String lClass = DomUtil.getChildContent(confNode, "listener-class"); - d.listenerClass.add(lClass); - confNode = DomUtil.getNext(confNode); - } - - confNode = DomUtil.getChild(webappNode, "security-constraint"); - while (confNode != null ) { - processSecurityConstraint(confNode); - confNode = DomUtil.getNext(confNode); - } - - confNode = DomUtil.getChild(webappNode, "login-config"); - while (confNode != null ) { - processLoginConfig(confNode); - confNode = DomUtil.getNext(confNode); - if (confNode != null) - throw new ServletException("Multiple login-config"); - } - - confNode = DomUtil.getChild(webappNode, "session-config"); - while (confNode != null ) { - String n = DomUtil.getChildContent(confNode, "session-timeout"); - int stout = Integer.parseInt(n); - d.sessionTimeout = stout; - confNode = DomUtil.getNext(confNode); - if (confNode != null) - throw new ServletException("Multiple session-config"); - } - - confNode = DomUtil.getChild(webappNode, "welcome-file-list"); - while (confNode != null ) { - Node wf = DomUtil.getChild(confNode, "welcome-file"); - while (wf != null) { - String file = DomUtil.getContent(wf); - d.welcomeFileList.add(file); - wf = DomUtil.getNext(wf); - } - // more sections ? - confNode = DomUtil.getNext(confNode); - } - - // Not supported right now - TODO: collect, have jndi plugin - confNode = DomUtil.getChild(webappNode, "env-entry"); - while (confNode != null ) { - processEnvEntry(confNode); - confNode = DomUtil.getNext(confNode); - } - - confNode = DomUtil.getChild(webappNode, "locale-encoding-mapping-list"); - while (confNode != null ) { - confNode = DomUtil.getNext(confNode); - String n = DomUtil.getChildContent(confNode, "locale"); - String t = DomUtil.getChildContent(confNode, "encoding"); - d.localeEncodingMapping.put(n, t); - } - - confNode = DomUtil.getChild(webappNode, "distributable"); - while (confNode != null ) { - d.distributable = true; - confNode = DomUtil.getNext(confNode); - } - - confNode = DomUtil.getChild(confNode, "security-role"); - while (confNode != null ) { - String n = DomUtil.getChildContent(confNode, "role-name"); - d.securityRole.add(n); - confNode = DomUtil.getNext(confNode); - } - - } catch (Exception e) { - e.printStackTrace(); - throw new ServletException(e); - } - } - - private void processJspConfig(Node confNode) { - Node tagLib = DomUtil.getChild(confNode, "taglib"); - while (tagLib != null) { - String uri = DomUtil.getChildContent(tagLib, "taglib-uri"); - String l = DomUtil.getChildContent(tagLib, "taglib-location"); - //d.tagLibs.put(uri, l); - tagLib = DomUtil.getNext(tagLib); - } - - tagLib = DomUtil.getChild(confNode, "jsp-property-group"); - while (tagLib != null) { - // That would be the job of the JSP servlet to process. - tagLib = DomUtil.getNext(tagLib); - } - } - - private void processEnvEntry(Node confNode) { - EnvEntryData ed = new EnvEntryData(); - ed.envEntryName = DomUtil.getChildContent(confNode,"env-entry-name"); - ed.envEntryType = DomUtil.getChildContent(confNode,"env-entry-type"); - ed.envEntryValue = DomUtil.getChildContent(confNode,"env-entry-value"); - d.envEntry.add(ed); - } - - private void processLoginConfig(Node confNode) { - d.authMethod = DomUtil.getChildContent(confNode,"auth-method"); - d.realmName = DomUtil.getChildContent(confNode,"auth-method"); - Node formNode = DomUtil.getChild(confNode, "form-login-config"); - if (formNode != null) { - d.formLoginPage = DomUtil.getChildContent(formNode,"form-login-page"); - d.formErrorPage = DomUtil.getChildContent(formNode,"form-error-page"); - } - } - - private void processSecurityConstraint(Node confNode) { - SecurityConstraintData sd = new SecurityConstraintData(); - Node cn = DomUtil.getChild(confNode, "web-resource-collection"); - while (cn != null) { - WebResourceCollectionData wrd = new WebResourceCollectionData(); - wrd.webResourceName = DomUtil.getChildContent(cn, "web-resource-name"); - Node scn = DomUtil.getChild(cn,"url-pattern"); - while (scn != null) { - wrd.urlPattern.add(DomUtil.getContent(scn)); - scn = DomUtil.getNext(scn); - } - scn = DomUtil.getChild(cn,"http-method"); - while (scn != null) { - wrd.httpMethod.add(DomUtil.getContent(scn)); - scn = DomUtil.getNext(scn); - } - cn = DomUtil.getNext(cn); - sd.webResourceCollection.add(wrd); - } - - d.securityConstraint.add(sd); - } - - private void processErrorPage(Node confNode) { - String name = DomUtil.getChildContent(confNode,"location"); - String c = DomUtil.getChildContent(confNode,"error-code"); - String t = DomUtil.getChildContent(confNode,"exception-type"); - if (c != null) { - d.errorPageCode.put(c, name); - } - if (t != null) { - d.errorPageException.put(t, name); - } - } - - private void processServlet(Node confNode) throws ServletException { - ServletData sd = new ServletData(); - - sd.servletName = DomUtil.getChildContent(confNode,"servlet-name"); - sd.servletClass = DomUtil.getChildContent(confNode,"servlet-class"); - sd.jspFile = DomUtil.getChildContent(confNode,"jsp-file"); - - processInitParams(confNode, sd.initParams); - - d.servlets.put( sd.servletName, sd ); - - String los = DomUtil.getChildContent(confNode, "load-on-startup"); - if (los != null ) { - sd.loadOnStartup = Integer.parseInt(los); - } - - Node sn = DomUtil.getChild(confNode, "security-role-ref"); - while (sn != null ) { - String roleName = DomUtil.getChildContent(sn, "role-name"); - String roleLink = DomUtil.getChildContent(sn, "role-link"); - if (roleLink == null) { - sd.securityRoleRef.put(roleName, ""); - } else { - sd.securityRoleRef.put(roleName, roleLink); - } - sn = DomUtil.getNext(sn); - } - } - - private void processInitParams(Node confNode, HashMap initParams) { - Node initN = DomUtil.getChild(confNode, "init-param"); - while (initN != null ) { - String n = DomUtil.getChildContent(initN, "param-name"); - String v = DomUtil.getChildContent(initN, "param-value"); - initParams.put(n, v); - initN = DomUtil.getNext(initN); - } - } - - private void processServletMapping(Node confNode) { - String name = DomUtil.getChildContent(confNode,"servlet-name"); - Node dataN = DomUtil.getChild(confNode, "url-pattern"); - while (dataN != null) { - String path = DomUtil.getContent(dataN).trim(); - dataN = DomUtil.getNext(dataN); - - if (! (path.startsWith("/") || path.startsWith("*"))) { - // backward compat - path = "/" + path; - } - d.servletMapping.put(path, name); - } - } - - private void processFilterMapping(Node confNode) { - String filterName = DomUtil.getChildContent(confNode,"filter-name"); - // multiple - ArrayList dispatchers = new ArrayList(); - Node dataN = DomUtil.getChild(confNode, "dispatcher"); - while (dataN != null ) { - String d = DomUtil.getContent(dataN); - dispatchers.add(d); - dataN = DomUtil.getNext(dataN); - } - - // Multiple url-pattern and servlet-name in one - // mapping rule. Need to be applied in order. - dataN = DomUtil.getChild(confNode, "url-pattern"); - while (dataN != null ) { - FilterMappingData fm = new FilterMappingData(); - fm.filterName = filterName; - fm.dispatcher = dispatchers; - String path = DomUtil.getContent(dataN); - dataN = DomUtil.getNext(dataN); - fm.urlPattern = path; - d.filterMappings.add(fm); - } - dataN = DomUtil.getChild(confNode, "servlet-name"); - while (dataN != null ) { - FilterMappingData fm = new FilterMappingData(); - fm.filterName = filterName; - fm.dispatcher = dispatchers; - String sn = DomUtil.getContent(dataN); - dataN = DomUtil.getNext(dataN); - fm.servletName = sn; - d.filterMappings.add(fm); - } - } - - private void processFilter(Node confNode) { - String name = DomUtil.getChildContent(confNode,"filter-name"); - String sclass = DomUtil.getChildContent(confNode,"filter-class"); - - FilterData fd = new FilterData(); - processInitParams(confNode, fd.initParams); - fd.filterName = name; - fd.filterClass = sclass; - d.filters.put(name, fd); - } - -} -- 2.11.0