tuscany-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From rf...@apache.org
Subject svn commit: r675040 [2/3] - in /tuscany/java/sca/modules: ./ binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/ binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/ contribution-osgi/ contribution/src/main...
Date Tue, 08 Jul 2008 23:10:33 GMT
Added: tuscany/java/sca/modules/extensibility-osgi/LICENSE
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility-osgi/LICENSE?rev=675040&view=auto
==============================================================================
--- tuscany/java/sca/modules/extensibility-osgi/LICENSE (added)
+++ tuscany/java/sca/modules/extensibility-osgi/LICENSE Tue Jul  8 16:10:31 2008
@@ -0,0 +1,205 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+

Added: tuscany/java/sca/modules/extensibility-osgi/NOTICE
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility-osgi/NOTICE?rev=675040&view=auto
==============================================================================
--- tuscany/java/sca/modules/extensibility-osgi/NOTICE (added)
+++ tuscany/java/sca/modules/extensibility-osgi/NOTICE Tue Jul  8 16:10:31 2008
@@ -0,0 +1,5 @@
+Copyright (c) 2005 - 2008 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+

Added: tuscany/java/sca/modules/extensibility-osgi/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility-osgi/pom.xml?rev=675040&view=auto
==============================================================================
--- tuscany/java/sca/modules/extensibility-osgi/pom.xml (added)
+++ tuscany/java/sca/modules/extensibility-osgi/pom.xml Tue Jul  8 16:10:31 2008
@@ -0,0 +1,66 @@
+<?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.    
+-->
+<project>
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.apache.tuscany.sca</groupId>
+		<artifactId>tuscany-modules</artifactId>
+		<version>1.4-SNAPSHOT</version>
+		<relativePath>../pom.xml</relativePath>
+	</parent>
+	<artifactId>tuscany-extensibility-osgi</artifactId>
+	<name>Apache Tuscany SCA Extensibility for OSGi</name>
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.tuscany.sca</groupId>
+			<artifactId>tuscany-extensibility</artifactId>
+			<version>1.4-SNAPSHOT</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.felix</groupId>
+			<artifactId>org.osgi.core</artifactId>
+			<version>1.0.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.felix</groupId>
+			<artifactId>org.apache.felix.framework</artifactId>
+			<version>1.0.4</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-bundle-plugin</artifactId>
+				<configuration>
+					<instructions>
+						<Bundle-Version>${tuscany.version}
+						</Bundle-Version>
+						<Bundle-SymbolicName>org.apache.tuscany.sca.extensibility
+						</Bundle-SymbolicName>
+						<Bundle-Description>${pom.name}</Bundle-Description>
+						<Export-Package>org.apache.tuscany.sca.extensibility.osgi*</Export-Package>
+					</instructions>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file

