summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorantelder <antelder@13f79535-47bb-0310-9956-ffa450edef68>2012-07-30 15:55:20 +0000
committerantelder <antelder@13f79535-47bb-0310-9956-ffa450edef68>2012-07-30 15:55:20 +0000
commit538d376ff03d211552152e042a84cd360d2f1fb7 (patch)
tree7eed4a75f59c6bb6d5930c607fdd570842f2929d
parent7e2bce2a6d6c7fa9bb38b97497b3004338e1f7eb (diff)
TUSCANY-4067: Update to support resources in jars and zips nested within contributions
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1367134 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/Contribution.java6
-rw-r--r--sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/impl/ContributionImpl.java18
-rw-r--r--sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java68
-rw-r--r--sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/impl/ContributionContentProcessor.java186
4 files changed, 212 insertions, 66 deletions
diff --git a/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/Contribution.java b/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/Contribution.java
index 07824bd4d7..d092af31e0 100644
--- a/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/Contribution.java
+++ b/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/Contribution.java
@@ -19,6 +19,7 @@
package org.apache.tuscany.sca.contribution;
+import java.net.URL;
import java.util.List;
import java.util.Set;
@@ -133,4 +134,9 @@ public interface Contribution extends Artifact, Extensible {
void mergeMetaData(ContributionMetadata metaData);
void addComposite(Composite composite);
+
+ List<URL> getExtractedArchives();
+
+ boolean useNestedArchives();
+ void setUseNestedArcives(boolean b);
} \ No newline at end of file
diff --git a/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/impl/ContributionImpl.java b/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/impl/ContributionImpl.java
index b795ac9c22..aa6d75c6bd 100644
--- a/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/impl/ContributionImpl.java
+++ b/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/impl/ContributionImpl.java
@@ -19,6 +19,7 @@
package org.apache.tuscany.sca.contribution.impl;
+import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@@ -51,9 +52,11 @@ class ContributionImpl extends ExtensibleImpl implements Contribution {
private List<Contribution> dependencies = new ArrayList<Contribution>();
private ModelResolver modelResolver;
private Set<String> types = new HashSet<String>();
+ private List<URL> extractedArchives = new ArrayList<URL>();
// FIXME remove this dependency on Java ClassLoaders
private ClassLoader classLoader;
+ private boolean useNestedArchives = true;
ContributionImpl() {
}
@@ -193,4 +196,19 @@ class ContributionImpl extends ExtensibleImpl implements Contribution {
a.setUnresolved(false);
artifacts.add(a);
}
+
+ @Override
+ public List<URL> getExtractedArchives() {
+ return extractedArchives;
+ }
+
+ @Override
+ public boolean useNestedArchives() {
+ return useNestedArchives;
+ }
+
+ @Override
+ public void setUseNestedArcives(boolean b) {
+ this.useNestedArchives = b;
+ }
}
diff --git a/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java b/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java
index 372607193c..f8ca0863d5 100644
--- a/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java
+++ b/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/java/impl/ContributionHelper.java
@@ -18,85 +18,23 @@
*/
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.security.AccessController;
-import java.security.PrivilegedAction;
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>();
- final boolean isZipContribution = contribution.getLocation().endsWith(".zip");
- final URI uri = URI.create(contribution.getLocation());
- boolean isFolderContribution = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
- public Boolean run() {
- return !isZipContribution && uri.getScheme().equals("file") && new File(uri.getSchemeSpecificPart()).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()));
- }
- }
+ for (URL url : contribution.getExtractedArchives()) {
+ if (url.toString().endsWith(".jar")) {
+ urls.add(url);
}
}
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();
- }
}
diff --git a/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/impl/ContributionContentProcessor.java b/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/impl/ContributionContentProcessor.java
index 58abc98d21..75e34bbcbf 100644
--- a/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/impl/ContributionContentProcessor.java
+++ b/sca-java-2.x/trunk/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/impl/ContributionContentProcessor.java
@@ -19,12 +19,19 @@
package org.apache.tuscany.sca.contribution.processor.impl;
import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
import org.apache.tuscany.sca.assembly.Composite;
import org.apache.tuscany.sca.contribution.Artifact;
@@ -154,7 +161,7 @@ public class ContributionContentProcessor implements ExtendedURLArtifactProcesso
} catch (MalformedURLException e) {
//ignore
}
-
+
Object model =
artifactProcessor.read(contributionURL,
URI.create(artifact.getURI()),
@@ -185,6 +192,21 @@ public class ContributionContentProcessor implements ExtendedURLArtifactProcesso
List<Artifact> contributionArtifacts = contribution.getArtifacts();
contributionArtifacts.addAll(artifacts);
+
+ if (contribution.useNestedArchives() && !!!isWebApp(contribution)) {
+ List<Artifact> nestedArchives = getNestedArchives(contribution);
+ List<URL> nestedArchiveURLs;
+ if (scanner instanceof DirectoryContributionScanner) {
+ nestedArchiveURLs = getNestedArchiveURLs(nestedArchives, contribution.getLocation());
+ } else {
+ try {
+ nestedArchiveURLs = extractNestedArchives(nestedArchives, contribution.getLocation());
+ } catch (IOException e) {
+ throw new ContributionReadException(e);
+ }
+ }
+ processNestedArchives(nestedArchiveURLs, contribution, context, monitor);
+ }
// If no sca-contribution.xml file was provided then just consider
// all composites in the contribution as deployables
@@ -224,6 +246,126 @@ public class ContributionContentProcessor implements ExtendedURLArtifactProcesso
return contribution;
}
+ private List<URL> getNestedArchiveURLs(List<Artifact> nestedArchives, String location) throws ContributionReadException {
+ List<URL> urls = new ArrayList<URL>();
+ for (Artifact a : nestedArchives) {
+ try {
+ urls.add(new URL(a.getLocation()));
+ } catch (MalformedURLException e) {
+ throw new ContributionReadException(e);
+ }
+ }
+ return urls;
+ }
+
+ private boolean isWebApp(Contribution contribution) {
+ for (Artifact a : contribution.getArtifacts()) {
+ if (a.getURI().equalsIgnoreCase("web-inf/web.xml")) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void processNestedArchives(List<URL> nestedArchiveURLs, Contribution contribution, ProcessorContext context, Monitor monitor) throws ContributionReadException {
+ for (URL url : nestedArchiveURLs) {
+ Contribution tempC = contributionFactory.createContribution();
+ tempC.setURI("temp");
+ tempC.setLocation(url.toString());
+ JarContributionScanner scanner = new JarContributionScanner(contributionFactory);
+ List<Artifact> artifacts = scanner.scan(tempC);
+ for (Artifact artifact : artifacts) {
+ // Add the deployed artifact model to the contribution
+ contribution.getModelResolver().addModel(artifact, context);
+
+ monitor.pushContext("Artifact: " + artifact.getURI());
+
+ Artifact oldArtifact = context.setArtifact(artifact);
+ try {
+ // Read each artifact
+ URL artifactLocationURL = null;
+ try {
+ artifactLocationURL = new URL(artifact.getLocation());
+ } catch (MalformedURLException e) {
+ //ignore
+ }
+
+ Object model;
+ try {
+ model = artifactProcessor.read(new URL(contribution.getLocation()), URI.create(artifact.getURI()), artifactLocationURL, context);
+ } catch (MalformedURLException e) {
+ throw new ContributionReadException(e);
+ }
+ if (model != null) {
+ artifact.setModel(model);
+
+ // Add the loaded model to the model resolver
+ contribution.getModelResolver().addModel(model, context);
+
+ }
+ } finally {
+ monitor.popContext();
+ context.setArtifact(oldArtifact);
+ }
+ }
+ contribution.getArtifacts().addAll(artifacts);
+ contribution.getExtractedArchives().add(url);
+ }
+ }
+
+ private List<Artifact> getNestedArchives(Contribution contribution) {
+ List<Artifact> nestedArchives = new ArrayList<Artifact>();
+ for (Artifact a : contribution.getArtifacts()) {
+ if (a.getURI().endsWith(".zip") || a.getURI().endsWith(".jar")) {
+ nestedArchives.add(a);
+ }
+ }
+ return nestedArchives;
+ }
+
+ private List<URL> extractNestedArchives(List<Artifact> nestedArchives, String contributionLocation) throws IOException {
+ if (nestedArchives.size() < 1) {
+ return Collections.emptyList();
+ }
+ List<URL> extractedArchiveURLs = new ArrayList<URL>();
+ FileOutputStream fileOutputStream = null;
+ ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(new File(URI.create(contributionLocation))));
+ try {
+ ZipEntry zipEntry = zipInputStream.getNextEntry();
+ while (zipEntry != null) {
+ for (Artifact artifact : nestedArchives) {
+ 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[4096];
+ int n;
+ while ((n = zipInputStream.read(buf, 0, buf.length)) > -1) {
+ fileOutputStream.write(buf, 0, n);
+ }
+
+ fileOutputStream.close();
+ zipInputStream.closeEntry();
+
+ extractedArchiveURLs.add(tempFile.toURI().toURL());
+
+ }
+ }
+ zipEntry = zipInputStream.getNextEntry();
+ }
+ } finally {
+ zipInputStream.close();
+ if (fileOutputStream != null) {
+ fileOutputStream.close();
+ }
+ }
+
+ return extractedArchiveURLs;
+ }
+
/**
* A pre-resolution step, which is required for Contributions to handle the resolution of imports and exports so that
* at resolve time, imports can be followed to exports and anything exported that is required can be resolved on demand
@@ -346,4 +488,46 @@ public class ContributionContentProcessor implements ExtendedURLArtifactProcesso
} // end for
} // end method resolveImports
+
+ /**
+ * 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();
+ }
+
} // end class ContributionContentProcessor