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>