Author: rmannibucau Date: Thu May 15 19:32:20 2014 New Revision: 1595019 URL: http://svn.apache.org/r1595019 Log: little refactoring to share tomcat hosts and select webapp checking classloader too, side note: jaxrs services is started too early to allow to get Server in components :(
Added: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/environment/ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/environment/Hosts.java Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java tomee/tomee/trunk/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomcatRsRegistry.java tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomcatHelper.java Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1595019&r1=1595018&r2=1595019&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java Thu May 15 19:32:20 2014 @@ -114,6 +114,7 @@ import org.apache.tomcat.InstanceManager import org.apache.tomcat.util.digester.Digester; import org.apache.tomee.catalina.cluster.ClusterObserver; import org.apache.tomee.catalina.cluster.TomEEClusterListener; +import org.apache.tomee.catalina.environment.Hosts; import org.apache.tomee.catalina.event.AfterApplicationCreated; import org.apache.tomee.catalina.routing.RouterValve; import org.apache.tomee.catalina.websocket.JavaEEDefaultServerEnpointConfigurator; @@ -228,7 +229,7 @@ public class TomcatWebAppBuilder impleme */ //Key is the host name private final Map<String, HostConfig> deployers = new TreeMap<String, HostConfig>(); - private final Map<String, Host> hosts = new TreeMap<String, Host>(); + private final Hosts hosts; /** * Deployed web applications */ @@ -253,8 +254,6 @@ public class TomcatWebAppBuilder impleme private Class<?> sessionManagerClass = null; - private String defaultHost = "localhost"; - private Set<CatalinaCluster> clusters = new HashSet<CatalinaCluster>(); private ClassLoader parentClassLoader; @@ -280,6 +279,8 @@ public class TomcatWebAppBuilder impleme // could search mbeans //Getting host config listeners + hosts = new Hosts(); + SystemInstance.get().setComponent(Hosts.class, hosts); for (final Service service : standardServer.findServices()) { if (service.getContainer() instanceof Engine) { final Engine engine = (Engine) service.getContainer(); @@ -295,7 +296,7 @@ public class TomcatWebAppBuilder impleme parentClassLoader = engine.getParentClassLoader(); manageCluster(engine.getCluster()); - defaultHost = engine.getDefaultHost(); + hosts.setDefault(engine.getDefaultHost()); addTomEERealm(engine); for (final Container engineChild : engine.findChildren()) { @@ -303,7 +304,7 @@ public class TomcatWebAppBuilder impleme final StandardHost host = (StandardHost) engineChild; manageCluster(host.getCluster()); addTomEERealm(host); - hosts.put(host.getName(), host); + hosts.add(host); for (final LifecycleListener listener : host.findLifecycleListeners()) { if (listener instanceof HostConfig) { final HostConfig hostConfig = (HostConfig) listener; @@ -508,7 +509,7 @@ public class TomcatWebAppBuilder impleme } } } else { - final Host host = hosts.get(defaultHost); + final Host host = hosts.getDefault(); if (StandardHost.class.isInstance(host)) { try { standardContext = StandardContext.class.cast(ParentClassLoaderFinder.Helper.get().loadClass(StandardHost.class.cast(host).getContextClass()).newInstance()); @@ -591,7 +592,7 @@ public class TomcatWebAppBuilder impleme String host = webApp.host; if (host == null) { - host = defaultHost; + host = hosts.getDefaultHost(); logger.info("using default host: " + host); } @@ -620,15 +621,17 @@ public class TomcatWebAppBuilder impleme } deployer.manageApp(standardContext); - } else if (hosts.containsKey(host)) { + } else { final Host theHost = hosts.get(host); - if (info != null) { - final ContextInfo contextInfo = addContextInfo(host, standardContext); - contextInfo.appInfo = info; - contextInfo.host = theHost; - } + if (theHost != null) { + if (info != null) { + final ContextInfo contextInfo = addContextInfo(host, standardContext); + contextInfo.appInfo = info; + contextInfo.host = theHost; + } - theHost.addChild(standardContext); + theHost.addChild(standardContext); + } } } @@ -781,7 +784,7 @@ public class TomcatWebAppBuilder impleme // just adding a carriage return to get logs more readable logger.info("------------------------- " - + Contexts.getHostname(standardContext).replace("_", defaultHost) + " -> " + + Contexts.getHostname(standardContext).replace("_", hosts.getDefaultHost()) + " -> " + finalName(standardContext.getPath())); if (FORCE_RELOADABLE && getContextInfo(standardContext) == null) { // don't do it for ears @@ -2222,7 +2225,7 @@ public class TomcatWebAppBuilder impleme if (host != null) { return host + contextRoot; } - return defaultHost + contextRoot; + return hosts.getDefaultHost() + contextRoot; } /** @@ -2248,7 +2251,7 @@ public class TomcatWebAppBuilder impleme private synchronized ContextInfo getContextInfo(final String webAppHost, final String webAppContextRoot) { String host = webAppHost; if (host == null) { - host = defaultHost; + host = hosts.getDefaultHost(); } final String id = getId(host, webAppContextRoot); Added: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/environment/Hosts.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/environment/Hosts.java?rev=1595019&view=auto ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/environment/Hosts.java (added) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/environment/Hosts.java Thu May 15 19:32:20 2014 @@ -0,0 +1,58 @@ +/** + * 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.tomee.catalina.environment; + +import org.apache.catalina.Host; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Map; +import java.util.TreeMap; + +public class Hosts implements Iterable<Host> { + private final Map<String, Host> hosts = new TreeMap<String, Host>(); + private String defaultHost = "localhost"; + + public void add(final Host host) { + hosts.put(host.getName(), host); + } + + public Map<String, Host> all() { + return hosts; + } + + public Host get(final String name) { + return hosts.get(name); + } + + public void setDefault(final String aDefault) { + this.defaultHost = aDefault; + } + + public String getDefaultHost() { + return defaultHost; + } + + public Host getDefault() { + return hosts.get(defaultHost); + } + + @Override + public Iterator<Host> iterator() { + return new ArrayList<Host>(hosts.values()).iterator(); + } +} Modified: tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java?rev=1595019&r1=1595018&r2=1595019&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java (original) +++ tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java Thu May 15 19:32:20 2014 @@ -288,6 +288,7 @@ public class Container { initProps.putAll(properties); SystemInstance.init(initProps); SystemInstance.get().setComponent(StandardServer.class, (StandardServer) tomcat.getServer()); + SystemInstance.get().setComponent(Server.class, tomcat.getServer()); // needed again cause of init() loader.initialize(properties); Modified: tomee/tomee/trunk/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomcatRsRegistry.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomcatRsRegistry.java?rev=1595019&r1=1595018&r2=1595019&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomcatRsRegistry.java (original) +++ tomee/tomee/trunk/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomcatRsRegistry.java Thu May 15 19:32:20 2014 @@ -19,17 +19,18 @@ package org.apache.tomee.webservices; import org.apache.catalina.Container; import org.apache.catalina.Context; import org.apache.catalina.Engine; +import org.apache.catalina.Host; import org.apache.catalina.Service; import org.apache.catalina.Wrapper; import org.apache.catalina.connector.Connector; -import org.apache.catalina.core.StandardHost; -import org.apache.catalina.core.StandardServer; +import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.server.httpd.HttpListener; import org.apache.openejb.server.httpd.util.HttpUtil; import org.apache.openejb.server.rest.RsRegistry; import org.apache.openejb.server.rest.RsServlet; import org.apache.openejb.util.LogCategory; import org.apache.openejb.util.Logger; +import org.apache.tomee.catalina.environment.Hosts; import org.apache.tomee.loader.TomcatHelper; import java.net.URI; @@ -42,20 +43,19 @@ import java.util.TreeMap; public class TomcatRsRegistry implements RsRegistry { private static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB_STARTUP, TomcatRsRegistry.class); + private final Hosts hosts; - private Engine engine; private List<Connector> connectors; private final Map<String, HttpListener> listeners = new TreeMap<String, HttpListener>(); public TomcatRsRegistry() { - StandardServer standardServer = TomcatHelper.getServer(); - for (Service service : standardServer.findServices()) { + for (final Service service : TomcatHelper.getServer().findServices()) { if (service.getContainer() instanceof Engine) { connectors = Arrays.asList(service.findConnectors()); - engine = (Engine) service.getContainer(); break; } } + hosts = SystemInstance.get().getComponent(Hosts.class); } @Override @@ -69,47 +69,37 @@ public class TomcatRsRegistry implements } // find the existing host (we do not auto-create hosts) - if (virtualHost == null) virtualHost = engine.getDefaultHost(); - Container host = null; Context context = null; - - // first try to find a host with the given webContext - for (Container container : engine.findChildren()) { - if (container instanceof StandardHost) { - final StandardHost standardHost = (StandardHost) container; - final Context c = ((Context) standardHost.findChild(webContext)); - if (c != null) { - host = standardHost; - context = c; - break; - } - } + if (virtualHost == null) { + host = hosts.getDefault(); + } else { + host = hosts.get(virtualHost); } - // else try to get the default host or the provided virtualhost if (host == null) { - host = engine.findChild(virtualHost); - } - - if (host == null) { - throw new IllegalArgumentException("Invalid virtual host '" + virtualHost + "'. Do you have a matching Host entry in the server.xml?"); - } - - // get the webapp context from the default host - if (context == null) { - context = (Context) host.findChild(webContext); - } + for (final Host h : hosts) { + context = findContext(h, webContext); + if (context != null) { + host = h; + if (classLoader != null && classLoader.equals(context.getLoader().getClassLoader())) { + break; + } // else try next to find something better + } + } - if (context == null && "/".equals(webContext)) { // ROOT - context = (Context) host.findChild(""); + if (host == null) { + throw new IllegalArgumentException("Invalid virtual host '" + virtualHost + "'. Do you have a matching Host entry in the server.xml?"); + } + } else { + context = findContext(host, webContext); } if (context == null) { throw new IllegalStateException("Invalid context '" + webContext + "'. Cannot find context in host " + host.getName()); } - Wrapper wrapper = context.createWrapper(); + final Wrapper wrapper = context.createWrapper(); final String name = "rest_" + listener.hashCode(); wrapper.setName(name); wrapper.setServletClass(RsServlet.class.getName()); @@ -138,6 +128,14 @@ public class TomcatRsRegistry implements return new AddressInfo(path, key); } + private static Context findContext(final Container host, final String webContext) { + Context webapp = Context.class.cast(host.findChild(webContext)); + if (webapp == null && "/".equals(webContext)) { // ROOT + webapp = Context.class.cast(host.findChild("")); + } + return webapp; + } + private static String removeWebContext(final String webContext, final String completePath) { if (webContext == null) { return completePath; Modified: tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomcatHelper.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomcatHelper.java?rev=1595019&r1=1595018&r2=1595019&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomcatHelper.java (original) +++ tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomcatHelper.java Thu May 15 19:32:20 2014 @@ -19,9 +19,11 @@ package org.apache.tomee.loader; import org.apache.catalina.Context; import org.apache.catalina.Realm; +import org.apache.catalina.Server; import org.apache.catalina.Wrapper; import org.apache.catalina.core.StandardContext; import org.apache.catalina.core.StandardServer; +import org.apache.openejb.loader.SystemInstance; import javax.management.MBeanServer; import javax.management.ObjectName; @@ -40,6 +42,7 @@ public class TomcatHelper { public static void setServer(StandardServer server) { TomcatHelper.server = server; + SystemInstance.get().setComponent(Server.class, server); } public static void setStopping(boolean stopping) {