]> git.argeo.org Git - lgpl/argeo-commons.git/blob - server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/webextender/TomcatDeployer.java
Improve logging
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.webextender / src / main / java / org / argeo / server / webextender / TomcatDeployer.java
1 package org.argeo.server.webextender;
2
3 import org.apache.catalina.Container;
4 import org.apache.catalina.Context;
5 import org.apache.catalina.Service;
6 import org.springframework.osgi.web.deployer.WarDeployment;
7 import org.springframework.osgi.web.deployer.tomcat.TomcatWarDeployer;
8 import org.springframework.util.ObjectUtils;
9
10 /**
11 * Wraps the Spring DM Tomcat deployer in order to avoid issue with call to
12 * getServerInfo() when undeployed. We need to hack a lot here because Spring
13 * OSGi Web is really not extendable.
14 */
15 public class TomcatDeployer extends TomcatWarDeployer {
16 private String serverInfo;
17 private Service service;
18 private String contextPath = "/org.argeo.rap.webapp";
19
20 @Override
21 public void setService(Object service) {
22 this.service = (Service) service;
23 super.setService(service);
24 // TODO: listen to OSGi service so that we get notified in the
25 // (unlikely) case the underlying service is updated
26 serverInfo = ((Service) service).getInfo();
27 if (log.isTraceEnabled())
28 log.trace("Argeo modified Tomcat deployer used");
29 }
30
31 @Override
32 protected String getServerInfo() {
33 return serverInfo;
34 }
35
36 @Override
37 protected void startDeployment(WarDeployment deployment) throws Exception {
38 // Context context = ((TomcatWarDeployment)
39 // deployment).getCatalinaContext();
40 // context.setCookies(false);
41 super.startDeployment(deployment);
42
43 // Required for multiple RAP sessions to work with Tomcat
44 // see
45 // http://wiki.eclipse.org/RAP/FAQ#How_to_run_a_RAP_application_in_multiple_browser_tabs.2Fwindows.3F
46 Context context = getContext(contextPath);
47 if (context != null)
48 context.setCookies(false);
49 }
50
51 /** @return null if not found */
52 private Context getContext(String path) {
53 for (Container container : getHost().findChildren()) {
54 if (log.isTraceEnabled())
55 log.trace(container.getClass() + ": " + container.getName());
56 if (container instanceof Context) {
57 Context context = (Context) container;
58 if (path.equals(context.getPath()))
59 return context;
60 }
61 }
62 return null;
63 }
64
65 private Container getHost() {
66 // get engine
67 Container container = service.getContainer();
68
69 if (container == null)
70 throw new IllegalStateException(
71 "The Tomcat server doesn't have any Engines defined");
72 // now get host
73 Container[] children = container.findChildren();
74 if (ObjectUtils.isEmpty(children))
75 throw new IllegalStateException(
76 "The Tomcat server doesn't have any Hosts defined");
77
78 // pick the first one and associate the context with it
79 return children[0];
80 }
81
82 public void setContextPath(String contextPath) {
83 this.contextPath = contextPath;
84 }
85
86 }