Propchange: tuscany/java/sca/modules/extensibility-osgi/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/extensibility-osgi/pom.xml
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoverer.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoverer.java?rev=675040&view=auto
==============================================================================
--- tuscany/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoverer.java (added)
+++ tuscany/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoverer.java Tue Jul  8 16:10:31 2008
@@ -0,0 +1,252 @@
+/*
+ * 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.extensibility.osgi;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.tuscany.sca.extensibility.ServiceDeclaration;
+import org.apache.tuscany.sca.extensibility.ServiceDiscoverer;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The ServiceDiscoverer that find META-INF/services/... in installed bundles
+ */
+public class OSGiServiceDiscoverer implements ServiceDiscoverer {
+    private static final Logger logger = Logger.getLogger(OSGiServiceDiscoverer.class.getName());
+    private BundleContext context;
+
+    public OSGiServiceDiscoverer(BundleContext context) {
+        this.context = context;
+    }
+
+    public static class ServiceDeclarationImpl implements ServiceDeclaration {
+        private Bundle bundle;
+        private URL url;
+        private String className;
+        private Class<?> javaClass;
+        private Map<String, String> attributes;
+
+        public ServiceDeclarationImpl(Bundle bundle, URL url, String className, Map<String, String> attributes) {
+            super();
+            this.bundle = bundle;
+            this.url = url;
+            this.className = className;
+            this.attributes = attributes;
+        }
+
+        public Map<String, String> getAttributes() {
+            return attributes;
+        }
+
+        public String getClassName() {
+            return className;
+        }
+
+        public Class<?> loadClass() throws ClassNotFoundException {
+            if (className == null) {
+                return null;
+            }
+            if (javaClass == null) {
+                javaClass = loadClass(className);
+            }
+            return javaClass;
+        }
+
+        public Class<?> loadClass(String className) throws ClassNotFoundException {
+            return bundle.loadClass(className);
+        }
+
+        public URL getLocation() {
+            return url;
+        }
+
+        public URL getResource(final String name) {
+            return AccessController.doPrivileged(new PrivilegedAction<URL>() {
+                public URL run() {
+                    return bundle.getResource(name);
+                }
+            });
+        }
+
+        public String toString() {
+            StringBuffer sb = new StringBuffer();
+            sb.append("Bundle: ").append(OSGiServiceDiscoverer.toString(bundle));
+            sb.append(" Resource: ").append(url);
+            sb.append(" Attributes: ").append(attributes);
+            return sb.toString();
+        }
+
+    }
+
+    private static String toString(Bundle b) {
+        StringBuffer sb = new StringBuffer();
+        sb.append(b.getBundleId()).append(" ").append(b.getSymbolicName());
+        int s = b.getState();
+        if ((s & Bundle.UNINSTALLED) != 0) {
+            sb.append(" UNINSTALLED");
+        }
+        if ((s & Bundle.INSTALLED) != 0) {
+            sb.append(" INSTALLED");
+        }
+        if ((s & Bundle.RESOLVED) != 0) {
+            sb.append(" RESOLVED");
+        }
+        if ((s & Bundle.STARTING) != 0) {
+            sb.append(" STARTING");
+        }
+        if ((s & Bundle.STOPPING) != 0) {
+            sb.append(" STOPPING");
+        }
+        if ((s & Bundle.ACTIVE) != 0) {
+            sb.append(" ACTIVE");
+        }
+        return sb.toString();
+
+    }
+
+    /**
+     * Parse a service declaration in the form class;attr=value,attr=value and
+     * return a map of attributes
+     * 
+     * @param declaration
+     * @return a map of attributes
+     */
+    protected static Map<String, String> parseServiceDeclaration(String declaration) {
+        Map<String, String> attributes = new HashMap<String, String>();
+        int index = declaration.indexOf(';');
+        if (index != -1) {
+            attributes.put("class", declaration.substring(0, index).trim());
+            declaration = declaration.substring(index);
+        } else {
+            int j = declaration.indexOf('=');
+            if (j == -1) {
+                attributes.put("class", declaration.trim());
+                return attributes;
+            } else {
+                declaration = ";" + declaration;
+            }
+        }
+        StringTokenizer tokens = new StringTokenizer(declaration);
+        for (; tokens.hasMoreTokens();) {
+            String key = tokens.nextToken("=").substring(1).trim();
+            if (key == null)
+                break;
+            String value = tokens.nextToken(",").substring(1).trim();
+            if (value == null)
+                break;
+            attributes.put(key, value);
+        }
+        return attributes;
+    }
+
+    @SuppressWarnings("unchecked")
+    public Set<ServiceDeclaration> discover(String serviceName) {
+        boolean debug = logger.isLoggable(Level.FINE);
+        Set<ServiceDeclaration> descriptors = new HashSet<ServiceDeclaration>();
+
+        serviceName = "META-INF/services/" + serviceName;
+
+        int index = serviceName.lastIndexOf('/');
+        String path = serviceName.substring(0, index);
+        String file = serviceName.substring(index + 1);
+
+        for (Bundle bundle : context.getBundles()) {
+            Enumeration<URL> urls = bundle.findEntries(path, file, false);
+            while (urls != null && urls.hasMoreElements()) {
+                final URL url = urls.nextElement();
+                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();
+                            }
+                        });
+                    } 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);
+                            }
+                        }
+                    } finally {
+                        if (reader != null) {
+                            try {
+                                reader.close();
+                            } catch (IOException e) {
+                                // Ignore
+                            }
+                        }
+                    }
+                } catch (IOException e) {
+                    logger.log(Level.SEVERE, e.getMessage(), e);
+                }
+            }
+        }
+        return descriptors;
+
+    }
+
+}

Propchange: tuscany/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoverer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoverer.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/extensibility-osgi/src/test/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscovererTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility-osgi/src/test/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscovererTestCase.java?rev=675040&view=auto
==============================================================================
--- tuscany/java/sca/modules/extensibility-osgi/src/test/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscovererTestCase.java (added)
+++ tuscany/java/sca/modules/extensibility-osgi/src/test/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscovererTestCase.java Tue Jul  8 16:10:31 2008
@@ -0,0 +1,104 @@
+/*
+ * 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.extensibility.osgi;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import junit.framework.Assert;
+
+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.ServiceDeclaration;
+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 OSGiServiceDiscovererTestCase {
+    private static Felix felix;
+    private static OSGiServiceDiscoverer discoverer;
+    private static Bundle testBundle;
+
+    /**
+     * @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,
+                      "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");
+        // 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 felix = new Felix(configMap, list);
+
+        // Now start Felix instance.
+        felix.start();
+        BundleContext context = felix.getBundleContext();
+        InputStream is = OSGiServiceDiscovererTestCase.class.getResourceAsStream("/test-bundle.jar");
+        testBundle = context.installBundle("test-bundle", is);
+        is.close();
+        discoverer = new OSGiServiceDiscoverer(context);
+    }
+
+    /**
+     * @throws java.lang.Exception
+     */
+    @AfterClass
+    public static void tearDownAfterClass() throws Exception {
+        if (felix != null) {
+            // Uninstall the bundle to clean up the cache
+            testBundle.uninstall();
+            felix.stop();
+        }
+    }
+
+    @Test
+    public void testDiscovery() {
+        Set<ServiceDeclaration> descriptors =
+            discoverer.discover("org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory");
+        Assert.assertEquals(1, descriptors.size());
+        descriptors = discoverer.discover("notthere");
+        Assert.assertEquals(0, descriptors.size());
+    }
+
+}

Propchange: tuscany/java/sca/modules/extensibility-osgi/src/test/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscovererTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/extensibility-osgi/src/test/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscovererTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/extensibility-osgi/src/test/resources/test-bundle.jar
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility-osgi/src/test/resources/test-bundle.jar?rev=675040&view=auto
==============================================================================
Binary file - no diff available.

