Author: rfeng
Date: Tue Feb  3 05:02:47 2009
New Revision: 740213

URL: http://svn.apache.org/viewvc?rev=740213&view=rev
Log:
Now have one bundle per 3rd party jar to be consistent with the distro story

Modified:
    
tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java
    
tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java

Modified: 
tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java?rev=740213&r1=740212&r2=740213&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java
 (original)
+++ 
tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java
 Tue Feb  3 05:02:47 2009
@@ -21,9 +21,12 @@
 
 import static java.lang.System.currentTimeMillis;
 import static java.lang.System.setProperty;
+import static 
org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.LAUNCHER_EQUINOX_LIBRARIES;
+import static 
org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.artifactId;
 import static 
org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.bundleName;
 import static 
org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.file;
 import static 
org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.fixupBundle;
+import static 
org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.jarVersion;
 import static 
org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.runtimeClasspathEntries;
 import static 
org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.string;
 import static 
org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.thirdPartyLibraryBundle;
@@ -32,6 +35,7 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URISyntaxException;
@@ -39,6 +43,7 @@
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -53,13 +58,14 @@
 import org.eclipse.core.runtime.adaptor.LocationManager;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
 
 /**
  * Wraps the Equinox runtime.
  */
 public class EquinoxHost {
     private static Logger logger = 
Logger.getLogger(EquinoxHost.class.getName());
-    
+
     static {
         if (getSystemProperty("osgi.debug") != null) {
             logger.setLevel(Level.FINE);
@@ -76,6 +82,8 @@
     private List<Bundle> installedBundles = new ArrayList<Bundle>();
 
     private Set<URL> bundleLocations;
+    private boolean aggregateThirdPartyJars = false;
+
     public EquinoxHost() {
         super();
     }
@@ -84,7 +92,7 @@
         super();
         this.bundleLocations = urls;
     }
-    
+
     private static String getSystemProperty(final String name) {
         return AccessController.doPrivileged(new PrivilegedAction<String>() {
             public String run() {
@@ -92,7 +100,7 @@
             }
         });
     }
-    
+
     private static Properties getSystemProperties() {
         return AccessController.doPrivileged(new 
PrivilegedAction<Properties>() {
             public Properties run() {
@@ -108,8 +116,8 @@
                 return props;
             }
         });
-    } 
-    
+    }
+
     private static void put(Properties props, String key, String value) {
         if (!props.contains(key)) {
             props.put(key, value);
@@ -136,9 +144,9 @@
                     props.load(is);
                     is.close();
                 }
-                
+
                 props.putAll(getSystemProperties());
-                
+
                 // Configure Eclipse properties
 
                 // Use the boot classloader as the parent classloader
@@ -161,7 +169,7 @@
                 put(props, LocationManager.PROP_USER_AREA_DEFAULT, new 
File(root, "user").toURI().toString());
 
                 EclipseStarter.setInitialProperties(props);
-                
+
                 // Test if the configuration/config.ini or osgi.bundles has 
been set
                 // If yes, try to avoid discovery of bundles
                 if (bundleLocations == null) {
@@ -179,7 +187,6 @@
                         }
                     }
                 }
-                
 
                 // Start Eclipse
                 bundleContext = EclipseStarter.startup(new String[] {}, null);
@@ -235,44 +242,26 @@
                 launcherBundleLocation = thisBundleLocation(launcherBundle);
             }
 
-            // Install the Tuscany bundles
-            long start = currentTimeMillis();
-
             // FIXME: SDO bundles dont have the correct dependencies
             setProperty("commonj.sdo.impl.HelperProvider", 
"org.apache.tuscany.sdo.helper.HelperProviderImpl");
 
