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


Reply via email to