You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2014/05/15 21:32:21 UTC

svn commit: r1595019 - in /tomee/tomee/trunk/tomee: tomee-catalina/src/main/java/org/apache/tomee/catalina/ tomee-catalina/src/main/java/org/apache/tomee/catalina/environment/ tomee-embedded/src/main/java/org/apache/tomee/embedded/ tomee-jaxrs/src/main...

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) {