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/11/19 13:22:29 UTC

tomee git commit: TOMEE-1449 support same app on multiple hosts

Repository: tomee
Updated Branches:
  refs/heads/develop aa59ad798 -> 4ff45bf73


TOMEE-1449 support same app on multiple hosts


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/4ff45bf7
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/4ff45bf7
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/4ff45bf7

Branch: refs/heads/develop
Commit: 4ff45bf73ade4f561c347f8923035352d80cacab
Parents: aa59ad7
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Wed Nov 19 13:21:40 2014 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Wed Nov 19 13:21:40 2014 +0100

----------------------------------------------------------------------
 .../apache/openejb/config/AppInfoBuilder.java   |  2 +-
 .../org/apache/openejb/config/AppModule.java    | 23 ++++++++++++
 .../org/apache/openejb/config/AutoConfig.java   |  2 +-
 .../openejb/config/InitEjbDeployments.java      | 27 ++++++++++++++
 .../openejb/core/CoreContainerSystem.java       | 37 +++++++++++++++++---
 .../org/apache/openejb/spi/ContainerSystem.java |  3 ++
 .../apache/openejb/server/rest/RESTService.java | 14 ++++++--
 .../openejb/server/webservices/WsService.java   |  2 +-
 .../tomee/catalina/TomcatJndiBuilder.java       | 11 +++---
 .../tomee/webservices/TomcatRsRegistry.java     |  4 ++-
 10 files changed, 110 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/4ff45bf7/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java b/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