Propchange: tuscany/java/sca/modules/extensibility-osgi/src/test/resources/test-bundle.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscover.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscover.java?rev=675040&view=auto
==============================================================================
--- tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscover.java (added)
+++ tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscover.java Tue Jul  8 16:10:31 2008
@@ -0,0 +1,237 @@
+/*
+ * 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.extensibility;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.ref.WeakReference;
+import java.net.URL;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * 
+ */
+public class ClasspathServiceDiscover implements ServiceDiscoverer {
+
+    public class ServiceDeclarationImpl implements ServiceDeclaration {
+        private URL url;
+        private String className;
+        private Class<?> javaClass;
+        private Map<String, String> attributes;
+
+        public ServiceDeclarationImpl(URL url, String className, Map<String, String> attributes) {
+            super();
+            this.url = url;
+            this.className = className;
+            this.attributes = attributes;
+        }
+
+        public Map<String, String> getAttributes() {
+            return attributes;
+        }
+
+        public String getClassName() {
+            return className;
+        }
+
+        public URL getLocation() {
+            return url;
+        }
+
+        public Class<?> loadClass() throws ClassNotFoundException {
+            if (className == null) {
+                return null;
+            }
+            if (javaClass == null) {
+                javaClass = loadClass(className);
+            }
+            return javaClass;
+        }
+
+        public Class<?> loadClass(String className) throws ClassNotFoundException {
+            return getClassLoader().loadClass(className);
+        }
+
+        private ClasspathServiceDiscover getOuterType() {
+            return ClasspathServiceDiscover.this;
+        }
+
+        public String toString() {
+            StringBuffer sb = new StringBuffer();
+            sb.append("ClassLoader: ").append(getClassLoader());
+            sb.append(" Attributes: ").append(attributes);
+            return sb.toString();
+        }
+
+        public URL getResource(final String name) {
+            return AccessController.doPrivileged(new PrivilegedAction<URL>() {
+                public URL run() {
+                    return getClassLoader().getResource(name);
+                }
+            });
+        }
+
+    }
+
+    private WeakReference<ClassLoader> classLoaderReference;
+    private static final Logger logger = Logger.getLogger(ClasspathServiceDiscover.class.getName());
+
+    public ClasspathServiceDiscover() {
+        // ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+        ClassLoader classLoader = ClasspathServiceDiscover.class.getClassLoader();
+        this.classLoaderReference = new WeakReference<ClassLoader>(classLoader);
+    }
+
+    public ClasspathServiceDiscover(ClassLoader classLoader) {
+        this.classLoaderReference = new WeakReference<ClassLoader>(classLoader);
+    }
+
+    protected List<URL> getResources(final String name) throws IOException {
+        try {
+            return AccessController.doPrivileged(new PrivilegedExceptionAction<List<URL>>() {
+                public List<URL> run() throws IOException {
+                    return Collections.list(getClassLoader().getResources(name));
+                }
+            });
+        } catch (PrivilegedActionException e) {
+            throw (IOException)e.getException();
+        }
+    }
+
+    private ClassLoader getClassLoader() {
+        return classLoaderReference.get();
+    }
+
+    /**
+     * Parse a service declaration in the form class;attr=value,attr=value and
+     * return a map of attributes
+     * 
+     * @param declaration
+     * @return a map of attributes
+     */
+    protected static Map<String, String> parseServiceDeclaration(String declaration) {
+        Map<String, String> attributes = new HashMap<String, String>();
+        int index = declaration.indexOf(';');
+        if (index != -1) {
+            attributes.put("class", declaration.substring(0, index).trim());
+            declaration = declaration.substring(index);
+        } else {
+            int j = declaration.indexOf('=');
+            if (j == -1) {
+                attributes.put("class", declaration.trim());
+                return attributes;
+            } else {
+                declaration = ";" + declaration;
+            }
+        }
+        StringTokenizer tokens = new StringTokenizer(declaration);
+        for (; tokens.hasMoreTokens();) {
+            String key = tokens.nextToken("=").substring(1).trim();
+            if (key == null)
+                break;
+            String value = tokens.nextToken(",").substring(1).trim();
+            if (value == null)
+                break;
+            attributes.put(key, value);
+        }
+        return attributes;
+    }
+
+    public Set<ServiceDeclaration> discover(String serviceName) {
+        Set<ServiceDeclaration> descriptors = new HashSet<ServiceDeclaration>();
+
+        String name = "META-INF/services/" + serviceName;
+        boolean debug = logger.isLoggable(Level.FINE);
+        try {
+            for (final URL url : getResources(name)) {
+                if (debug) {
+                    logger.fine("Reading service provider file: " + url.toExternalForm());
+                }
+
+                // 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();
+                }
+                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(url, className, attributes);
+                            descriptors.add(descriptor);
+                        }
+                    }
+                } finally {
+                    if (reader != null) {
+                        try {
+                            reader.close();
+                        } catch (IOException e) {
+                            // Ignore
+                        }
+                    }
+                }
+            }
+        } catch (IOException e) {
+            logger.log(Level.SEVERE, e.getMessage(), e);
+        }
+        return descriptors;
+
+    }
+
+}

