You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by js...@apache.org on 2008/09/15 08:02:31 UTC

svn commit: r695349 [2/2] - in /tuscany/branches/sca-android: modules/ modules/api/META-INF/ modules/assembly-java-dsl/META-INF/ modules/assembly-xml/META-INF/ modules/assembly-xsd/META-INF/ modules/assembly/META-INF/ modules/binding-atom-abdera/META-I...

Added: tuscany/branches/sca-android/modules/interface/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/interface/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/interface/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/interface/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/monitor-logging/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/monitor-logging/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/monitor-logging/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/monitor-logging/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/monitor/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/monitor/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/monitor/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/monitor/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/node-api/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/node-api/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/node-api/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/node-api/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/node-impl/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/node-impl/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/node-impl/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/node-impl/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/node-launcher-equinox/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/node-launcher-equinox/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/node-launcher-equinox/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/node-launcher-equinox/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Modified: tuscany/branches/sca-android/modules/node-launcher-equinox/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/node-launcher-equinox/pom.xml?rev=695349&r1=695348&r2=695349&view=diff
==============================================================================
--- tuscany/branches/sca-android/modules/node-launcher-equinox/pom.xml (original)
+++ tuscany/branches/sca-android/modules/node-launcher-equinox/pom.xml Sun Sep 14 23:01:45 2008
@@ -111,9 +111,6 @@
                         <Bundle-Version>${tuscany.version}</Bundle-Version>
                         <Bundle-SymbolicName>org.apache.tuscany.sca.node.launcher.equinox</Bundle-SymbolicName>
                         <Bundle-Description>${pom.name}</Bundle-Description>
-                        <!-- 
-                        <Bundle-Activator>org.apache.tuscany.sca.node.equinox.launcher.LauncherBundleActivator</Bundle-Activator>
-                        -->
                         <Export-Package>org.apache.tuscany.sca.node.equinox.launcher*</Export-Package>
                         <Eclipse-AutoStart>true</Eclipse-AutoStart> 
                     </instructions>

Modified: tuscany/branches/sca-android/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java?rev=695349&r1=695348&r2=695349&view=diff
==============================================================================
--- tuscany/branches/sca-android/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java (original)
+++ tuscany/branches/sca-android/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java Sun Sep 14 23:01:45 2008
@@ -101,9 +101,6 @@
             // Use the boot classloader as the parent classloader
             props.put("osgi.contextClassLoaderParent", "boot");
             
-            // Set the extension bundle
-            props.put("osgi.framework.extensions", "org.apache.tuscany.sca.node.launcher.equinox");
-            
             // Set startup properties
             props.put(EclipseStarter.PROP_CLEAN, "true");
             

Modified: tuscany/branches/sca-android/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxLauncherBundleHelper.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxLauncherBundleHelper.java?rev=695349&r1=695348&r2=695349&view=diff
==============================================================================
--- tuscany/branches/sca-android/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxLauncherBundleHelper.java (original)
+++ tuscany/branches/sca-android/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxLauncherBundleHelper.java Sun Sep 14 23:01:45 2008
@@ -1,6 +1,12 @@
 package org.apache.tuscany.sca.node.equinox.launcher;
 
-import java.io.ByteArrayInputStream;
+import static java.lang.System.currentTimeMillis;
+import static java.lang.System.getProperty;
+import static java.lang.System.setProperty;
+import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.libraryBundle;
+import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.string;
+
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -32,20 +38,22 @@
         this.bundleContext.addBundleListener(this);
 
         // Install the Tuscany bundles
-        long start = System.currentTimeMillis();
+        long start = currentTimeMillis();
 
         // FIXME: SDO bundles dont have the correct dependencies
-        System.setProperty("commonj.sdo.impl.HelperProvider", "org.apache.tuscany.sdo.helper.HelperProviderImpl");
+        setProperty("commonj.sdo.impl.HelperProvider", "org.apache.tuscany.sdo.helper.HelperProviderImpl");
 
         // Get the list of JAR files to install
-        String jarFilesProperty = System.getProperty("org.apache.tuscany.sca.node.launcher.equinox.jarFiles");
+        String jarFilesProperty = getProperty("org.apache.tuscany.sca.node.launcher.equinox.jarFiles");
         String[] jarFiles = jarFilesProperty.split(";");
         
         // Create a single 'library' bundle for them
