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