Propchange: tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscover.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscover.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDeclaration.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDeclaration.java?rev=675040&r1=675039&r2=675040&view=diff
==============================================================================
--- tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDeclaration.java (original)
+++ tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDeclaration.java Tue Jul  8 16:10:31 2008
@@ -19,7 +19,6 @@
 
 package org.apache.tuscany.sca.extensibility;
 
-import java.lang.ref.WeakReference;
 import java.net.URL;
 import java.util.Map;
 
@@ -30,107 +29,40 @@
  *
  * @version $Rev$ $Date$
  */
-public class ServiceDeclaration {
-
-    private WeakReference<ClassLoader> classLoader;
-
-    private String className;
-
-    private Map<String, String> attributes;
-
-    /**
-     * Service declaration constructor
-     * 
-     * @param className Service implementation class name
-     * @param classLoader ClassLoader corresponding to this service
-     *                implementation
-     * @param attributes Optional attributes for this service declaration
-     */
-    public ServiceDeclaration(String className, ClassLoader classLoader, Map<String, String> attributes) {
-
-        this.className = className;
-        this.classLoader = new WeakReference<ClassLoader>(classLoader);
-        this.attributes = attributes;
-    }
-
+public interface ServiceDeclaration {
     /**
-     * Load this service implementation class
-     * 
-     * @return Class
+     * Load a java class in the same context as the service definition
+     * @param className The class name
+     * @return The loaded class
      * @throws ClassNotFoundException
      */
-    @SuppressWarnings("unchecked")
-    public Class<?> loadClass() throws ClassNotFoundException {
-
-        return Class.forName(className, true, classLoader.get());
-    }
-
+    Class<?> loadClass(String className) throws ClassNotFoundException;
     /**
-     * Load another class using the ClassLoader of this service implementation
-     * 
-     * @param anotherClassName
-     * @return Class
-     * @throws ClassNotFoundException
+     * Get the java class for the service impl
+     * @return The java class
      */
-    public Class<?> loadClass(String anotherClassName) throws ClassNotFoundException {
-
-        return Class.forName(anotherClassName, true, classLoader.get());
-    }
-
-    /**
-     * Return the resource corresponding to this service implementation class
-     * 
-     * @return resource URL
-     */
-    public URL getResource() {
-        return classLoader.get().getResource(className);
-    }
-
+    Class<?> loadClass() throws ClassNotFoundException;
     /**
-     * ClassLoader associated with this service declaration
-     * 
-     * @return ClassLoader
+     * Get all attributes (name=value pairs) defined for the given entry
+     * @return All attributes keyed by name
      */
-    public ClassLoader getClassLoader() {
-        return classLoader.get();
-    }
-
+    Map<String, String> getAttributes();
+    
+    URL getLocation();
+    
+    String getClassName();
+    
+    URL getResource(String name);
+    
     /**
-     * Service implementation class corresponding to this declaration
-     * 
-     * @return The Service implementation class corresponding to this declaration 
+     * The service descriptor might be hashed
+     * @param obj Another object
+     * @return
      */
-    public String getClassName() {
-        return className;
-    }
-
+    boolean equals(Object obj);
     /**
-     * Attributes specified for this declaration
-     * 
-     * @return attributes
+     * The service descriptor might be hashed
+     * @return
      */
-    public Map<String, String> getAttributes() {
-        return attributes;
-    }
-
-    /**
-     * Equals method used to ensure that each service declaration is stored only
-     * once in a set of declarations.
-     */
-    @Override
-    public boolean equals(Object o) {
-        if (!(o instanceof ServiceDeclaration))
-            return false;
-        ServiceDeclaration s = (ServiceDeclaration)o;
-        if (!className.equals(s.className))
-            return false;
-        else if (!classLoader.equals(s.classLoader))
-            return false;
-        else if (attributes == null)
-            return s.attributes == null;
-        else
-            return attributes.equals(s.attributes);
-
-    }
-
+    int hashCode();
 }

Added: tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscoverer.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscoverer.java?rev=675040&view=auto
==============================================================================
--- tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscoverer.java (added)
+++ tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscoverer.java Tue Jul  8 16:10:31 2008
@@ -0,0 +1,34 @@
+/*
+ * 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.extensibility;
+
+import java.util.Set;
+
+/**
+ * 
+ */
+public interface ServiceDiscoverer {
+    /**
+     * Discover the service descriptors by name
+     * @param serviceName
+     * @return A set of service descriptors
+     */
+    Set<ServiceDeclaration> discover(String serviceName);
+}

Propchange: tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscoverer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscoverer.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

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=675040&r1=675039&r2=675040&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 Jul  8 16:10:31 2008
@@ -19,23 +19,9 @@
 
 package org.apache.tuscany.sca.extensibility;
 
-import java.io.BufferedReader;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Map;
 import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.logging.Level;
 import java.util.logging.Logger;
 
 /**
@@ -50,9 +36,10 @@
 public class ServiceDiscovery {
     private static final Logger logger = Logger.getLogger(ServiceDiscovery.class.getName());
 
-    private static ServiceDiscovery instance;
+    private final static ServiceDiscovery instance = new ServiceDiscovery();
 
-    private HashSet<ClassLoader> registeredClassLoaders;
+    private static ServiceDiscoverer discoverer;
+    private Set<ClassLoader> registeredClassLoaders = new HashSet<ClassLoader>();
 
     /**
      * Get an instance of Service discovery, one instance is created per
@@ -61,15 +48,29 @@
      * @return
      */
     public static ServiceDiscovery getInstance() {
-
-        if (instance == null) {
-            instance = new ServiceDiscovery();
-            instance.registeredClassLoaders = new HashSet<ClassLoader>();
-            instance.registeredClassLoaders.add(ServiceDiscovery.class.getClassLoader());
-        }
+//
+//        if (instance == null) {
+//            instance = new ServiceDiscovery();
+//            instance.registeredClassLoaders = new HashSet<ClassLoader>();
+//            instance.registeredClassLoaders.add(ServiceDiscovery.class.getClassLoader());
+//        }
         return instance;
     }
-
+    
+    public static ServiceDiscoverer getServiceDiscoverer() {
+        if (discoverer == null) {
+            discoverer = new ClasspathServiceDiscover();
+        }
+        return discoverer;
+    }
+    
+    public static void setServiceDiscoverer(ServiceDiscoverer sd) {
+        if (discoverer != null) {
+            throw new IllegalStateException("The ServiceDiscoverer cannot be reset");
+        }
+        discoverer = sd;
+    }
+    
     /**
      * Register a ClassLoader with this discovery mechanism. Tuscany extension
      * ClassLoaders are registered here.
@@ -96,14 +97,10 @@
      * @return set of service declarations
      * @throws IOException
      */
-    public synchronized Set<ServiceDeclaration> getServiceDeclarations(String name) throws IOException {
-
-        Set<ServiceDeclaration> classSet = new HashSet<ServiceDeclaration>();
-
-        for (ClassLoader classLoader : registeredClassLoaders) {
-            getServiceClasses(classLoader, name, classSet, true);
-        }
-        return classSet;
+    public Set<ServiceDeclaration> getServiceDeclarations(String name) throws IOException {
+        // Set<ServiceDeclaration> classSet = new HashSet<ServiceDeclaration>();
+        Set<ServiceDeclaration> services = getServiceDiscoverer().discover(name);
+        return services;
     }
 
     /**
@@ -126,185 +123,55 @@
      * @throws IOException
      * @throws ClassNotFoundException
      */
-    public synchronized Class<?> loadFirstServiceClass(Class<?> serviceInterface) throws IOException, ClassNotFoundException {
+    public Class<?> loadFirstServiceClass(Class<?> serviceInterface) throws IOException, ClassNotFoundException {
+        Set<ServiceDeclaration> services = getServiceDiscoverer().discover(serviceInterface.getName());
+        if(services.isEmpty()) {
+            return null;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 
-        Set<ServiceDeclaration> classSet = new HashSet<ServiceDeclaration>();
 
-        for (ClassLoader classLoader : registeredClassLoaders) {
-            getServiceClasses(classLoader, serviceInterface.getName(), classSet, false);
-            if (classSet.size() > 0)
-                break;
-        }
-        if (classSet.size() > 0)
-            return classSet.iterator().next().loadClass();
-        else
-            return null;
 
-    }
 
-    /**
-     * Returns a unique list of resource URLs of name META-INF/services/<name>
-     * Each URL is associated with the first ClassLoader that it was visible
-     * from
-     * 
-     * @param name Name of resource
-     * @return Table of URLs with associated ClassLoaders
-     * @throws IOException
-     */
-    public synchronized Hashtable<ClassLoader, Set<URL>> getServiceResources(final String name) throws IOException {
 
-        Hashtable<ClassLoader, Set<URL>> resourceTable = new Hashtable<ClassLoader, Set<URL>>();
 
-        HashSet<URL> allURLs = new HashSet<URL>();
-        for (final ClassLoader classLoader : registeredClassLoaders) {
-            HashSet<URL> urls = new HashSet<URL>();
-            resourceTable.put(classLoader, urls);
-            boolean debug = logger.isLoggable(Level.FINE);
-            if (debug) {
-                logger.fine("Discovering service resources using class loader " + classLoader);
-            }
-            // Allow privileged access to read META-INF/services/*. Add FilePermission to added to security policy file.
-            ArrayList<URL> urlList;
-            try {
-                // FIXME J2 Security - promote this to callers of this method
-                urlList = AccessController.doPrivileged(new PrivilegedExceptionAction<ArrayList<URL>>() {
-                    public ArrayList<URL> run() throws IOException {
-                        return Collections.list(classLoader.getResources("META-INF/services/" + name));
-                    }
-                });
-            } catch (PrivilegedActionException e) {
-                throw (IOException)e.getException();
-            }
-            
-            for (URL url : urlList) {
-                if (allURLs.contains(url))
-                    continue;
-                urls.add(url);
-            }
-            allURLs.addAll(urls);
-        }
-        return resourceTable;
-    }
 
-    /**
-     * Parse a service declaration in the form class;attr=value,attr=value and
-     * return a map of attributes
-     * 
-     * @param declaration
-     * @return a map of attributes
-     */
-    private Map<String, String> parseServiceDeclaration(String declaration) {
-        Map<String, String> attributes = new HashMap<String, String>();
-        int index = declaration.indexOf(';');
-        if (index != -1) {
-            attributes.put("class", declaration.substring(0, index).trim());
-            declaration = declaration.substring(index);
-        } else {
-            int j = declaration.indexOf('=');
-            if (j == -1) {
-                attributes.put("class", declaration.trim());
-                return attributes;
-            } else {
-                declaration = ";" + declaration;
-            }
-        }
-        StringTokenizer tokens = new StringTokenizer(declaration);
-        for (; tokens.hasMoreTokens();) {
-            String key = tokens.nextToken("=").substring(1).trim();
-            if (key == null)
-                break;
-            String value = tokens.nextToken(",").substring(1).trim();
-            if (value == null)
-                break;
-            attributes.put(key, value);
-        }
-        return attributes;
-    }
 
-    /**
-     * Load the service class whose name specified in a configuration file
-     * 
-     * @param classLoader
-     * @param name The name of the service class
-     * @param classSet Populate this set with classes extends/implements the
-     *                service class
-     * @throws IOException
-     */
-    private void getServiceClasses(final ClassLoader classLoader,
-                                   final String name,
-                                   Set<ServiceDeclaration> classSet,
-                                   boolean findAllClasses) throws IOException {
-
-        boolean debug = logger.isLoggable(Level.FINE);
-        if (debug) {
-            logger.fine("Discovering service providers using class loader " + classLoader);
-        }
-        // Allow privileged access to read META-INF/services/*. Add FilePermission to added to
-        // security policy file.
-        ArrayList<URL> urlList;
-        try {
-            urlList = AccessController.doPrivileged(new PrivilegedExceptionAction<ArrayList<URL>>() {
-                public ArrayList<URL> run() throws IOException {
-                    return Collections.list(classLoader.getResources("META-INF/services/" + name));
-                }
-            });
-        } catch (PrivilegedActionException e) {
-            throw (IOException)e.getException();
-        }
-        
-        for (final URL url : urlList) {
-            if (debug) {
-                logger.fine("Reading service provider file: " + url.toExternalForm());
-            }
-
-            // 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();
-            }
-            BufferedReader reader = null;
-            try {
-                reader = new BufferedReader(new InputStreamReader(is));
-                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");
-                        ServiceDeclaration serviceClass = new ServiceDeclaration(className, classLoader, attributes);
-                        classSet.add(serviceClass);
-
-                        if (!findAllClasses)
-                            break;
-                    }
-                }
-            } finally {
-                if (reader != null)
-                    reader.close();
-                if (is != null) {
-                    try {
-                        is.close();
-                    } catch (IOException ioe) {
-                    }
-                }
-            }
-            if (!findAllClasses && classSet.size() > 0)
-                break;
         }
+        return services.iterator().next().loadClass();
     }
 
 }