index be0657b..032cff3 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
@@ -640,7 +640,7 @@ class AppInfoBuilder {
             final Persistence persistence = persistenceModule.getPersistence();
             for (final PersistenceUnit persistenceUnit : persistence.getPersistenceUnit()) {
                 final PersistenceUnitInfo info = new PersistenceUnitInfo();
-                info.id = persistenceUnit.getName() + " " + rootUrl.hashCode();
+                info.id = appModule.persistenceUnitId(rootUrl, persistenceUnit.getName());
                 info.name = persistenceUnit.getName();
                 info.watchedResources.addAll(persistenceModule.getWatchedResources());
                 info.persistenceUnitRootUrl = rootUrl;

http://git-wip-us.apache.org/repos/asf/tomee/blob/4ff45bf7/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java b/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java
index c11f6ec..7d71a80 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java
@@ -79,6 +79,29 @@ public class AppModule implements DeploymentModule {
         this(classLoader, jarLocation, null, false);
     }
 
+    // shared between org.apache.openejb.config.AutoConfig.resolvePersistenceRefs() and org.apache.openejb.config.AppInfoBuilder.buildPersistenceModules()
+    public String persistenceUnitId(final String rootUrl, final String name) {
+        return name + " " + rootUrl.hashCode() + uniqueHostIfExists();
+    }
+
+    public String uniqueHostIfExists() {
+        final boolean hasWebApps = !getWebModules().isEmpty();
+        if (isWebapp() && hasWebApps) {
+            return getWebModules().iterator().next().getHost();
+        } else if (hasWebApps) {
+            String id = null;
+            for (final WebModule web : getWebModules()) {
+                if (id == null) {
+                    id = web.getHost();
+                } else if (!id.equals(web.getHost())) {
+                    return ""; // find something better as in org.apache.openejb.config.InitEjbDeployments
+                }
+            }
+            return id;
+        }
+        return "";
+    }
+
     public <T extends DeploymentModule> AppModule(final T... modules) {
         final T firstModule = modules[0];
 

http://git-wip-us.apache.org/repos/asf/tomee/blob/4ff45bf7/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java b/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
index bd58150..33064f0 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
@@ -215,7 +215,7 @@ public class AutoConfig implements DynamicDeployer, JndiConstants {
         for (final PersistenceModule module : appModule.getPersistenceModules()) {
             final String rootUrl = module.getRootUrl();
             for (final PersistenceUnit unit : module.getPersistence().getPersistenceUnit()) {
-                unit.setId(unit.getName() + " " + rootUrl.hashCode());
+                unit.setId(appModule.persistenceUnitId(rootUrl, unit.getName()));
                 persistenceUnits.add(rootUrl, unit.getName(), unit);
             }
         }

http://git-wip-us.apache.org/repos/asf/tomee/blob/4ff45bf7/container/openejb-core/src/main/java/org/apache/openejb/config/InitEjbDeployments.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/InitEjbDeployments.java b/container/openejb-core/src/main/java/org/apache/openejb/config/InitEjbDeployments.java
index c1f8ee3..1437928 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/config/InitEjbDeployments.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/config/InitEjbDeployments.java
@@ -30,8 +30,10 @@ import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.Messages;
 import org.apache.openejb.util.StringTemplate;
 
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -67,6 +69,8 @@ public class InitEjbDeployments implements DynamicDeployer {
         contextData.put("appId", appModule.getModuleId());
 
         for (final EjbModule ejbModule : appModule.getEjbModules()) {
+            contextData.put("host", ejbModule.isWebapp() ? findHost(ejbModule.getModuleId(), appModule.getWebModules()) : appModule.uniqueHostIfExists());
+            contextData.put("hash", Integer.toString(ejbModule.hashCode()));
             contextData.put("ejbJarId", ejbModule.getModuleId());
             deploy(ejbModule, contextData, abstractSchemaNames);
         }
@@ -74,6 +78,29 @@ public class InitEjbDeployments implements DynamicDeployer {
         return appModule;
     }
 
+    private String findCommonHost(final Collection<WebModule> webModules) {
+        String host = null;
+        for (final WebModule w: webModules) {
+            final String wHost = w.getHost();
+            if (host == null) {
+                host = wHost;
+            } else if (!host.equals(wHost)) {
+                return "lib"; // surely better to do
+            }
+        }
+        return host != null ? host : "localhost";
+    }
+
+    private String findHost(final String id, final Collection<WebModule> webModules) {
+        for (final WebModule w: webModules) {
+            if (w.getModuleId().equals(id)) {
+                final String host = w.getHost();
+                return host != null ? host : "localhost";
+            }
+        }
+        return "localhost";
+    }
+
     public EjbModule deploy(final EjbModule ejbModule) throws OpenEJBException {
         return deploy(ejbModule, new HashMap<String, String>(), new HashSet<String>());
     }

http://git-wip-us.apache.org/repos/asf/tomee/blob/4ff45bf7/container/openejb-core/src/main/java/org/apache/openejb/core/CoreContainerSystem.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/CoreContainerSystem.java b/container/openejb-core/src/main/java/org/apache/openejb/core/CoreContainerSystem.java
index ac59ffa..3b41a3f 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/CoreContainerSystem.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/CoreContainerSystem.java
@@ -27,6 +27,7 @@ import org.apache.openejb.spi.ContainerSystem;
 import javax.naming.Context;
 import javax.naming.NamingException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -39,7 +40,7 @@ public class CoreContainerSystem implements ContainerSystem {
     private final Map<Object, AppContext> apps = new ConcurrentHashMap<Object, AppContext>();
     private final Map<Object, BeanContext> deployments = new ConcurrentHashMap<Object, BeanContext>();
     private final Map<Object, Container> containers = new ConcurrentHashMap<Object, Container>();
-    private final Map<String, WebContext> webDeployments = new ConcurrentHashMap<String, WebContext>();
+    private final Map<String, List<WebContext>> webDeployments = new ConcurrentHashMap<String, List<WebContext>>();
     private final Context jndiContext;
 
     /**
@@ -116,16 +117,44 @@ public class CoreContainerSystem implements ContainerSystem {
     }
 
     @Override
+    public WebContext getWebContextByHost(final String id, final String host) {
+        final List<WebContext> webContexts = webDeployments.get(id);
+        if (webContexts == null || webContexts.isEmpty()) {
+            return null;
+        }
+        if (webContexts.size() == 1 && webContexts.get(0).getHost() == null) {
+            return webContexts.get(0);
+        }
+        for (final WebContext web : webContexts) {
+            if (web.getHost() != null && web.getHost().equals(host)) {
+                return web;
+            }
+        }
+        return null;
+    }
+
+    @Override
     public WebContext getWebContext(final String id) {
-        return webDeployments.get(id);
+        final List<WebContext> webContexts = webDeployments.get(id);
+        return webContexts != null && !webContexts.isEmpty() ? webContexts.get(0) : null;
     }
 
     public WebContext[] WebDeployments() {
-        return webDeployments.values().toArray(new WebContext[webDeployments.size()]);
+        final Collection<WebContext> all = new ArrayList<>(webDeployments.size());
+        for (final Collection<WebContext> list : webDeployments.values()) {
+            all.addAll(list);
+        }
+        return all.toArray(new WebContext[all.size()]);
     }
 
     public void addWebContext(final WebContext webDeployment) {
-        this.webDeployments.put(webDeployment.getId(), webDeployment);
+        final String id = webDeployment.getId();
+        List<WebContext> list = this.webDeployments.get(id);
+        if (list == null) {
+            list = new ArrayList<WebContext>();
+            this.webDeployments.put(id, list);
+        }
+        list.add(webDeployment);
     }
 
     public void removeWebContext(final WebContext info) {

http://git-wip-us.apache.org/repos/asf/tomee/blob/4ff45bf7/container/openejb-core/src/main/java/org/apache/openejb/spi/ContainerSystem.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/spi/ContainerSystem.java b/container/openejb-core/src/main/java/org/apache/openejb/spi/ContainerSystem.java
index 9acf4ea..e9bea6f 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/spi/ContainerSystem.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/spi/ContainerSystem.java
@@ -35,6 +35,9 @@ public interface ContainerSystem {
 
     Container[] containers();
 
+    WebContext getWebContextByHost(String id, String host);
+
+    @Deprecated // user getWebContextByHost
     WebContext getWebContext(String id);
 
     Context getJNDIContext();

http://git-wip-us.apache.org/repos/asf/tomee/blob/4ff45bf7/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
----------------------------------------------------------------------
diff --git a/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java b/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
index c1cfe47..da6bcb8 100644
--- a/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
+++ b/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
@@ -100,7 +100,7 @@ public abstract class RESTService implements ServerService, SelfManaging {
     private final String wildcard = SystemInstance.get().getProperty("openejb.rest.wildcard", ".*"); // embedded = regex, tomee = servlet
 
     public void afterApplicationCreated(final AppInfo appInfo, final WebAppInfo webApp) {
-        final WebContext webContext = containerSystem.getWebContext(webApp.moduleId);
+        final WebContext webContext = containerSystem.getWebContextByHost(webApp.moduleId, webApp.host != null ? webApp.host : virtualHost);
         if (webContext == null) {
             return;
         }
@@ -457,7 +457,8 @@ public abstract class RESTService implements ServerService, SelfManaging {
         }
 
         final RsHttpListener listener = createHttpListener();
-        final RsRegistry.AddressInfo address = rsRegistry.createRsHttpListener(contextRoot, listener, classLoader, nopath.substring(NOPATH_PREFIX.length() - 1), virtualHost, auth, realm);
+        final String host = findHost(contextRoot, appInfo.webApps);
+        final RsRegistry.AddressInfo address = rsRegistry.createRsHttpListener(contextRoot, listener, classLoader, nopath.substring(NOPATH_PREFIX.length() - 1), host, auth, realm);
 
         services.add(new DeployedService(address.complete, contextRoot, application.getClass().getName()));
         listener.deployApplication(application, address.complete.substring(0, address.complete.length() - wildcard.length()), nopath.substring(NOPATH_PREFIX.length(), nopath.length() - wildcard.length()), additionalProviders, restEjbs, // app config
@@ -465,6 +466,15 @@ public abstract class RESTService implements ServerService, SelfManaging {
             new ServiceConfiguration(configuration, appInfo.services)); // deployment config
     }
 
+    private String findHost(final String context, final Collection<WebAppInfo> webs) {
+        for (final WebAppInfo web : webs) {
+            if (context.equals(web.contextRoot)) {
+                return web.host != null ? web.host : virtualHost;
+            }
+        }
+        return virtualHost;
+    }
+
     private static String appPrefix(final WebAppInfo info, final Class<?> appClazz) {
         StringBuilder builder = null;
 

http://git-wip-us.apache.org/repos/asf/tomee/blob/4ff45bf7/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
----------------------------------------------------------------------
diff --git a/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java b/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
index ba0a571..4aab10d 100644
--- a/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
+++ b/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
@@ -346,7 +346,7 @@ public abstract class WsService implements ServerService, SelfManaging {
     }
 
     public void afterApplicationCreated(final AppInfo appInfo, final WebAppInfo webApp) {
-        final WebContext webContext = containerSystem.getWebContext(webApp.moduleId);
+        final WebContext webContext = containerSystem.getWebContextByHost(webApp.moduleId, webApp.host != null ? webApp.host : virtualHost);
         if (webContext == null)
             return;
 

http://git-wip-us.apache.org/repos/asf/tomee/blob/4ff45bf7/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java
index 3c360b4..8baa4e4 100644
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java
+++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java
@@ -164,9 +164,10 @@ public class TomcatJndiBuilder {
         }
 
         // classical deployment - needed because can be overriden through META-INF/context.xml
+        final String hostname = org.apache.tomee.catalina.Contexts.getHostname(standardContext);
         String path = standardContext.findParameter(TomcatWebAppBuilder.OPENEJB_WEBAPP_MODULE_ID);
         if (path == null) { // standardContext not created by OpenEJB
-            path = org.apache.tomee.catalina.Contexts.getHostname(standardContext);
+            path = hostname;
             if (standardContext.getPath().startsWith("/")) {
                 path += standardContext.getPath();
             } else {
@@ -174,11 +175,11 @@ public class TomcatJndiBuilder {
             }
         }
 
-        WebContext webContext = cs.getWebContext(path);
+        WebContext webContext = cs.getWebContextByHost(path, hostname);
         if (webContext == null) { // tomee-embedded deployment
-            webContext = cs.getWebContext(standardContext.getPath().replaceFirst("/", ""));
+            webContext = cs.getWebContextByHost(standardContext.getPath().replaceFirst("/", ""), hostname);
             if (webContext == null) {
-                webContext = cs.getWebContext(standardContext.getPath());
+                webContext = cs.getWebContextByHost(standardContext.getPath(), hostname);
             }
         }
 
@@ -189,7 +190,7 @@ public class TomcatJndiBuilder {
             if (webContext == null && contextInfo != null && contextInfo.appInfo != null) { // can happen if deployed from apps/
                 for (final WebAppInfo webAppInfo : contextInfo.appInfo.webApps) {
                     if (webAppInfo.path != null && webAppInfo.path.replace(File.separatorChar, '/').equals(standardContext.getDocBase())) {
-                        webContext = cs.getWebContext(webAppInfo.moduleId);
+                        webContext = cs.getWebContextByHost(webAppInfo.moduleId, hostname);
                         if (webContext != null) {
                             break;
                         }

http://git-wip-us.apache.org/repos/asf/tomee/blob/4ff45bf7/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomcatRsRegistry.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomcatRsRegistry.java b/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomcatRsRegistry.java
index 3b09bab..774c270 100644
--- a/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomcatRsRegistry.java
+++ b/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomcatRsRegistry.java
@@ -147,13 +147,15 @@ public class TomcatRsRegistry implements RsRegistry {
         if (webContext == null) {
             return completePath;
         }
-        return completePath.substring(webContext.length());
+        return completePath.substring((webContext.length() > 0 && !webContext.startsWith("/") ? 1 : 0) + webContext.length());
     }
 
     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(""));
+        } else if (webapp == null && webContext.length() > 0 && !webContext.startsWith("/")) {
+            webapp = Context.class.cast(host.findChild("/" + webContext));
         }
         return webapp;
     }