X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=server%2Fruntime%2Forg.argeo.server.webextender%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fserver%2Fwebextender%2FTomcatDeployer.java;fp=server%2Fruntime%2Forg.argeo.server.webextender%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fserver%2Fwebextender%2FTomcatDeployer.java;h=c41351dc0083440165d534fb75e2ab2431f9db53;hb=ca91d6c3f261173feb0ae4914450a119336f83c1;hp=f93a5f3e50141b2a82fb1bd603ecb390a6024be8;hpb=de5375d3d1fa1a6f098f556a0d101580eb1857f4;p=lgpl%2Fargeo-commons.git diff --git a/server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/webextender/TomcatDeployer.java b/server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/webextender/TomcatDeployer.java index f93a5f3e5..c41351dc0 100644 --- a/server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/webextender/TomcatDeployer.java +++ b/server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/webextender/TomcatDeployer.java @@ -1,20 +1,27 @@ package org.argeo.server.webextender; +import org.apache.catalina.Container; +import org.apache.catalina.Context; import org.apache.catalina.Service; +import org.springframework.osgi.web.deployer.WarDeployment; import org.springframework.osgi.web.deployer.tomcat.TomcatWarDeployer; +import org.springframework.util.ObjectUtils; /** * Wraps the Spring DM Tomcat deployer in order to avoid issue with call to - * getServerInfo() when undeployed. + * getServerInfo() when undeployed. We need to hack a lot here because Spring + * OSGi Web is really not extendable. */ public class TomcatDeployer extends TomcatWarDeployer { private String serverInfo; + private Service service; @Override public void setService(Object service) { + this.service = (Service) service; super.setService(service); // TODO: listen to OSGi service so that we get notified in the - // (unlikely) cae the underlying service is update + // (unlikely) case the underlying service is updated serverInfo = ((Service) service).getInfo(); if (log.isDebugEnabled()) log.debug("Argeo modified Tomcat deployer used"); @@ -25,4 +32,50 @@ public class TomcatDeployer extends TomcatWarDeployer { return serverInfo; } + @Override + protected void startDeployment(WarDeployment deployment) throws Exception { + // Context context = ((TomcatWarDeployment) + // deployment).getCatalinaContext(); + // context.setCookies(false); + super.startDeployment(deployment); + + // Required for multiple RAP sessions to work with Tomcat + // see + // http://wiki.eclipse.org/RAP/FAQ#How_to_run_a_RAP_application_in_multiple_browser_tabs.2Fwindows.3F + // TODO make it configurable in order to cover other web apps + Context context = getContext("/org.argeo.rap.webapp"); + if (context != null) + context.setCookies(false); + } + + /** @return null if not found */ + private Context getContext(String path) { + for (Container container : getHost().findChildren()) { + log.debug(container.getClass() + ": " + container.getName()); + if (container instanceof Context) { + Context context = (Context) container; + if (path.equals(context.getPath())) + return context; + } + } + return null; + } + + private Container getHost() { + // get engine + Container container = service.getContainer(); + + if (container == null) + throw new IllegalStateException( + "The Tomcat server doesn't have any Engines defined"); + // now get host + Container[] children = container.findChildren(); + if (ObjectUtils.isEmpty(children)) + throw new IllegalStateException( + "The Tomcat server doesn't have any Hosts defined"); + + // pick the first one and associate the context with it + return children[0]; + } + }