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/09/10 00:24:55 UTC

svn commit: r693637 - in /tuscany/java/sca/modules: contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/ extensibility-equinox/src/test/java/org...

Author: rfeng
Date: Tue Sep  9 15:24:55 2008
New Revision: 693637

URL: http://svn.apache.org/viewvc?rev=693637&view=rev
Log:
Use bundle.getResources to discover services
Run the test case within OSGi

Added:
    tuscany/java/sca/modules/node-launcher-equinox/src/test/java/hello/HelloWorldClient.java   (with props)
Modified:
    tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassReferenceModelResolver.java
    tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoverer.java
    tuscany/java/sca/modules/extensibility-equinox/src/test/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscovererTestCase.java
    tuscany/java/sca/modules/extensibility-equinox/src/test/resources/test-bundle.jar
    tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscovery.java
    tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java
    tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java
    tuscany/java/sca/modules/node-launcher-equinox/src/test/java/hello/HelloWorldImpl.java
    tuscany/java/sca/modules/node-launcher-equinox/src/test/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherTestCase.java
    tuscany/java/sca/modules/node-launcher-equinox/src/test/resources/HelloWorld.composite

Modified: tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassReferenceModelResolver.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassReferenceModelResolver.java?rev=693637&r1=693636&r2=693637&view=diff
==============================================================================
--- tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassReferenceModelResolver.java (original)
+++ tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassReferenceModelResolver.java Tue Sep  9 15:24:55 2008
@@ -62,7 +62,7 @@
                 //        return Thread.currentThread().getContextClassLoader();
                 //    }
                 //});
-                ClassLoader contextClassLoader = ServiceDiscovery.class.getClassLoader();
+                ClassLoader contextClassLoader = ServiceDiscovery.getInstance().getServiceDiscoverer().getClass().getClassLoader();
                 cl = new ContributionClassLoader(contribution, contextClassLoader);
                 contribution.setClassLoader(cl);
             }