-        long libraryStart = System.currentTimeMillis();
-        //InputStream library = NodeLauncherUtil.libraryBundle(jarFiles);
-        Bundle libraryBundle = bundleContext.installBundle("org.apache.tuscany.sca.node.launcher.equinox.libraries", new ByteArrayInputStream(new byte[0]));
-        logger.info("Third-party library bundle installed in " + (System.currentTimeMillis() - libraryStart) + " ms: " + NodeLauncherUtil.string(libraryBundle, false));
+        long libraryStart = currentTimeMillis();
+        InputStream library = libraryBundle(jarFiles);
+        logger.info("Third-party library bundle generated in " + (currentTimeMillis() - libraryStart) + " ms.");
+        libraryStart = currentTimeMillis();
+        Bundle libraryBundle = bundleContext.installBundle("org.apache.tuscany.sca.node.launcher.equinox.libraries", library);
+        logger.info("Third-party library bundle installed in " + (currentTimeMillis() - libraryStart) + " ms: " + string(libraryBundle, false));
         installedBundles.add(libraryBundle);
         
         // Get the set of already installed bundles
@@ -55,9 +63,9 @@
         }
 
         // Get the list of bundle files and names to install
-        String bundleFilesProperty = System.getProperty("org.apache.tuscany.sca.node.launcher.equinox.bundleFiles");
+        String bundleFilesProperty = getProperty("org.apache.tuscany.sca.node.launcher.equinox.bundleFiles");
         String[] bundleFiles = bundleFilesProperty.split(";");
-        String bundleNamesProperty = System.getProperty("org.apache.tuscany.sca.node.launcher.equinox.bundleNames");
+        String bundleNamesProperty = getProperty("org.apache.tuscany.sca.node.launcher.equinox.bundleNames");
         String[] bundleNames = bundleNamesProperty.split(";");
         
         // Install all the bundles that are not already installed
@@ -68,14 +76,14 @@
                 if (bundleName.contains("org.eclipse.jdt.junit")) {
                     continue;
                 }
-                long installStart = System.currentTimeMillis();
+                long installStart = currentTimeMillis();
                 Bundle bundle = bundleContext.installBundle(bundleFile);
-                logger.info("Bundle installed in " + (System.currentTimeMillis() - installStart) + " ms: " + NodeLauncherUtil.string(bundle, false));
+                logger.info("Bundle installed in " + (currentTimeMillis() - installStart) + " ms: " + string(bundle, false));
                 installedBundles.add(bundle);
             }
         }
 
-        long end = System.currentTimeMillis();
+        long end = currentTimeMillis();
         logger.info("Tuscany bundles are installed in " + (end - start) + " ms.");
     }
 
@@ -86,7 +94,7 @@
             Bundle bundle = installedBundles.get(i);
             try {
                 //if (logger.isLoggable(Level.FINE)) {
-                logger.info("Uninstalling bundle: " + NodeLauncherUtil.string(bundle, false));
+                logger.info("Uninstalling bundle: " + string(bundle, false));
                 //}
                 bundle.uninstall();
             } catch (Exception e) {

Modified: tuscany/branches/sca-android/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java?rev=695349&r1=695348&r2=695349&view=diff
==============================================================================
--- tuscany/branches/sca-android/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java (original)
+++ tuscany/branches/sca-android/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java Sun Sep 14 23:01:45 2008
@@ -26,11 +26,13 @@
 import static org.osgi.framework.Constants.EXPORT_PACKAGE;
 import static org.osgi.framework.Constants.IMPORT_PACKAGE;
 
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.io.InputStream;
 import java.lang.reflect.Constructor;
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -308,11 +310,12 @@
         }
     }
 