-            // Install a single 'library' bundle for the third-party JAR files
-            String libraryBundleName = 
"org.apache.tuscany.sca.node.launcher.equinox.libraries";
-            Bundle libraryBundle = allBundles.get(libraryBundleName);
-            if (libraryBundle == null) {
-                if (logger.isLoggable(Level.FINE)) {
-                    logger.fine("Generating third-party library bundle.");
-                }
+            // Install the Tuscany bundles
+            long start = currentTimeMillis();
+
+            if (logger.isLoggable(Level.FINE)) {
+                logger.fine("Generating third-party library bundle.");
+            }
+            long libraryStart = currentTimeMillis();
+            if (!aggregateThirdPartyJars) {
                 for (String jarFile : jarFiles) {
-                    if (logger.isLoggable(Level.FINE)) {
-                        logger.fine("Adding third-party jar: " + jarFile);
-                    }
-                }
-                long libraryStart = currentTimeMillis();
-                InputStream library = thirdPartyLibraryBundle(jarFiles);
-                if (logger.isLoggable(Level.FINE)) {
-                    logger.fine("Third-party library bundle generated in " + 
(currentTimeMillis() - libraryStart)
-                        + " ms.");
-                }
-                libraryStart = currentTimeMillis();
-                libraryBundle =
-                    
bundleContext.installBundle("org.apache.tuscany.sca.node.launcher.equinox.libraries",
 library);
-                allBundles.put(libraryBundleName, libraryBundle);
-                installedBundles.add(libraryBundle);
-                if (logger.isLoggable(Level.FINE)) {
-                    logger.fine("Third-party library bundle installed in " + 
(currentTimeMillis() - libraryStart)
-                        + " ms: "
-                        + string(libraryBundle, false));
+                    installAsBundle(jarFile, null);
                 }
             } else {
-                if (logger.isLoggable(Level.FINE)) {
-                    logger.fine("Third-party library bundle is already 
installed: " + string(libraryBundle, false));
-                }
+                installAsBundle(jarFiles, LAUNCHER_EQUINOX_LIBRARIES);
+            }
+            if (logger.isLoggable(Level.FINE)) {
+                logger
+                    .fine("Third-party library bundle installed in " + 
(currentTimeMillis() - libraryStart) + " ms: ");
             }
 
             // Install all the other bundles that are not already installed
@@ -286,25 +275,7 @@
                 if (bundleName.contains("org.eclipse.jdt.junit")) {
                     continue;
                 }
-                Bundle bundle = allBundles.get(bundleName);
-                if (bundle == null) {
-                    long installStart = currentTimeMillis();
-                    String location = bundleFile;
-                    if (bundleFile.startsWith("file:")) {
-                        File target = file(new URL(bundleFile));
-                        // Use a special "reference" scheme to install the 
bundle as a reference
-                        // instead of copying the bundle 
-                        location = "reference:file:/" + target.getPath();
-                    }
-                    bundle = bundleContext.installBundle(location);
-                    if (logger.isLoggable(Level.FINE)) {
-                        logger.fine("Bundle installed in " + 
(currentTimeMillis() - installStart)
-                            + " ms: "
-                            + string(bundle, false));
-                    }
-                    allBundles.put(bundleName, bundle);
-                    installedBundles.add(bundle);
-                }
+                installBundle(bundleFile, bundleName);
             }
 
             long end = currentTimeMillis();
@@ -313,7 +284,6 @@
             }
 
             // Start the extensiblity and launcher bundles
-            long activateStart = System.currentTimeMillis();
             String extensibilityBundleName = 
"org.apache.tuscany.sca.extensibility.equinox";
             Bundle extensibilityBundle = 
allBundles.get(extensibilityBundleName);
             if ((extensibilityBundle.getState() & Bundle.ACTIVE) == 0) {
@@ -360,6 +330,63 @@
         }
     }
 
