You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2008/07/18 22:47:24 UTC
svn commit: r678033 [2/2] - in /tuscany/java/sca/modules: ./
extensibility-eclipse/ extensibility-osgi/
extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/
implementation-node-osgi-runtime/ implementation-node-osgi-runtime/src/ ...
Added: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/osgi/webapp/NodeWebAppServletHost.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-node-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/osgi/webapp/NodeWebAppServletHost.java?rev=678033&view=auto
==============================================================================
--- tuscany/java/sca/modules/implementation-node-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/osgi/webapp/NodeWebAppServletHost.java (added)
+++ tuscany/java/sca/modules/implementation-node-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/osgi/webapp/NodeWebAppServletHost.java Fri Jul 18 13:47:22 2008
@@ -0,0 +1,392 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.sca.implementation.node.osgi.webapp;
+
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.net.InetAddress;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterConfig;
+import javax.servlet.RequestDispatcher;
+import javax.servlet.Servlet;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.host.http.ServletHost;
+import org.apache.tuscany.sca.host.http.ServletHostExtensionPoint;
+import org.apache.tuscany.sca.host.http.ServletMappingException;
+import org.apache.tuscany.sca.implementation.node.osgi.launcher.NodeImplementationLauncherUtil;
+import org.apache.tuscany.sca.node.SCAClient;
+import org.apache.tuscany.sca.node.SCANode2;
+import org.apache.tuscany.sca.node.SCANode2Factory;
+
+/**
+ * ServletHost implementation for use in a Webapp Node environment.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NodeWebAppServletHost implements ServletHost, Filter {
+ private static final Logger logger = Logger.getLogger(NodeWebAppServletHost.class.getName());
+
+ private static final NodeWebAppServletHost servletHost = new NodeWebAppServletHost();
+
+ private Map<String, Servlet> servlets = new HashMap<String, Servlet>();
+ private SCANode2 node;
+
+ private String contextPath = "/";
+ private int defaultPort = 8080;
+
+ /**
+ * Constructs a new NodeWebAppServletHost.
+ */
+ private NodeWebAppServletHost() {
+ }
+
+ /**
+ * Returns the Servlet host for the current Web app.
+ *
+ * @return
+ */
+ public static NodeWebAppServletHost servletHost() {
+ return servletHost;
+ }
+
+ /**
+ * Initialize the Servlet host.
+ *
+ * @param filterConfig
+ * @throws ServletException
+ */
+ public void init(final FilterConfig filterConfig) throws ServletException {
+
+ // Create a Servlet config wrapping the given filter config
+ ServletConfig servletConfig = servletConfig(filterConfig);
+
+ // Get the Servlet context
+ ServletContext servletContext = servletConfig.getServletContext();
+
+ // Initialize the context path
+ contextPath = contextPath(servletContext);
+
+ // Derive the node name from the Webapp context path
+ String nodeName = contextPath;
+ if (nodeName.startsWith("/")) {
+ nodeName = nodeName.substring(1);
+ }
+ if (nodeName.endsWith("/")) {
+ nodeName = nodeName.substring(0, nodeName.length() - 1);
+ }
+
+ // Determine the node configuration URI
+ String nodeConfiguration = NodeImplementationLauncherUtil.nodeConfigurationURI(nodeName);
+
+ // Create the SCA node
+ SCANode2Factory nodeFactory = SCANode2Factory.newInstance();
+ node = nodeFactory.createSCANodeFromURL(nodeConfiguration);
+
+ // Register the Servlet host
+ ServletHostExtensionPoint servletHosts = servletHosts(node);
+ servletHosts.getServletHosts().clear();
+ servletHosts.addServletHost(servletHost);
+
+ // Save the node in the Servlet context
+ servletContext.setAttribute(SCAClient.class.getName(), node);
+
+ // Start the node
+ node.start();
+
+ // Initialize the registered Servlets
+ for (Servlet servlet : servlets.values()) {
+ servlet.init(servletConfig);
+ }
+ }
+
+ public void addServletMapping(String suri, Servlet servlet) throws ServletMappingException {
+ URI pathURI = URI.create(suri);
+
+ // Make sure that the path starts with a /
+ suri = pathURI.getPath();
+ if (!suri.startsWith("/")) {
+ suri = '/' + suri;
+ }
+
+ if (!suri.startsWith(contextPath)) {
+ suri = contextPath + suri;
+ }
+
+ // In a webapp just use the given path and ignore the host and port
+ // as they are fixed by the Web container
+ servlets.put(suri, servlet);
+
+ logger.info("Added Servlet mapping: " + suri);
+ }
+
+ public Servlet removeServletMapping(String suri) throws ServletMappingException {
+ URI pathURI = URI.create(suri);
+
+ // Make sure that the path starts with a /
+ suri = pathURI.getPath();
+ if (!suri.startsWith("/")) {
+ suri = '/' + suri;
+ }
+
+ if (!suri.startsWith(contextPath)) {
+ suri = contextPath + suri;
+ }
+
+ // In a webapp just use the given path and ignore the host and port
+ // as they are fixed by the Web container
+ return servlets.remove(suri);
+ }
+
+ public Servlet getServletMapping(String suri) throws ServletMappingException {
+ if (!suri.startsWith("/")) {
+ suri = '/' + suri;
+ }
+
+ if (!suri.startsWith(contextPath)) {
+ suri = contextPath + suri;
+ }
+
+ // Get the Servlet mapped to the given path
+ Servlet servlet = servlets.get(suri);
+ return servlet;
+ }
+
+ public URL getURLMapping(String suri) throws ServletMappingException {
+ URI uri = URI.create(suri);
+
+ // Get the URI scheme and port
+ String scheme = uri.getScheme();
+ if (scheme == null) {
+ scheme = "http";
+ }
+ int portNumber = uri.getPort();
+ if (portNumber == -1) {
+ portNumber = defaultPort;
+ }
+
+ // Get the host
+ String host;
+ try {
+ host = InetAddress.getLocalHost().getHostName();
+ } catch (UnknownHostException e) {
+ host = "localhost";
+ }
+
+ // Construct the URL
+ String path = uri.getPath();
+ if (!path.startsWith("/")) {
+ path = '/' + path;
+ }
+
+ if (contextPath != null && !path.startsWith(contextPath)) {
+ path = contextPath + path;
+ }
+
+ URL url;
+ try {
+ url = new URL(scheme, host, portNumber, path);
+ } catch (MalformedURLException e) {
+ throw new ServletMappingException(e);
+ }
+ return url;
+ }
+
+ public RequestDispatcher getRequestDispatcher(String suri) throws ServletMappingException {
+
+ // Make sure that the path starts with a /
+ if (!suri.startsWith("/")) {
+ suri = '/' + suri;
+ }
+
+ suri = contextPath + suri;
+
+ // Get the Servlet mapped to the given path
+ Servlet servlet = servlets.get(suri);
+ if (servlet != null) {
+ return new NodeWebAppRequestDispatcher(suri, servlet);
+ }
+
+ for (Map.Entry<String, Servlet> entry : servlets.entrySet()) {
+ String servletPath = entry.getKey();
+ if (servletPath.endsWith("*")) {
+ servletPath = servletPath.substring(0, servletPath.length() - 1);
+ if (suri.startsWith(servletPath)) {
+ return new NodeWebAppRequestDispatcher(entry.getKey(), entry.getValue());
+ } else {
+ if ((suri + "/").startsWith(servletPath)) {
+ return new NodeWebAppRequestDispatcher(entry.getKey(), entry.getValue());
+ }
+ }
+ }
+ }
+
+ // No Servlet found
+ return null;
+ }
+
+ /**
+ * Destroy the Servlet host.
+ *
+ * @throws ServletException
+ */
+ public void destroy() {
+
+ // Destroy the registered Servlets
+ for (Servlet servlet : servlets.values()) {
+ servlet.destroy();
+ }
+
+ // Stop the node
+ if (node != null) {
+ node.stop();
+ }
+ }
+
+ public void doFilter(ServletRequest request, ServletResponse response, javax.servlet.FilterChain chain)
+ throws IOException, ServletException {
+
+ // Get the Servlet path
+ HttpServletRequest httpRequest = (HttpServletRequest)request;
+ String path = httpRequest.getPathInfo();
+ if (path == null) {
+ path = httpRequest.getServletPath();
+ }
+ if (path == null) {
+ path = "/";
+ }
+
+ // Get a request dispatcher for the Servlet mapped to that path
+ RequestDispatcher dispatcher = getRequestDispatcher(path);
+ if (dispatcher != null) {
+
+ // Let the dispatcher forward the request to the Servlet
+ dispatcher.forward(request, response);
+
+ } else {
+
+ // Proceed down the filter chain
+ chain.doFilter(request, response);
+ }
+ }
+
+ public void setDefaultPort(int port) {
+ defaultPort = port;
+ }
+
+ public int getDefaultPort() {
+ return defaultPort;
+ }
+
+ public String getContextPath() {
+ return contextPath;
+ }
+
+ public void setContextPath(String path) {
+ //this.contextPath = path;
+ }
+
+ /**
+ * Initializes the contextPath
+ * The 2.5 Servlet API has a getter for this, for pre 2.5 Servlet
+ * containers use an init parameter.
+ */
+ private static String contextPath(ServletContext context) {
+ String contextPath = "/";
+
+ // The getContextPath() is introduced since Servlet 2.5
+ Method m;
+ try {
+ // Try to get the method anyway since some ServletContext impl has this method even before 2.5
+ m = context.getClass().getMethod("getContextPath", new Class[] {});
+ contextPath = (String)m.invoke(context, new Object[] {});
+ } catch (Exception e) {
+ contextPath = context.getInitParameter("contextPath");
+ if (contextPath == null) {
+ logger.warning("Servlet level is: " + context.getMajorVersion() + "." + context.getMinorVersion());
+ throw new IllegalStateException(
+ "'contextPath' init parameter must be set for pre-2.5 servlet container");
+ }
+ }
+
+ logger.info("ContextPath: " + contextPath);
+ return contextPath;
+ }
+
+ /**
+ * Returns the Servlet host extension point used by the given node.
+ *
+ * @return
+ */
+ private static ServletHostExtensionPoint servletHosts(SCANode2 node) {
+ //FIXME Need a clean way to get the extension point registry
+ // from the node
+ ExtensionPointRegistry registry;
+ try {
+ registry = (ExtensionPointRegistry)node.getClass().getMethod("getExtensionPointRegistry").invoke(node);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ ServletHostExtensionPoint servletHosts = registry.getExtensionPoint(ServletHostExtensionPoint.class);
+ return servletHosts;
+ }
+
+ /**
+ * Returns a Servlet config wrapping a filter config.
+ *
+ * @param filterConfig
+ * @return
+ */
+ private static ServletConfig servletConfig(final FilterConfig filterConfig) {
+ ServletConfig servletConfig = new ServletConfig() {
+ public String getInitParameter(String name) {
+ return filterConfig.getInitParameter(name);
+ }
+
+ public Enumeration getInitParameterNames() {
+ return filterConfig.getInitParameterNames();
+ }
+
+ public ServletContext getServletContext() {
+ return filterConfig.getServletContext();
+ }
+
+ public String getServletName() {
+ return filterConfig.getFilterName();
+ }
+ };
+ return servletConfig;
+ }
+}
Propchange: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/osgi/webapp/NodeWebAppServletHost.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/osgi/webapp/NodeWebAppServletHost.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-node-osgi-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory?rev=678033&view=auto
==============================================================================
--- tuscany/java/sca/modules/implementation-node-osgi-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory (added)
+++ tuscany/java/sca/modules/implementation-node-osgi-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory Fri Jul 18 13:47:22 2008
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+
+# Implementation class for the implementation extension
+org.apache.tuscany.sca.implementation.node.osgi.provider.NodeImplementationProviderFactory;model=org.apache.tuscany.sca.implementation.node.NodeImplementation
Added: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/hello/HelloWorld.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/hello/HelloWorld.java?rev=678033&view=auto
==============================================================================
--- tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/hello/HelloWorld.java (added)
+++ tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/hello/HelloWorld.java Fri Jul 18 13:47:22 2008
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 hello;
+
+import org.osoa.sca.annotations.Remotable;
+
+/**
+ * HelloWorld interface
+ */
+@Remotable
+public interface HelloWorld {
+ String hello(String name);
+}
Propchange: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/hello/HelloWorld.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/hello/HelloWorld.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/hello/HelloWorldImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/hello/HelloWorldImpl.java?rev=678033&view=auto
==============================================================================
--- tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/hello/HelloWorldImpl.java (added)
+++ tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/hello/HelloWorldImpl.java Fri Jul 18 13:47:22 2008
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 hello;
+
+/**
+ * HelloWorldImpl
+ */
+public class HelloWorldImpl implements HelloWorld {
+ public String hello(String name) {
+ System.out.println("Hello: " + name);
+ return "Hello, " + name;
+ }
+}
Propchange: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/hello/HelloWorldImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/hello/HelloWorldImpl.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/org/apache/tuscany/sca/implementation/node/osgi/LauncherBundleActivatorTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/org/apache/tuscany/sca/implementation/node/osgi/LauncherBundleActivatorTestCase.java?rev=678033&view=auto
==============================================================================
--- tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/org/apache/tuscany/sca/implementation/node/osgi/LauncherBundleActivatorTestCase.java (added)
+++ tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/org/apache/tuscany/sca/implementation/node/osgi/LauncherBundleActivatorTestCase.java Fri Jul 18 13:47:22 2008
@@ -0,0 +1,166 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.sca.implementation.node.osgi;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.felix.framework.Felix;
+import org.apache.felix.framework.cache.BundleCache;
+import org.apache.felix.framework.util.FelixConstants;
+import org.apache.tuscany.sca.extensibility.ServiceDiscovery;
+import org.apache.tuscany.sca.extensibility.osgi.OSGiServiceDiscoverer;
+import org.apache.tuscany.sca.implementation.node.osgi.launcher.LauncherBundleActivator;
+import org.apache.tuscany.sca.node.SCANode2Factory;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+
+/**
+ *
+ */
+public class LauncherBundleActivatorTestCase {
+ private static Felix felix;
+ // private static OSGiServiceDiscoverer discoverer;
+ private static LauncherBundleActivator activator;
+
+ private final static String systemPackages =
+ "org.osgi.framework; version=1.3.0," + "org.osgi.service.packageadmin; version=1.2.0, "
+ + "org.osgi.service.startlevel; version=1.0.0, "
+ + "org.osgi.service.url; version=1.0.0, "
+ + "org.osgi.util.tracker; version=1.3.2, "
+ + "javax.xml, "
+ + "javax.xml.datatype, "
+ + "javax.xml.namespace, "
+ + "javax.xml.parsers, "
+ + "javax.xml.transform, "
+ + "javax.xml.transform.dom, "
+ + "javax.xml.transform.sax, "
+ + "javax.xml.transform.stream, "
+ + "javax.xml.validation, "
+ + "javax.xml.xpath, "
+ + "javax.xml.stream, "
+ + "javax.sql,"
+ + "org.w3c.dom, "
+ + "org.xml.sax, "
+ + "org.xml.sax.ext, "
+ + "org.xml.sax.helpers, "
+ + "javax.security.auth, "
+ + "javax.security.auth.login, "
+ + "javax.security.auth.callback, "
+ + "javax.naming, "
+ + "javax.naming.spi, "
+ + "javax.naming.directory, "
+ + "javax.management, "
+ + "javax.imageio, "
+ + "sun.misc, "
+ + "javax.net, "
+ + "javax.crypto, "
+ + "javax.rmi, "
+ + "javax.transaction, "
+ + "javax.transaction.xa";
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ // Create a configuration property map.
+ Map<String, String> configMap = new HashMap<String, String>();
+ // Configure the Felix instance to be embedded.
+ configMap.put(FelixConstants.EMBEDDED_EXECUTION_PROP, "true");
+ // Add core OSGi packages to be exported from the class path
+ // via the system bundle.
+ configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES, systemPackages);
+ // Explicitly specify the directory to use for caching bundles.
+ configMap.put(BundleCache.CACHE_PROFILE_DIR_PROP, "target/.felix");
+ List<BundleActivator> list = new ArrayList<BundleActivator>();
+
+ // Now create an instance of the framework with
+ // our configuration properties and activator.
+ felix = new Felix(configMap, list);
+
+ // Now start Felix instance.
+ felix.start();
+ BundleContext context = felix.getBundleContext();
+// discoverer = new OSGiServiceDiscoverer(context);
+// ServiceDiscovery.setServiceDiscoverer(discoverer);
+
+ System.setProperty("TUSCANY_HOME", "target");
+ activator = new LauncherBundleActivator();
+ activator.start(context);
+ }
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ if (felix != null) {
+ // Uninstall the bundle to clean up the cache
+ activator.stop(felix.getBundleContext());
+ felix.stop();
+ }
+ }
+
+ @Test
+ public void testLauncher() throws Exception {
+ String className = SCANode2Factory.class.getName();
+ Map<String, Bundle> bundles = new HashMap<String, Bundle>();
+
+ for (Bundle b : felix.getBundleContext().getBundles()) {
+ bundles.put(b.getSymbolicName(), b);
+ // b.start();
+ System.out.println(OSGiServiceDiscoverer.toString(b));
+ }
+ Bundle b1 = bundles.get("org.apache.tuscany.sca.extensibility.osgi");
+ Class<?> discovererClass = b1.loadClass(OSGiServiceDiscoverer.class.getName());
+ Thread.currentThread().setContextClassLoader(discovererClass.getClassLoader());
+
+ Constructor<?> ctor = discovererClass.getConstructor(BundleContext.class);
+ Object discoverer = ctor.newInstance(felix.getBundleContext());
+
+ Class<?> serviceDiscoveryClass = b1.loadClass(ServiceDiscovery.class.getName());
+ Method set = serviceDiscoveryClass.getMethod("setServiceDiscoverer", discovererClass.getInterfaces()[0]);
+ set.invoke(null, discoverer);
+
+ Bundle b2 = bundles.get("org.apache.tuscany.sca.node2.api");
+ // b2.start();
+ Class<?> factory = b2.loadClass(className);
+ Method newInstance = factory.getMethod("newInstance");
+ Object instance = newInstance.invoke(null);
+ Method create = instance.getClass().getMethod("createSCANodeFromClassLoader", String.class, ClassLoader.class);
+ Object node = create.invoke(instance, "HelloWorld.composite", getClass().getClassLoader());
+ Method start = node.getClass().getMethod("start");
+ start.invoke(node);
+ Method stop = node.getClass().getMethod("stop");
+ stop.invoke(node);
+
+ }
+
+}
Propchange: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/org/apache/tuscany/sca/implementation/node/osgi/LauncherBundleActivatorTestCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/org/apache/tuscany/sca/implementation/node/osgi/LauncherBundleActivatorTestCase.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/org/apache/tuscany/sca/implementation/node/osgi/NodeImplementationTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/org/apache/tuscany/sca/implementation/node/osgi/NodeImplementationTestCase.java?rev=678033&view=auto
==============================================================================
--- tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/org/apache/tuscany/sca/implementation/node/osgi/NodeImplementationTestCase.java (added)
+++ tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/org/apache/tuscany/sca/implementation/node/osgi/NodeImplementationTestCase.java Fri Jul 18 13:47:22 2008
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.sca.implementation.node.osgi;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.sca.node.SCANode2;
+import org.apache.tuscany.sca.node.SCANode2Factory;
+
+/**
+ * Test case for node component implementations.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NodeImplementationTestCase extends TestCase {
+
+ private SCANode2 node;
+
+ @Override
+ protected void setUp() throws Exception {
+ node = SCANode2Factory.newInstance().createSCANodeFromClassLoader("TestNode.composite", null);
+ node.start();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ if (node != null) {
+ node.stop();
+ }
+ }
+
+ public void testNode() {
+ }
+
+}
Propchange: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/org/apache/tuscany/sca/implementation/node/osgi/NodeImplementationTestCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/java/org/apache/tuscany/sca/implementation/node/osgi/NodeImplementationTestCase.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/resources/HelloWorld.composite
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/resources/HelloWorld.composite?rev=678033&view=auto
==============================================================================
--- tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/resources/HelloWorld.composite (added)
+++ tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/resources/HelloWorld.composite Fri Jul 18 13:47:22 2008
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+-->
+<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"
+ targetNamespace="http://sample/composite"
+ xmlns:sc="http://sample/composite"
+ name="HelloWorld">
+
+ <component name="HelloWorld">
+ <implementation.java class="hello.HelloWorldImpl"/>
+ </component>
+
+</composite>
Added: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/resources/TestComposite.composite
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/resources/TestComposite.composite?rev=678033&view=auto
==============================================================================
--- tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/resources/TestComposite.composite (added)
+++ tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/resources/TestComposite.composite Fri Jul 18 13:47:22 2008
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+-->
+<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"
+ targetNamespace="http://sample/composite"
+ xmlns:sc="http://sample/composite"
+ name="TestComposite">
+
+ <component name="TestComponent">
+ </component>
+
+</composite>
Added: tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/resources/TestNode.composite
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/resources/TestNode.composite?rev=678033&view=auto
==============================================================================
--- tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/resources/TestNode.composite (added)
+++ tuscany/java/sca/modules/implementation-node-osgi-runtime/src/test/resources/TestNode.composite Fri Jul 18 13:47:22 2008
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+-->
+<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"
+ targetNamespace="http://sample/node"
+ xmlns:sc="http://sample/composite"
+ name="TestNode">
+
+ <component name="TestNode">
+ <tuscany:implementation.node uri="TestNode" composite="sc:TestComposite"/>
+ </component>
+
+</composite>
Modified: tuscany/java/sca/modules/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/pom.xml?rev=678033&r1=678032&r2=678033&view=diff
==============================================================================
--- tuscany/java/sca/modules/pom.xml (original)
+++ tuscany/java/sca/modules/pom.xml Fri Jul 18 13:47:22 2008
@@ -136,6 +136,7 @@
<module>implementation-java-runtime</module>
<module>implementation-node</module>
<module>implementation-node-runtime</module>
+ <module>implementation-node-osgi-runtime</module>
<module>implementation-notification</module>
<module>implementation-osgi</module>
<module>implementation-resource</module>