-    static byte[] generateBundle(Manifest mf) throws IOException {
+    static InputStream libraryBundle(String[] jarFiles) throws IOException {
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        Manifest mf = libraryManifest(jarFiles);
         JarOutputStream jos = new JarOutputStream(bos, mf);
         jos.close();
-        return bos.toByteArray();
+        return new ByteArrayInputStream(bos.toByteArray());
     }
 
     /**

Added: tuscany/branches/sca-android/modules/node-launcher-osgi/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/node-launcher-osgi/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/node-launcher-osgi/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/node-launcher-osgi/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Modified: tuscany/branches/sca-android/modules/node-launcher-osgi/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/node-launcher-osgi/pom.xml?rev=695349&r1=695348&r2=695349&view=diff
==============================================================================
--- tuscany/branches/sca-android/modules/node-launcher-osgi/pom.xml (original)
+++ tuscany/branches/sca-android/modules/node-launcher-osgi/pom.xml Sun Sep 14 23:01:45 2008
@@ -132,7 +132,6 @@
                 </configuration>
             </plugin>
 
-<!-- 
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
@@ -146,7 +145,6 @@
                     </instructions>
                 </configuration>
             </plugin>
- -->            
         </plugins>
     </build>
 

Added: tuscany/branches/sca-android/modules/node-launcher-webapp/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/node-launcher-webapp/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/node-launcher-webapp/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/node-launcher-webapp/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/node-launcher/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/node-launcher/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/node-launcher/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/node-launcher/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/node-manager/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/node-manager/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/node-manager/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/node-manager/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/osgi-runtime/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/osgi-runtime/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/osgi-runtime/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/osgi-runtime/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/policy-logging/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/policy-logging/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/policy-logging/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/policy-logging/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/policy-security-jsr250/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/policy-security-jsr250/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/policy-security-jsr250/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/policy-security-jsr250/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/policy-security-ws/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/policy-security-ws/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/policy-security-ws/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/policy-security-ws/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/policy-security/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/policy-security/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/policy-security/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/policy-security/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/policy-transaction/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/policy-transaction/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/policy-transaction/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/policy-transaction/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/policy-xml-ws/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/policy-xml-ws/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/policy-xml-ws/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/policy-xml-ws/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/policy-xml/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/policy-xml/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/policy-xml/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/policy-xml/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/policy/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/policy/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/policy/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/policy/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Modified: tuscany/branches/sca-android/modules/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/pom.xml?rev=695349&r1=695348&r2=695349&view=diff
==============================================================================
--- tuscany/branches/sca-android/modules/pom.xml (original)
+++ tuscany/branches/sca-android/modules/pom.xml Sun Sep 14 23:01:45 2008
@@ -156,9 +156,8 @@
                 <module>node-api</module>
                 <module>node-impl</module>
                 <module>node-launcher</module>
-                <!--
                 <module>node-launcher-equinox</module>
-                -->
+                <module>thirdparty-library</module>
                 <module>node-launcher-osgi</module>
                 <module>node-launcher-webapp</module>
                 <module>node-manager</module>
@@ -206,30 +205,53 @@
     <build>
         <plugins>
             <plugin>
-                <artifactId>maven-jar-plugin</artifactId>
-                <configuration>
-                    <archive>
-                        <manifestFile>
-                            ${project.build.outputDirectory}/META-INF/MANIFEST.MF
-                        </manifestFile>
-                    </archive>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <version>1.4.3</version>
-                <extensions>true</extensions>
-                <executions>
-                    <execution>
-                        <id>bundle-manifest</id>
-                        <phase>process-classes</phase>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
+               <artifactId>maven-eclipse-plugin</artifactId>
+               <version>2.5.1</version>
+               <configuration>
+                   <buildcommands>
+                       <buildcommand>org.eclipse.pde.ManifestBuilder</buildcommand>
+                       <buildcommand>org.eclipse.jdt.core.javabuilder</buildcommand>
+                   </buildcommands>
+                   <projectnatures>
+                       <projectnature>org.eclipse.jdt.core.javanature</projectnature>
+                       <projectnature>org.eclipse.pde.PluginNature</projectnature>
+                   </projectnatures>
+                   <classpathContainers>
+                       <classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER</classpathContainer>
+                       <!--
+                       <classpathContainer>org.eclipse.pde.core.requiredPlugins</classpathContainer>
+                        -->
+                   </classpathContainers>
+               </configuration>
+           </plugin>
+
+           <plugin>
+               <groupId>org.apache.felix</groupId>
+               <artifactId>maven-bundle-plugin</artifactId>
+               <version>1.4.3</version>
+               <extensions>true</extensions>
+               <executions>
+                   <execution>
+                       <id>bundle-manifest</id>
+                       <phase>process-classes</phase>
+                       <goals>
+                           <goal>manifest</goal>
+                       </goals>
+                       <configuration>
+                           <manifestLocation>${basedir}/META-INF</manifestLocation>
+                       </configuration>
+                   </execution>
+               </executions>
+           </plugin> 
+
+           <plugin>
+               <artifactId>maven-jar-plugin</artifactId>
+               <configuration>
+                   <archive>
+                       <manifestFile>${basedir}/META-INF/MANIFEST.MF</manifestFile>
+                   </archive>
+               </configuration>
+           </plugin>
         </plugins>
     </build>
     

Added: tuscany/branches/sca-android/modules/runtime-standalone/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/runtime-standalone/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/runtime-standalone/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/runtime-standalone/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/runtime-tomcat/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/runtime-tomcat/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/runtime-tomcat/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/runtime-tomcat/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/runtime-war/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/runtime-war/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/runtime-war/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/runtime-war/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/runtime/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/runtime/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/runtime/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/runtime/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/runtime2/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/runtime2/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/runtime2/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/runtime2/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/sca-api/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/sca-api/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/sca-api/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/sca-api/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/scdl4j/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/scdl4j/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/scdl4j/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/scdl4j/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/thirdparty-library/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/thirdparty-library/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/thirdparty-library/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/thirdparty-library/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/thirdparty-library/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/thirdparty-library/pom.xml?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/thirdparty-library/pom.xml (added)
+++ tuscany/branches/sca-android/modules/thirdparty-library/pom.xml Sun Sep 14 23:01:45 2008
@@ -0,0 +1,76 @@
+<?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-thirdparty-library</artifactId>
+    <name>Apache Tuscany OSGi Bundle for Third Party Jars</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-distribution-all</artifactId>
+            <type>pom</type>
+            <version>1.4-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+              <artifactId>maven-clean-plugin</artifactId>
+              <configuration>
+                <filesets>
+                  <fileset>
+                    <directory>${basedir}/lib</directory>
+                    <includes>
+                      <include>*</include>
+                    </includes>
+                    <followSymlinks>false</followSymlinks>
+                   </fileset>
+                 </filesets>
+               </configuration>
+             </plugin>
+            
+            <plugin>
+                <groupId>org.apache.tuscany.sca</groupId>
+                <artifactId>tuscany-maven-bundle-plugin</artifactId>
+                <configuration>
+                    <copyJars>true</copyJars>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>build-manifest</id>
+                        <goals>
+                            <goal>build</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+            </plugin>
+
+        </plugins>
+    </build>
+</project>

Added: tuscany/branches/sca-android/modules/tracing-aspectj/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/tracing-aspectj/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/tracing-aspectj/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/tracing-aspectj/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Modified: tuscany/branches/sca-android/modules/tracing-aspectj/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/tracing-aspectj/pom.xml?rev=695349&r1=695348&r2=695349&view=diff
==============================================================================
--- tuscany/branches/sca-android/modules/tracing-aspectj/pom.xml (original)
+++ tuscany/branches/sca-android/modules/tracing-aspectj/pom.xml Sun Sep 14 23:01:45 2008
@@ -93,6 +93,18 @@
                     <argLine>-ea -Xmx128m -javaagent:target/dependency/aspectjweaver-1.6.1.jar</argLine>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Bundle-Version>1.4</Bundle-Version>
+                        <Bundle-SymbolicName>org.apache.tuscany.sca.tracing.aspect</Bundle-SymbolicName>
+                        <Bundle-Description>${pom.description}</Bundle-Description>
+                        <Export-Package></Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file

Added: tuscany/branches/sca-android/modules/workspace-impl/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/workspace-impl/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/workspace-impl/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/workspace-impl/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/workspace-xml/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/workspace-xml/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/workspace-xml/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/workspace-xml/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/workspace/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/workspace/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/workspace/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/workspace/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/xsd-xml/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/xsd-xml/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/xsd-xml/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/xsd-xml/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Added: tuscany/branches/sca-android/modules/xsd/META-INF/README
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/modules/xsd/META-INF/README?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/modules/xsd/META-INF/README (added)
+++ tuscany/branches/sca-android/modules/xsd/META-INF/README Sun Sep 14 23:01:45 2008
@@ -0,0 +1 @@
+This directory contains a generated MANIFEST.MF file.

Modified: tuscany/branches/sca-android/samples/calculator-rcp/src/main/java/calculator/rcp/Activator.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/samples/calculator-rcp/src/main/java/calculator/rcp/Activator.java?rev=695349&r1=695348&r2=695349&view=diff
==============================================================================
--- tuscany/branches/sca-android/samples/calculator-rcp/src/main/java/calculator/rcp/Activator.java (original)
+++ tuscany/branches/sca-android/samples/calculator-rcp/src/main/java/calculator/rcp/Activator.java Sun Sep 14 23:01:45 2008
@@ -18,6 +18,12 @@
  */
 package calculator.rcp;
 
+import java.io.File;
+
+import org.apache.tuscany.sca.extensibility.equinox.EquinoxServiceDiscoverer;
+import org.apache.tuscany.sca.node.SCAContribution;
+import org.apache.tuscany.sca.node.SCANode;
+import org.apache.tuscany.sca.node.SCANodeFactory;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.osgi.framework.BundleContext;
@@ -33,6 +39,8 @@
     // The shared instance
     private static Activator plugin;
 
+    private SCANode node;
+
     /**
      * The constructor
      */
@@ -46,6 +54,10 @@
     public void start(BundleContext context) throws Exception {
         super.start(context);
         plugin = this;
+        Class<?> cls = EquinoxServiceDiscoverer.class;
+        SCANodeFactory factory = SCANodeFactory.newInstance();
+        node = factory.createSCANode("Calculator.composite", new SCAContribution("c1", new File("target/classes").toURI().toString()));
+        node.start();
     }
 
     /*
@@ -55,6 +67,9 @@
     public void stop(BundleContext context) throws Exception {
         plugin = null;
         super.stop(context);
+        if (node != null) {
+            node.stop();
+        }
     }
 
     /**

Added: tuscany/branches/sca-android/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleMojo.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleMojo.java?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleMojo.java (added)
+++ tuscany/branches/sca-android/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleMojo.java Sun Sep 14 23:01:45 2008
@@ -0,0 +1,285 @@
+/*
+ * 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.tools.sca.tuscany.bundle.plugin;
+
+import static org.apache.tuscany.tools.sca.tuscany.bundle.plugin.LibraryBundleUtil.write;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.jar.Manifest;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactCollector;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolver;
+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.maven.shared.dependency.tree.DependencyTree;
+import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
+
+/**
+ * @version $Rev$ $Date$
+ * @goal build
+ * @phase process-sources
+ * @requiresDependencyResolution test
+ * @description Build a virtual bundle for 3rd party dependencies
+ */
+public class LibraryBundleMojo extends AbstractMojo {
+    /**
+     * The project to create a build for.
+     *
+     * @parameter expression="${project}"
+     * @required
+     * @readonly
+     */
+    private MavenProject project;
+
+    /**
+     * The basedir of the project.
+     * 
+     * @parameter expression="${basedir}"
+     * @required @readonly
+     */
+    private File basedir;
+
+    /**
+     * Used to look up Artifacts in the remote repository.
+     * 
+     * @parameter expression="${component.org.apache.maven.artifact.factory.ArtifactFactory}"
+     * @required
+     * @readonly
+     */
+    private org.apache.maven.artifact.factory.ArtifactFactory factory;
+
+    /**
+     * Used to look up Artifacts in the remote repository.
+     * 
+     * @parameter expression="${component.org.apache.maven.artifact.resolver.ArtifactResolver}"
+     * @required
+     * @readonly
+     */
+    private org.apache.maven.artifact.resolver.ArtifactResolver resolver;
+
+    /**
+     * Location of the local repository.
+     * 
+     * @parameter expression="${localRepository}"
+     * @readonly
+     * @required
+     */
+    private org.apache.maven.artifact.repository.ArtifactRepository local;
+
+    /**
+     * List of Remote Repositories used by the resolver
+     * 
+     * @parameter expression="${project.remoteArtifactRepositories}"
+     * @readonly
+     * @required
+     */
+    private java.util.List remoteRepos;
+
+    /**
+     * @parameter
+     */
+    private boolean copyJars = false;
+
+    /**
+     * Dependency tree builder
+     * 
+     * @component
+     */
+    private DependencyTreeBuilder dependencyTreeBuilder;
+
+    /**
+     * Artifact factory
+     * 
+     * @component
+     */
+    private ArtifactFactory artifactFactory;
+    
+    /**
+     * @component
+     */
+    private ArtifactMetadataSource artifactMetadataSource;    
+    
+    /**
+     * @component
+     */
+    private ArtifactCollector collector;
+
+    /**
+     * The local repository
+     *
+     * @parameter expression="${localRepository}"
+     * @required
+     */
+    private ArtifactRepository localRepository;
+
+    /**
+     * The remote repositories
+     *
+     * @parameter expression="${project.remoteArtifactRepositories}"
+     */
+    private List remoteRepositories;
+    
+    /**
+     * Artifact resolver
+     * 
+     * @component
+     */
+    private ArtifactResolver artifactResolver;
+
+    public void execute() throws MojoExecutionException {
+        Log log = getLog();
+
+        if (project.getPackaging().equals("pom")) {
+            return;
+        }
+
+        DependencyTree dependencyTree;
+        try {
+            dependencyTree = dependencyTreeBuilder.buildDependencyTree(project, 
+                                                                                  localRepository, artifactFactory,
+                                                                                  artifactMetadataSource, collector );
+                                                                          
+        } catch (DependencyTreeBuilderException e) {
+            throw new MojoExecutionException("Could not build dependency tree", e);
+        }
+        
+        Set<File> jarFiles = new HashSet<File>();
+        for (Object o : dependencyTree.getArtifacts()) {
+            Artifact artifact = (Artifact)o;
+
+            if (!(Artifact.SCOPE_COMPILE.equals(artifact.getScope()) || Artifact.SCOPE_RUNTIME.equals(artifact.getScope()))) {
+                if (log.isDebugEnabled()) {
+                    log.debug("Skipping artifact: " + artifact);
+                }
+                continue;
+            }
+            if (!"jar".equals(artifact.getType())) {
+                continue;
+            }
+            if ("org.apache.tuscany.sca".equals(artifact.getGroupId())) {
+                continue;
+            }
+            
+            VersionRange versionRange = artifact.getVersionRange();
+            if (versionRange == null)
+                versionRange = VersionRange.createFromVersion(artifact.getVersion());
+            Artifact dependencyArtifact = artifactFactory.createDependencyArtifact(artifact.getGroupId(), 
+                                                                                   artifact.getArtifactId(), 
+                                                                                   versionRange, 
+                                                                                   artifact.getType(), 
+                                                                                   artifact.getClassifier(), 
+                                                                                   artifact.getScope());
+                                                                           
+           try {
+               artifactResolver.resolve(dependencyArtifact, remoteRepositories, localRepository);
+           } catch (ArtifactResolutionException e) {
+               log.warn("Artifact " + artifact + " could not be resolved.");
+           } catch (ArtifactNotFoundException e) {
+               log.warn("Artifact " + artifact + " could not be found.");
+           }
+           artifact = dependencyArtifact;
+
+            if (log.isDebugEnabled()) {
+                log.debug("Artifact: " + artifact);
+            }
+            String bundleName = null;
+            try {
+                bundleName = LibraryBundleUtil.getBundleName(artifact.getFile());
+            } catch (IOException e) {
+                throw new MojoExecutionException(e.getMessage(), e);
+            }
+            if (bundleName == null) {
+                if (artifact.getFile().exists()) {
+                    log.info("Adding third party jar: " + artifact);
+                    jarFiles.add(artifact.getFile());
+                } else {
+                    log.warn("Third party jar not found: " + artifact);
+                }
+            }
+        }
+
+        try {
+            String version = project.getVersion();
+            if (version.endsWith(Artifact.SNAPSHOT_VERSION)) {
+                version = version.substring(0, version.length() - Artifact.SNAPSHOT_VERSION.length() - 1);
+            }
+
+            Manifest mf = LibraryBundleUtil.libraryManifest(jarFiles, project.getName(), version, copyJars);
+            File file = new File(project.getBasedir(), "META-INF");
+            file.mkdir();
+            file= new File(file, "MANIFEST.MF");
+            if (log.isDebugEnabled()) {
+                log.debug("Generating " + file);
+            }
+
+            FileOutputStream fos = new FileOutputStream(file);
+            write(mf, fos);
+            fos.close();
+
+            if (copyJars) {
+                File lib = new File(project.getBasedir(), "lib");
+                if (lib.isDirectory()) {
+                    for (File c : lib.listFiles()) {
+                        c.delete();
+                    }
+                }
+                lib.mkdir();
+                byte[] buf = new byte[4096];
+                for (File jar : jarFiles) {
+                    File jarFile = new File(lib, jar.getName());
+                    if (log.isDebugEnabled()) {
+                        log.debug("Copying " + jar + " to " + jarFile);
+                    }
+                    FileInputStream in = new FileInputStream(jar);
+                    FileOutputStream out = new FileOutputStream(jarFile);
+                    for (;;) {
+                        int len = in.read(buf);
+                        if (len > 0) {
+                            out.write(buf, 0, len);
+                        } else {
+                            break;
+                        }
+                    }
+                    in.close();
+                    out.close();
+                }
+            }
+        } catch (Exception e) {
+            throw new MojoExecutionException(e.getMessage(), e);
+        }
+
+    }
+
+}

Added: tuscany/branches/sca-android/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleUtil.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-android/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleUtil.java?rev=695349&view=auto
==============================================================================
--- tuscany/branches/sca-android/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleUtil.java (added)
+++ tuscany/branches/sca-android/tools/maven/maven-tuscany-bundle-plugin/src/main/java/org/apache/tuscany/tools/sca/tuscany/bundle/plugin/LibraryBundleUtil.java Sun Sep 14 23:01:45 2008
@@ -0,0 +1,281 @@
+/*
+ * 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.tools.sca.tuscany.bundle.plugin;
+
+import static org.osgi.framework.Constants.BUNDLE_CLASSPATH;
+import static org.osgi.framework.Constants.BUNDLE_MANIFESTVERSION;
+import static org.osgi.framework.Constants.BUNDLE_NAME;
+import static org.osgi.framework.Constants.BUNDLE_SYMBOLICNAME;
+import static org.osgi.framework.Constants.BUNDLE_VERSION;
+import static org.osgi.framework.Constants.DYNAMICIMPORT_PACKAGE;
+import static org.osgi.framework.Constants.EXPORT_PACKAGE;
+import static org.osgi.framework.Constants.IMPORT_PACKAGE;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * Common functions and constants used by the admin components.
+ *
+ * @version $Rev$ $Date$
+ */
+public final class LibraryBundleUtil {
+
+    private static final String LAUNCHER_EQUINOX_LIBRARIES = "org.apache.tuscany.sca.node.launcher.equinox.libraries";
+
+    static File file(URL url) {
+        if (url == null || !url.getProtocol().equals("file")) {
+            return null;
+        } else {
+            String filename = url.getFile().replace('/', File.separatorChar);
+            int pos = 0;
+            while ((pos = filename.indexOf('%', pos)) >= 0) {
+                if (pos + 2 < filename.length()) {
+                    String hexStr = filename.substring(pos + 1, pos + 3);
+                    char ch = (char)Integer.parseInt(hexStr, 16);
+                    filename = filename.substring(0, pos) + ch + filename.substring(pos + 3);
+                }
+            }
+            return new File(filename);
+        }
+    }
+
+    static Pattern pattern = Pattern.compile("-([0-9.]+)");
+
+    private static String version(String jarFile) {
+        Matcher matcher = pattern.matcher(jarFile);
+        String version = "1.0.0";
+        if (matcher.find()) {
+            version = matcher.group();
+            if (version.endsWith(".")) {
+                version = version.substring(1, version.length() - 1);
+            } else {
+                version = version.substring(1);
+            }
+        }
+        return version;
+    }
+
+    private static void addPackages(File jarFile, Set<String> packages) throws IOException {
+        String version = ";version=" + version(jarFile.getPath());
+        ZipInputStream is = new ZipInputStream(new FileInputStream(jarFile));
+        ZipEntry entry;
+        while ((entry = is.getNextEntry()) != null) {
+            String entryName = entry.getName();
+            if (!entry.isDirectory() && entryName != null
+                && entryName.length() > 0
+                && !entryName.startsWith(".")
+                && entryName.endsWith(".class") // Exclude resources from Export-Package
+                && entryName.lastIndexOf("/") > 0
+                && Character.isJavaIdentifierStart(entryName.charAt(0))) {
+                String pkg = entryName.substring(0, entryName.lastIndexOf("/")).replace('/', '.');
+                if (!("org.apache.commons.lang.enum".equals(pkg))) {
+                    packages.add(pkg + version);
+                }
+            }
+        }
+        is.close();
+    }
+
+    static Manifest libraryManifest(Set<File> jarFiles, String name, String version, boolean copyJars)
+        throws IllegalStateException {
+        try {
+
+            // List exported packages and bundle classpath entries
+            StringBuffer classpath = new StringBuffer();
+            StringBuffer exports = new StringBuffer();
+            StringBuffer imports = new StringBuffer();
+            Set<String> packages = new HashSet<String>();
+            for (File jarFile : jarFiles) {
+                addPackages(jarFile, packages);
+                if (copyJars) {
+                    classpath.append("lib/");
+                    classpath.append(jarFile.getName());
+                    classpath.append(",");
+                } else {
+                    classpath.append("\"external:");
+                    classpath.append(jarFile.getPath().replace(File.separatorChar, '/'));
+                    classpath.append("\",");
+                }
+            }
+
+            Set<String> importPackages = new HashSet<String>();
+            for (String pkg : packages) {
+                exports.append(pkg);
+                exports.append(',');
+
+                String importPackage = pkg;
+                int index = pkg.indexOf(';');
+                if (index != -1) {
+                    importPackage = pkg.substring(0, index);
+                }
+                if (!importPackages.contains(importPackage)) {
+                    imports.append(importPackage);
+                    imports.append(',');
+                    importPackages.add(importPackage);
+                }
+            }
+
+            // Create a manifest
+            Manifest manifest = new Manifest();
+            Attributes attributes = manifest.getMainAttributes();
+            attributes.putValue("Manifest-Version", "1.0");
+            attributes.putValue(BUNDLE_MANIFESTVERSION, "2");
+            attributes.putValue(BUNDLE_SYMBOLICNAME, LAUNCHER_EQUINOX_LIBRARIES);
+            attributes.putValue(BUNDLE_NAME, name);
+            attributes.putValue(BUNDLE_VERSION, version);
+            attributes.putValue(DYNAMICIMPORT_PACKAGE, "*");
+            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));
+
+            return manifest;
+        } catch (IOException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    static String dump(Manifest mf) throws IOException {
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        mf.write(bos);
+        return new String(bos.toByteArray());
+    }
+
+    static byte[] generateBundle(Manifest mf) throws IOException {
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        JarOutputStream jos = new JarOutputStream(bos, mf);
+        jos.close();
+        return bos.toByteArray();
+    }
+
+    static void write(Manifest manifest, OutputStream out) throws IOException {
+        DataOutputStream dos = new DataOutputStream(out);
+        Attributes attributes = manifest.getMainAttributes();
+        write(attributes, "Manifest-Version", dos);
+        write(attributes, BUNDLE_MANIFESTVERSION, dos);
+        write(attributes, BUNDLE_SYMBOLICNAME, dos);
+        write(attributes, BUNDLE_NAME, dos);
+        write(attributes, BUNDLE_VERSION, dos);
+        write(attributes, DYNAMICIMPORT_PACKAGE, dos);
+        write(attributes, EXPORT_PACKAGE, dos);
+        write(attributes, IMPORT_PACKAGE, dos);
+        write(attributes, BUNDLE_CLASSPATH, dos);
+        dos.flush();
+    }
+    
+    private static void write(Attributes attributes, String key, DataOutputStream dos) throws IOException {
+        StringBuffer line = new StringBuffer();
+        line.append(key);
+        line.append(": ");
+        String value = attributes.getValue(key); 
+        line.append(new String(value.getBytes("UTF8")));
+        line.append("\r\n");
+        int l = line.length();
+        if (l > 72) {
+            for (int i = 70; i < l - 2;) {
+                line.insert(i, "\r\n ");
+                i += 72;
+                l += 3;
+            }
+        }
+        dos.writeBytes(line.toString());
+    }
+
+    /**
+     * Returns the name of a bundle, or null if the given file is not a bundle.
+     *  
+     * @param file
+     * @return
+     * @throws IOException
+     */
+    static String getBundleName(File file) throws IOException {
+        if (!file.exists()) {
+            return null;
+        }
+        String bundleName = null;
+        if (file.isDirectory()) {
+            File mf = new File(file, "META-INF/MANIFEST.MF");
+            if (mf.isFile()) {
+                Manifest manifest = new Manifest(new FileInputStream(mf));
+                bundleName = manifest.getMainAttributes().getValue(BUNDLE_SYMBOLICNAME);
+            }
+        } else {
+            JarFile jar = new JarFile(file, false);
+            Manifest manifest = jar.getManifest();
+            bundleName = manifest.getMainAttributes().getValue(BUNDLE_SYMBOLICNAME);
+            jar.close();
+        }
+        if (bundleName == null) {
+            return bundleName;
+        }
+        int sc = bundleName.indexOf(';');
+        if (sc != -1) {
+            bundleName = bundleName.substring(0, sc);
+        }
+        return bundleName;
+    }
+
+    public static String string(Bundle b, boolean verbose) {
+        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");
+        }
+
+        if (verbose) {
+            sb.append(" ").append(b.getLocation());
+            sb.append(" ").append(b.getHeaders());
+        }
+        return sb.toString();
+    }
+}