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 2016/07/21 14:40:30 UTC
tomee git commit: TOMEE-1545 taking into account appId for parallel
deployments for jaxrs apps
Repository: tomee
Updated Branches:
refs/heads/master 14e895bd2 -> 6c3a16d5c
TOMEE-1545 taking into account appId for parallel deployments for jaxrs apps
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/6c3a16d5
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/6c3a16d5
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/6c3a16d5
Branch: refs/heads/master
Commit: 6c3a16d5c6eda40a7cf4284b36de94cd59bebaf7
Parents: 14e895b
Author: Romain manni-Bucau <rm...@gmail.com>
Authored: Thu Jul 21 16:40:17 2016 +0200
Committer: Romain manni-Bucau <rm...@gmail.com>
Committed: Thu Jul 21 16:40:17 2016 +0200
----------------------------------------------------------------------
.../apache/openejb/server/rest/RESTService.java | 58 +++++++++++---------
.../apache/openejb/server/rest/RsRegistry.java | 2 +-
.../openejb/server/rest/RsRegistryImpl.java | 2 +-
.../tomee/webservices/TomcatRsRegistry.java | 56 +++++++++++++++++--
4 files changed, 83 insertions(+), 35 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/6c3a16d5/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 bcacd75..08ca23b 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
@@ -156,7 +156,7 @@ public abstract class RESTService implements ServerService, SelfManaging {
}
application = "true".equalsIgnoreCase(appInfo.properties.getProperty("openejb.cxf-rs.cache-application", "true"))
- ? new InternalApplication(application) /* caches singletons and classes */ : application;
+ ? new InternalApplication(application) /* caches singletons and classes */ : application;
final Set<Class<?>> classes = new HashSet<>(application.getClasses());
final Set<Object> singletons = application.getSingletons();
@@ -376,7 +376,7 @@ public abstract class RESTService implements ServerService, SelfManaging {
} else {
pojoConfigurations = PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp);
deploySingleton(appInfo.appId, webApp.contextRoot, appPrefix, o, appInstance, classLoader, additionalProviders,
- new ServiceConfiguration(PojoUtil.findConfiguration(pojoConfigurations, o.getClass().getName()), appInfo.services));
+ new ServiceConfiguration(PojoUtil.findConfiguration(pojoConfigurations, o.getClass().getName()), appInfo.services));
}
}
@@ -390,7 +390,7 @@ public abstract class RESTService implements ServerService, SelfManaging {
} else {
pojoConfigurations = PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp);
deployPojo(appInfo.appId, webApp.contextRoot, appPrefix, clazz, appInstance, classLoader, injections, context, owbCtx, additionalProviders,
- new ServiceConfiguration(PojoUtil.findConfiguration(pojoConfigurations, clazz.getName()), appInfo.services));
+ new ServiceConfiguration(PojoUtil.findConfiguration(pojoConfigurations, clazz.getName()), appInfo.services));
}
}
@@ -413,15 +413,15 @@ public abstract class RESTService implements ServerService, SelfManaging {
deployEJB(appInfo.appId, webApp.contextRoot, appPrefix, restEjbs.get(clazz).context, additionalProviders, appInfo.services);
} else {
deployPojo(appInfo.appId, webApp.contextRoot, appPrefix, ctx.getBeanClass(), null, ctx.getClassLoader(), ctx.getInjections(), context,
- owbCtx, additionalProviders, new ServiceConfiguration(ctx.getProperties(), appInfo.services));
+ owbCtx, additionalProviders, new ServiceConfiguration(ctx.getProperties(), appInfo.services));
}
} else {
try {
final Class<?> loadedClazz = classLoader.loadClass(clazz);
pojoConfigurations = PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp);
deployPojo(appInfo.appId, webApp.contextRoot, appPrefix, loadedClazz, null, classLoader, injections, context, owbCtx,
- additionalProviders,
- new ServiceConfiguration(PojoUtil.findConfiguration(pojoConfigurations, loadedClazz.getName()), appInfo.services));
+ additionalProviders,
+ new ServiceConfiguration(PojoUtil.findConfiguration(pojoConfigurations, loadedClazz.getName()), appInfo.services));
} catch (final ClassNotFoundException e) {
throw new OpenEJBRestRuntimeException("can't find class " + clazz, e);
}
@@ -467,10 +467,10 @@ public abstract class RESTService implements ServerService, SelfManaging {
final String host = findHost(contextRoot, appInfo.webApps);
final RsRegistry.AddressInfo address = rsRegistry.createRsHttpListener(appInfo.appId, contextRoot, listener, classLoader, nopath.substring(NOPATH_PREFIX.length() - 1), host, auth, realm);
- services.add(new DeployedService(address.complete, contextRoot, application.getClass().getName()));
+ services.add(new DeployedService(address.complete, contextRoot, application.getClass().getName(), appInfo.appId));
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
- classLoader, injections, context, owbCtx, // injection/webapp context
- new ServiceConfiguration(configuration, appInfo.services)); // deployment config
+ classLoader, injections, context, owbCtx, // injection/webapp context
+ new ServiceConfiguration(configuration, appInfo.services)); // deployment config
}
private String findHost(final String context, final Collection<WebAppInfo> webs) {
@@ -637,16 +637,16 @@ public abstract class RESTService implements ServerService, SelfManaging {
}
deployApplication(appInfo, next.getValue().path, restEjbs, comp.getClassLoader(), comp.getInjections(),
- containerSystem.getAppContext(appInfo.appId).getWebBeansContext(), comp.getJndiContext(),
- providers, pojoConfigurations, application, wildcard);
+ containerSystem.getAppContext(appInfo.appId).getWebBeansContext(), comp.getJndiContext(),
+ providers, pojoConfigurations, application, wildcard);
} else {
for (final Map.Entry<String, EJBRestServiceInfo> ejb : restEjbs.entrySet()) {
final BeanContext ctx = ejb.getValue().context;
if (BeanType.MANAGED.equals(ctx.getComponentType())) {
deployPojo(appInfo.appId, "", ejb.getValue().path, ctx.getBeanClass(), null, ctx.getClassLoader(), ctx.getInjections(),
- ctx.getJndiContext(),
- containerSystem.getAppContext(appInfo.appId).getWebBeansContext(),
- providers, new ServiceConfiguration(ctx.getProperties(), appInfo.services));
+ ctx.getJndiContext(),
+ containerSystem.getAppContext(appInfo.appId).getWebBeansContext(),
+ providers, new ServiceConfiguration(ctx.getProperties(), appInfo.services));
} else {
deployEJB(appInfo.appId, "", ejb.getValue().path, ctx, providers, appInfo.services);
}
@@ -742,7 +742,7 @@ public abstract class RESTService implements ServerService, SelfManaging {
final RsHttpListener listener = createHttpListener();
final RsRegistry.AddressInfo address = rsRegistry.createRsHttpListener(appId, web, listener, classLoader, nopath.substring(NOPATH_PREFIX.length() - 1), virtualHost, auth, realm);
- services.add(new DeployedService(address.complete, web, o.getClass().getName()));
+ services.add(new DeployedService(address.complete, web, o.getClass().getName(), appId));
listener.deploySingleton(contextRoot, getFullContext(address.base, contextRoot), o, appInstance, additionalProviders, configuration);
LOGGER.info("deployed REST singleton: " + o);
@@ -759,9 +759,9 @@ public abstract class RESTService implements ServerService, SelfManaging {
final RsHttpListener listener = createHttpListener();
final RsRegistry.AddressInfo address = rsRegistry.createRsHttpListener(appId, web, listener, classLoader, nopath.substring(NOPATH_PREFIX.length() - 1), virtualHost, auth, realm);
- services.add(new DeployedService(address.complete, contextRoot, loadedClazz.getName()));
+ services.add(new DeployedService(address.complete, contextRoot, loadedClazz.getName(), appId));
listener.deployPojo(classLoader, contextRoot, getFullContext(address.base, contextRoot), loadedClazz, app, injections, context, owbCtx,
- additionalProviders, config);
+ additionalProviders, config);
LOGGER.info("REST Service: " + address.complete + " -> Pojo " + loadedClazz.getName());
}
@@ -772,9 +772,9 @@ public abstract class RESTService implements ServerService, SelfManaging {
final RsHttpListener listener = createHttpListener();
final RsRegistry.AddressInfo address = rsRegistry.createRsHttpListener(appId, web, listener, beanContext.getClassLoader(), nopath.substring(NOPATH_PREFIX.length() - 1), virtualHost, auth, realm);
- services.add(new DeployedService(address.complete, context, beanContext.getBeanClass().getName()));
+ services.add(new DeployedService(address.complete, context, beanContext.getBeanClass().getName(), appId));
listener.deployEJB(context, getFullContext(address.base, context), beanContext,
- additionalProviders, new ServiceConfiguration(beanContext.getProperties(), serviceInfos));
+ additionalProviders, new ServiceConfiguration(beanContext.getProperties(), serviceInfos));
LOGGER.info("REST Service: " + address.complete + " -> EJB " + beanContext.getEjbName());
}
@@ -899,8 +899,8 @@ public abstract class RESTService implements ServerService, SelfManaging {
return managedUrl + "/" + wildcard;
}
- private void undeployRestObject(final String context) {
- HttpListener listener = rsRegistry.removeListener(context);
+ private void undeployRestObject(final String appId, final String context) {
+ HttpListener listener = rsRegistry.removeListener(appId, context);
if (listener != null) {
if (BasicAuthHttpListenerWrapper.class.isInstance(listener)) {
@@ -935,8 +935,8 @@ public abstract class RESTService implements ServerService, SelfManaging {
for (final WebAppInfo webApp : app.webApps) {
final List<DeployedService> toRemove = new ArrayList<>();
for (final DeployedService service : services) {
- if (service.isInWebApp(webApp)) {
- undeployRestObject(service.address);
+ if (service.isInWebApp(app.appId, webApp)) {
+ undeployRestObject(app.appId, service.address);
toRemove.add(service);
}
}
@@ -980,7 +980,7 @@ public abstract class RESTService implements ServerService, SelfManaging {
}
for (final DeployedService service : services) {
- undeployRestObject(service.address);
+ undeployRestObject(service.appId, service.address);
}
}
@@ -1046,15 +1046,19 @@ public abstract class RESTService implements ServerService, SelfManaging {
public String address;
public String webapp;
public String origin;
+ public String appId;
- public DeployedService(final String address, final String webapp, final String origin) {
+ public DeployedService(final String address, final String webapp, final String origin, final String appId) {
this.address = address;
this.webapp = webapp;
this.origin = origin;
+ this.appId = appId;
}
- public boolean isInWebApp(final WebAppInfo webApp) {
- return (webApp.contextRoot != null && webApp.contextRoot.equals(webapp)) || (webapp != null && webapp.startsWith(webApp.contextRoot != null ? webApp.contextRoot : ""));
+ public boolean isInWebApp(final String appId, final WebAppInfo webApp) { // we support paralell deployments so we need app (versionned) + webapp check
+ return !(appId == null && this.appId != null) && !(appId != null && !appId.equals(this.appId))
+ && ((webApp.contextRoot != null &&
+ webApp.contextRoot.equals(webapp)) || (webapp != null && webapp.startsWith(webApp.contextRoot != null ? webApp.contextRoot : "")));
}
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/6c3a16d5/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistry.java
----------------------------------------------------------------------
diff --git a/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistry.java b/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistry.java
index f3041e2..f7dc13d 100644
--- a/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistry.java
+++ b/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistry.java
@@ -24,7 +24,7 @@ import java.util.List;
public interface RsRegistry {
AddressInfo createRsHttpListener(String appId, String webContext, HttpListener listener, ClassLoader classLoader, String path, String virtualHost, String auth, String realm);
- HttpListener removeListener(String context);
+ HttpListener removeListener(String appId, String context);
public static class AddressInfo {
public String base;
http://git-wip-us.apache.org/repos/asf/tomee/blob/6c3a16d5/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistryImpl.java
----------------------------------------------------------------------
diff --git a/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistryImpl.java b/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistryImpl.java
index 4e71fd3..211c6d6 100644
--- a/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistryImpl.java
+++ b/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistryImpl.java
@@ -43,7 +43,7 @@ public class RsRegistryImpl extends OpenEJBHttpRegistry implements RsRegistry {
}
@Override
- public HttpListener removeListener(String context) {
+ public HttpListener removeListener(final String appId, final String context) {
String regex = addresses.get(context);
if (regex != null) {
HttpListener listener = registry.removeHttpListener(regex);
http://git-wip-us.apache.org/repos/asf/tomee/blob/6c3a16d5/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 5475ff2..4203215 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
@@ -35,6 +35,7 @@ import org.apache.tomee.catalina.environment.Hosts;
import org.apache.tomee.catalina.registration.Registrations;
import org.apache.tomee.loader.TomcatHelper;
+import javax.servlet.DispatcherType;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
@@ -42,14 +43,13 @@ import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
-import javax.servlet.DispatcherType;
public class TomcatRsRegistry implements RsRegistry {
private static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB_STARTUP, TomcatRsRegistry.class);
private final Hosts hosts;
private List<Connector> connectors;
- private final Map<String, HttpListener> listeners = new TreeMap<>();
+ private final Map<Key, HttpListener> listeners = new TreeMap<>();
public TomcatRsRegistry() {
for (final Service service : TomcatHelper.getServer().findServices()) {
@@ -138,7 +138,7 @@ public class TomcatRsRegistry implements RsRegistry {
path = address(connectors, host.getName(), webContext);
final String key = address(connectors, host.getName(), completePath);
- listeners.put(key, listener);
+ listeners.put(new Key(appId, key), listener);
return new AddressInfo(path, key);
}
@@ -188,7 +188,7 @@ public class TomcatRsRegistry implements RsRegistry {
}
@Override
- public HttpListener removeListener(final String completePath) {
+ public HttpListener removeListener(final String appId, final String completePath) {
if(completePath != null) {
String path = completePath;
// assure context root with a leading slash
@@ -197,10 +197,54 @@ public class TomcatRsRegistry implements RsRegistry {
} else {
path = completePath;
}
- if (listeners.containsKey(path)) {
- return listeners.remove(path);
+
+ final Key key = new Key(appId, path);
+ if (listeners.containsKey(key)) {
+ return listeners.remove(key);
}
}
return null;
}
+
+ private static final class Key implements Comparable<Key> {
+ private final String appId; // can be versionned so context is not enough
+ private final String path;
+ private final int hash; // hashmap key so compute only once the hash for perf
+
+ private Key(final String appId, final String path) {
+ this.appId = appId;
+ this.path = path;
+ this.hash = 31 * (appId != null ? appId.hashCode() : 0) + (path != null ? path.hashCode() : 0);
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ final Key key = Key.class.cast(o);
+ return appId != null ? appId.equals(key.appId) : key.appId == null && (path != null ? path.equals(key.path) : key.path == null);
+
+ }
+
+ @Override
+ public int hashCode() {
+ return hash;
+ }
+
+ @Override
+ public int compareTo(final Key o) {
+ if ((appId != null && !appId.equals(o.appId)) || o.appId != null) {
+ final int appCompare = (appId == null ? "" : appId).compareTo(o.appId == null ? "" : o.appId);
+ if (appCompare != 0) {
+ return appCompare;
+ }
+ }
+ return path.compareTo(o.path);
+ }
+ }
}