Repository: tomee Updated Branches: refs/heads/master 01808df26 -> 97cee7124
TOMEE-1545 using tomcat version in context info id Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/97cee712 Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/97cee712 Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/97cee712 Branch: refs/heads/master Commit: 97cee71249562f1df48ed41f21101d5cce1923c9 Parents: 01808df Author: Romain Manni-Bucau <[email protected]> Authored: Mon Aug 17 21:18:43 2015 -0700 Committer: Romain Manni-Bucau <[email protected]> Committed: Mon Aug 17 21:18:43 2015 -0700 ---------------------------------------------------------------------- .../apache/openejb/server/rest/RESTService.java | 34 +++++----- .../apache/openejb/server/rest/RsRegistry.java | 2 +- .../openejb/server/rest/RsRegistryImpl.java | 2 +- .../tomee/catalina/TomcatWebAppBuilder.java | 67 +++++++++++++------- .../tomee/webservices/TomcatRsRegistry.java | 15 +++-- 5 files changed, 76 insertions(+), 44 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/97cee712/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 e249e4c..df2eadb 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 @@ -369,10 +369,10 @@ public abstract class RESTService implements ServerService, SelfManaging { if (hasEjbAndIsNotAManagedBean(restEjbs, o.getClass().getName())) { // no more a singleton if the ejb is not a singleton...but it is a weird case - deployEJB(webApp.contextRoot, appPrefix, restEjbs.get(o.getClass().getName()).context, additionalProviders, appInfo.services); + deployEJB(appInfo.appId, webApp.contextRoot, appPrefix, restEjbs.get(o.getClass().getName()).context, additionalProviders, appInfo.services); } else { pojoConfigurations = PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp); - deploySingleton(webApp.contextRoot, appPrefix, o, appInstance, classLoader, additionalProviders, + deploySingleton(appInfo.appId, webApp.contextRoot, appPrefix, o, appInstance, classLoader, additionalProviders, new ServiceConfiguration(PojoUtil.findConfiguration(pojoConfigurations, o.getClass().getName()), appInfo.services)); } } @@ -383,10 +383,10 @@ public abstract class RESTService implements ServerService, SelfManaging { } if (hasEjbAndIsNotAManagedBean(restEjbs, clazz.getName())) { - deployEJB(webApp.contextRoot, appPrefix, restEjbs.get(clazz.getName()).context, additionalProviders, appInfo.services); + deployEJB(appInfo.appId, webApp.contextRoot, appPrefix, restEjbs.get(clazz.getName()).context, additionalProviders, appInfo.services); } else { pojoConfigurations = PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp); - deployPojo(webApp.contextRoot, appPrefix, clazz, appInstance, classLoader, injections, context, owbCtx, additionalProviders, + deployPojo(appInfo.appId, webApp.contextRoot, appPrefix, clazz, appInstance, classLoader, injections, context, owbCtx, additionalProviders, new ServiceConfiguration(PojoUtil.findConfiguration(pojoConfigurations, clazz.getName()), appInfo.services)); } } @@ -407,16 +407,16 @@ public abstract class RESTService implements ServerService, SelfManaging { if (restEjbs.containsKey(clazz)) { final BeanContext ctx = restEjbs.get(clazz).context; if (hasEjbAndIsNotAManagedBean(restEjbs, clazz)) { - deployEJB(webApp.contextRoot, appPrefix, restEjbs.get(clazz).context, additionalProviders, appInfo.services); + deployEJB(appInfo.appId, webApp.contextRoot, appPrefix, restEjbs.get(clazz).context, additionalProviders, appInfo.services); } else { - deployPojo(webApp.contextRoot, appPrefix, ctx.getBeanClass(), null, ctx.getClassLoader(), ctx.getInjections(), context, + deployPojo(appInfo.appId, webApp.contextRoot, appPrefix, ctx.getBeanClass(), null, ctx.getClassLoader(), ctx.getInjections(), context, owbCtx, additionalProviders, new ServiceConfiguration(ctx.getProperties(), appInfo.services)); } } else { try { final Class<?> loadedClazz = classLoader.loadClass(clazz); pojoConfigurations = PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp); - deployPojo(webApp.contextRoot, appPrefix, loadedClazz, null, classLoader, injections, context, owbCtx, + deployPojo(appInfo.appId, webApp.contextRoot, appPrefix, loadedClazz, null, classLoader, injections, context, owbCtx, additionalProviders, new ServiceConfiguration(PojoUtil.findConfiguration(pojoConfigurations, loadedClazz.getName()), appInfo.services)); } catch (final ClassNotFoundException e) { @@ -458,7 +458,7 @@ public abstract class RESTService implements ServerService, SelfManaging { final RsHttpListener listener = createHttpListener(); 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); + 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())); 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 @@ -638,12 +638,12 @@ public abstract class RESTService implements ServerService, SelfManaging { for (final Map.Entry<String, EJBRestServiceInfo> ejb : restEjbs.entrySet()) { final BeanContext ctx = ejb.getValue().context; if (BeanType.MANAGED.equals(ctx.getComponentType())) { - deployPojo("", ejb.getValue().path, ctx.getBeanClass(), null, ctx.getClassLoader(), ctx.getInjections(), + 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)); } else { - deployEJB("", ejb.getValue().path, ctx, providers, appInfo.services); + deployEJB(appInfo.appId, "", ejb.getValue().path, ctx, providers, appInfo.services); } } } @@ -731,11 +731,11 @@ public abstract class RESTService implements ServerService, SelfManaging { return restEjbs; } - private void deploySingleton(final String web, final String contextRoot, final Object o, final Application appInstance, final ClassLoader classLoader, + private void deploySingleton(final String appId, final String web, final String contextRoot, final Object o, final Application appInstance, final ClassLoader classLoader, final Collection<Object> additionalProviders, final ServiceConfiguration configuration) { final String nopath = getAddress(contextRoot, o.getClass()); final RsHttpListener listener = createHttpListener(); - final RsRegistry.AddressInfo address = rsRegistry.createRsHttpListener(web, listener, classLoader, nopath.substring(NOPATH_PREFIX.length() - 1), virtualHost, auth, realm); + 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())); listener.deploySingleton(contextRoot, getFullContext(address.base, contextRoot), o, appInstance, additionalProviders, configuration); @@ -743,7 +743,8 @@ public abstract class RESTService implements ServerService, SelfManaging { LOGGER.info("deployed REST singleton: " + o); } - private void deployPojo(final String web, final String contextRoot, final Class<?> loadedClazz, final Application app, final ClassLoader classLoader, final Collection<Injection> injections, + private void deployPojo(final String appId, final String web, final String contextRoot, final Class<?> loadedClazz, final Application app, + final ClassLoader classLoader, final Collection<Injection> injections, final Context context, final WebBeansContext owbCtx, final Collection<Object> additionalProviders, final ServiceConfiguration config) { if (loadedClazz.isInterface()) { return; @@ -751,7 +752,7 @@ public abstract class RESTService implements ServerService, SelfManaging { final String nopath = getAddress(contextRoot, loadedClazz); final RsHttpListener listener = createHttpListener(); - final RsRegistry.AddressInfo address = rsRegistry.createRsHttpListener(web, listener, classLoader, nopath.substring(NOPATH_PREFIX.length() - 1), virtualHost, auth, realm); + 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())); listener.deployPojo(classLoader, contextRoot, getFullContext(address.base, contextRoot), loadedClazz, app, injections, context, owbCtx, @@ -760,10 +761,11 @@ public abstract class RESTService implements ServerService, SelfManaging { LOGGER.info("REST Service: " + address.complete + " -> Pojo " + loadedClazz.getName()); } - private void deployEJB(final String web, final String context, final BeanContext beanContext, final Collection<Object> additionalProviders, final Collection<ServiceInfo> serviceInfos) { + private void deployEJB(final String appId, final String web, final String context, final BeanContext beanContext, final Collection<Object> additionalProviders, + final Collection<ServiceInfo> serviceInfos) { final String nopath = getAddress(context, beanContext.getBeanClass()); final RsHttpListener listener = createHttpListener(); - final RsRegistry.AddressInfo address = rsRegistry.createRsHttpListener(web, listener, beanContext.getClassLoader(), nopath.substring(NOPATH_PREFIX.length() - 1), virtualHost, auth, realm); + 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())); listener.deployEJB(context, getFullContext(address.base, context), beanContext, http://git-wip-us.apache.org/repos/asf/tomee/blob/97cee712/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 d75dc04..f3041e2 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 @@ -22,7 +22,7 @@ import org.apache.openejb.server.httpd.HttpListener; import java.util.List; public interface RsRegistry { - AddressInfo createRsHttpListener(String webContext, HttpListener listener, ClassLoader classLoader, String path, String virtualHost, String auth, String realm); + AddressInfo createRsHttpListener(String appId, String webContext, HttpListener listener, ClassLoader classLoader, String path, String virtualHost, String auth, String realm); HttpListener removeListener(String context); http://git-wip-us.apache.org/repos/asf/tomee/blob/97cee712/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 f6db204..4e71fd3 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 @@ -29,7 +29,7 @@ public class RsRegistryImpl extends OpenEJBHttpRegistry implements RsRegistry { private Map<String, String> addresses = new HashMap<String, String>(); @Override - public AddressInfo createRsHttpListener(String webContext, HttpListener listener, ClassLoader classLoader, String path, String virtualHost, String auth, String realm) { + public AddressInfo createRsHttpListener(String appId, String webContext, HttpListener listener, ClassLoader classLoader, String path, String virtualHost, String auth, String realm) { final String address = HttpUtil.selectSingleAddress(getResolvedAddresses(path)); if ("BASIC".equals(auth)) { // important to wrap with basic wrapper before classloader wrapping http://git-wip-us.apache.org/repos/asf/tomee/blob/97cee712/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java index 329106c..95b40cf 100644 --- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java +++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java @@ -466,7 +466,7 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare } } - if (isAlreadyDeployed(webApp)) { + if (isAlreadyDeployed(appInfo, webApp)) { continue; } @@ -515,7 +515,7 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare appParam.setValue(webApp.moduleId); standardContext.addApplicationParameter(appParam); - if (!isAlreadyDeployed(webApp)) { + if (!isAlreadyDeployed(appInfo, webApp)) { if (standardContext.getPath() == null) { if (webApp.contextRoot != null && webApp.contextRoot.startsWith("/")) { standardContext.setPath(webApp.contextRoot); @@ -542,7 +542,7 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare webApp.contextRoot = ""; } - if (isAlreadyDeployed(webApp)) { // possible because of the previous renaming + if (isAlreadyDeployed(appInfo, webApp)) { // possible because of the previous renaming continue; } @@ -580,11 +580,12 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare } } - private boolean isAlreadyDeployed(final WebAppInfo webApp) { - final ContextInfo contextInfo = getContextInfo(webApp.host, webApp.contextRoot); + private boolean isAlreadyDeployed(final AppInfo appInfo, final WebAppInfo webApp) { + final String version = appVersion(appInfo); + final ContextInfo contextInfo = getContextInfo(webApp.host, webApp.contextRoot, version); if (contextInfo != null && contextInfo.standardContext != null && contextInfo.standardContext.getState() == LifecycleState.FAILED) { - synchronized (this) { - infos.remove(getId(webApp.host, webApp.contextRoot)); + synchronized (infos) { + infos.remove(getId(webApp.host, webApp.contextRoot, version)); } return false; } @@ -718,8 +719,9 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare */ @Override public void undeployWebApps(final AppInfo appInfo) throws Exception { + final String version = appVersion(appInfo); for (final WebAppInfo webApp : appInfo.webApps) { - final ContextInfo contextInfo = getContextInfo(webApp.host, webApp.contextRoot); + final ContextInfo contextInfo = getContextInfo(webApp.host, webApp.contextRoot, version); if (contextInfo != null) { final StandardContext standardContext = contextInfo.standardContext; @@ -956,7 +958,7 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare continue; } - final String wId = getId(webApp.host, webApp.contextRoot); + final String wId = getId(webApp.host, webApp.contextRoot, contextInfo.version); if (id.equals(wId)) { return webApp; } @@ -1228,7 +1230,7 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare // appInfo is null when deployment fails if (contextInfo.appInfo != null) { for (final WebAppInfo w : contextInfo.appInfo.webApps) { - if (id.equals(getId(w.host, w.contextRoot)) || id.equals(getId(w.host, w.moduleId))) { + if (id.equals(getId(w.host, w.contextRoot, contextInfo.version)) || id.equals(getId(w.host, w.moduleId, contextInfo.version))) { if (webAppInfo == null) { webAppInfo = w; } else if (w.host != null && w.host.equals(Contexts.getHostname(standardContext))) { @@ -1516,7 +1518,7 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare // skip undeployment if restarting final TomEEWebappClassLoader tomEEWebappClassLoader = lazyClassLoader( - org.apache.catalina.Context.class.isInstance(child) ? org.apache.catalina.Context.class.cast(child) : null); + org.apache.catalina.Context.class.isInstance(child) ? org.apache.catalina.Context.class.cast(child) : null); if (tomEEWebappClassLoader != null && tomEEWebappClassLoader.isRestarting()) { return true; } @@ -1583,7 +1585,7 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare final String id = getId(standardContext); WebAppInfo currentWebAppInfo = null; for (final WebAppInfo webAppInfo : contextInfo.appInfo.webApps) { - final String wId = getId(webAppInfo.host, webAppInfo.contextRoot); + final String wId = getId(webAppInfo.host, webAppInfo.contextRoot, contextInfo.version); if (id.equals(wId)) { currentWebAppInfo = webAppInfo; break; @@ -1750,6 +1752,14 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare addConfiguredDocBases(standardContext, contextInfo); } + private static String appVersion(final AppInfo appInfo) { + if (appInfo != null && appInfo.webAppAlone && appInfo.appId != null) { + final int versionIndex = appInfo.appId.indexOf("##"); + return versionIndex >= 0 ? appInfo.appId.substring(versionIndex) : ""; + } + return ""; + } + private void addConfiguredDocBases(final StandardContext standardContext, final ContextInfo contextInfo) { if (contextInfo.appInfo.path != null) { // add external web resources final String contextPath = standardContext.getServletContext().getContextPath(); @@ -2342,10 +2352,10 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare * @return id of the context */ private String getId(final StandardContext standardContext) { - return getId(Contexts.getHostname(standardContext), standardContext.getName()); + return getId(Contexts.getHostname(standardContext), standardContext.getPath(), standardContext.getWebappVersion()); } - private String getId(final String host, final String context) { + private String getId(final String host, final String context, final String version) { String contextRoot = context; if (isRoot(contextRoot)) { contextRoot = ""; @@ -2353,10 +2363,7 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare if (!contextRoot.startsWith("/")) { contextRoot = "/" + contextRoot; } - if (host != null) { - return host + contextRoot; - } - return hosts.getDefaultHost() + contextRoot; + return (host == null ? hosts.getDefaultHost() : host) + contextRoot + (version == null || version.isEmpty() ? "" : (version.startsWith("##") ? version : "##" + version)); } /** @@ -2379,13 +2386,13 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare * * @return context info */ - private synchronized ContextInfo getContextInfo(final String webAppHost, final String webAppContextRoot) { + private synchronized ContextInfo getContextInfo(final String webAppHost, final String webAppContextRoot, final String version) { String host = webAppHost; if (host == null) { host = hosts.getDefaultHost(); } - final String id = getId(host, webAppContextRoot); + final String id = getId(host, webAppContextRoot, version); final ContextInfo value; synchronized (infos) { @@ -2414,6 +2421,8 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare contextInfo = infos.get(id); if (contextInfo == null) { contextInfo = new ContextInfo(); + final String webappVersion = standardContext.getWebappVersion(); + contextInfo.version = webappVersion != null && !webappVersion.isEmpty() ? "##" + webappVersion : webappVersion; contextInfo.standardContext = standardContext; infos.put(id, contextInfo); } @@ -2427,9 +2436,22 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare * @param standardContext context */ private void removeContextInfo(final StandardContext standardContext) { - final String id = getId(standardContext); + boolean found = false; synchronized (infos) { - infos.remove(id); + final Iterator<Map.Entry<String, ContextInfo>> info = infos.entrySet().iterator(); + while (info.hasNext()) { + if (info.next().getValue().standardContext == standardContext) { + info.remove(); + found = true; + break; + } + } + } + if (!found) { // unlikely + final String id = getId(standardContext); + synchronized (infos) { + infos.remove(id); + } } } @@ -2439,6 +2461,7 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare public StandardContext standardContext; public HostConfig deployer; public Host host; + public String version; public Collection<String> resourceNames = Collections.emptyList(); @Override http://git-wip-us.apache.org/repos/asf/tomee/blob/97cee712/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 2f3d549..5475ff2 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 @@ -62,7 +62,7 @@ public class TomcatRsRegistry implements RsRegistry { } @Override - public AddressInfo createRsHttpListener(final String webContext, final HttpListener listener, final ClassLoader classLoader, final String completePath, final String virtualHost, final String auth, final String realm) { + public AddressInfo createRsHttpListener(final String appId, final String webContext, final HttpListener listener, final ClassLoader classLoader, final String completePath, final String virtualHost, final String auth, final String realm) { String path = webContext; if (path == null) { throw new NullPointerException("contextRoot is null"); @@ -82,7 +82,7 @@ public class TomcatRsRegistry implements RsRegistry { if (host == null) { for (final Host h : hosts) { - context = findContext(h, webContext); + context = findContext(h, appId, webContext); if (context != null) { host = h; if (classLoader != null && classLoader.equals(context.getLoader().getClassLoader())) { @@ -95,7 +95,7 @@ public class TomcatRsRegistry implements RsRegistry { throw new IllegalArgumentException("Invalid virtual host '" + virtualHost + "'. Do you have a matching Host entry in the server.xml?"); } } else { - context = findContext(host, webContext); + context = findContext(host, appId, webContext); } if (context == null) { @@ -155,7 +155,14 @@ public class TomcatRsRegistry implements RsRegistry { return completePath.substring((webContext.length() > 0 && !webContext.startsWith("/") ? 1 : 0) + webContext.length()); } - private static Context findContext(final Container host, final String webContext) { + private static Context findContext(final Container host, final String appId, final String webContext) { + if (appId != null) { // when using versioning appId is like context#1235 but not the context itself so ensure to test appId first + final Context ctx = Context.class.cast(host.findChild('/' + appId)); + if (ctx != null) { + return ctx; + } + } + Context webapp = Context.class.cast(host.findChild(webContext)); if (webapp == null && "/".equals(webContext)) { // ROOT webapp = Context.class.cast(host.findChild(""));