Modified: tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoverer.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoverer.java?rev=693637&r1=693636&r2=693637&view=diff
==============================================================================
--- tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoverer.java (original)
+++ tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoverer.java Tue Sep  9 15:24:55 2008
@@ -28,6 +28,9 @@
 import java.security.PrivilegedAction;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -44,7 +47,7 @@
 /**
  * A ServiceDiscoverer that find META-INF/services/... in installed bundles
  *
- * @version $Rev: $ $Date: $
+ * @version $Rev$ $Date$
  */
 public class EquinoxServiceDiscoverer implements ServiceDiscoverer {
     private static final Logger logger = Logger.getLogger(EquinoxServiceDiscoverer.class.getName());
@@ -182,67 +185,90 @@
         serviceName = "META-INF/services/" + serviceName;
 
         for (Bundle bundle : context.getBundles()) {
-            final URL url = bundle.getEntry(serviceName);
-            if (url == null) {
+            if (bundle.getBundleId() == 0) {
+                // Skip system bundle as it has access to the application classloader
                 continue;
             }
-            if (debug) {
-                logger.fine("Reading service provider file: " + url.toExternalForm());
-            }
+            Enumeration<URL> urls = null;
             try {
-                // Allow privileged access to open URL stream. Add FilePermission to added to security
-                // policy file.
-                InputStream is;
-                try {
-                    is = AccessController.doPrivileged(new PrivilegedExceptionAction<InputStream>() {
-                        public InputStream run() throws IOException {
-                            return url.openStream();
-                        }
-                    });
-                } catch (PrivilegedActionException e) {
-                    throw (IOException)e.getException();
+                // Use getResources to find resources on the classpath of the bundle
+                // Please note if there is an DynamicImport-Package=*, and another bundle
+                // exports the resource package, there is a possiblity that it doesn't
+                // find the containing entry
+                urls = bundle.getResources(serviceName);
+                if (urls == null) {
+                    URL entry = bundle.getEntry(serviceName);
+                    if (entry != null) {
+                        urls = Collections.enumeration(Arrays.asList(entry));
+                    }
                 }
-                BufferedReader reader = null;
-                try {
-                    reader = new BufferedReader(new InputStreamReader(is));
-                    int count = 0;
-                    while (true) {
-                        String line = reader.readLine();
-                        if (line == null)
-                            break;
-                        line = line.trim();
-                        if (!line.startsWith("#") && !"".equals(line)) {
-                            String reg = line.trim();
-                            if (debug) {
-                                logger.fine("Registering service provider: " + reg);
-                            }
+            } catch (IOException e) {
+                logger.log(Level.SEVERE, e.getMessage(), e);
+            }
+            if (urls == null) {
+                continue;
+            }
+            while (urls.hasMoreElements()) {
+                final URL url = urls.nextElement();
 
-                            Map<String, String> attributes = parseServiceDeclaration(reg);
-                            String className = attributes.get("class");
-                            if (className == null) {
-                                // Add a unique class name to prevent equals() from returning true
-                                className = "_class_" + count;
-                                count++;
+                if (debug) {
+                    logger.fine("Reading service provider file: " + url.toExternalForm());
+                }
+                try {
+                    // Allow privileged access to open URL stream. Add FilePermission to added to security
+                    // policy file.
+                    InputStream is;
+                    try {
+                        is = AccessController.doPrivileged(new PrivilegedExceptionAction<InputStream>() {
+                            public InputStream run() throws IOException {
+                                return url.openStream();
                             }
-                            ServiceDeclarationImpl descriptor =
-                                new ServiceDeclarationImpl(bundle, url, className, attributes);
-                            descriptors.add(descriptor);
-                            if (firstOnly) {
-                                return descriptors;
+                        });
+                    } catch (PrivilegedActionException e) {
+                        throw (IOException)e.getException();
+                    }
+                    BufferedReader reader = null;
+                    try {
+                        reader = new BufferedReader(new InputStreamReader(is));
+                        int count = 0;
+                        while (true) {
+                            String line = reader.readLine();
+                            if (line == null)
+                                break;
+                            line = line.trim();
+                            if (!line.startsWith("#") && !"".equals(line)) {
+                                String reg = line.trim();
+                                if (debug) {
+                                    logger.fine("Registering service provider: " + reg);
+                                }
+
+                                Map<String, String> attributes = parseServiceDeclaration(reg);
+                                String className = attributes.get("class");
+                                if (className == null) {
+                                    // Add a unique class name to prevent equals() from returning true
+                                    className = "_class_" + count;
+                                    count++;
+                                }
+                                ServiceDeclarationImpl descriptor =
+                                    new ServiceDeclarationImpl(bundle, url, className, attributes);
+                                descriptors.add(descriptor);
+                                if (firstOnly) {
+                                    return descriptors;
+                                }
                             }
                         }
-                    }
-                } finally {
-                    if (reader != null) {
-                        try {
-                            reader.close();
-                        } catch (IOException e) {
-                            // Ignore
+                    } finally {
+                        if (reader != null) {
+                            try {
+                                reader.close();
+                            } catch (IOException e) {
+                                // Ignore
+                            }
                         }
                     }
+                } catch (IOException e) {
+                    logger.log(Level.SEVERE, e.getMessage(), e);
                 }
-            } catch (IOException e) {
-                logger.log(Level.SEVERE, e.getMessage(), e);
             }
         }
         return descriptors;

Modified: tuscany/java/sca/modules/extensibility-equinox/src/test/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscovererTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility-equinox/src/test/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscovererTestCase.java?rev=693637&r1=693636&r2=693637&view=diff
==============================================================================
--- tuscany/java/sca/modules/extensibility-equinox/src/test/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscovererTestCase.java (original)
+++ tuscany/java/sca/modules/extensibility-equinox/src/test/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscovererTestCase.java Tue Sep  9 15:24:55 2008
@@ -42,7 +42,7 @@
 /**
  * Test the Equinox service discoverer.
  * 
- * @version $Rev: $ $Date: $
+ * @version $Rev$ $Date$
  */
 public class EquinoxServiceDiscovererTestCase {
     private static EquinoxServiceDiscoverer discoverer;
@@ -133,10 +133,20 @@
     @Test
     public void testDiscovery() {
         Set<ServiceDeclaration> descriptors =
-            discoverer.discover("org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory", false);
+            discoverer.discover("test.TestService", false);
         Assert.assertEquals(1, descriptors.size());
         descriptors = discoverer.discover("notthere", false);
         Assert.assertEquals(0, descriptors.size());
     }
 
+    @Test
+    public void testDiscoveryFirst() {
+        Set<ServiceDeclaration> descriptors =
+            discoverer.discover("test.TestService", true);
+        Assert.assertEquals(1, descriptors.size());
+        descriptors = discoverer.discover("notthere", true);
+        Assert.assertEquals(0, descriptors.size());
+    }    
+    
+
 }

Modified: tuscany/java/sca/modules/extensibility-equinox/src/test/resources/test-bundle.jar
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility-equinox/src/test/resources/test-bundle.jar?rev=693637&r1=693636&r2=693637&view=diff
==============================================================================
Binary files - no diff available.

Modified: tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscovery.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscovery.java?rev=693637&r1=693636&r2=693637&view=diff
==============================================================================
--- tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscovery.java (original)
+++ tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscovery.java Tue Sep  9 15:24:55 2008
@@ -55,7 +55,7 @@
         return INSTANCE;
     }
 
-    private ServiceDiscoverer getServiceDiscoverer() {
+    public ServiceDiscoverer getServiceDiscoverer() {
         if (discoverer == null) {
             discoverer = new ContextClassLoaderServiceDiscoverer();
         }

Modified: tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java?rev=693637&r1=693636&r2=693637&view=diff
==============================================================================
--- tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java (original)
+++ tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java Tue Sep  9 15:24:55 2008
@@ -100,7 +100,7 @@
             props.put("osgi.contextClassLoaderParent", "boot");
             
             // Set the extension bundle
-            props.put("osgi.framework.extensions", "org.apache.tuscany.sca.extensibility.equinox");
+            props.put("osgi.framework.extensions", "org.apache.tuscany.sca.node.launcher.equinox");
             
             // Set startup properties
             props.put(EclipseStarter.PROP_CLEAN, "true");
@@ -205,6 +205,9 @@
      * @throws IOException
      */
     private static String getBundleName(File file) throws IOException {
+        if (!file.exists()) {
+            return null;
+        }
         String bundleName = null;
         if (file.isDirectory()) {
             File mf = new File(file, "META-INF/MANIFEST.MF");

Modified: tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java?rev=693637&r1=693636&r2=693637&view=diff
==============================================================================
--- tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java (original)
+++ tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java Tue Sep  9 15:24:55 2008
@@ -250,6 +250,7 @@
             if (!entry.isDirectory() && entryName != null
                 && entryName.length() > 0
                 && !entryName.startsWith(".")
+                && entryName.endsWith(".class") // Exclude resources from Export-Package
                 && entryName.lastIndexOf("/") > 0) {
                 String pkg = entryName.substring(0, entryName.lastIndexOf("/")).replace('/', '.') + version;
                 packages.add(pkg);

Added: tuscany/java/sca/modules/node-launcher-equinox/src/test/java/hello/HelloWorldClient.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-launcher-equinox/src/test/java/hello/HelloWorldClient.java?rev=693637&view=auto
==============================================================================
--- tuscany/java/sca/modules/node-launcher-equinox/src/test/java/hello/HelloWorldClient.java (added)
+++ tuscany/java/sca/modules/node-launcher-equinox/src/test/java/hello/HelloWorldClient.java Tue Sep  9 15:24:55 2008
@@ -0,0 +1,50 @@
+/*
+ * 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.EagerInit;
+import org.osoa.sca.annotations.Init;
+import org.osoa.sca.annotations.Reference;
+import org.osoa.sca.annotations.Scope;
+
+/**
+ * This client program shows how to create an SCA runtime, start it,
+ * and locate and invoke a SCA component
+ */
+@Scope("COMPOSITE")
+@EagerInit
+public class HelloWorldClient {
+
+    private HelloWorld hw;
+
+    @Reference
+    public void setHelloWorld(HelloWorld hw) {
+        this.hw = hw;
+    }
+
+    @Init
+    public void hello() {
+        // Say hello
+        System.out.println("Contribution ClassLoader: " + getClass().getClassLoader());
+        System.out.println("SCA API ClassLoader: " + Reference.class.getClassLoader());
+        System.out.println(hw.hello("Equinox"));
+    }
+
+}

Propchange: tuscany/java/sca/modules/node-launcher-equinox/src/test/java/hello/HelloWorldClient.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/node-launcher-equinox/src/test/java/hello/HelloWorldClient.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: tuscany/java/sca/modules/node-launcher-equinox/src/test/java/hello/HelloWorldImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-launcher-equinox/src/test/java/hello/HelloWorldImpl.java?rev=693637&r1=693636&r2=693637&view=diff
==============================================================================
--- tuscany/java/sca/modules/node-launcher-equinox/src/test/java/hello/HelloWorldImpl.java (original)
+++ tuscany/java/sca/modules/node-launcher-equinox/src/test/java/hello/HelloWorldImpl.java Tue Sep  9 15:24:55 2008
@@ -24,7 +24,7 @@
  */
 public class HelloWorldImpl implements HelloWorld {
     public String hello(String name) {
-        System.out.println("Hello: " + name);
+        System.out.println("Name: " + name);
         return "Hello, " + name;
     }
 }

Modified: tuscany/java/sca/modules/node-launcher-equinox/src/test/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-launcher-equinox/src/test/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherTestCase.java?rev=693637&r1=693636&r2=693637&view=diff
==============================================================================
--- tuscany/java/sca/modules/node-launcher-equinox/src/test/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherTestCase.java (original)
+++ tuscany/java/sca/modules/node-launcher-equinox/src/test/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherTestCase.java Tue Sep  9 15:24:55 2008
@@ -19,9 +19,6 @@
 
 package org.apache.tuscany.sca.node.equinox.launcher;
 
-import hello.HelloWorld;
-
-import org.apache.tuscany.sca.node.SCAClient;
 import org.apache.tuscany.sca.node.SCANode;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -55,10 +52,6 @@
     public void testLaunch() throws Exception {
         SCANode node = launcher.createNodeFromClassLoader("HelloWorld.composite", getClass().getClassLoader());
         node.start();
-
-        HelloWorld hw = ((SCAClient)node).getService(HelloWorld.class, "HelloWorld");
-        hw.hello("OSGi");
-
         node.stop();
     }
 

Modified: tuscany/java/sca/modules/node-launcher-equinox/src/test/resources/HelloWorld.composite
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-launcher-equinox/src/test/resources/HelloWorld.composite?rev=693637&r1=693636&r2=693637&view=diff
==============================================================================
--- tuscany/java/sca/modules/node-launcher-equinox/src/test/resources/HelloWorld.composite (original)
+++ tuscany/java/sca/modules/node-launcher-equinox/src/test/resources/HelloWorld.composite Tue Sep  9 15:24:55 2008
@@ -22,9 +22,13 @@
 	targetNamespace="http://sample/composite"
 	xmlns:sc="http://sample/composite"
 	name="HelloWorld">
-
+    
     <component name="HelloWorld">
-        <implementation.java class="hello.HelloWorldImpl"/>
+        <implementation.java class="hello.HelloWorldImpl" />
+    </component>
+    <component name="HelloWorldClient">
+        <implementation.java class="hello.HelloWorldClient" />
+        <reference name="helloWorld" target="HelloWorld"></reference>
     </component>
 
 </composite>