Author: rfeng
Date: Fri Aug  8 15:53:11 2008
New Revision: 684135

URL: http://svn.apache.org/viewvc?rev=684135&view=rev
Log:
Support to start OSGi from a list of jar files
Add more context to ServiceDiscoverer

Modified:
    
tuscany/java/sca/modules/extensibility-equinox/src/main/java/org/apache/tuscany/sca/extensibility/equinox/EquinoxServiceDiscoverer.java
    
tuscany/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoverer.java
    
tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscoverer.java
    
tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscoverer.java
    tuscany/java/sca/modules/node2-impl/pom.xml
    
tuscany/java/sca/modules/node2-launcher-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/launcher/FelixOSGiHost.java
    
tuscany/java/sca/modules/node2-launcher-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/launcher/LauncherBundleActivator.java
    
tuscany/java/sca/tools/maven/maven-osgi-junit/src/main/java/org/apache/tuscany/tools/sca/osgi/junit/plugin/OSGiJUnitMojo.java

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=684135&r1=684134&r2=684135&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
 Fri Aug  8 15:53:11 2008
@@ -326,8 +326,12 @@
      * This class loader can be set as the thread context class loader for 
non-OSGi code
      * @return
      */
-    public ClassLoader getClassLoader() {
+    public ClassLoader getContextClassLoader() {
         return classLoader;
     }
 
+    public <T> T getContext() {
+        return (T) context;
+    }
+
 }

Modified: 
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=684135&r1=684134&r2=684135&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoverer.java
 (original)
+++ 
tuscany/java/sca/modules/extensibility-osgi/src/main/java/org/apache/tuscany/sca/extensibility/osgi/OSGiServiceDiscoverer.java
 Fri Aug  8 15:53:11 2008
@@ -262,9 +262,13 @@
      * This class loader can be set as the thread context class loader for 
non-OSGi code
      * @return
      */
-    public ClassLoader getClassLoader() {
+    public ClassLoader getContextClassLoader() {
         return classLoader;
     }
+    
+    public <T> T getContext() {
+        return (T) context;
+    }
 
     @SuppressWarnings("unchecked")
     public Set<ServiceDeclaration> discover(String serviceName, boolean 
firstOnly) {

Modified: 
tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscoverer.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscoverer.java?rev=684135&r1=684134&r2=684135&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscoverer.java
 (original)
+++ 
tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ClasspathServiceDiscoverer.java
 Fri Aug  8 15:53:11 2008
@@ -81,7 +81,7 @@
         }
 
         public Class<?> loadClass(String className) throws 
ClassNotFoundException {
-            return getClassLoader().loadClass(className);
+            return getContextClassLoader().loadClass(className);
         }
 
         private ClasspathServiceDiscoverer getOuterType() {
@@ -90,7 +90,7 @@
 
         public String toString() {
             StringBuffer sb = new StringBuffer();
-            sb.append("ClassLoader: ").append(getClassLoader());
+            sb.append("ClassLoader: ").append(getContextClassLoader());
             sb.append(" Attributes: ").append(attributes);
             return sb.toString();
         }
@@ -98,7 +98,7 @@
         public URL getResource(final String name) {
             return AccessController.doPrivileged(new PrivilegedAction<URL>() {
                 public URL run() {
-                    return getClassLoader().getResource(name);
+                    return getContextClassLoader().getResource(name);
                 }
             });
         }
@@ -123,14 +123,14 @@
             return AccessController.doPrivileged(new 
PrivilegedExceptionAction<List<URL>>() {
                 public List<URL> run() throws IOException {
                     if (firstOnly) {
-                        URL url = getClassLoader().getResource(name);
+                        URL url = getContextClassLoader().getResource(name);
                         if (url != null) {
                             return Arrays.asList(url);
                         } else {
                             return Collections.emptyList();
                         }
                     } else {
-                        return 
Collections.list(getClassLoader().getResources(name));
+                        return 
Collections.list(getContextClassLoader().getResources(name));
                     }
                 }
             });
@@ -139,9 +139,13 @@
         }
     }
 
