Author: rsivaram
Date: Tue May 13 15:01:18 2008
New Revision: 656026

URL: http://svn.apache.org/viewvc?rev=656026&view=rev
Log:
Install individual virtual bundles for 3rd party jars

Modified:
    
incubator/tuscany/java/sca/itest/osgi-tuscany/osgi-tuscany-test/src/main/java/org/apache/tuscany/sca/test/util/TuscanyLoader.java
    
incubator/tuscany/java/sca/itest/osgi-tuscany/osgi-tuscany-test/src/test/java/org/apache/tuscany/sca/test/osgi/harness/OSGiTuscanyTestHarness.java
    
incubator/tuscany/java/sca/itest/osgi-tuscany/osgi-tuscany-test/src/test/java/org/apache/tuscany/sca/test/osgi/tuscany/OSGiSupplyChainTestCase.java
    incubator/tuscany/java/sca/itest/osgi-tuscany/pom.xml
    incubator/tuscany/java/sca/itest/osgi-tuscany/tuscany-manifest/pom.xml
    
incubator/tuscany/java/sca/itest/osgi-tuscany/tuscany-manifest/src/main/java/org/apache/tuscany/sca/manifest/ManifestBundleActivator.java
    
incubator/tuscany/java/sca/modules/osgi-runtime/src/main/java/org/apache/tuscany/sca/osgi/runtime/OSGiBundleActivator.java

Modified: 
incubator/tuscany/java/sca/itest/osgi-tuscany/osgi-tuscany-test/src/main/java/org/apache/tuscany/sca/test/util/TuscanyLoader.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/osgi-tuscany/osgi-tuscany-test/src/main/java/org/apache/tuscany/sca/test/util/TuscanyLoader.java?rev=656026&r1=656025&r2=656026&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/itest/osgi-tuscany/osgi-tuscany-test/src/main/java/org/apache/tuscany/sca/test/util/TuscanyLoader.java
 (original)
+++ 
incubator/tuscany/java/sca/itest/osgi-tuscany/osgi-tuscany-test/src/main/java/org/apache/tuscany/sca/test/util/TuscanyLoader.java
 Tue May 13 15:01:18 2008
@@ -59,6 +59,8 @@
     
     private static final HashSet<String> ignoreTuscanyModules = new 
HashSet<String>();
     