Added: tuscany/java/sca/modules/extensibility/src/test/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscovererTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility/src/test/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscovererTestCase.java?rev=675040&view=auto
==============================================================================
--- tuscany/java/sca/modules/extensibility/src/test/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscovererTestCase.java (added)
+++ tuscany/java/sca/modules/extensibility/src/test/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscovererTestCase.java Tue Jul  8 16:10:31 2008
@@ -0,0 +1,61 @@
+/*
+ * 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.extensibility;
+
+import java.util.Set;
+
+import junit.framework.Assert;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * Test Case for ClasspathServiceDiscover
+ */
+public class ClasspathServiceDiscovererTestCase {
+    private static ClasspathServiceDiscover discover;
+
+    /**
+     * @throws java.lang.Exception
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
+        discover = new ClasspathServiceDiscover(ClasspathServiceDiscover.class.getClassLoader());
+    }
+
+    @Test
+    public void testDiscovery() {
+        Set<ServiceDeclaration> discriptors =
+            discover.discover("org.apache.tuscany.sca.core.ModuleActivatorExtensionPoint");
+        Assert.assertEquals(1, discriptors.size());
+        discriptors =
+            discover.discover("notthere");
+        Assert.assertEquals(0, discriptors.size());
+    }
+
+    /**
+     * @throws java.lang.Exception
+     */
+    @AfterClass
+    public static void tearDownAfterClass() throws Exception {
+    }
+
+}

