/* * Copyright (C) 2007-2012 Argeo GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 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. 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; private String contextPath = "/ui"; @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) case the underlying service is updated serverInfo = ((Service) service).getInfo(); log.info("Enhanced Argeo Tomcat webapp deployer being used"); } @Override protected String getServerInfo() { 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 Context context = getContext(contextPath); if (context != null) context.setCookies(false); } /** @return null if not found */ private Context getContext(String path) { for (Container container : getHost().findChildren()) { if (log.isTraceEnabled()) log.trace(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]; } public void setContextPath(String contextPath) { this.contextPath = contextPath; } }