+    private static String manifestClassPath = null;
+    
     static {
         for (String ignoreModule : tuscanyModulesToIgnore) {
             ignoreTuscanyModules.add(ignoreModule);
@@ -119,6 +121,8 @@
         String tuscanyManifestBundleName = new File(tuscanyManifestDir + 
"/target/" + tuscanyManifestJar).toURI().toURL().toString();
         Bundle tuscanyManifestBundle = 
bundleContext.installBundle(tuscanyManifestBundleName);        
         tuscanyManifestBundle.start();
+        
+        manifestClassPath = 
(String)tuscanyManifestBundle.getHeaders().get("Class-Path");
     }
     
     
@@ -146,6 +150,8 @@
                 for (File file : files) {
                     if (ignoreTuscanyModules.contains(file.getName()))
                         continue;
+                    if (manifestClassPath != null && 
manifestClassPath.indexOf(file.getName()) < 0)
+                        continue;
                     String bundleURL = findBundle(file.toString(), "tuscany");
                     if (bundleURL != null) {
                         Bundle bundle = bundleContext.installBundle(bundleURL);

Modified: 
incubator/tuscany/java/sca/itest/osgi-tuscany/osgi-tuscany-test/src/test/java/org/apache/tuscany/sca/test/osgi/harness/OSGiTuscanyTestHarness.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/osgi-tuscany/osgi-tuscany-test/src/test/java/org/apache/tuscany/sca/test/osgi/harness/OSGiTuscanyTestHarness.java?rev=656026&r1=656025&r2=656026&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/itest/osgi-tuscany/osgi-tuscany-test/src/test/java/org/apache/tuscany/sca/test/osgi/harness/OSGiTuscanyTestHarness.java
 (original)
+++ 
incubator/tuscany/java/sca/itest/osgi-tuscany/osgi-tuscany-test/src/test/java/org/apache/tuscany/sca/test/osgi/harness/OSGiTuscanyTestHarness.java
 Tue May 13 15:01:18 2008
@@ -81,6 +81,9 @@
         OSGiRuntimeLoader.shutdownOSGiRuntime();
     }
     
+    public BundleContext getBundleContext() {
+        return bundleContext;
+    }
    
     public void runTest(String... testDirs) throws Exception {
         

Modified: 
incubator/tuscany/java/sca/itest/osgi-tuscany/osgi-tuscany-test/src/test/java/org/apache/tuscany/sca/test/osgi/tuscany/OSGiSupplyChainTestCase.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/osgi-tuscany/osgi-tuscany-test/src/test/java/org/apache/tuscany/sca/test/osgi/tuscany/OSGiSupplyChainTestCase.java?rev=656026&r1=656025&r2=656026&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/itest/osgi-tuscany/osgi-tuscany-test/src/test/java/org/apache/tuscany/sca/test/osgi/tuscany/OSGiSupplyChainTestCase.java
 (original)
+++ 
incubator/tuscany/java/sca/itest/osgi-tuscany/osgi-tuscany-test/src/test/java/org/apache/tuscany/sca/test/osgi/tuscany/OSGiSupplyChainTestCase.java
 Tue May 13 15:01:18 2008
@@ -23,6 +23,8 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
 
 /*
  * Test Tuscany running in an OSGi container
@@ -45,6 +47,14 @@
     @After
     public void tearDown() throws Exception {
 
+        BundleContext bundleContext = testHarness.getBundleContext();
+        if (bundleContext != null) {
+            Bundle[] bundles = bundleContext.getBundles();
+            for (Bundle bundle : bundles) {
+                if (bundle.getSymbolicName() != null && 
bundle.getSymbolicName().startsWith("supplychain"))
+                    bundle.uninstall();
+            }
+        }
         if (testHarness != null) {
             testHarness.tearDown();
         }

Modified: incubator/tuscany/java/sca/itest/osgi-tuscany/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/osgi-tuscany/pom.xml?rev=656026&r1=656025&r2=656026&view=diff
==============================================================================
--- incubator/tuscany/java/sca/itest/osgi-tuscany/pom.xml (original)
+++ incubator/tuscany/java/sca/itest/osgi-tuscany/pom.xml Tue May 13 15:01:18 
2008
@@ -37,9 +37,11 @@
         <module>tuscany-runtime</module>
         <module>tuscany-extensions</module>
         <module>tuscany-3rdparty</module>
--->
+
 
         <module>tuscany-3rdparty-manifest</module>
+-->
+
         <module>tuscany-manifest</module>
 
 

Modified: incubator/tuscany/java/sca/itest/osgi-tuscany/tuscany-manifest/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/osgi-tuscany/tuscany-manifest/pom.xml?rev=656026&r1=656025&r2=656026&view=diff
==============================================================================
--- incubator/tuscany/java/sca/itest/osgi-tuscany/tuscany-manifest/pom.xml 
(original)
+++ incubator/tuscany/java/sca/itest/osgi-tuscany/tuscany-manifest/pom.xml Tue 
May 13 15:01:18 2008
@@ -473,6 +473,12 @@
             <groupId>${pom.groupId}</groupId>
             <artifactId>tuscany-implementation-script</artifactId>
             <version>${pom.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>groovy</groupId>
+                    <artifactId>groovy-all-minimal</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>${pom.groupId}</groupId>

Modified: 
incubator/tuscany/java/sca/itest/osgi-tuscany/tuscany-manifest/src/main/java/org/apache/tuscany/sca/manifest/ManifestBundleActivator.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/osgi-tuscany/tuscany-manifest/src/main/java/org/apache/tuscany/sca/manifest/ManifestBundleActivator.java?rev=656026&r1=656025&r2=656026&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/itest/osgi-tuscany/tuscany-manifest/src/main/java/org/apache/tuscany/sca/manifest/ManifestBundleActivator.java
 (original)
+++ 
incubator/tuscany/java/sca/itest/osgi-tuscany/tuscany-manifest/src/main/java/org/apache/tuscany/sca/manifest/ManifestBundleActivator.java
 Tue May 13 15:01:18 2008
@@ -10,6 +10,8 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.jar.Attributes;
+import java.util.jar.JarInputStream;
 import java.util.jar.JarOutputStream;
 import java.util.jar.Manifest;
 import java.util.zip.ZipEntry;
@@ -48,28 +50,48 @@
     private void install3rdPartyJarsIntoOSGi(BundleContext bundleContext) {
     
         try {
-            HashMap<String, InputStream> separateBundles = new HashMap<String, 
InputStream>();
-            HashSet<String> thirdPartyJars = new HashSet<String>();
-            
-            File tuscanyInstallDir = find3rdPartyJars(bundleContext, 
thirdPartyJars, separateBundles);
+            // FIXME: SDO bundles dont have the correct dependencies
+            System.setProperty("commonj.sdo.impl.HelperProvider", 
"org.apache.tuscany.sdo.helper.HelperProviderImpl");
             
-            String thirdPartyBundleLocation = 
tuscanyInstallDir.toURI().toURL().toString() + "/tuscany-3rdparty.jar";
+            HashMap<String, InputStream> thirdPartyJarsWithManifests = new 
HashMap<String, InputStream>();
+            HashSet<String> thirdPartyJars = new HashSet<String>();
             
-            InputStream manifestStream = 
this.getClass().getClassLoader().getResourceAsStream(TUSCANY_OSGI_MANIFEST_DIR 
+ "/MANIFEST.MF");
+            File tuscanyInstallDir = find3rdPartyJars(bundleContext, 
thirdPartyJars, thirdPartyJarsWithManifests);
             
-            if (manifestStream != null) {
+//            Install 3rd party libs as a single virtual bundle            
+//            String thirdPartyBundleLocation = 
tuscanyInstallDir.toURI().toURL().toString() + "/tuscany-3rdparty.jar";
+//            
+//            InputStream manifestStream = 
this.getClass().getClassLoader().getResourceAsStream(TUSCANY_OSGI_MANIFEST_DIR 
+ "/MANIFEST.MF");
+//            
+//            if (manifestStream != null) {
+//            
+//                createAndInstallBundle(bundleContext, 
thirdPartyBundleLocation, manifestStream, tuscanyInstallDir, thirdPartyJars);
+//            }
             
-                createAndInstallBundle(bundleContext, 
thirdPartyBundleLocation, manifestStream, tuscanyInstallDir, thirdPartyJars);
+            for (String bundleName : thirdPartyJarsWithManifests.keySet()) {
+                                
+                String bundleLocation = 
tuscanyInstallDir.toURI().toURL().toString() + "/" + bundleName;
+                InputStream bundleManifestStream = 
thirdPartyJarsWithManifests.get(bundleName);
+                HashSet<String> jarSet = new HashSet<String>();
+                jarSet.add(bundleName);
+                
+                createAndInstallBundle(bundleContext, bundleLocation, 
bundleManifestStream, tuscanyInstallDir, jarSet);
+                bundleManifestStream.close();
+                
             }
             
-            for (String bundleName : separateBundles.keySet()) {
-                                
+            for (String bundleName : thirdPartyJars) {
+                
+                if (bundleName.startsWith("org.apache.felix"))
+                    continue;
+                
                 String bundleLocation = 
tuscanyInstallDir.toURI().toURL().toString() + "/" + bundleName;
-                InputStream bundleManifestStream = 
separateBundles.get(bundleName);
+                InputStream bundleManifestStream = 
createBundleManifest(tuscanyInstallDir, bundleName);
                 HashSet<String> jarSet = new HashSet<String>();
-                jarSet.add(bundleLocation);
+                jarSet.add(bundleName);
                 
                 createAndInstallBundle(bundleContext, bundleLocation, 
bundleManifestStream, tuscanyInstallDir, jarSet);
+                bundleManifestStream.close();
                 
             }
             
@@ -80,7 +102,7 @@
         
     private File find3rdPartyJars(BundleContext bundleContext, 
             HashSet<String> thirdPartyJars, 
-            HashMap<String, InputStream> individual3rdPartyBundles) 
+            HashMap<String, InputStream> thirdPartyBundleManifests) 
     throws IOException
     {
         
@@ -116,14 +138,15 @@
         String[] classPathEntries = classPath.split(" ");
         for (String classPathEntry : classPathEntries) {
             classPathEntry = classPathEntry.trim();
-            if (!classPathEntry.startsWith("tuscany") || 
classPathEntry.startsWith("tuscany-sdo")) {
+            if (!classPathEntry.startsWith("tuscany") || 
classPathEntry.startsWith("tuscany-sdo") || 
classPathEntry.startsWith("tuscany-das")) {
                 if (classPathEntry.endsWith(".jar")) {
                     String manifestName = TUSCANY_OSGI_MANIFEST_DIR + "/" + 
classPathEntry.substring(0, classPathEntry.length()-4) + ".mf";
                     InputStream manifestStream;
                     if ((manifestStream = 
this.getClass().getClassLoader().getResourceAsStream(manifestName)) != null)
-                        individual3rdPartyBundles.put(classPathEntry, 
manifestStream);
+                        thirdPartyBundleManifests.put(classPathEntry, 
manifestStream);
+                    else
+                        thirdPartyJars.add(classPathEntry);
                 }
-                thirdPartyJars.add(classPathEntry);
             }
         }
         
@@ -190,5 +213,75 @@
             e.printStackTrace();
         }
     }
+    
+    private InputStream createBundleManifest(File tuscanyDir, String 
bundleName) throws Exception {
+        File jarFile = new File(tuscanyDir.getPath() + File.separator + 
bundleName);
+        if (!jarFile.exists())
+            return null;
+        JarInputStream jar = new JarInputStream(new FileInputStream(jarFile));
+        Manifest manifest = jar.getManifest();
+        if (manifest == null)
+            manifest = new Manifest();
+        Attributes attributes = manifest.getMainAttributes();
+        if (attributes.getValue("Manifest-Version") == null) {
+            attributes.putValue("Manifest-Version", "1.0");
+        }
+        attributes.putValue("Bundle-ClassPath", bundleName);
+        
+        String packages = getPackagesInJar(bundleName, jar);
+
+        attributes.remove(new Attributes.Name("Require-Bundle"));
+        attributes.remove(new Attributes.Name("Import-Package"));
+        
+        if (attributes.getValue("Bundle-SymbolicName") == null)
+            attributes.putValue("Bundle-SymbolicName", bundleName);
+        if (attributes.getValue("Bundle-Version") == null)
+            attributes.putValue("Bundle-Version", "1.0.0");
+        // Existing export statements in bundles may contain versions, so they 
should be used as is
+        // SDO exports are not sufficient, and should be changed
+        if (attributes.getValue("Export-Package") == null || 
bundleName.startsWith("tuscany-sdo-impl")) {
+            attributes.putValue("Export-Package", packages);
+            attributes.putValue("Import-Package", packages);
+        }
+        
+        attributes.putValue("DynamicImport-Package", "*");       
+        
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        manifest.write(out);
+        ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+        out.close();
+               
+        return in;
+        
+    }
+    
+    private String getPackagesInJar(String bundleName, JarInputStream jar) 
throws Exception {
+        HashSet<String> packages = new HashSet<String>();
+        ZipEntry entry;
+        while ((entry = jar.getNextEntry()) != null) {
+            String entryName = entry.getName();
+            if (!entry.isDirectory() && entryName != null && 
entryName.length() > 0 && 
+                    !entryName.startsWith(".") && 
!entryName.startsWith("META-INF") &&
+                    entryName.lastIndexOf("/") > 0) {
+                String pkg = entryName.substring(0, 
entryName.lastIndexOf("/")).replace('/', '.');
+                packages.add(pkg);
+                
+            }
+        }
+        // FIXME: Split package
+        if (bundleName.startsWith("axis2-adb"))
+            packages.remove("org.apache.axis2.util");
+        if (bundleName.startsWith("axis2-codegen")) {
+            packages.remove("org.apache.axis2.wsdl");
+            packages.remove("org.apache.axis2.wsdl.util");
+        }
+        
+        StringBuilder pkgBuf = new StringBuilder();
+        for (String pkg : packages) {
+            if (pkgBuf.length() >0) pkgBuf.append(',');
+            pkgBuf.append(pkg);
+        }
+        return pkgBuf.toString();
+    }
        
 }

Modified: 
incubator/tuscany/java/sca/modules/osgi-runtime/src/main/java/org/apache/tuscany/sca/osgi/runtime/OSGiBundleActivator.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/osgi-runtime/src/main/java/org/apache/tuscany/sca/osgi/runtime/OSGiBundleActivator.java?rev=656026&r1=656025&r2=656026&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/osgi-runtime/src/main/java/org/apache/tuscany/sca/osgi/runtime/OSGiBundleActivator.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/osgi-runtime/src/main/java/org/apache/tuscany/sca/osgi/runtime/OSGiBundleActivator.java
 Tue May 13 15:01:18 2008
@@ -131,7 +131,9 @@
                     }
                 }
                    }
-               }
+               } else {
+            threadContextClassLoader.addBundle(bundle); 
+        }
        }
 
 


Reply via email to