-    private ClassLoader getClassLoader() {
+    public ClassLoader getContextClassLoader() {
         return classLoaderReference.get();
     }
+    
+    public <T> T getContext() {
+        return (T) getContextClassLoader();
+    }
 
     /**
      * Parse a service declaration in the form class;attr=value,attr=value and

Modified: 
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=684135&r1=684134&r2=684135&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscoverer.java
 (original)
+++ 
tuscany/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/extensibility/ServiceDiscoverer.java
 Fri Aug  8 15:53:11 2008
@@ -33,4 +33,13 @@
      * @return A set of service descriptors
      */
     Set<ServiceDeclaration> discover(String serviceName, boolean firstOnly);
+    
+    /**
+     * Get the context for the service discoverer
+     * @param <T> It can be a ClassLoader for JSE or BundleContext for OSGi
+     * @return The context
+     */
+    <T> T getContext();
+    
+    ClassLoader getContextClassLoader();
 }

Modified: tuscany/java/sca/modules/node2-impl/pom.xml
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/node2-impl/pom.xml?rev=684135&r1=684134&r2=684135&view=diff
==============================================================================
--- tuscany/java/sca/modules/node2-impl/pom.xml (original)
+++ tuscany/java/sca/modules/node2-impl/pom.xml Fri Aug  8 15:53:11 2008
@@ -83,7 +83,7 @@
                         <Bundle-Version>${tuscany.version}</Bundle-Version>
                         
<Bundle-SymbolicName>org.apache.tuscany.sca.node2.impl</Bundle-SymbolicName>
                         <Bundle-Description>${pom.name}</Bundle-Description>
-                        
<Export-Package>org.apache.tuscany.sca.node*</Export-Package>
+                        
<Export-Package>org.apache.tuscany.sca.node.impl*</Export-Package>
                     </instructions>
                 </configuration>
             </plugin>

Modified: 
tuscany/java/sca/modules/node2-launcher-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/launcher/FelixOSGiHost.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/node2-launcher-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/launcher/FelixOSGiHost.java?rev=684135&r1=684134&r2=684135&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/node2-launcher-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/launcher/FelixOSGiHost.java
 (original)
+++ 
tuscany/java/sca/modules/node2-launcher-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/launcher/FelixOSGiHost.java
 Fri Aug  8 15:53:11 2008
