You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by an...@apache.org on 2009/04/02 12:19:37 UTC

svn commit: r761236 - in /tuscany/java/sca: itest/ modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/

Author: antelder
Date: Thu Apr  2 10:19:37 2009
New Revision: 761236

URL: http://svn.apache.org/viewvc?rev=761236&view=rev
Log:
Add prototype code to support zip/folder contributions containing nested jar's, and add itests for that to build

Added:
    tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java   (with props)
Modified:
    tuscany/java/sca/itest/pom.xml
    tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java

Modified: tuscany/java/sca/itest/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/java/sca/itest/pom.xml?rev=761236&r1=761235&r2=761236&view=diff
==============================================================================
--- tuscany/java/sca/itest/pom.xml (original)
+++ tuscany/java/sca/itest/pom.xml Thu Apr  2 10:19:37 2009
@@ -59,6 +59,8 @@
                 <module>callback-set-callback</module>
                 <module>callback-set-conversation</module>
                 <module>component-type</module>
+                <module>contribution-folder</module>
+                <module>contribution-zip</module>
                 <module>conversations</module>
                 <!--module>definitions-multiple</module-->
                 <module>exceptions</module>

Modified: tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java?rev=761236&r1=761235&r2=761236&view=diff
==============================================================================
--- tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java (original)
+++ tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java Thu Apr  2 10:19:37 2009
@@ -20,7 +20,6 @@
 package org.apache.tuscany.sca.contribution.java.impl;
 
 import java.io.IOException;
-import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
@@ -52,9 +51,16 @@
         ClassLoader parentClassLoader = ServiceDiscovery.getInstance().getServiceDiscoverer().getClass().getClassLoader();
         return parentClassLoader;
     }
-    
-    public ClassLoaderModelResolver(final Contribution contribution, FactoryExtensionPoint modelFactories) throws MalformedURLException {
-        super(new URL[] {new URL(contribution.getLocation())}, parentClassLoader());
+
+    private static URL[] getContributionURLs(final Contribution contribution) throws IOException {
+        List<URL> urls = new ArrayList<URL>();
+        urls.add(new URL(contribution.getLocation()));
+        urls.addAll(ContributionHelper.getNestedJarUrls(contribution));
+        return urls.toArray(new URL[urls.size()]);
+    }
+
+    public ClassLoaderModelResolver(final Contribution contribution, FactoryExtensionPoint modelFactories) throws IOException {
+        super(getContributionURLs(contribution), parentClassLoader());
         this.contribution = contribution;
         
         // Index Java import resolvers by package name

Added: tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java?rev=761236&view=auto
==============================================================================
--- tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java (added)
+++ tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java Thu Apr  2 10:19:37 2009
@@ -0,0 +1,73 @@
+package org.apache.tuscany.sca.contribution.java.impl;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import org.apache.tuscany.sca.contribution.Artifact;
+import org.apache.tuscany.sca.contribution.Contribution;
+
+public class ContributionHelper {
+
+    public static List<URL> getNestedJarUrls(final Contribution contribution) throws IOException {
+        List<URL> urls = new ArrayList<URL>();
+        for (Artifact a : contribution.getArtifacts()) {
+            if (a.getLocation().endsWith(".jar")) {
+                if (contribution.getLocation().endsWith(".zip")) {
+                    urls.add(createTempJar(a, contribution));
+                } else {
+                    urls.add(new URL(a.getLocation()));
+                }
+            }
+        }
+        return urls;
+    }
+
+    /**
+     * URLClassLoader doesn't seem to work with URLs to jars within an archive so as a work around
+     * copy the jar to a temp file and use the url to that.
+     */
+    private static URL createTempJar(Artifact artifact, Contribution contribution) throws IOException {
+        FileOutputStream fileOutputStream = null;
+        ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(new File(URI.create(contribution.getLocation()))));
+        try {
+            ZipEntry zipEntry = zipInputStream.getNextEntry();
+            while (zipEntry != null) {
+                if (artifact.getLocation().endsWith(zipEntry.getName())) {
+
+                    String tempName = "tmp." + artifact.getURI().substring(0, artifact.getURI().length() - 3);
+                    File tempFile = File.createTempFile(tempName, ".jar");
+                    tempFile.deleteOnExit();
+                    fileOutputStream = new FileOutputStream(tempFile);
+
+                    byte[] buf = new byte[2048];
+                    int n;
+                    while ((n = zipInputStream.read(buf, 0, buf.length)) > -1) {
+                        fileOutputStream.write(buf, 0, n);
+                    }
+
+                    fileOutputStream.close();
+                    zipInputStream.closeEntry();
+
+                    return tempFile.toURI().toURL();
+
+                }
+                zipEntry = zipInputStream.getNextEntry();
+            }
+        } finally {
+            zipInputStream.close();
+            if (fileOutputStream != null) {
+                fileOutputStream.close();
+            }
+        }
+        
+        throw new IllegalStateException();
+    }
+}

Propchange: tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date