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/06 12:32:16 UTC

svn commit: r762272 - in /tuscany/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl: ClassLoaderModelResolver.java ContributionClassLoader.java ContributionHelper.java

Author: antelder
Date: Mon Apr  6 10:32:15 2009
New Revision: 762272

URL: http://svn.apache.org/viewvc?rev=762272&view=rev
Log:
Copy zip/folder nested jar support change from 2.x to 1.x

Added:
    tuscany/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java   (with props)
Modified:
    tuscany/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java
    tuscany/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionClassLoader.java

Modified: tuscany/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java?rev=762272&r1=762271&r2=762272&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java (original)
+++ tuscany/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ClassLoaderModelResolver.java Mon Apr  6 10:32:15 2009
@@ -55,8 +55,15 @@
         return parentClassLoader;
     }
     
-    public ClassLoaderModelResolver(final Contribution contribution, ModelFactoryExtensionPoint 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, ModelFactoryExtensionPoint modelFactories) throws IOException {
+        super(getContributionURLs(contribution), parentClassLoader());
         this.contribution = contribution;
         
         // Index Java import resolvers by package name

Modified: tuscany/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionClassLoader.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionClassLoader.java?rev=762272&r1=762271&r2=762272&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionClassLoader.java (original)
+++ tuscany/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionClassLoader.java Mon Apr  6 10:32:15 2009
@@ -25,10 +25,12 @@
 import java.net.URLClassLoader;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashSet;
+import java.util.List;
 
 import org.apache.tuscany.sca.contribution.Contribution;
 import org.apache.tuscany.sca.contribution.Export;
@@ -57,7 +59,10 @@
         if (contribution.getLocation() != null) {
             try {
                 this.addURL(new URL(contribution.getLocation()));
-            } catch (MalformedURLException e) {
+                for (URL url : ContributionHelper.getNestedJarUrls(contribution)) {
+                    this.addURL(url);
+                }
+            } catch (IOException e) {
                 throw new RuntimeException(e);
             }
         }

Added: tuscany/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java?rev=762272&view=auto
==============================================================================
--- tuscany/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java (added)
+++ tuscany/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java Mon Apr  6 10:32:15 2009
@@ -0,0 +1,78 @@
+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>();
+        boolean isZipContribution = contribution.getLocation().endsWith(".zip");
+        URI uri = URI.create(contribution.getLocation());
+        boolean isFolderContribution = !isZipContribution && uri.getScheme().equals("file") && new File(uri).isDirectory();
+        if (isZipContribution || isFolderContribution) {
+            for (Artifact a : contribution.getArtifacts()) {
+                if (a.getLocation().endsWith(".jar")) {
+                    if (isZipContribution) {
+                        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)).replace('/', '.');
+                    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/branches/sca-java-1.x/modules/contribution-java/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

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