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();
+ }
+}