summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorantelder <antelder@13f79535-47bb-0310-9956-ffa450edef68>2011-06-02 14:37:38 +0000
committerantelder <antelder@13f79535-47bb-0310-9956-ffa450edef68>2011-06-02 14:37:38 +0000
commitb710508864ed964787c47f7fffce99cb7ce2d933 (patch)
treeed9de95379afd6b8ef3afde91bd7031c05d66ad7
parent2f35cf58e717dad6e7300f4af7298b26d7406441 (diff)
Look at a reuseable way of calculating a contributions dependencies without having to process and validate the entire contribution
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1130575 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/DependencyUtils.java141
-rw-r--r--sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/impl/DependencyUtilsTestCase.java62
2 files changed, 203 insertions, 0 deletions
diff --git a/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/DependencyUtils.java b/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/DependencyUtils.java
new file mode 100644
index 0000000000..294e09cd2f
--- /dev/null
+++ b/sca-java-2.x/trunk/modules/domain-node/src/main/java/org/apache/tuscany/sca/impl/DependencyUtils.java
@@ -0,0 +1,141 @@
+/*
+ * 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.sca.impl;
+
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import javax.xml.stream.XMLStreamException;
+
+import org.apache.tuscany.sca.TuscanyRuntime;
+import org.apache.tuscany.sca.contribution.Contribution;
+import org.apache.tuscany.sca.contribution.ContributionMetadata;
+import org.apache.tuscany.sca.contribution.Export;
+import org.apache.tuscany.sca.contribution.Import;
+import org.apache.tuscany.sca.contribution.java.JavaImport;
+import org.apache.tuscany.sca.contribution.namespace.NamespaceImport;
+import org.apache.tuscany.sca.contribution.processor.ContributionReadException;
+import org.apache.tuscany.sca.monitor.ValidationException;
+
+import com.ibm.jvm.util.ByteArrayOutputStream;
+
+public class DependencyUtils {
+
+ public static List<String> getDependencies(String contributionURI, Map<String, ZipInputStream> possibles) throws ValidationException, IOException, ContributionReadException, XMLStreamException {
+
+ Map<String, ContributionMetadata> contributionMetaDatas = new HashMap<String, ContributionMetadata>();
+ for (String curi : possibles.keySet()) {
+ ZipInputStream zis = possibles.get(curi);
+ ZipEntry entry;
+ while ((entry = zis.getNextEntry()) != null) {
+ if (Contribution.SCA_CONTRIBUTION_META.equals(entry.getName())) {
+
+ byte[] buffer = new byte[2048];
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ BufferedOutputStream bos = new BufferedOutputStream(baos, buffer.length);
+
+ int size;
+ while ((size = zis.read(buffer, 0, buffer.length)) != -1) {
+ bos.write(buffer, 0, size);
+ }
+ bos.close();
+
+ contributionMetaDatas.put(curi, (ContributionMetadata)TuscanyRuntime.newInstance().getDeployer().loadXMLDocument(new StringReader(baos.toString())));
+ }
+ }
+ zis.close(); // close it so no one tries to reuse the already read stream
+ }
+ return getDependencies(contributionMetaDatas, contributionURI);
+ }
+
+ public static List<String> getDependencies(Map<String, ContributionMetadata> possibles, String targetURI) throws ValidationException {
+ if (!possibles.containsKey(targetURI)) {
+ throw new IllegalArgumentException(targetURI);
+ }
+
+ Set<String> dependencies = new HashSet<String>();
+
+ // Go through the contribution imports
+ for (Import import_ : possibles.get(targetURI).getImports()) {
+ boolean resolved = false;
+
+ // Go through all contribution candidates and their exports
+ List<Export> matchingExports = new ArrayList<Export>();
+
+ for (String dependencyURI : possibles.keySet()) {
+ if (dependencyURI.equals(targetURI)) {
+ // Do not self import
+ continue;
+ }
+ ContributionMetadata dependency = possibles.get(dependencyURI);
+
+ // When a contribution contains a reference to an artifact from a namespace that
+ // is declared in an import statement of the contribution, if the SCA artifact
+ // resolution mechanism is used to resolve the artifact, the SCA runtime MUST resolve
+ // artifacts from the locations identified by the import statement(s) for the namespace.
+ if (import_ instanceof NamespaceImport) {
+ NamespaceImport namespaceImport = (NamespaceImport)import_;
+ if (namespaceImport.getLocation() != null)
+ if (!namespaceImport.getLocation().equals(dependencyURI))
+ continue;
+ }
+ if (import_ instanceof JavaImport) {
+ JavaImport javaImport = (JavaImport)import_;
+ if (javaImport.getLocation() != null)
+ if (!javaImport.getLocation().equals(dependencyURI))
+ continue;
+ }
+
+ for (Export export : dependency.getExports()) {
+
+ // If an export from a contribution matches the import in hand
+ // add that contribution to the dependency set
+ if (import_.match(export)) {
+ resolved = true;
+ matchingExports.add(export);
+
+ if (!dependencies.contains(dependencyURI)) {
+ dependencies.add(dependencyURI);
+
+ // Now add the dependencies of that contribution
+ getDependencies(possibles, dependencyURI);
+
+ } // end if
+ } // end if
+ } // end for
+ } // end for
+
+ if (!resolved) {
+ throw new ValidationException("Contribution " + targetURI + " has unresolved Import: " + import_);
+ }
+ }
+
+ return new ArrayList<String>(dependencies);
+ }
+}
diff --git a/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/impl/DependencyUtilsTestCase.java b/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/impl/DependencyUtilsTestCase.java
new file mode 100644
index 0000000000..c169fb9808
--- /dev/null
+++ b/sca-java-2.x/trunk/modules/domain-node/src/test/java/org/apache/tuscany/sca/impl/DependencyUtilsTestCase.java
@@ -0,0 +1,62 @@
+/*
+ * 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.sca.impl;
+
+import java.io.BufferedInputStream;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipInputStream;
+
+import javax.xml.stream.XMLStreamException;
+
+import junit.framework.Assert;
+
+import org.apache.tuscany.sca.contribution.processor.ContributionReadException;
+import org.apache.tuscany.sca.monitor.ValidationException;
+import org.junit.Test;
+
+public class DependencyUtilsTestCase {
+
+ @Test
+ public void loadTest() throws ValidationException, ContributionReadException, FileNotFoundException, IOException, XMLStreamException {
+
+ List<String> importDs = DependencyUtils.getDependencies("import", initZips());
+ Assert.assertEquals(1, importDs.size());
+ Assert.assertEquals("export", importDs.get(0));
+
+ List<String> exportDs = DependencyUtils.getDependencies("export", initZips());
+ Assert.assertEquals(0, exportDs.size());
+
+ List<String> unrelatedDs = DependencyUtils.getDependencies("unrelated", initZips());
+ Assert.assertEquals(0, unrelatedDs.size());
+ }
+
+ private Map<String, ZipInputStream> initZips() throws FileNotFoundException {
+ Map<String, ZipInputStream> contributions = new HashMap<String, ZipInputStream>();
+ contributions.put("import", new ZipInputStream(new BufferedInputStream(new FileInputStream("src/test/resources/import.jar"))));
+ contributions.put("export", new ZipInputStream(new BufferedInputStream(new FileInputStream("src/test/resources/export.jar"))));
+ contributions.put("unrelated", new ZipInputStream(new BufferedInputStream(new FileInputStream("src/test/resources/sample-helloworld-nodeployable.jar"))));
+ return contributions;
+ }
+
+}