Propchange: tuscany/java/sca/modules/extensibility/src/test/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscovererTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/extensibility/src/test/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscovererTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: tuscany/java/sca/modules/extension-helper/src/main/java/org/apache/tuscany/sca/extension/helper/impl/DiscoveryUtils.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/extension-helper/src/main/java/org/apache/tuscany/sca/extension/helper/impl/DiscoveryUtils.java?rev=675040&r1=675039&r2=675040&view=diff
==============================================================================
--- tuscany/java/sca/modules/extension-helper/src/main/java/org/apache/tuscany/sca/extension/helper/impl/DiscoveryUtils.java (original)
+++ tuscany/java/sca/modules/extension-helper/src/main/java/org/apache/tuscany/sca/extension/helper/impl/DiscoveryUtils.java Tue Jul  8 16:10:31 2008
@@ -38,23 +38,24 @@
  */
 public class DiscoveryUtils {
 
-	@SuppressWarnings("unchecked")
+    @SuppressWarnings("unchecked")
     public static <T> List<T> discoverActivators(Class<T> activatorClass, ExtensionPointRegistry registry) {
         List<T> activators;
-		try {
-			Set<ServiceDeclaration> activatorClasses = ServiceDiscovery.getInstance().getServiceDeclarations(activatorClass);
-			activators = new ArrayList<T>();
-			for (ServiceDeclaration declaration : activatorClasses) {
-			    try {
-			    	Class<T> c = (Class<T>)declaration.loadClass();
-			        activators.add(c.cast(instantiateActivator(c, registry)));
-			    } catch (Throwable e) {
-			        e.printStackTrace(); // TODO: log
-			    }
-			}
-		} catch (IOException e) {
-			throw new RuntimeException(e);
-		}
+        try {
+            Set<ServiceDeclaration> activatorClasses =
+                ServiceDiscovery.getInstance().getServiceDeclarations(activatorClass);
+            activators = new ArrayList<T>();
+            for (ServiceDeclaration declaration : activatorClasses) {
+                try {
+                    Class<T> c = (Class<T>)declaration.loadClass();
+                    activators.add(c.cast(instantiateActivator(c, registry)));
+                } catch (Throwable e) {
+                    e.printStackTrace(); // TODO: log
+                }
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
         return activators;
     }
 
@@ -63,18 +64,18 @@
         if (cs.length != 1) {
             throw new RuntimeException("Activator must have only one constructors");
         }
-        
+
         Class<?>[] paramTypes = cs[0].getParameterTypes();
         Object[] extensions = new Object[paramTypes.length];
 
-        for (int i=0; i< paramTypes.length; i++) {
+        for (int i = 0; i < paramTypes.length; i++) {
             if ("org.apache.tuscany.sca.host.http.ServletHost".equals(paramTypes[i].getName())) {
                 extensions[i] = getServletHost(registry);
             } else {
                 extensions[i] = registry.getExtensionPoint(paramTypes[i]);
             }
         }
-        
+
         try {
 
             return cs[0].newInstance(extensions);
@@ -109,5 +110,4 @@
         }
     }
 
-
 }

Modified: tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationProvider.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationProvider.java?rev=675040&r1=675039&r2=675040&view=diff
==============================================================================
--- tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationProvider.java (original)
+++ tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationProvider.java Tue Jul  8 16:10:31 2008
@@ -21,7 +21,6 @@
 
 import java.lang.reflect.Method;
 import java.util.List;
-import java.util.Map;
 
 import org.apache.tuscany.sca.assembly.Service;
 import org.apache.tuscany.sca.context.ComponentContextFactory;
@@ -64,7 +63,7 @@
                                       JavaPropertyValueObjectFactory propertyValueObjectFactory,
                                       ComponentContextFactory componentContextFactory,
                                       RequestContextFactory requestContextFactory,
-                                      Map<ClassLoader, List<PolicyHandlerTuple>> policyHandlerClassNames) {
+                                      List<PolicyHandlerTuple> policyHandlerClassNames) {
         super();
         this.implementation = implementation;
         this.requestContextFactory = requestContextFactory;

Modified: tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationProviderFactory.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationProviderFactory.java?rev=675040&r1=675039&r2=675040&view=diff
==============================================================================
--- tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationProviderFactory.java (original)
+++ tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationProviderFactory.java Tue Jul  8 16:10:31 2008
@@ -20,7 +20,6 @@
 package org.apache.tuscany.sca.implementation.java.invocation;
 
 import java.util.List;
-import java.util.Map;
 
 import org.apache.tuscany.sca.context.ComponentContextFactory;
 import org.apache.tuscany.sca.context.RequestContextFactory;
@@ -42,14 +41,14 @@
     private ProxyFactory proxyService;
     private ComponentContextFactory componentContextFactory;
     private RequestContextFactory requestContextFactory;
-    private Map<ClassLoader, List<PolicyHandlerTuple>> policyHandlerClassNames = null;
+    private List<PolicyHandlerTuple> policyHandlerClassNames = null;
 
     public JavaImplementationProviderFactory(ProxyFactory proxyService,
                                              DataBindingExtensionPoint dataBindingRegistry,
                                              JavaPropertyValueObjectFactory propertyValueObjectFactory,
                                              ComponentContextFactory componentContextFactory,
                                              RequestContextFactory requestContextFactory,
-                                             Map<ClassLoader, List<PolicyHandlerTuple>> policyHandlerClassNames) {
+                                             List<PolicyHandlerTuple> policyHandlerClassNames) {
         super();
         this.proxyService = proxyService;
         this.dataBindingRegistry = dataBindingRegistry;

Modified: tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/module/JavaRuntimeModuleActivator.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/module/JavaRuntimeModuleActivator.java?rev=675040&r1=675039&r2=675040&view=diff
==============================================================================
--- tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/module/JavaRuntimeModuleActivator.java (original)
+++ tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/module/JavaRuntimeModuleActivator.java Tue Jul  8 16:10:31 2008
@@ -20,7 +20,6 @@
 package org.apache.tuscany.sca.implementation.java.module;
 
 import java.util.List;
-import java.util.Map;
 
 import org.apache.tuscany.sca.context.ComponentContextFactory;
 import org.apache.tuscany.sca.context.ContextFactoryExtensionPoint;
@@ -77,7 +76,7 @@
         ComponentContextFactory componentContextFactory = contextFactories.getFactory(ComponentContextFactory.class);
         RequestContextFactory requestContextFactory = contextFactories.getFactory(RequestContextFactory.class);
 
-        Map<ClassLoader, List<PolicyHandlerTuple>> policyHandlerClassNames = null;
+        List<PolicyHandlerTuple> policyHandlerClassNames = null;
         policyHandlerClassNames = PolicyHandlerDefinitionsLoader.loadPolicyHandlerClassnames();
         
         ProxyFactory proxyFactory = new ExtensibleProxyFactory(proxyFactories);

Modified: tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/JavaImplementation.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/JavaImplementation.java?rev=675040&r1=675039&r2=675040&view=diff
==============================================================================
--- tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/JavaImplementation.java (original)
+++ tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/JavaImplementation.java Tue Jul  8 16:10:31 2008
@@ -188,11 +188,11 @@
     /**
      * @return the map of a policy handler class names
      */
-    Map<ClassLoader, List<PolicyHandlerTuple>> getPolicyHandlerClassNames();
+    List<PolicyHandlerTuple> getPolicyHandlerClassNames();
 
     /**
      * @param policyHandlerClassNames Map of policyhandler class names
      */
-    void setPolicyHandlerClassNames(Map<ClassLoader, List<PolicyHandlerTuple>> policyHandlerClassNames);
+    void setPolicyHandlerClassNames(List<PolicyHandlerTuple> policyHandlerClassNames);
 
 }

Modified: tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/impl/JavaImplementationImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/impl/JavaImplementationImpl.java?rev=675040&r1=675039&r2=675040&view=diff
==============================================================================
--- tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/impl/JavaImplementationImpl.java (original)
+++ tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/impl/JavaImplementationImpl.java Tue Jul  8 16:10:31 2008
@@ -51,7 +51,7 @@
     private long maxAge = -1;
     private long maxIdleTime = -1;
     private JavaScopeImpl scope = JavaScopeImpl.STATELESS;
-    private Map<ClassLoader, List<PolicyHandlerTuple>> policyHandlerClassNames = null;
+    private List<PolicyHandlerTuple> policyHandlerClassNames = null;
     
     protected JavaImplementationImpl() {
         super();
@@ -157,11 +157,11 @@
         this.maxIdleTime = maxIdleTime;
     }
 
-    public Map<ClassLoader, List<PolicyHandlerTuple>> getPolicyHandlerClassNames() {
+    public List<PolicyHandlerTuple> getPolicyHandlerClassNames() {
         return policyHandlerClassNames;
     }
 
-    public void setPolicyHandlerClassNames(Map<ClassLoader, List<PolicyHandlerTuple>> policyHandlerClassNames) {
+    public void setPolicyHandlerClassNames(List<PolicyHandlerTuple> policyHandlerClassNames) {
         this.policyHandlerClassNames = policyHandlerClassNames;
     }
  

Modified: tuscany/java/sca/modules/osgi-runtime/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/osgi-runtime/pom.xml?rev=675040&r1=675039&r2=675040&view=diff
==============================================================================
--- tuscany/java/sca/modules/osgi-runtime/pom.xml (original)
+++ tuscany/java/sca/modules/osgi-runtime/pom.xml Tue Jul  8 16:10:31 2008
@@ -1,24 +1,23 @@
 <?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.
+ * 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.
 -->
 <project>
-
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.tuscany.sca</groupId>
@@ -26,54 +25,45 @@
         <version>1.4-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
-
     <artifactId>tuscany-osgi-runtime</artifactId>
     <name>Apache Tuscany OSGi Runtime Helper Library</name>
-
     <dependencies>
-
         <dependency>
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.main</artifactId>
             <version>1.0.4</version>
         </dependency>
-
-
         <dependency>
             <groupId>org.apache.tuscany.sca</groupId>
-            <artifactId>tuscany-host-embedded</artifactId>
+            <artifactId>tuscany-core-spi</artifactId>
             <version>1.4-SNAPSHOT</version>
         </dependency>
-
         <dependency>
-            <groupId>org.easymock</groupId>
-            <artifactId>easymock</artifactId>
-            <version>2.2</version>
-            <scope>test</scope>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-extensibility-osgi</artifactId>
+            <version>1.4-SNAPSHOT</version>
         </dependency>
-
-
     </dependencies>
-
-
     <build>
         <plugins>
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
-
                 <configuration>
                     <instructions>
                         <Bundle-Version>${tuscany.version}</Bundle-Version>
-                        <Bundle-SymbolicName>org.apache.tuscany.sca.osgi.runtime</Bundle-SymbolicName>
+                        <Bundle-SymbolicName>org.apache.tuscany.sca.osgi.runtime
+                        </Bundle-SymbolicName>
                         <Bundle-Description>${pom.name}</Bundle-Description>
-                        <Export-Package>org.apache.tuscany.sca.osgi.runtime*</Export-Package>
-                        <Bundle-Activator>org.apache.tuscany.sca.osgi.runtime.OSGiBundleActivator</Bundle-Activator>
-                        <DynamicImport-Package>org.apache.felix.main,org.eclipse.core.runtime.adaptor</DynamicImport-Package>
+                        <Export-Package>org.apache.tuscany.sca.osgi.runtime*
+                        </Export-Package>
+                        <Bundle-Activator>org.apache.tuscany.sca.osgi.runtime.OSGiBundleActivator
+                        </Bundle-Activator>
+                        <DynamicImport-Package>org.apache.felix.main,org.eclipse.core.runtime.adaptor
+                        </DynamicImport-Package>
                     </instructions>
                 </configuration>
             </plugin>
         </plugins>
     </build>
-
-</project>
+</project>
\ No newline at end of file



Mime
View raw message