summaryrefslogtreecommitdiffstats
path: root/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src
diff options
context:
space:
mode:
Diffstat (limited to 'sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src')
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/ContainerLoader.java100
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyContextListener.java144
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyHost.java162
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyValve.java118
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/BootstrapConfigurationException.java41
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/RuntimeBootstrap.java113
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/TomcatServerLifecycleListener.java40
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/TomcatWebAppLifecycleListener.java249
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/WebAppLifecycleListener.java152
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/resources/org/apache/tuscany/tomcat/LocalStrings.properties20
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/resources/org/apache/tuscany/tomcat/Messages.properties39
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/AbstractTomcatTest.java250
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TestServlet.java50
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TomcatIntegrationTestCase.java109
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TomcatStandaloneTestCase.java63
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app1/WEB-INF/axis2.xml167
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app1/WEB-INF/classes/sca.module21
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app1/WEB-INF/web.xml6
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app1/index.html3
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app2/WEB-INF/classes/sca.module21
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app2/WEB-INF/web.xml29
-rw-r--r--sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app2/index.html3
22 files changed, 1900 insertions, 0 deletions
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/ContainerLoader.java b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/ContainerLoader.java
new file mode 100644
index 0000000000..60c9a7961f
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/ContainerLoader.java
@@ -0,0 +1,100 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * 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.apache.tuscany.tomcat;
+
+import java.beans.PropertyChangeListener;
+
+import org.apache.catalina.Container;
+import org.apache.catalina.Loader;
+
+/**
+ * Implementation of a TomcatLoader that allows privileged servlets from the container
+ * classloader to be loaded into an unprivileged application. This allows the Tuscany
+ * integration code to add servlets to the application, for example, to handle web
+ * services requests.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ContainerLoader implements Loader {
+ private static final String INFO = ContainerLoader.class.getName() + "/SNAPSHOT";
+ private final ClassLoader cl;
+ private Container container;
+
+ /**
+ * Constructor specifying the classloader to be used.
+ *
+ * @param cl the classloader this Loader wraps, typically the container classloader
+ */
+ public ContainerLoader(ClassLoader cl) {
+ this.cl = cl;
+ }
+
+ public void backgroundProcess() {
+ }
+
+ public ClassLoader getClassLoader() {
+ return cl;
+ }
+
+ public Container getContainer() {
+ return container;
+ }
+
+ public void setContainer(Container container) {
+ this.container = container;
+ }
+
+ public boolean getDelegate() {
+ return false;
+ }
+
+ public void setDelegate(boolean delegate) {
+ throw new UnsupportedOperationException();
+ }
+
+ public String getInfo() {
+ return INFO;
+ }
+
+ public boolean getReloadable() {
+ return false;
+ }
+
+ public void setReloadable(boolean reloadable) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void addPropertyChangeListener(PropertyChangeListener listener) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void addRepository(String repository) {
+ throw new UnsupportedOperationException();
+ }
+
+ public String[] findRepositories() {
+ throw new UnsupportedOperationException();
+ }
+
+ public boolean modified() {
+ throw new UnsupportedOperationException();
+ }
+
+ public void removePropertyChangeListener(PropertyChangeListener listener) {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyContextListener.java b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyContextListener.java
new file mode 100644
index 0000000000..04977dbc27
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyContextListener.java
@@ -0,0 +1,144 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * 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.apache.tuscany.tomcat;
+
+import java.io.IOException;
+
+import javax.servlet.ServletContext;
+
+import org.apache.catalina.Context;
+import org.apache.catalina.Lifecycle;
+import org.apache.catalina.LifecycleEvent;
+import org.apache.catalina.LifecycleListener;
+import org.apache.catalina.Valve;
+import org.apache.catalina.core.StandardWrapper;
+
+import org.apache.tuscany.binding.axis2.handler.WebServiceEntryPointServlet;
+import org.apache.tuscany.common.resource.ResourceLoader;
+import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl;
+import org.apache.tuscany.core.config.ConfigurationException;
+import org.apache.tuscany.core.config.ConfigurationLoadException;
+import org.apache.tuscany.core.config.ModuleComponentConfigurationLoader;
+import org.apache.tuscany.core.config.impl.ModuleComponentConfigurationLoaderImpl;
+import org.apache.tuscany.core.context.AggregateContext;
+import org.apache.tuscany.core.context.EventContext;
+import org.apache.tuscany.core.runtime.RuntimeContext;
+import org.apache.tuscany.model.assembly.AssemblyFactory;
+import org.apache.tuscany.model.assembly.AssemblyModelContext;
+import org.apache.tuscany.model.assembly.ModuleComponent;
+import org.apache.tuscany.model.assembly.impl.AssemblyModelContextImpl;
+import org.apache.tuscany.model.assembly.loader.AssemblyModelLoader;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class TuscanyContextListener implements LifecycleListener {
+ private static final String TUSCANY_RUNTIME_NAME = RuntimeContext.class.getName();
+ public static final String MODULE_COMPONENT_NAME = "org.apache.tuscany.core.webapp.ModuleComponentContext";
+
+ private final AssemblyFactory modelFactory;
+ private final AssemblyModelLoader modelLoader;
+ private final RuntimeContext runtime;
+ private final ResourceLoader systemLoader;
+ private AggregateContext moduleContext;
+
+ public TuscanyContextListener(RuntimeContext runtimeContext, AssemblyFactory modelFactory, AssemblyModelLoader modelLoader, ResourceLoader systemLoader) {
+ this.runtime = runtimeContext;
+ this.modelFactory = modelFactory;
+ this.modelLoader = modelLoader;
+ this.systemLoader = systemLoader;
+ }
+
+ public void lifecycleEvent(LifecycleEvent event) {
+ String type = event.getType();
+ if (Lifecycle.START_EVENT.equals(type)) {
+ startContext((Context) event.getLifecycle());
+ } else if (Lifecycle.STOP_EVENT.equals(type)) {
+ stopContext((Context) event.getLifecycle());
+ }
+ }
+
+ private void startContext(Context ctx) {
+ ResourceLoader resourceLoader = new ResourceLoaderImpl(ctx.getLoader().getClassLoader());
+ try {
+ if (resourceLoader.getResource("sca.module") == null) {
+ return;
+ }
+ } catch (IOException e) {
+ return;
+ }
+ ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+ try {
+ AssemblyModelContext modelContext = new AssemblyModelContextImpl(modelFactory, modelLoader, systemLoader, resourceLoader);
+ ModuleComponentConfigurationLoader loader = new ModuleComponentConfigurationLoaderImpl(modelContext);
+
+ try {
+ // Load the SCDL configuration of the application module
+ ModuleComponent moduleComponent = loader.loadModuleComponent(ctx.getName(), ctx.getPath());
+
+ // Register it under the root application context
+ AggregateContext rootContext = runtime.getRootContext();
+ rootContext.registerModelObject(moduleComponent);
+ moduleContext = (AggregateContext)rootContext.getContext(moduleComponent.getName());
+ moduleContext.registerModelObject(moduleComponent.getComponentImplementation());
+ } catch (ConfigurationLoadException e) {
+ throw new UnsupportedOperationException();
+ } catch (ConfigurationException e) {
+ throw new UnsupportedOperationException();
+ }
+ } finally {
+ Thread.currentThread().setContextClassLoader(oldCl);
+ }
+
+ moduleContext.fireEvent(EventContext.MODULE_START, null);
+
+ // add a valve to this context's pipeline that will associate the request with the runtime
+ Valve valve = new TuscanyValve(moduleContext);
+ ctx.getPipeline().addValve(valve);
+
+ // add the web service servlet wrapper
+ addWebServiceWrapper(ctx);
+
+ // add the RuntimeContext in as a servlet context parameter
+ ServletContext servletContext = ctx.getServletContext();
+ servletContext.setAttribute(TUSCANY_RUNTIME_NAME, runtime);
+ servletContext.setAttribute(MODULE_COMPONENT_NAME, moduleContext);
+ }
+
+ private void stopContext(Context ctx) {
+ if (moduleContext!=null) {
+ moduleContext.fireEvent(EventContext.MODULE_START, null);
+ }
+ // todo unload module component from runtime
+ }
+
+ private static void addWebServiceWrapper(Context ctx) {
+ // todo this should not depend on axis2, we need an API in the model for embedders
+ // todo should only add this servlet if we need it
+ // todo servlet implementation should be determined by the binding implementation
+ // todo should get path from entry point definition and not hard code to /services
+
+ Class<WebServiceEntryPointServlet> servletClass = WebServiceEntryPointServlet.class;
+ StandardWrapper wrapper = new StandardWrapper();
+ wrapper.setName("TuscanyAxis2EntryPointServlet");
+ wrapper.setLoader(new ContainerLoader(servletClass.getClassLoader()));
+ wrapper.setServletClass(servletClass.getName());
+ ctx.addChild(wrapper);
+ ctx.addServletMapping("/services/*", wrapper.getName());
+ }
+}
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyHost.java b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyHost.java
new file mode 100644
index 0000000000..b6e6db6da7
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyHost.java
@@ -0,0 +1,162 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * 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.apache.tuscany.tomcat;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.catalina.Container;
+import org.apache.catalina.LifecycleException;
+import org.apache.catalina.core.StandardContext;
+import org.apache.catalina.core.StandardHost;
+import org.apache.catalina.util.StringManager;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.tuscany.common.monitor.impl.NullMonitorFactory;
+import org.apache.tuscany.common.resource.ResourceLoader;
+import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl;
+import org.apache.tuscany.core.builder.RuntimeConfigurationBuilder;
+import org.apache.tuscany.core.builder.impl.DefaultWireBuilder;
+import org.apache.tuscany.core.config.ConfigurationLoadException;
+import org.apache.tuscany.core.config.ModuleComponentConfigurationLoader;
+import org.apache.tuscany.core.config.impl.ModuleComponentConfigurationLoaderImpl;
+import org.apache.tuscany.core.context.AggregateContext;
+import org.apache.tuscany.core.context.EventContext;
+import org.apache.tuscany.core.context.SystemAggregateContext;
+import org.apache.tuscany.core.runtime.RuntimeContext;
+import org.apache.tuscany.core.runtime.RuntimeContextImpl;
+import org.apache.tuscany.core.system.builder.SystemComponentContextBuilder;
+import org.apache.tuscany.core.system.builder.SystemEntryPointBuilder;
+import org.apache.tuscany.core.system.builder.SystemExternalServiceBuilder;
+import org.apache.tuscany.core.system.loader.SystemSCDLModelLoader;
+import org.apache.tuscany.model.assembly.AssemblyFactory;
+import org.apache.tuscany.model.assembly.AssemblyModelContext;
+import org.apache.tuscany.model.assembly.ModuleComponent;
+import org.apache.tuscany.model.assembly.impl.AssemblyFactoryImpl;
+import org.apache.tuscany.model.assembly.impl.AssemblyModelContextImpl;
+import org.apache.tuscany.model.assembly.loader.AssemblyModelLoader;
+import org.apache.tuscany.model.scdl.loader.SCDLModelLoader;
+import org.apache.tuscany.model.scdl.loader.impl.SCDLAssemblyModelLoaderImpl;
+
+/**
+ * A Tomcat listener to be attached to a Host container to add SCA runtime functionality.
+ * The listener wraps a Tuscany runtime and listens for container events to detect the
+ * addition and removal of Context children.
+ *
+ * @version $Rev$ $Date$
+ */
+public class TuscanyHost extends StandardHost {
+ private static final String SYSTEM_MODULE_COMPONENT = "org.apache.tuscany.core.system";
+ private static final Log log = LogFactory.getLog(TuscanyHost.class);
+ private static final StringManager sm = StringManager.getManager("org.apache.tuscany.tomcat");
+
+ private RuntimeContext runtime;
+ private AssemblyModelLoader modelLoader;
+ private AssemblyFactory modelFactory;
+ private ResourceLoader systemLoader;
+
+ public synchronized void start() throws LifecycleException {
+ startRuntime();
+ super.start();
+ }
+
+ public synchronized void stop() throws LifecycleException {
+ super.stop();
+ stopRuntime();
+ }
+
+ private void startRuntime() {
+ systemLoader = new ResourceLoaderImpl(getClass().getClassLoader());
+
+ // Create an assembly model factory
+ modelFactory = new AssemblyFactoryImpl();
+
+ // Create an assembly model loader
+ List<SCDLModelLoader> scdlLoaders=new ArrayList<SCDLModelLoader>();
+ scdlLoaders.add(new SystemSCDLModelLoader());
+ modelLoader = new SCDLAssemblyModelLoaderImpl(scdlLoaders);
+
+ // Create an assembly model context
+ AssemblyModelContext modelContext = new AssemblyModelContextImpl(modelFactory, modelLoader, systemLoader);
+
+ // Load the system module component
+ ModuleComponentConfigurationLoader loader = new ModuleComponentConfigurationLoaderImpl(modelContext);
+ ModuleComponent systemModuleComponent;
+ try {
+ systemModuleComponent = loader.loadSystemModuleComponent(SYSTEM_MODULE_COMPONENT, SYSTEM_MODULE_COMPONENT);
+ } catch (ConfigurationLoadException e) {
+ log.warn(sm.getString("runtime.loadSystemFailed"), e);
+ return;
+ }
+
+ List<RuntimeConfigurationBuilder> configBuilders = new ArrayList();
+ configBuilders.add((new SystemComponentContextBuilder()));
+ configBuilders.add(new SystemEntryPointBuilder());
+ configBuilders.add(new SystemExternalServiceBuilder());
+
+ runtime = new RuntimeContextImpl(new NullMonitorFactory(), scdlLoaders, configBuilders, new DefaultWireBuilder());
+ runtime.start();
+
+ try {
+ SystemAggregateContext systemContext = runtime.getSystemContext();
+ systemContext.registerModelObject(systemModuleComponent);
+
+ // Get the aggregate context representing the system module component
+ AggregateContext systemModuleComponentContext = (AggregateContext) systemContext.getContext(SYSTEM_MODULE_COMPONENT);
+ systemModuleComponentContext.registerModelObject(systemModuleComponent.getComponentImplementation());
+ systemModuleComponentContext.fireEvent(EventContext.MODULE_START, null);
+ } catch (Exception e) {
+ log.warn(sm.getString("runtime.registerSystemFailed"), e);
+ runtime.stop();
+ runtime = null;
+ return;
+ }
+
+ log.info(sm.getString("runtime.started"));
+ }
+
+ private void stopRuntime() {
+ if (runtime == null) {
+ return;
+ }
+
+ runtime.stop();
+ runtime = null;
+ log.info(sm.getString("runtime.stopped"));
+ }
+
+ public synchronized void addChild(Container child) {
+ if (!(child instanceof StandardContext)) {
+ throw new IllegalArgumentException(sm.getString("tuscanyHost.notContext"));
+ }
+ StandardContext ctx = (StandardContext) child;
+ ctx.addLifecycleListener(new TuscanyContextListener(runtime, modelFactory, modelLoader, systemLoader));
+ super.addChild(child);
+ }
+
+ public String toString() {
+
+ StringBuffer sb = new StringBuffer(132);
+ if (getParent() != null) {
+ sb.append(getParent().toString()).append('.');
+ }
+ sb.append("TuscanyHost[").append(getName()).append(']');
+ return (sb.toString());
+
+ }
+}
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyValve.java b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyValve.java
new file mode 100644
index 0000000000..d5383b64ea
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyValve.java
@@ -0,0 +1,118 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * 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.apache.tuscany.tomcat;
+
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.catalina.connector.Request;
+import org.apache.catalina.connector.Response;
+import org.apache.catalina.valves.ValveBase;
+import org.osoa.sca.CurrentModuleContext;
+import org.osoa.sca.ModuleContext;
+import org.osoa.sca.SCA;
+
+import org.apache.tuscany.core.context.AggregateContext;
+import org.apache.tuscany.core.context.EventContext;
+import org.apache.tuscany.core.context.EventException;
+import org.apache.tuscany.core.context.webapp.LazyHTTPSessionId;
+
+/**
+ * Valve that can be added to a pipeline to automatically set the SCA environment as each request is processed.
+ *
+ * @version $Rev$ $Date$
+ */
+public class TuscanyValve extends ValveBase {
+ /**
+ * Name of the note that contains the request id
+ */
+ private static final String REQUEST_ID = "org.apache.tuscany.tomcat.REQUEST_ID";
+
+ private static final ContextBinder BINDER = new ContextBinder();
+
+ private final AggregateContext moduleComponentContext;
+
+ public TuscanyValve(AggregateContext moduleComponentContext) {
+ this.moduleComponentContext = moduleComponentContext;
+ }
+
+ public void invoke(Request request, Response response) throws IOException, ServletException {
+ Object oldRequestId = request.getNote(REQUEST_ID);
+ ModuleContext oldContext = CurrentModuleContext.getContext();
+
+ // bind the current module context to the thread for use by CurrentModuleContext
+ BINDER.setContext((ModuleContext) moduleComponentContext);
+ try {
+ if (oldRequestId != null) {
+ // the request has already been started, just invoke the next valve
+ next.invoke(request, response);
+ } else {
+ // tell the runtime a new request is starting
+ Object requestId = new Object();
+ // jfm
+ if (request.getSession(false) != null) {
+ // A session is already active
+ moduleComponentContext
+ .fireEvent(EventContext.SESSION_NOTIFY, ((HttpServletRequest) request).getSession(true));
+ } else {
+ // Create a lazy wrapper since a session is not yet active
+ moduleComponentContext.fireEvent(EventContext.SESSION_NOTIFY, new LazyHTTPSessionId(
+ (HttpServletRequest) request));
+ }
+ // jfm
+ try {
+ moduleComponentContext.fireEvent(EventContext.REQUEST_START, requestId);
+ } catch (Exception e) {
+ throw new ServletException(e.getMessage(), e);
+ }
+ request.setNote(REQUEST_ID, requestId);
+
+ try {
+ // invoke the next valve in the pipeline
+ next.invoke(request, response);
+ } finally {
+ // notify the runtime the request is ending
+ request.removeNote(REQUEST_ID);
+ try {
+ moduleComponentContext.fireEvent(EventContext.REQUEST_END, requestId);
+ } catch (Exception e) {
+ // the application already did its work, log and ignore
+ // todo log this exception
+ }
+ }
+ }
+ } finally {
+ // restore the previous module context onto the thread
+ BINDER.setContext(oldContext);
+ }
+ }
+
+ private static class ContextBinder extends SCA {
+ public void setContext(ModuleContext context) {
+ setModuleContext(context);
+ }
+
+ public void start() {
+ throw new AssertionError();
+ }
+
+ public void stop() {
+ throw new AssertionError();
+ }
+ }
+}
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/BootstrapConfigurationException.java b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/BootstrapConfigurationException.java
new file mode 100644
index 0000000000..39f24cba8f
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/BootstrapConfigurationException.java
@@ -0,0 +1,41 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.tuscany.tomcat.lifecycle.listener;
+
+import org.apache.tuscany.common.TuscanyException;
+
+/**
+ * Signals an exception booting the Tuscany runtime hosted in a Tomcat instance
+ *
+ * @version $Rev$ $Date$
+ */
+public class BootstrapConfigurationException extends TuscanyException {
+
+ public BootstrapConfigurationException() {
+ super();
+ }
+
+ public BootstrapConfigurationException(String message) {
+ super(message);
+ }
+
+ public BootstrapConfigurationException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public BootstrapConfigurationException(Throwable cause) {
+ super(cause);
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/RuntimeBootstrap.java b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/RuntimeBootstrap.java
new file mode 100644
index 0000000000..16cad1cb1b
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/RuntimeBootstrap.java
@@ -0,0 +1,113 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.tuscany.tomcat.lifecycle.listener;
+
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.List;
+
+import javax.naming.Context;
+import javax.naming.Name;
+import javax.naming.RefAddr;
+import javax.naming.Reference;
+import javax.naming.spi.ObjectFactory;
+
+import org.apache.tuscany.common.monitor.MonitorFactory;
+import org.apache.tuscany.core.builder.RuntimeConfigurationBuilder;
+import org.apache.tuscany.core.config.ModuleComponentConfigurationLoader;
+import org.apache.tuscany.core.config.JavaIntrospectionHelper;
+import org.apache.tuscany.core.system.builder.SystemComponentContextBuilder;
+import org.apache.tuscany.core.system.builder.SystemEntryPointBuilder;
+import org.apache.tuscany.core.system.builder.SystemExternalServiceBuilder;
+import org.apache.tuscany.core.runtime.RuntimeContext;
+import org.apache.tuscany.core.runtime.RuntimeContextImpl;
+
+/**
+ * Bootstraps an SCA runtime hosted by a Tomcat instance. The runtime will be bound to JNDI and accessed by
+ * {@link org.apache.tuscany.tomcat.lifecycle.listener.WebAppLifecycleListener}s that deploy web archives as module
+ * components.
+ * <p>
+ * Tomcat is configured by adding the following to <code>server.xml</code> under the
+ * <code>GlobalNamingResources</code> element:
+ *
+ * <pre>
+ * &lt;Resource name=&quot;TuscanyRuntime&quot; auth=&quot;Container&quot; type=&quot;org.apache.tuscany.core.runtime.RuntimeContext&quot;
+ * description=&quot;Tuscany Runtime&quot;
+ * factory=&quot; org.apache.tuscany.tomcat.lifecycle.listener.RuntimeBootstrap&quot;
+ * monitor=&quot;[monitor factory]&quot; loader=&quot;[configuration loader]&quot;/&gt;
+ * </pre>
+ *
+ * @version $Rev$ $Date$
+ */
+public class RuntimeBootstrap implements ObjectFactory {
+
+ public static final String RUNTIME_NAME = "TuscanyRuntime";
+
+ public RuntimeBootstrap() {
+ }
+
+ public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment)
+ throws BootstrapConfigurationException {
+ if (!RUNTIME_NAME.equals(name)) {
+ throw new BootstrapConfigurationException("Tuscany Runtime must be configured with JNDI address of " + RUNTIME_NAME);
+ }
+ MonitorFactory monitorFactory = null;
+ ModuleComponentConfigurationLoader configurationLoader = null;
+
+ Reference ref = (Reference) obj;
+ if (!RuntimeContext.class.getName().equals(ref.getClassName())) {
+ throw new BootstrapConfigurationException("Invalid runtime configuration");
+ }
+ RefAddr monitorAddr = ref.get("monitor");
+ RefAddr loaderAddr = ref.get("loader");
+ if (loaderAddr == null) {
+ throw new BootstrapConfigurationException("No configuration laoder specified in Tomcat configuration");
+ }
+ if (monitorAddr != null) {
+ try {
+ Class monitorFactoryClass = JavaIntrospectionHelper.loadClass(monitorAddr.getContent().toString());
+ monitorFactory = (MonitorFactory) monitorFactoryClass.newInstance();
+ } catch (ClassNotFoundException e) {
+ throw new BootstrapConfigurationException("Unable to find monitor factory class specified in Tomcat configuration", e);
+ } catch (InstantiationException e) {
+ throw new BootstrapConfigurationException("Error initializing monitor factory in Tomcat configuration", e);
+ } catch (IllegalAccessException e) {
+ throw new BootstrapConfigurationException("Error initializing monitor factory in Tomcat configuration", e);
+ }
+ }
+// try {
+// Class configurationLoaderClass = JavaIntrospectionHelper.loadClass(loaderAddr.getContent().toString());
+// configurationLoader = (ConfigurationLoader) configurationLoaderClass.newInstance();
+// } catch (ClassNotFoundException e) {
+// throw new BootstrapConfigurationException("Unable to find configuration loader class specified in Tomcat configuration", e);
+// } catch (InstantiationException e) {
+// throw new BootstrapConfigurationException("Error initializing configuration loader in Tomcat configuration", e);
+// } catch (IllegalAccessException e) {
+// throw new BootstrapConfigurationException("Error initializing configuration loader in Tomcat configuration", e);
+// }
+ // create the SCA Runtime and have it bound in the global JNDI context
+ return new RuntimeContextImpl(monitorFactory, null, createBuilders(),null);
+ }
+
+ /**
+ * Creates a collection of bootstrap builders
+ */
+ private List<RuntimeConfigurationBuilder> createBuilders() {
+ List<RuntimeConfigurationBuilder> builders = new ArrayList();
+ builders.add((new SystemComponentContextBuilder()));
+ builders.add(new SystemEntryPointBuilder());
+ builders.add(new SystemExternalServiceBuilder());
+ return builders;
+ }
+}
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/TomcatServerLifecycleListener.java b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/TomcatServerLifecycleListener.java
new file mode 100644
index 0000000000..0da95bde17
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/TomcatServerLifecycleListener.java
@@ -0,0 +1,40 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.tuscany.tomcat.lifecycle.listener;
+
+import org.apache.catalina.LifecycleEvent;
+import org.apache.catalina.LifecycleListener;
+
+/**
+ * This class manages the lifecycle of the SCA container in Tomcat.
+ * @deprecated
+ */
+public class TomcatServerLifecycleListener implements LifecycleListener {
+ //private CoreModuleContext containerModuleContext;
+
+ /**
+ * Constructor
+ */
+ public TomcatServerLifecycleListener() {
+ }
+
+ /**
+ * @see org.apache.catalina.LifecycleListener#lifecycleEvent(org.apache.catalina.LifecycleEvent)
+ */
+ public void lifecycleEvent(LifecycleEvent lifecycleEvent) {
+ }
+}
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/TomcatWebAppLifecycleListener.java b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/TomcatWebAppLifecycleListener.java
new file mode 100644
index 0000000000..d1e7d8de39
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/TomcatWebAppLifecycleListener.java
@@ -0,0 +1,249 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.tuscany.tomcat.lifecycle.listener;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.catalina.Context;
+import org.apache.catalina.Lifecycle;
+import org.apache.catalina.LifecycleEvent;
+import org.apache.catalina.LifecycleListener;
+import org.apache.catalina.deploy.FilterDef;
+import org.apache.catalina.deploy.FilterMap;
+import org.apache.tuscany.common.monitor.impl.NullMonitorFactory;
+import org.apache.tuscany.common.resource.ResourceLoader;
+import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl;
+import org.apache.tuscany.core.builder.RuntimeConfigurationBuilder;
+import org.apache.tuscany.core.builder.impl.DefaultWireBuilder;
+import org.apache.tuscany.core.config.ModuleComponentConfigurationLoader;
+import org.apache.tuscany.core.config.impl.ModuleComponentConfigurationLoaderImpl;
+import org.apache.tuscany.core.context.AggregateContext;
+import org.apache.tuscany.core.context.CoreRuntimeException;
+import org.apache.tuscany.core.context.EventContext;
+import org.apache.tuscany.core.context.webapp.HTTPSessionExpirationListener;
+import org.apache.tuscany.core.context.webapp.TuscanyRequestFilter;
+import org.apache.tuscany.core.context.webapp.TuscanyWebAppRuntime;
+import org.apache.tuscany.core.runtime.RuntimeContext;
+import org.apache.tuscany.core.runtime.RuntimeContextImpl;
+import org.apache.tuscany.core.system.builder.SystemComponentContextBuilder;
+import org.apache.tuscany.core.system.builder.SystemEntryPointBuilder;
+import org.apache.tuscany.core.system.builder.SystemExternalServiceBuilder;
+import org.apache.tuscany.core.system.loader.SystemSCDLModelLoader;
+import org.apache.tuscany.model.assembly.AssemblyFactory;
+import org.apache.tuscany.model.assembly.AssemblyModelContext;
+import org.apache.tuscany.model.assembly.ModuleComponent;
+import org.apache.tuscany.model.assembly.impl.AssemblyFactoryImpl;
+import org.apache.tuscany.model.assembly.impl.AssemblyModelContextImpl;
+import org.apache.tuscany.model.assembly.loader.AssemblyModelLoader;
+import org.apache.tuscany.model.scdl.loader.SCDLModelLoader;
+import org.apache.tuscany.model.scdl.loader.impl.SCDLAssemblyModelLoaderImpl;
+import org.osoa.sca.ServiceRuntimeException;
+
+//FIXME This is a temporary hack to bootstrap the runtime in a Tomcat environment and do some bringup testing, the real bootstrap code is
+// still under construction
+
+/**
+ * Responsible for initializing web applications as module components in a
+ * Tomcat instance. When a web app is being loaded in Tomcat, this listener
+ * receives a callback to register a corresponding module component and set up
+ * the appropriate Servlet filters in the web context.
+ * <p/>
+ * Note that Tomcat loads this class in the standard (common/lib) classloader
+ * even though the context classloader is that of the web app being loaded.
+ * Consequently, the transitive closure of class references must not include
+ * <tt>ModuleContext</tt> or <tt>ModuleManager</tt>
+ * <p/>
+ * TODO decide if we want to set this up as a Tomcat listener or as a web app
+ * listener Setting this up as a web app listener allows users to set the
+ * context path, avoiding a performance hit for SCA event processing in contexts
+ * where it is not used. The downside is the potential for user error. For
+ * example, SCA event filters must be manually configured. We probably should
+ * provide both options
+ * FIXME fix the exception handling
+ */
+public class TomcatWebAppLifecycleListener implements LifecycleListener {
+
+ private final static String SYSTEM_MODULE_COMPONENT = "org.apache.tuscany.core.system";
+
+ /**
+ * Constructor
+ */
+ public TomcatWebAppLifecycleListener() {
+ }
+
+ /**
+ * Callback for receiving web application events. When a web app containing
+ * an SCA configuration is initialized, a module component is created and
+ * appropriate SCA filters are set for in the web context. If a web app stop
+ * event is received, the corresponding module component is deregistered from
+ * the system.
+ */
+ public void lifecycleEvent(LifecycleEvent event) {
+ String lifecycleEventType = event.getType();
+ Object lifecycleEventSource = event.getSource();
+
+ if (Lifecycle.START_EVENT.equals(lifecycleEventType) && lifecycleEventSource instanceof Context) {
+
+ // The web app is starting
+ Context context = (Context) lifecycleEventSource;
+ try {
+
+ // Get the application classloader
+ ClassLoader applicationClassLoader = Thread.currentThread().getContextClassLoader();
+ ResourceLoader resourceLoader = new ResourceLoaderImpl(applicationClassLoader);
+
+ // Check if the web app contains an sca.module file
+ URL url;
+ try {
+ url = resourceLoader.getResource("sca.module");
+ } catch (IOException e) {
+ url = null;
+ }
+ if (url != null) {
+ // The Web app has an sca.module file
+ // Get the module component name from the context
+ String moduleComponentName = context.getPath().substring(1);
+ try {
+
+ // Create an assembly model factory
+ AssemblyFactory modelFactory=new AssemblyFactoryImpl();
+
+ // Create an assembly model loader
+ List<SCDLModelLoader> scdlLoaders=new ArrayList<SCDLModelLoader>();
+ scdlLoaders.add(new SystemSCDLModelLoader());
+ AssemblyModelLoader modelLoader=new SCDLAssemblyModelLoaderImpl(scdlLoaders);
+
+ // Create an assembly model context
+ AssemblyModelContext modelContext = new AssemblyModelContextImpl(modelFactory, modelLoader, resourceLoader);
+
+ // Create system configuration builders
+ List<RuntimeConfigurationBuilder> configBuilders = new ArrayList();
+ configBuilders.add((new SystemComponentContextBuilder()));
+ configBuilders.add(new SystemEntryPointBuilder());
+ configBuilders.add(new SystemExternalServiceBuilder());
+
+ // Create a runtime context and start it
+ RuntimeContext runtimeContext = new RuntimeContextImpl(new NullMonitorFactory(), scdlLoaders, configBuilders,new DefaultWireBuilder());
+ runtimeContext.start();
+
+ // Get the system context
+ AggregateContext systemContext = runtimeContext.getSystemContext();
+
+ // Load the system module component
+ ModuleComponentConfigurationLoader loader = new ModuleComponentConfigurationLoaderImpl(modelContext);
+ ModuleComponent systemModuleComponent = loader.loadSystemModuleComponent(SYSTEM_MODULE_COMPONENT, SYSTEM_MODULE_COMPONENT);
+
+ // Register it with the system context
+ systemContext.registerModelObject(systemModuleComponent);
+
+ // Get the aggregate context representing the system module component
+ AggregateContext systemModuleComponentContext = (AggregateContext) systemContext.getContext(SYSTEM_MODULE_COMPONENT);
+ systemModuleComponentContext.registerModelObject(systemModuleComponent.getComponentImplementation());
+ systemModuleComponentContext.fireEvent(EventContext.MODULE_START, null);
+
+ // Load the SCDL configuration of the application module
+ String uri = context.getPath().substring(1);
+ ModuleComponent moduleComponent = loader.loadModuleComponent(moduleComponentName, uri);
+
+ // Register it under the root application context
+ runtimeContext.getRootContext().registerModelObject(moduleComponent);
+ AggregateContext moduleContext=(AggregateContext)runtimeContext.getContext(moduleComponent.getName());
+ moduleContext.registerModelObject(moduleComponent.getComponentImplementation());
+
+ // Create a Tuscany runtime and store it in the servlet
+ // context
+ TuscanyWebAppRuntime tuscanyRuntime = new TuscanyWebAppRuntime(moduleContext);
+ context.getServletContext().setAttribute(TuscanyWebAppRuntime.class.getName(), tuscanyRuntime);
+
+ // Start the runtime and the module component context
+ tuscanyRuntime.start();
+ try {
+ //moduleContext.start();
+
+ moduleContext.fireEvent(EventContext.MODULE_START, null);
+
+ } finally {
+ tuscanyRuntime.stop();
+ }
+
+ // Set up the SCA web app filter and listener
+ FilterDef def = new FilterDef();
+ def.setDescription("SCA Filter");
+ def.setFilterClass(TuscanyRequestFilter.class.getName());
+ def.setFilterName("__modContext");
+ def.setDisplayName("SCA Filter");
+ FilterMap map = new FilterMap();
+ map.setFilterName("__modContext");
+ map.setURLPattern("/*");
+ context.addFilterDef(def);
+ context.addFilterMap(map);
+ context.addApplicationListener(HTTPSessionExpirationListener.class.getName());
+
+ } catch (CoreRuntimeException e) {
+ throw new ServiceRuntimeException(e);
+ } catch (Exception e) {
+ throw new ServiceRuntimeException(e);
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } else if (Lifecycle.STOP_EVENT.equals(lifecycleEventType) && lifecycleEventSource instanceof Context) {
+
+ // The web app is stopping
+ Context context = (Context) lifecycleEventSource;
+ try {
+
+ // Get the tuscany runtime from the servlet context
+ // If the servlet context contains a tuscany runtime then this is a
+ // Tuscany app
+ TuscanyWebAppRuntime tuscanyRuntime = (TuscanyWebAppRuntime) context.getServletContext().getAttribute(
+ TuscanyWebAppRuntime.class.getName());
+ if (tuscanyRuntime != null) {
+
+ // Get the module component name from the servlet context
+ try {
+ // Start the runtime
+ tuscanyRuntime.start();
+ try {
+ // Stop the module context
+ AggregateContext aggregateContext = tuscanyRuntime.getModuleComponentContext();
+ aggregateContext.fireEvent(EventContext.MODULE_STOP, null);
+ aggregateContext.stop();
+ } finally {
+
+ // Stop the runtime
+ tuscanyRuntime.stop();
+
+ // Cleanup the servlet context
+ context.getServletContext().removeAttribute(TuscanyWebAppRuntime.class.getName());
+ }
+
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/WebAppLifecycleListener.java b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/WebAppLifecycleListener.java
new file mode 100644
index 0000000000..0e9a80f13d
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/lifecycle/listener/WebAppLifecycleListener.java
@@ -0,0 +1,152 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.apache.tuscany.tomcat.lifecycle.listener;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.apache.catalina.Context;
+import org.apache.catalina.Lifecycle;
+import org.apache.catalina.LifecycleEvent;
+import org.apache.catalina.LifecycleListener;
+import org.apache.catalina.deploy.FilterDef;
+import org.apache.catalina.deploy.FilterMap;
+import org.apache.tuscany.common.TuscanyRuntimeException;
+import org.apache.tuscany.core.config.ConfigurationException;
+import org.apache.tuscany.core.context.AggregateContext;
+import org.apache.tuscany.core.context.EventContext;
+import org.apache.tuscany.core.context.webapp.HTTPSessionExpirationListener;
+import org.apache.tuscany.core.context.webapp.TuscanyRequestFilter;
+import org.apache.tuscany.core.context.webapp.TuscanyWebAppRuntime;
+import org.apache.tuscany.core.runtime.RuntimeContext;
+import org.apache.tuscany.core.runtime.RuntimeMonitor;
+import org.apache.tuscany.model.assembly.ModuleComponent;
+
+/**
+ * Responsible for initializing web applications as module components in a Tomcat instance. When a web app is being
+ * loaded in Tomcat, this listener receives a callback to register a corresponding module component and set up the
+ * appropriate Servlet filters in the web context.
+ * <p>
+ * Note that Tomcat loads this class in the standard (common/lib) classloader even though the context classloader is
+ * that of the web app being loaded.
+ */
+public class WebAppLifecycleListener implements LifecycleListener {
+
+ private RuntimeContext runtime;
+
+ private RuntimeMonitor monitor;
+
+ // ----------------------------------
+ // Constructors
+ // ----------------------------------
+
+ public WebAppLifecycleListener() {
+ // locate runtime in the global naming context
+ javax.naming.Context context = null;
+ try {
+ context = (javax.naming.Context) (new InitialContext()).lookup("java:/");
+ runtime = (RuntimeContext) context.lookup(RuntimeBootstrap.RUNTIME_NAME);
+ monitor = runtime.getMonitorFactory().getMonitor(RuntimeMonitor.class);
+ } catch (NamingException e) {
+ // FIXME need bootstrap logging;
+ return;
+ }
+ }
+
+ /**
+ * Callback for receiving web application events. When a web app containing an SCA configuration is initialized, a
+ * module component is created and appropriate SCA filters are set for in the web context. If a web app stop event
+ * is received, the corresponding module component is deregistered from the system.
+ */
+ public void lifecycleEvent(LifecycleEvent event) {
+ String lifecycleEventType = event.getType();
+ Object lifecycleEventSource = event.getSource();
+
+ if (Lifecycle.START_EVENT.equals(lifecycleEventType) && lifecycleEventSource instanceof Context) {
+ // The web app is starting
+ Context context = (Context) lifecycleEventSource;
+ String name = context.getPath().substring(1);
+ try {
+ ModuleComponent moduleComponent = null;// FIXME runtime.loadModuleComponent(name, "sca.module");
+ if (moduleComponent == null) {
+ return; // not an SCA module component
+ }
+ // create the module component
+ runtime.registerModelObject(moduleComponent);
+ AggregateContext aggregateContext = (AggregateContext) runtime.getContext(moduleComponent.getName());
+ TuscanyWebAppRuntime tuscanyRuntime = new TuscanyWebAppRuntime(aggregateContext);
+ context.getServletContext().setAttribute(TuscanyWebAppRuntime.class.getName(), tuscanyRuntime);
+ // Start the runtime and the module component context
+ tuscanyRuntime.start();
+ try {
+ aggregateContext.start();
+ aggregateContext.fireEvent(EventContext.MODULE_START, null);
+ } finally {
+ tuscanyRuntime.stop();
+ }
+ // Set up the SCA web app filter and listener
+ FilterDef def = new FilterDef();
+ def.setDescription("SCA Filter");
+ def.setFilterClass(TuscanyRequestFilter.class.getName());
+ def.setFilterName("__modContext");
+ def.setDisplayName("SCA Filter");
+ FilterMap map = new FilterMap();
+ map.setFilterName("__modContext");
+ map.setURLPattern("/*");
+ context.addFilterDef(def);
+ context.addFilterMap(map);
+ context.addApplicationListener(HTTPSessionExpirationListener.class.getName());
+ } catch (ConfigurationException e) {
+ e.addContextName(name);
+ monitor.log(e);
+ return;
+ } catch (TuscanyRuntimeException e) {
+ e.addContextName(name);
+ monitor.log(e);
+ return;
+ }
+ } else if (Lifecycle.STOP_EVENT.equals(lifecycleEventType) && lifecycleEventSource instanceof Context) {
+ // The web app is stopping
+ Context context = (Context) lifecycleEventSource;
+ // Get the tuscany runtime from the servlet context
+ TuscanyWebAppRuntime tuscanyRuntime = (TuscanyWebAppRuntime) context.getServletContext().getAttribute(
+ TuscanyWebAppRuntime.class.getName());
+ if (tuscanyRuntime == null) {
+ return; // not an SCA module
+ }
+ try {
+ // Stop the module context
+ tuscanyRuntime.start();
+ AggregateContext aggregateContext = tuscanyRuntime.getModuleComponentContext();
+ aggregateContext.fireEvent(EventContext.MODULE_STOP, null);
+ aggregateContext.stop();
+ } catch (TuscanyRuntimeException e) {
+ monitor.log(e);
+ } finally {
+ try {
+ tuscanyRuntime.stop();
+ } catch (TuscanyRuntimeException e) {
+ monitor.log(e);
+ } finally {
+ // Cleanup the servlet context
+ context.getServletContext().removeAttribute(TuscanyWebAppRuntime.class.getName());
+ }
+ }
+
+ }
+ }
+}
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/resources/org/apache/tuscany/tomcat/LocalStrings.properties b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/resources/org/apache/tuscany/tomcat/LocalStrings.properties
new file mode 100644
index 0000000000..213545ecee
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/resources/org/apache/tuscany/tomcat/LocalStrings.properties
@@ -0,0 +1,20 @@
+# Copyright (c) 2006 The Apache Software Foundation or its licensors, as applicable.
+#
+# 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.
+
+runtime.loadSystemFailed = Error loading system configuration:
+runtime.registerSystemFailed = Error registering system configuration:
+runtime.started = Started Tuscany runtime
+runtime.stopped = Stopped Tuscany runtime
+
+tuscanyHost.notContext = Child of a TuscanyHost must be a StandardContext \ No newline at end of file
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/resources/org/apache/tuscany/tomcat/Messages.properties b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/resources/org/apache/tuscany/tomcat/Messages.properties
new file mode 100644
index 0000000000..f926ca6488
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/main/resources/org/apache/tuscany/tomcat/Messages.properties
@@ -0,0 +1,39 @@
+# Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+#
+# 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.
+# ====================================================================
+# To code developer:
+# Do NOT change the properties between this line and the
+# "%%% END OF TRANSLATED PROPERTIES %%%" line.
+# Make a new property name, append to the end of the file and change
+# the code to use the new property.
+# ====================================================================
+
+# =====================================================================
+# %%% END OF TRANSLATED PROPERTIES %%%
+# =====================================================================
+# NLS_MESSAGEFORMAT_ALL
+
+SCA_STARTING =Tuscany: Starting SCA runtime.
+SCA_STARTED =Tuscany: Started SCA runtime.
+SCA_STOPPING =Tuscany: Stopping SCA runtime.
+SCA_STOPPED =Tuscany: Stopped SCA runtime.
+SCA_STARTING_MODULE =Tuscany: Starting SCA module component {0}.
+SCA_LOADED_MODULE =Tuscany: Loaded SCA module {0}.
+SCA_STARTED_MODULE =Tuscany: Started SCA module component {0}.
+SCA_STOPPING_MODULE =Tuscany: Stopping SCA module component {0}.
+SCA_STOPPED_MODULE =Tuscany: Stopped SCA module component {0}.
+SCA_START_MODULE_FAILED =Tuscany: Error starting SCA module component {0}: {1}.
+SCA_STOP_MODULE_FAILED =Tuscany: Error stopping SCA module component {0}: {1}.
+SCA_START_WEBAPP_FAILED =Tuscany: Error starting Web application {0}: {1}.
+SCA_STOP_WEBAPP_FAILED =Tuscany: Error stopping Web application {0}: {1}. \ No newline at end of file
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/AbstractTomcatTest.java b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/AbstractTomcatTest.java
new file mode 100644
index 0000000000..1e9529b965
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/AbstractTomcatTest.java
@@ -0,0 +1,250 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation
+ *
+ * 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.apache.tuscany.tomcat.integration;
+
+import junit.framework.TestCase;
+import org.apache.catalina.Host;
+import org.apache.catalina.Globals;
+import org.apache.catalina.connector.Connector;
+import org.apache.catalina.connector.Request;
+import org.apache.catalina.connector.Response;
+import org.apache.catalina.core.StandardEngine;
+import org.apache.catalina.core.ApplicationFilterFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Enumeration;
+import java.util.Collections;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletOutputStream;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class AbstractTomcatTest extends TestCase {
+ protected Host host;
+ protected MockRequest request;
+ protected MockResponse response;
+ protected StandardEngine engine;
+
+ protected void setupTomcat(File baseDir, Host host) throws Exception {
+ File appBase = new File(baseDir, "webapps").getCanonicalFile();
+
+ // Configure a Tomcat Engine
+ engine = new StandardEngine();
+ engine.setName("Catalina");
+ engine.setDefaultHost("localhost");
+ engine.setBaseDir(baseDir.getAbsolutePath());
+
+ this.host = host;
+ host.setName("localhost");
+ host.setAppBase(appBase.getAbsolutePath());
+ engine.addChild(host);
+
+ // build a empty request/response
+ Connector connector = new Connector("HTTP/1.1");
+ request = new MockRequest();
+ request.setConnector(connector);
+ response = new MockResponse();
+ request.setResponse(response);
+ request.setMethod("POST");
+ request.setScheme("http");
+ }
+
+ public static class MockRequest extends Request {
+ private String method;
+ private String scheme;
+ private String requestURI;
+ private String contentType;
+ private Map<String,String> headers = new HashMap();
+ private ServletInputStream inputStream;
+
+ public void setScheme(String scheme) {
+ this.scheme = scheme;
+ }
+
+ public void setMethod(String method) {
+ this.method = method;
+ }
+
+ public void setRequestURI(String requestURI) {
+ this.requestURI = requestURI;
+ }
+
+ public String getScheme() {
+ return scheme;
+ }
+
+ public String getMethod() {
+ return method;
+ }
+
+ public int getServerPort() {
+ return 80;
+ }
+
+ public String getServerName() {
+ return "localhost";
+ }
+
+ public String getRequestURI() {
+ return requestURI;
+ }
+
+ public void setAttribute(String name, Object value) {
+ if (name.startsWith("org.apache.tomcat.")) {
+ return;
+ }
+ super.setAttribute(name, value);
+ }
+
+ public Object getAttribute(String name) {
+ if (name.equals(Globals.DISPATCHER_TYPE_ATTR)) {
+ return (dispatcherType == null)
+ ? ApplicationFilterFactory.REQUEST_INTEGER
+ : dispatcherType;
+ } else if (name.equals(Globals.DISPATCHER_REQUEST_PATH_ATTR)) {
+ return (requestDispatcherPath == null)
+ ? getRequestPathMB().toString()
+ : requestDispatcherPath.toString();
+ }
+
+ return attributes.get(name);
+ }
+
+ public String getHeader(String name) {
+ return headers.get(name);
+ }
+
+ public Enumeration getHeaderNames() {
+ return Collections.enumeration(headers.keySet());
+ }
+
+ public void setContentType(String contentType) {
+ this.contentType = contentType;
+ }
+
+ public String getContentType() {
+ return contentType;
+ }
+
+ public ServletInputStream getInputStream() throws IOException {
+ return inputStream;
+ }
+
+ public InputStream getStream() {
+ return inputStream;
+ }
+
+ public void setStream(ServletInputStream stream) {
+ inputStream = stream;
+ }
+ }
+
+ public static class MockResponse extends Response {
+ private boolean suspended;
+ private String contentType;
+ private int status;
+ private Map headers = new HashMap();
+ private ServletOutputStream outputStream = new MockOutputStream();
+
+ public boolean isCommitted() {
+ return false;
+ }
+
+ public boolean isAppCommitted() {
+ return false;
+ }
+
+ public void sendAcknowledgement() {
+ }
+
+ public void setSuspended(boolean suspended) {
+ this.suspended = suspended;
+ }
+
+ public boolean isSuspended() {
+ return suspended;
+ }
+
+ public void setStatus(int status, String message) {
+ this.status = status;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public void reset() {
+ }
+
+ public void addHeader(String name, String value) {
+ headers.put(name, value);
+ }
+
+ public String[] getHeaderNames() {
+ return (String[]) headers.keySet().toArray(new String[headers.size()]);
+ }
+
+ public String getContentType() {
+ return contentType;
+ }
+
+ public void setContentType(String contentType) {
+ this.contentType = contentType;
+ }
+
+ public OutputStream getStream() {
+ return outputStream;
+ }
+
+ public ServletOutputStream getOutputStream() throws IOException {
+ return outputStream;
+ }
+ }
+
+ public static class MockInputStream extends ServletInputStream {
+ private final byte[] bytes;
+ private int index;
+
+ public MockInputStream(byte[] bytes) {
+ this.bytes = bytes;
+ }
+
+ public int read() throws IOException {
+ if (index == bytes.length) {
+ return -1;
+ }
+ else {
+ return bytes[index++];
+ }
+ }
+ }
+
+ public static class MockOutputStream extends ServletOutputStream {
+ private ByteArrayOutputStream os = new ByteArrayOutputStream();
+
+ public void write(int b) throws IOException {
+ os.write(b);
+ }
+ }
+}
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TestServlet.java b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TestServlet.java
new file mode 100644
index 0000000000..d81e6cc081
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TestServlet.java
@@ -0,0 +1,50 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * 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.apache.tuscany.tomcat.integration;
+
+import java.io.IOException;
+import javax.servlet.GenericServlet;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.ServletException;
+
+import org.osoa.sca.ModuleContext;
+import org.osoa.sca.CurrentModuleContext;
+
+import org.apache.tuscany.core.runtime.RuntimeContext;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class TestServlet extends GenericServlet {
+
+ public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
+ ModuleContext moduleContext = CurrentModuleContext.getContext();
+ if (moduleContext == null) {
+ throw new ServletException("No module context returned");
+ }
+ String name = moduleContext.getName();
+ if (!"testContext".equals(name)) {
+ throw new ServletException("Invalid module context name: " + name);
+ }
+
+ Object runtime = getServletContext().getAttribute("org.apache.tuscany.core.runtime.RuntimeContext");
+ if (!(runtime instanceof RuntimeContext)) {
+ throw new ServletException("Runtime not bound to org.apache.tuscany.core.runtime.RuntimeContext");
+ }
+ }
+}
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TomcatIntegrationTestCase.java b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TomcatIntegrationTestCase.java
new file mode 100644
index 0000000000..4c3b1516aa
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TomcatIntegrationTestCase.java
@@ -0,0 +1,109 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * 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.apache.tuscany.tomcat.integration;
+
+import org.apache.catalina.Valve;
+import org.apache.catalina.Loader;
+import org.apache.catalina.Wrapper;
+import org.apache.catalina.core.StandardContext;
+import org.apache.catalina.core.StandardWrapper;
+import org.apache.catalina.startup.ContextConfig;
+import org.apache.tuscany.tomcat.TuscanyHost;
+import org.apache.tuscany.tomcat.TuscanyValve;
+import org.apache.tuscany.tomcat.ContainerLoader;
+
+import java.io.File;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class TomcatIntegrationTestCase extends AbstractTomcatTest {
+ protected File app1;
+
+ public void testComponentIntegration() throws Exception {
+ // create the webapp Context
+ StandardContext ctx = new StandardContext();
+ ctx.addLifecycleListener(new ContextConfig());
+ ctx.setName("testContext");
+ ctx.setDocBase(app1.getAbsolutePath());
+
+ // define our test servlet
+ Loader loader = new ContainerLoader(TestServlet.class.getClassLoader());
+ StandardWrapper wrapper = new StandardWrapper();
+ wrapper.setServletClass(TestServlet.class.getName());
+ wrapper.setLoader(loader);
+ ctx.addChild(wrapper);
+
+ host.addChild(ctx);
+ boolean found = false;
+ for (Valve valve: ctx.getPipeline().getValves()) {
+ if (valve instanceof TuscanyValve) {
+ found = true;
+ break;
+ }
+ }
+ assertTrue("TuscanyValve not in pipeline", found);
+
+ request.setContext(ctx);
+ request.setWrapper(wrapper);
+ host.invoke(request, response);
+
+ host.removeChild(ctx);
+ }
+
+ public void testWebServiceIntegration() throws Exception {
+ // create the webapp Context
+ StandardContext ctx = new StandardContext();
+ ctx.addLifecycleListener(new ContextConfig());
+ ctx.setName("testContext");
+ ctx.setDocBase(app1.getAbsolutePath());
+
+ host.addChild(ctx);
+
+ Wrapper wrapper = (Wrapper) ctx.findChild("TuscanyAxis2EntryPointServlet");
+ assertNotNull("No webservice wrapper present", wrapper);
+ request.setContext(ctx);
+ request.setRequestURI("/services/epName");
+ request.setWrapper(wrapper);
+ request.setContentType("text/xml");
+ String xml = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:q0=\"http://helloworldaxis.samples.tuscany.apache.org\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +
+ "<soapenv:Body>\n" +
+ "<q0:getGreetings>\n" +
+ "<q0:in0>hello</q0:in0>\n" +
+ "</q0:getGreetings>\n" +
+ "</soapenv:Body>\n" +
+ "</soapenv:Envelope>\n";
+ request.setStream(new MockInputStream(xml.getBytes("UTF-8")));
+ host.invoke(request, response);
+
+ host.removeChild(ctx);
+ }
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ app1 = new File(getClass().getResource("/app1").toURI());
+ File baseDir = new File(app1, "../../tomcat").getCanonicalFile();
+ setupTomcat(baseDir, new TuscanyHost());
+ engine.start();
+ }
+
+ protected void tearDown() throws Exception {
+ engine.stop();
+ super.tearDown();
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TomcatStandaloneTestCase.java b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TomcatStandaloneTestCase.java
new file mode 100644
index 0000000000..b623b2e7b5
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TomcatStandaloneTestCase.java
@@ -0,0 +1,63 @@
+package org.apache.tuscany.tomcat.integration;
+
+import org.apache.catalina.core.StandardContext;
+import org.apache.catalina.core.StandardWrapper;
+import org.apache.catalina.core.StandardHost;
+import org.apache.catalina.startup.ContextConfig;
+import org.apache.catalina.Valve;
+import org.apache.catalina.Wrapper;
+
+import org.apache.tuscany.tomcat.TuscanyValve;
+import org.apache.tuscany.tomcat.TuscanyHost;
+
+import java.io.File;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class TomcatStandaloneTestCase extends AbstractTomcatTest {
+ protected File app2;
+
+ public void testRuntimeIntegration() throws Exception {
+ StandardContext ctx = new StandardContext();
+
+ // caution: this sets the parent of the webapp loader to the test classloader so it can find TestServlet
+ // anything that relies on the TCCL may not work correctly
+ ClassLoader cl = TestServlet.class.getClassLoader();
+ ctx.setParentClassLoader(cl);
+
+ ctx.addLifecycleListener(new ContextConfig());
+ ctx.setName("testContext");
+ ctx.setDocBase(app2.getAbsolutePath());
+
+ host.addChild(ctx);
+ boolean found = false;
+ for (Valve valve: ctx.getPipeline().getValves()) {
+ if (valve instanceof TuscanyValve) {
+ found = true;
+ break;
+ }
+ }
+ assertFalse("TuscanyValve in pipeline", found);
+
+ request.setContext(ctx);
+ request.setWrapper((Wrapper) ctx.findChild("TestServlet"));
+ host.invoke(request, response);
+
+ host.removeChild(ctx);
+ }
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ app2 = new File(getClass().getResource("/app2").toURI());
+ File baseDir = new File(app2, "../../tomcat").getCanonicalFile();
+ setupTomcat(baseDir, new StandardHost());
+ engine.start();
+ }
+
+ protected void tearDown() throws Exception {
+ engine.stop();
+ super.tearDown();
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app1/WEB-INF/axis2.xml b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app1/WEB-INF/axis2.xml
new file mode 100644
index 0000000000..a38cf9864a
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app1/WEB-INF/axis2.xml
@@ -0,0 +1,167 @@
+<axisconfig name="AxisJava2.0">
+ <!-- ================================================= -->
+ <!-- Parameters -->
+ <!-- ================================================= -->
+ <parameter name="hotdeployment" locked="false">false</parameter>
+ <parameter name="hotupdate" locked="false">false</parameter>
+ <parameter name="enableMTOM" locked="false">false</parameter>
+ <!-- Uncomment this to enable REST support -->
+ <!-- <parameter name="enableREST" locked="false">true</parameter>-->
+
+
+ <parameter name="userName" locked="false">admin</parameter>
+ <parameter name="password" locked="false">axis2</parameter>
+
+ <parameter name="seralizeLocation" locked="false">.</parameter>
+ <hostConfiguration>
+ <ip>127.0.0.1</ip>
+ <port>5555</port>
+ </hostConfiguration>
+
+
+ <!--if you want to extract the service archive file and work with that please uncomment this-->
+ <!--else , it wont extract archive file or does not take into consideration if someone drop-->
+ <!--exploded directory into /service directory-->
+ <!--<parameter name="extractServiceArchive" locked="false">true</parameter>-->
+
+
+ <!-- The way of adding listener to the system-->
+ <!-- <listener class="org.apache.axis2.ObserverIMPL">-->
+ <!-- <parameter name="RSS_URL" locked="false">http://127.0.0.1/rss</parameter>-->
+ <!-- </listener>-->
+
+ <!-- ================================================= -->
+ <!-- Message Receivers -->
+ <!-- ================================================= -->
+ <!--This is the Deafult Message Receiver for the system , if you want to have MessageReceivers for -->
+ <!--all the other MEP implement it and add the correct entry to here , so that you can refer from-->
+ <!--any operation -->
+ <!--Note : You can ovride this for particular service by adding the same element with your requirement-->
+ <messageReceivers>
+ <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
+ class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>
+ <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
+ class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
+ </messageReceivers>
+ <!-- ================================================= -->
+ <!-- Transport Ins -->
+ <!-- ================================================= -->
+ <transportReceiver name="http" class="org.apache.axis2.transport.http.SimpleHTTPServer">
+ <parameter name="port" locked="false">6060</parameter>
+ </transportReceiver>
+
+ <!-- Uncomment this one with the appropriate papameters to enable the SMTP transport Receiver
+ <transportReceiver name="mail" class="org.apache.axis2.transport.mail.SimpleMailListener">
+ <parameter name="transport.mail.pop3.host" locked="false">127.0.0.1</parameter>
+ <parameter name="transport.mail.pop3.user" locked="false">axis2</parameter>
+ <parameter name="transport.mail.pop3.password" locked="false">axis2</parameter>
+ <parameter name="transport.mail.pop3.port" locked="false">110</parameter>
+ <parameter name="transport.mail.replyToAddress" locked="false">axis2@127.0.0.1</parameter>
+ </transportReceiver> -->
+
+ <!--REMOVED FOR TUSCANY transportReceiver name="tcp" class="org.apache.axis2.transport.tcp.TCPServer">
+ <parameter name="port" locked="false">6060</parameter>
+ </transportReceiver -->
+
+ <!--REMOVED FOR TUSCANY transportReceiver name="jms" class="org.apache.axis2.transport.jms.SimpleJMSListener">
+ <parameter name="transport.jms.Destination" locked="false">dynamicQueues/FOO</parameter>
+ <parameter name="java.naming.factory.initial" locked="false">
+ org.activemq.jndi.ActiveMQInitialContextFactory</parameter>
+ <parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter>
+ </transportReceiver>
+ -->
+
+ <!-- ================================================= -->
+ <!-- Transport Outs -->
+ <!-- ================================================= -->
+
+ <!--REMOVED FOR TUSCANY transportSender name="tcp" class="org.apache.axis2.transport.tcp.TCPTransportSender"/> -->
+ <transportSender name="local" class="org.apache.axis2.transport.local.LocalTransportSender"/>
+ <!--REMOVED FOR TUSCANY transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender"/> -->
+ <transportSender name="http" class="org.apache.axis2.transport.http.CommonsHTTPTransportSender">
+ <parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter>
+ <parameter name="Transfer-Encoding" locked="false">chunked</parameter>
+ </transportSender>
+ <transportSender name="https"
+ class="org.apache.axis2.transport.http.CommonsHTTPTransportSender">
+ <parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter>
+ <parameter name="Transfer-Encoding" locked="false">chunked</parameter>
+ </transportSender>
+
+ <!-- Uncomment this one with the appropriate papameters to enable the SMTP transport Receiver
+ <transportSender name="mailto" class="org.apache.axis2.transport.mail.MailTransportSender">
+ <parameter name="transport.mail.smtp.host" locked="false">127.0.0.1</parameter>
+ <parameter name="transport.mail.smtp.user" locked="false">axis2</parameter>
+ <parameter name="transport.mail.smtp.password" locked="false">axis2</parameter>
+ <parameter name="transport.mail.smtp.port" locked="false">25</parameter>
+ </transportSender>
+ -->
+
+ <!-- ================================================= -->
+ <!-- Global Modules -->
+ <!-- ================================================= -->
+ <!-- Comment this to disable Addressing -->
+ <!--REMOVED FOR TUSCANY module ref="addressing"/> -->
+
+
+ <!--Configuring module , providing parameters for modules whether they refer or not-->
+ <!--<moduleConfig name="addressing">-->
+ <!--<parameter name="addressingPara" locked="false">N/A</parameter>-->
+ <!--</moduleConfig>-->
+
+ <!-- ================================================= -->
+ <!-- Phases -->
+ <!-- ================================================= -->
+ <phaseOrder type="inflow">
+ <!-- System pre defined phases -->
+ <phase name="TransportIn"/>
+ <phase name="PreDispatch"/>
+ <phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase">
+ <handler name="AddressingBasedDispatcher"
+ class="org.apache.axis2.engine.AddressingBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+
+ <handler name="RequestURIBasedDispatcher"
+ class="org.apache.axis2.engine.RequestURIBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+
+ <handler name="SOAPActionBasedDispatcher"
+ class="org.apache.axis2.engine.SOAPActionBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+
+ <handler name="SOAPMessageBodyBasedDispatcher"
+ class="org.apache.axis2.engine.SOAPMessageBodyBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+ <handler name="InstanceDispatcher"
+ class="org.apache.axis2.engine.InstanceDispatcher">
+ <order phase="PostDispatch"/>
+ </handler>
+ </phase>
+ <!-- System pre defined phases -->
+ <!-- After Postdispatch phase module author or or service author can add any phase he want -->
+ <phase name="userphase1"/>
+ </phaseOrder>
+ <phaseOrder type="outflow">
+ <!-- user can add his own phases to this area -->
+ <phase name="userphase1"/>
+ <!--system predefined phase-->
+ <!--these phase will run irrespective of the service-->
+ <phase name="PolicyDetermination"/>
+ <phase name="MessageOut"/>
+ </phaseOrder>
+ <phaseOrder type="INfaultflow">
+ <!-- user can add his own phases to this area -->
+ <phase name="userphase1"/>
+ </phaseOrder>
+ <phaseOrder type="Outfaultflow">
+ <!-- user can add his own phases to this area -->
+ <phase name="userphase1"/>
+ <phase name="PolicyDetermination"/>
+ <phase name="MessageOut"/>
+ </phaseOrder>
+</axisconfig>
+
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app1/WEB-INF/classes/sca.module b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app1/WEB-INF/classes/sca.module
new file mode 100644
index 0000000000..4273a8171c
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app1/WEB-INF/classes/sca.module
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 BEA Sytems Inc.
+ Copyright (c) 2005 International Business Machines
+
+ 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.
+ -->
+<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ name="testModule">
+
+</module>
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app1/WEB-INF/web.xml b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app1/WEB-INF/web.xml
new file mode 100644
index 0000000000..a363db8e12
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app1/WEB-INF/web.xml
@@ -0,0 +1,6 @@
+<!DOCTYPE web-app
+ PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+ "http://java.sun.com/dtd/web-app_2_3.dtd">
+
+<web-app>
+</web-app> \ No newline at end of file
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app1/index.html b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app1/index.html
new file mode 100644
index 0000000000..55ecbd81ba
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app1/index.html
@@ -0,0 +1,3 @@
+<html>
+<body>Hello World</body>
+</html> \ No newline at end of file
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app2/WEB-INF/classes/sca.module b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app2/WEB-INF/classes/sca.module
new file mode 100644
index 0000000000..fd1d63a7a6
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app2/WEB-INF/classes/sca.module
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 BEA Sytems Inc.
+ Copyright (c) 2005 International Business Machines
+
+ 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.
+ -->
+<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ name="testModule">
+
+</module>
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app2/WEB-INF/web.xml b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app2/WEB-INF/web.xml
new file mode 100644
index 0000000000..abf92d4ca7
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app2/WEB-INF/web.xml
@@ -0,0 +1,29 @@
+<!DOCTYPE web-app
+ PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+ "http://java.sun.com/dtd/web-app_2_3.dtd">
+
+<web-app>
+ <context-param>
+ <param-name>org.apache.tuscany.core.webapp.ModuleComponentName</param-name>
+ <param-value>testContext</param-value>
+ </context-param>
+ <listener>
+ <listener-class>org.apache.tuscany.core.webapp.TuscanyServletListener</listener-class>
+ </listener>
+ <servlet>
+ <servlet-name>TestServlet</servlet-name>
+ <servlet-class>org.apache.tuscany.tomcat.integration.TestServlet</servlet-class>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>TestServlet</servlet-name>
+ <url-pattern>/servlet</url-pattern>
+ </servlet-mapping>
+ <filter>
+ <filter-name>TuscanyFilter</filter-name>
+ <filter-class>org.apache.tuscany.core.webapp.TuscanyRequestFilter</filter-class>
+ </filter>
+ <filter-mapping>
+ <filter-name>TuscanyFilter</filter-name>
+ <servlet-name>TestServlet</servlet-name>
+ </filter-mapping>
+</web-app> \ No newline at end of file
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app2/index.html b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app2/index.html
new file mode 100644
index 0000000000..55ecbd81ba
--- /dev/null
+++ b/sca-java-1.x/tags/java-stable-20060304/sca/tomcat/src/test/resources/app2/index.html
@@ -0,0 +1,3 @@
+<html>
+<body>Hello World</body>
+</html> \ No newline at end of file