From 36ecafe8e1c556478eef816e04ce6b536e9eb71e Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Fri, 25 Feb 2011 19:37:46 +0000 Subject: [PATCH] Extend Spring DM web extender in order to fix issue when undeploying git-svn-id: https://svn.argeo.org/commons/trunk@4211 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../org.argeo.server.webextender/.project | 22 -- .../.settings/org.eclipse.pde.core.prefs | 4 - .../META-INF/MANIFEST.MF | 11 - .../build.properties | 1 - .../META-INF/spring/extender/webextender.xml | 2 +- .../org.argeo.server.webextender/pom.xml | 17 +- .../argeo/server/catalina/CatalinaServer.java | 219 ------------------ .../argeo/server/catalina/OsgiCatalina.java | 34 --- .../TomcatDeployer.java | 10 +- 9 files changed, 19 insertions(+), 301 deletions(-) delete mode 100644 server/modules/org.argeo.server.webextender/.project delete mode 100644 server/modules/org.argeo.server.webextender/.settings/org.eclipse.pde.core.prefs delete mode 100644 server/modules/org.argeo.server.webextender/META-INF/MANIFEST.MF delete mode 100644 server/modules/org.argeo.server.webextender/build.properties rename server/{modules => runtime}/org.argeo.server.webextender/META-INF/spring/extender/webextender.xml (89%) delete mode 100644 server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/catalina/CatalinaServer.java delete mode 100644 server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/catalina/OsgiCatalina.java rename server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/{catalina => webextender}/TomcatDeployer.java (58%) diff --git a/server/modules/org.argeo.server.webextender/.project b/server/modules/org.argeo.server.webextender/.project deleted file mode 100644 index a8e485fac..000000000 --- a/server/modules/org.argeo.server.webextender/.project +++ /dev/null @@ -1,22 +0,0 @@ - - - org.argeo.server.webextender - - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - - diff --git a/server/modules/org.argeo.server.webextender/.settings/org.eclipse.pde.core.prefs b/server/modules/org.argeo.server.webextender/.settings/org.eclipse.pde.core.prefs deleted file mode 100644 index bd6f9bab4..000000000 --- a/server/modules/org.argeo.server.webextender/.settings/org.eclipse.pde.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -#Fri Feb 25 14:51:26 CET 2011 -eclipse.preferences.version=1 -pluginProject.extensions=false -resolve.requirebundle=false diff --git a/server/modules/org.argeo.server.webextender/META-INF/MANIFEST.MF b/server/modules/org.argeo.server.webextender/META-INF/MANIFEST.MF deleted file mode 100644 index ba6ebbf6b..000000000 --- a/server/modules/org.argeo.server.webextender/META-INF/MANIFEST.MF +++ /dev/null @@ -1,11 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: Webextender -Bundle-SymbolicName: org.argeo.server.webextender -Bundle-Version: 1.0.0.qualifier -Bundle-Vendor: Argeo -Fragment-Host: org.springframework.osgi.web.extender -Import-Package: org.apache.catalina, - org.apache.catalina.connector, - org.argeo.server.catalina, - org.springframework.osgi.web.deployer.tomcat;version="1.2.1" diff --git a/server/modules/org.argeo.server.webextender/build.properties b/server/modules/org.argeo.server.webextender/build.properties deleted file mode 100644 index 5f22cdd44..000000000 --- a/server/modules/org.argeo.server.webextender/build.properties +++ /dev/null @@ -1 +0,0 @@ -bin.includes = META-INF/ diff --git a/server/modules/org.argeo.server.webextender/META-INF/spring/extender/webextender.xml b/server/runtime/org.argeo.server.webextender/META-INF/spring/extender/webextender.xml similarity index 89% rename from server/modules/org.argeo.server.webextender/META-INF/spring/extender/webextender.xml rename to server/runtime/org.argeo.server.webextender/META-INF/spring/extender/webextender.xml index 6e87783c2..9df865db1 100644 --- a/server/modules/org.argeo.server.webextender/META-INF/spring/extender/webextender.xml +++ b/server/runtime/org.argeo.server.webextender/META-INF/spring/extender/webextender.xml @@ -11,7 +11,7 @@ - \ No newline at end of file diff --git a/server/runtime/org.argeo.server.webextender/pom.xml b/server/runtime/org.argeo.server.webextender/pom.xml index 08adbeefc..da4b0ba11 100644 --- a/server/runtime/org.argeo.server.webextender/pom.xml +++ b/server/runtime/org.argeo.server.webextender/pom.xml @@ -30,10 +30,9 @@ ${version.maven-bundle-plugin} - - - org.argeo.server.* - + org.springframework.osgi.web.extender + org.argeo.server.webextender.* + org.springframework.beans.factory,* @@ -43,7 +42,15 @@ org.springframework.osgi - org.springframework.web.extender + org.springframework.osgi.web.extender + + + org.apache.catalina + com.springsource.org.apache.catalina + + + org.springframework + org.springframework.beans diff --git a/server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/catalina/CatalinaServer.java b/server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/catalina/CatalinaServer.java deleted file mode 100644 index 392bbfa30..000000000 --- a/server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/catalina/CatalinaServer.java +++ /dev/null @@ -1,219 +0,0 @@ -package org.argeo.server.catalina; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLStreamHandler; -import java.util.Properties; - -import javax.management.MBeanRegistration; - -import org.apache.catalina.Lifecycle; -import org.apache.catalina.Server; -import org.apache.catalina.Service; -import org.apache.catalina.connector.Connector; -import org.apache.catalina.core.StandardService; -import org.apache.catalina.util.ServerInfo; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.naming.resources.DirContextURLStreamHandler; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.Constants; -import org.osgi.framework.ServiceRegistration; -import org.osgi.service.url.AbstractURLStreamHandlerService; -import org.osgi.service.url.URLConstants; -import org.osgi.service.url.URLStreamHandlerService; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.InitializingBean; - -public class CatalinaServer implements DisposableBean,InitializingBean{ - /** logger */ - private static final Log log = LogFactory.getLog(CatalinaServer.class); - - /** default XML configuration */ - private static final String DEFAULT_XML_CONF_LOCATION = "conf/default-server.xml"; - - /** user-configurable XML configuration */ - private static final String XML_CONF_LOCATION = "conf/server.xml"; - - private BundleContext bundleContext; - - private StandardService server; - - private ServiceRegistration registration, urlRegistration; - - public void afterPropertiesSet() throws Exception { - log.info("Starting " + ServerInfo.getServerInfo() + " ..."); - - // default startup procedure - ClassLoader cl = CatalinaServer.class.getClassLoader(); - Thread current = Thread.currentThread(); - ClassLoader old = current.getContextClassLoader(); - - try { - current.setContextClassLoader(cl); - - server = createCatalinaServer(bundleContext.getBundle()); - - server.start(); - - Connector[] connectors = server.findConnectors(); - for (int i = 0; i < connectors.length; i++) { - Connector conn = connectors[i]; - log.info("Succesfully started " + ServerInfo.getServerInfo() + " @ " + conn.getDomain() + ":" - + conn.getPort()); - } - - // register URL service - urlRegistration = registerTomcatJNDIUrlService(); - // publish server as an OSGi service - registration = publishServerAsAService(server); - log.info("Published " + ServerInfo.getServerInfo() + " as an OSGi service"); - } - catch (Exception ex) { - String msg = "Cannot start " + ServerInfo.getServerInfo(); - log.error(msg, ex); - throw new RuntimeException(msg, ex); - } - finally { - current.setContextClassLoader(old); - } - } - - public void destroy() throws Exception { - // unpublish service first - registration.unregister(); - urlRegistration.unregister(); - - log.info("Unpublished " + ServerInfo.getServerInfo() + " OSGi service"); - - // default startup procedure - ClassLoader cl = CatalinaServer.class.getClassLoader(); - Thread current = Thread.currentThread(); - ClassLoader old = current.getContextClassLoader(); - - try { - current.setContextClassLoader(cl); - //reset CCL - // current.setContextClassLoader(null); - log.info("Stopping " + ServerInfo.getServerInfo() + " ..."); - server.stop(); - log.info("Succesfully stopped " + ServerInfo.getServerInfo()); - } - catch (Exception ex) { - log.error("Cannot stop " + ServerInfo.getServerInfo(), ex); - throw ex; - } - finally { - current.setContextClassLoader(old); - } - } - - private StandardService createCatalinaServer(Bundle bundle) throws Exception { - // first try to use the XML file - URL xmlConfiguration = bundle.getResource(XML_CONF_LOCATION); - - if (xmlConfiguration != null) { - log.info("Using custom XML configuration " + xmlConfiguration); - } - else { - xmlConfiguration = bundle.getResource(DEFAULT_XML_CONF_LOCATION); - if (xmlConfiguration == null) - log.error("No XML configuration found; bailing out..."); - else - log.info("Using default XML configuration " + xmlConfiguration); - } - - return createServerFromXML(xmlConfiguration); - } - - private StandardService createServerFromXML(URL xmlConfiguration) throws IOException { - OsgiCatalina catalina = new OsgiCatalina(); - catalina.setAwait(false); - catalina.setUseShutdownHook(false); - catalina.setName("Catalina"); - catalina.setParentClassLoader(Thread.currentThread().getContextClassLoader()); - - // copy the URL file to a local temporary file (since Catalina doesn't use URL unfortunately) - File configTempFile = File.createTempFile("dm.catalina", ".cfg.xml"); - configTempFile.deleteOnExit(); - - // copy URL to temporary file - copyURLToFile(xmlConfiguration.openStream(), new FileOutputStream(configTempFile)); - log.debug("Copied configuration " + xmlConfiguration + " to temporary file " + configTempFile); - - catalina.setConfigFile(configTempFile.getAbsolutePath()); - - catalina.load(); - - Server server = catalina.getServer(); - - return (StandardService) server.findServices()[0]; - } - - private void copyURLToFile(InputStream inStream, FileOutputStream outStream) { - - int bytesRead; - byte[] buf = new byte[4096]; - try { - while ((bytesRead = inStream.read(buf)) >= 0) { - outStream.write(buf, 0, bytesRead); - } - } - catch (IOException ex) { - throw (RuntimeException) new IllegalStateException("Cannot copy URL to file").initCause(ex); - } - finally { - try { - inStream.close(); - } - catch (IOException ignore) { - } - try { - outStream.close(); - } - catch (IOException ignore) { - } - } - } - - private ServiceRegistration publishServerAsAService(StandardService server) { - Properties props = new Properties(); - // put some extra properties to easily identify the service - props.put(Constants.SERVICE_VENDOR, "Spring Dynamic Modules"); - props.put(Constants.SERVICE_DESCRIPTION, ServerInfo.getServerInfo()); - props.put(Constants.BUNDLE_VERSION, ServerInfo.getServerNumber()); - props.put(Constants.BUNDLE_NAME, bundleContext.getBundle().getSymbolicName()); - - // spring-dm specific property - props.put("org.springframework.osgi.bean.name", "tomcat-server"); - - // publish just the interfaces and the major classes (server/handlerWrapper) - String[] classes = new String[] { StandardService.class.getName(), Service.class.getName(), - MBeanRegistration.class.getName(), Lifecycle.class.getName() }; - - return bundleContext.registerService(classes, server, props); - } - - private ServiceRegistration registerTomcatJNDIUrlService() { - Properties properties = new Properties(); - properties.put(URLConstants.URL_HANDLER_PROTOCOL, "jndi"); - final URLStreamHandler handler = new DirContextURLStreamHandler(); - - return bundleContext.registerService(URLStreamHandlerService.class.getName(), - new AbstractURLStreamHandlerService() { - - private final static String EMPTY_STRING = ""; - - - public URLConnection openConnection(URL u) throws IOException { - return new URL(u, EMPTY_STRING, handler).openConnection(); - } - }, properties); - } - -} diff --git a/server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/catalina/OsgiCatalina.java b/server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/catalina/OsgiCatalina.java deleted file mode 100644 index f07b9c5d1..000000000 --- a/server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/catalina/OsgiCatalina.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2006-2008 the original author or authors. - * - * 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.catalina; - -import org.apache.catalina.Server; -import org.apache.catalina.startup.Catalina; - -/** - * OSGi extension of Catalina class used for easy access to the underlying - * configuration. - * - * @author Costin Leau - * - */ -public class OsgiCatalina extends Catalina { - - public Server getServer() { - return server; - } -} diff --git a/server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/catalina/TomcatDeployer.java b/server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/webextender/TomcatDeployer.java similarity index 58% rename from server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/catalina/TomcatDeployer.java rename to server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/webextender/TomcatDeployer.java index 3cc16bcee..f93a5f3e5 100644 --- a/server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/catalina/TomcatDeployer.java +++ b/server/runtime/org.argeo.server.webextender/src/main/java/org/argeo/server/webextender/TomcatDeployer.java @@ -1,10 +1,10 @@ -package org.argeo.server.catalina; +package org.argeo.server.webextender; import org.apache.catalina.Service; import org.springframework.osgi.web.deployer.tomcat.TomcatWarDeployer; /** - * Wraps the Spring DM Tomcate deployer in order to avoid issue with call to + * Wraps the Spring DM Tomcat deployer in order to avoid issue with call to * getServerInfo() when undeployed. */ public class TomcatDeployer extends TomcatWarDeployer { @@ -13,8 +13,11 @@ public class TomcatDeployer extends TomcatWarDeployer { @Override public void setService(Object service) { super.setService(service); - + // TODO: listen to OSGi service so that we get notified in the + // (unlikely) cae the underlying service is update serverInfo = ((Service) service).getInfo(); + if (log.isDebugEnabled()) + log.debug("Argeo modified Tomcat deployer used"); } @Override @@ -22,5 +25,4 @@ public class TomcatDeployer extends TomcatWarDeployer { return serverInfo; } - } -- 2.39.2