+    public Bundle installAsBundle(Collection<String> jarFiles, String 
libraryBundleName) throws IOException,
+        BundleException {
+        // Install a single 'library' bundle for the third-party JAR files
+        Bundle libraryBundle = allBundles.get(libraryBundleName);
+        if (libraryBundle == null) {
+            InputStream library = thirdPartyLibraryBundle(jarFiles, 
libraryBundleName, null);
+            libraryBundle = bundleContext.installBundle(libraryBundleName, 
library);
+            allBundles.put(libraryBundleName, libraryBundle);
+            installedBundles.add(libraryBundle);
+        } else {
+            if (logger.isLoggable(Level.FINE)) {
+                logger.fine("Third-party library bundle is already installed: 
" + string(libraryBundle, false));
+            }
+        }
+        return libraryBundle;
+    }
+
+    public void installBundle(String bundleFile, String bundleName) throws 
MalformedURLException, BundleException {
+        Bundle bundle = allBundles.get(bundleName);
+        if (bundle == null) {
+            long installStart = currentTimeMillis();
+            String location = bundleFile;
+            if (bundleFile.startsWith("file:")) {
+                File target = file(new URL(bundleFile));
+                // Use a special "reference" scheme to install the bundle as a 
reference
+                // instead of copying the bundle 
+                location = "reference:file:/" + target.getPath();
+            }
+            bundle = bundleContext.installBundle(location);
+            if (logger.isLoggable(Level.FINE)) {
+                logger.fine("Bundle installed in " + (currentTimeMillis() - 
installStart)
+                    + " ms: "
+                    + string(bundle, false));
+            }
+            allBundles.put(bundleName, bundle);
+            installedBundles.add(bundle);
+        }
+    }
+
+    public Bundle installAsBundle(String jarFile, String symbolicName) throws 
IOException, BundleException {
+        if (symbolicName == null) {
+            symbolicName = LAUNCHER_EQUINOX_LIBRARIES + "." + 
artifactId(jarFile);
+        }
+        Bundle bundle = allBundles.get(symbolicName);
+        if (bundle == null) {
+            String version = jarVersion(jarFile);
+            if (logger.isLoggable(Level.FINE)) {
+                logger.fine("Installing third-party jar as bundle: " + 
jarFile);
+            }
+            InputStream is = 
thirdPartyLibraryBundle(Collections.singleton(jarFile), symbolicName, version);
+            bundle = bundleContext.installBundle(symbolicName, is);
+            allBundles.put(symbolicName, bundle);
+            installedBundles.add(bundle);
+        }
+        return bundle;
+    }
+
     private Set<URL> findBundleLocations() throws FileNotFoundException, 
URISyntaxException, MalformedURLException {
         if (bundleLocations == null) {
             if (!startedEclipse) {

Modified: 
tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java?rev=740213&r1=740212&r2=740213&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java
 (original)
+++ 
tuscany/java/sca/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java
 Tue Feb  3 05:02:47 2009
@@ -45,6 +45,7 @@
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -63,6 +64,7 @@
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
 
 /**
  * Common functions and constants used by the admin components.
@@ -72,7 +74,7 @@
 final class NodeLauncherUtil {
     private static final Logger logger = 
Logger.getLogger(NodeLauncherUtil.class.getName());
 
-    private static final String LAUNCHER_EQUINOX_LIBRARIES = 
"org.apache.tuscany.sca.node.launcher.equinox.libraries";
+    static final String LAUNCHER_EQUINOX_LIBRARIES = 
"org.apache.tuscany.sca.node.launcher.equinox.libraries";
 
     private static final String NODE_FACTORY = 
"org.apache.tuscany.sca.node.NodeFactory";
 
@@ -230,7 +232,11 @@
         }
     }
 
-    private static Pattern pattern = Pattern.compile("-([0-9.]+)");
+    /**
+     * starting with -, then some digits, then . or - or _, then some digits 
again
+     * 
+     */
+    private static Pattern pattern = 
Pattern.compile("-(\\d)+((\\.|-|_)(\\d)+)*");
 
     /**
      * Returns the version number to use for the given JAR file.
@@ -238,19 +244,48 @@
      * @param jarFile
      * @return
      */
-    private static String jarVersion(String jarFile) {
-        Matcher matcher = pattern.matcher(jarFile);
-        String version = "1.0.0";
+    static String jarVersion(String jarFile) {
+        String name = jarFile;
+        int index = name.lastIndexOf('/');
+        if (index != -1) {
+            // Find the last segment
+            name = name.substring(index + 1);
+        }
+        index = name.lastIndexOf('.');
+        if (index != -1) {
+            // Trim the extension
+            name = name.substring(0, index);
+        }
+        
+        Matcher matcher = pattern.matcher(name);
+        String version = "0.0.0";
         if (matcher.find()) {
             version = matcher.group();
-            if (version.endsWith(".")) {
-                version = version.substring(1, version.length() - 1);
-            } else {
-                version = version.substring(1);
-            }
+            version = version.substring(1);
         }
         return version;
     }
+    
+    static String artifactId(String jarFile) {
+        String name = jarFile;
+        int index = name.lastIndexOf('/');
+        if (index != -1) {
+            // Find the last segment
+            name = name.substring(index + 1);
+        }
+        index = name.lastIndexOf('.');
+        if (index != -1) {
+            // Trim the extension
+            name = name.substring(0, index);
+        }
+        
+        Matcher matcher = pattern.matcher(name);
+        if (matcher.find()) {
+            return name.substring(0, matcher.start());
+        } else {
+            return name;
+        }
+    }
 
     /**
      * Add the packages found in the given JAR to a set.
@@ -259,8 +294,12 @@
      * @param packages
      * @throws IOException
      */
-    private static void addPackages(String jarFile, Set<String> packages) 
throws IOException {
-        String version = ";version=" + jarVersion(jarFile);
+    private static void addPackages(String jarFile, Set<String> packages, 
String version) throws IOException {
+        if (version == null) {
+            version = ";version=" + jarVersion(jarFile);
+        } else {
+            version = ";version=" + version;
+        }
         File file = file(new URL(jarFile));
         if (file.isDirectory()) {
             List<String> classFiles = listClassFiles(file);
@@ -326,10 +365,12 @@
      * Generate a manifest from a list of third-party JAR files.
      * 
      * @param jarFiles
+     * @param bundleSymbolicName The Bundle-SymbolicName
+     * @param bundleVersion The Bundle-Version
      * @return
      * @throws IllegalStateException
      */
-    static private Manifest thirdPartyLibraryBundleManifest(List<String> 
jarFiles) throws IllegalStateException {
+    static private Manifest thirdPartyLibraryBundleManifest(Collection<String> 
jarFiles, String bundleSymbolicName, String bundleVersion) throws 
IllegalStateException {
         try {
 
             // List exported packages and bundle classpath entries
@@ -338,7 +379,7 @@
             StringBuffer imports = new StringBuffer();
             Set<String> packages = new HashSet<String>();
             for (String jarFile : jarFiles) {
-                addPackages(jarFile, packages);
+                addPackages(jarFile, packages, bundleVersion);
                 classpath.append("\"external:");
                 classpath.append(file(new 
URL(jarFile)).getPath().replace(File.separatorChar, '/'));
                 classpath.append("\",");
@@ -368,7 +409,15 @@
             Attributes attributes = manifest.getMainAttributes();
             attributes.putValue("Manifest-Version", "1.0");
             attributes.putValue(BUNDLE_MANIFESTVERSION, "2");
-            attributes.putValue(BUNDLE_SYMBOLICNAME, 
LAUNCHER_EQUINOX_LIBRARIES);
+            
+            if (bundleVersion == null) {
+                bundleVersion = "0.0.0";
+            }
+            attributes.putValue(Constants.BUNDLE_VERSION, bundleVersion);
+            if (bundleSymbolicName == null) {
+                bundleSymbolicName = LAUNCHER_EQUINOX_LIBRARIES;
+            }
+            attributes.putValue(BUNDLE_SYMBOLICNAME, bundleSymbolicName);
             attributes.putValue(EXPORT_PACKAGE, exports.substring(0, 
exports.length() - 1));
             attributes.putValue(IMPORT_PACKAGE, imports.substring(0, 
imports.length() - 1));
             attributes.putValue(BUNDLE_CLASSPATH, classpath.substring(0, 
classpath.length() - 1));
@@ -384,12 +433,14 @@
      * Generates a library bundle from a list of third-party JARs.
      * 
      * @param jarFiles
+     * @param bundleSymbolicName The Bundle-SymbolicName
+     * @param bundleVersion The Bundle-Version
      * @return
      * @throws IOException
      */
-    static InputStream thirdPartyLibraryBundle(List<String> jarFiles) throws 
IOException {
+    static InputStream thirdPartyLibraryBundle(Collection<String> jarFiles, 
String bundleSymbolicName, String bundleVersion) throws IOException {
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        Manifest mf = thirdPartyLibraryBundleManifest(jarFiles);
+        Manifest mf = thirdPartyLibraryBundleManifest(jarFiles, 
bundleSymbolicName, bundleVersion);
         JarOutputStream jos = new JarOutputStream(bos, mf);
         jos.close();
         return new ByteArrayInputStream(bos.toByteArray());


Reply via email to