@@ -40,6 +40,7 @@
 public class FelixOSGiHost implements OSGiHost {
 
     private Felix felix;
+    private LauncherBundleActivator activator;
     private ClassLoader tccl;
 
     private final static String systemPackages =
@@ -82,6 +83,17 @@
             + "javax.transaction, "
             + "javax.transaction.xa";
 
+    public LauncherBundleActivator getActivator() {
+        if (activator == null) {
+            activator = new LauncherBundleActivator();
+        }
+        return activator;
+    }
+
+    public void setActivator(LauncherBundleActivator activator) {
+        this.activator = activator;
+    }
+
     public BundleContext start() {
         try {
             startup();
@@ -116,7 +128,7 @@
         configMap.put(BundleCache.CACHE_PROFILE_DIR_PROP, "target/.felix");
         List<BundleActivator> list = new ArrayList<BundleActivator>();
 
-        list.add(new LauncherBundleActivator());
+        list.add(getActivator());
 
         // Now create an instance of the framework with
         // our configuration properties and activator.
@@ -139,7 +151,7 @@
                     Method getter = 
discovererClass.getMethod("getServiceDiscoverer");
                     Object discoverer = getter.invoke(null);
 
-                    Method getCL = 
discoverer.getClass().getMethod("getClassLoader");
+                    Method getCL = 
discoverer.getClass().getMethod("getContextClassLoader");
                     ClassLoader cl = (ClassLoader)getCL.invoke(discoverer);
                     return cl;
                 } catch (Exception e) {

Modified: 
tuscany/java/sca/modules/node2-launcher-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/launcher/LauncherBundleActivator.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/node2-launcher-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/launcher/LauncherBundleActivator.java?rev=684135&r1=684134&r2=684135&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/node2-launcher-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/launcher/LauncherBundleActivator.java
 (original)
+++ 
tuscany/java/sca/modules/node2-launcher-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/launcher/LauncherBundleActivator.java
 Fri Aug  8 15:53:11 2008
@@ -40,8 +40,17 @@
 
     private BundleContext bundleContext;
     private List<Bundle> tuscanyBundles = new ArrayList<Bundle>();
-    
-    private List<URL> jarFiles = new ArrayList<URL>();
+
+    private List<URL> jarFiles;
+
+    public LauncherBundleActivator() {
+        super();
+    }
+
+    public LauncherBundleActivator(List<URL> jarFiles) {
+        super();
+        this.jarFiles = jarFiles;
+    }
 
     public static String toString(Bundle b, boolean verbose) {
         StringBuffer sb = new StringBuffer();
@@ -124,10 +133,12 @@
 
             // FIXME: SDO bundles dont have the correct dependencies
             System.setProperty("commonj.sdo.impl.HelperProvider", 
"org.apache.tuscany.sdo.helper.HelperProviderImpl");
-            File tuscanyInstallDir = 
findTuscanyInstallDir(bundleContext.getBundle());
+            List<URL> urls = jarFiles;
+            if (urls == null) {
+                File tuscanyInstallDir = 
findTuscanyInstallDir(bundleContext.getBundle());
 
-            List<URL> urls =
-                JarFileFinder.findJarFiles(tuscanyInstallDir, new 
JarFileFinder.StandAloneJARFileNameFilter());
+                urls = JarFileFinder.findJarFiles(tuscanyInstallDir, new 
JarFileFinder.StandAloneJARFileNameFilter());
+            }
 
             for (URL url : urls) {
                 File file = new File(url.toURI());
@@ -254,11 +265,11 @@
         }
         return null;
     }
-    
+
     private String getFileName(URL url) {
         String name = url.getPath();
         int index = name.lastIndexOf('/');
-        return name.substring(index+1);
+        return name.substring(index + 1);
     }
 
     private void addFileToJar(URL file, JarOutputStream jarOut) throws 
IOException {
@@ -314,7 +325,7 @@
                 InputStream in = mf.openStream();
                 manifest.read(in);
                 in.close();
-            } catch(IOException e) {
+            } catch (IOException e) {
                 // Ignore
             }
         }

Modified: 
tuscany/java/sca/tools/maven/maven-osgi-junit/src/main/java/org/apache/tuscany/tools/sca/osgi/junit/plugin/OSGiJUnitMojo.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/tools/maven/maven-osgi-junit/src/main/java/org/apache/tuscany/tools/sca/osgi/junit/plugin/OSGiJUnitMojo.java?rev=684135&r1=684134&r2=684135&view=diff
==============================================================================
--- 
tuscany/java/sca/tools/maven/maven-osgi-junit/src/main/java/org/apache/tuscany/tools/sca/osgi/junit/plugin/OSGiJUnitMojo.java
 (original)
+++ 
tuscany/java/sca/tools/maven/maven-osgi-junit/src/main/java/org/apache/tuscany/tools/sca/osgi/junit/plugin/OSGiJUnitMojo.java
 Fri Aug  8 15:53:11 2008
@@ -20,17 +20,23 @@
 
 import java.io.File;
 import java.lang.reflect.Method;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
+import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 
 import junit.framework.Assert;
 
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactResolver;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import 
org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
+import org.apache.maven.artifact.versioning.VersionRange;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.project.MavenProject;
 import org.apache.tuscany.sca.node.osgi.launcher.FelixOSGiHost;
 import org.apache.tuscany.sca.node.osgi.launcher.LauncherBundleActivator;
@@ -63,22 +69,109 @@
     protected File basedir;
 
     /**
-     * @component
+     * Used to look up Artifacts in the remote repository.
+     * 
+     * @parameter 
expression="${component.org.apache.maven.artifact.factory.ArtifactFactory}"
+     * @required
+     * @readonly
      */
-    protected ArtifactResolver resolver;
+    protected org.apache.maven.artifact.factory.ArtifactFactory factory;
 
-    protected ArtifactRepository localRepository;
+    /**
+     * Used to look up Artifacts in the remote repository.
+     * 
+     * @parameter 
expression="${component.org.apache.maven.artifact.resolver.ArtifactResolver}"
+     * @required
+     * @readonly
+     */
+    protected org.apache.maven.artifact.resolver.ArtifactResolver resolver;
+
+    /**
+     * Location of the local repository.
+     * 
+     * @parameter expression="${localRepository}"
+     * @readonly
+     * @required
+     */
+    protected org.apache.maven.artifact.repository.ArtifactRepository local;
+
+    /**
+     * List of Remote Repositories used by the resolver
+     * 
+     * @parameter expression="${project.remoteArtifactRepositories}"
+     * @readonly
+     * @required
+     */
+    protected java.util.List remoteRepos;
+
+    /**
+     * @parameter
+     */
+    protected String osgiRuntime;
+
+    protected Artifact getArtifact(String groupId, String artifactId) throws 
MojoExecutionException {
+        Artifact artifact;
+        VersionRange vr;
+        try {
+            vr = VersionRange.createFromVersionSpec(project.getVersion());
+        } catch (InvalidVersionSpecificationException e1) {
+            vr = VersionRange.createFromVersion(project.getVersion());
+        }
+        artifact = factory.createDependencyArtifact(groupId, artifactId, vr, 
"jar", null, Artifact.SCOPE_TEST);
+
+        try {
+            resolver.resolve(artifact, remoteRepos, local);
+        } catch (ArtifactResolutionException e) {
+            throw new MojoExecutionException("Unable to resolve artifact.", e);
+        } catch (ArtifactNotFoundException e) {
+            throw new MojoExecutionException("Unable to find artifact.", e);
+        }
+
+        return artifact;
+    }
 
     public void execute() throws MojoExecutionException {
         if (project.getPackaging().equals("pom")) {
             return;
         }
 
-        String home = new File(basedir, "target/tuscany").toString();
-        System.setProperty("TUSCANY_HOME", home);
-        getLog().info(home);
+        Log log = getLog();
+        List<URL> jarFiles = new ArrayList<URL>();
+        for (Object o : project.getArtifacts()) {
+            Artifact a = (Artifact)o;
+            try {
+                if (log.isDebugEnabled()) {
+                    log.debug("Adding: " + a);
+                }
+                jarFiles.add(a.getFile().toURI().toURL());
+            } catch (MalformedURLException e) {
+                getLog().error(e);
+            }
+        }
+
+        /*
+         * Add org.apache.tuscany.sca:tuscany-extensibility-osgi module
+         */
+        String aid = "equinox".equals(osgiRuntime) ? 
"tuscany-extensibility-equinox" : "tuscany-extensibility-osgi";
+        Artifact ext = getArtifact("org.apache.tuscany.sca", aid);
+        try {
+            URL url = ext.getFile().toURI().toURL();
+            if (!jarFiles.contains(url)) {
+                if (log.isDebugEnabled()) {
+                    log.debug("Adding: " + ext);
+                }
+                jarFiles.add(url);
+            }
+        } catch (MalformedURLException e) {
+            getLog().error(e);
+        }
+
+        //        String home = new File(basedir, "target/tuscany").toString();
+        //        System.setProperty("TUSCANY_HOME", home);
+        //        getLog().info(home);
         try {
             FelixOSGiHost host = new FelixOSGiHost();
+            host.setActivator(new LauncherBundleActivator(jarFiles));
             BundleContext context = host.start();
 
             for (Bundle b : context.getBundles()) {
@@ -102,9 +195,10 @@
             host.stop();
         } catch (Throwable e) {
             throw new MojoExecutionException(e.getMessage(), e);
-        } finally {
-            System.clearProperty("TUSCANY_HOME");
         }
+        //        finally {
+        //            System.clearProperty("TUSCANY_HOME");
+        //        }
 
     }
 
@@ -148,6 +242,7 @@
     public int runTestCase(ClassLoader testClassLoader, Class testClass) 
throws Exception {
 
         if (testClass.getName().endsWith("TestCase")) {
+            getLog().info("Running: " + testClass.getName());
             Class coreClass = Class.forName("org.junit.runner.JUnitCore", 
true, testClassLoader);
             Object core = coreClass.newInstance();
             Class reqClass = Class.forName("org.junit.runner.Request", true, 
testClassLoader);
@@ -168,10 +263,10 @@
                 } else {
                     errors++;
                 }
-                ((Throwable)ex).printStackTrace();
+                getLog().error((Throwable)ex);
             }
 
-            System.out.println("Test Runs: " + runs
+            getLog().info("Test Runs: " + runs
                 + ", Failures: "
                 + failures
                 + ", Errors: "


Reply via email to