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>