summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvamsic007 <vamsic007@13f79535-47bb-0310-9956-ffa450edef68>2008-11-06 16:43:27 +0000
committervamsic007 <vamsic007@13f79535-47bb-0310-9956-ffa450edef68>2008-11-06 16:43:27 +0000
commit374f54d3f32e33e59ae74e7d2f4a48c2d6e4f86a (patch)
tree1ce56406e094e6d175a7e424398e36351809f468
parent78cb33c9bbcfd8a9994bf5c3b9ba134696259f54 (diff)
Package processor for EAR files.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@711902 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to '')
-rw-r--r--java/sca/modules/contribution-jee/src/main/java/org/apache/tuscany/sca/contribution/jee/impl/EarContributionProcessor.java140
-rw-r--r--java/sca/modules/contribution-jee/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.PackageProcessor19
-rw-r--r--java/sca/modules/contribution-jee/src/test/java/org/apache/tuscany/sca/contribution/jee/EarContributionProcessorTestCase.java57
3 files changed, 216 insertions, 0 deletions
diff --git a/java/sca/modules/contribution-jee/src/main/java/org/apache/tuscany/sca/contribution/jee/impl/EarContributionProcessor.java b/java/sca/modules/contribution-jee/src/main/java/org/apache/tuscany/sca/contribution/jee/impl/EarContributionProcessor.java
new file mode 100644
index 0000000000..3a80c1dd3b
--- /dev/null
+++ b/java/sca/modules/contribution-jee/src/main/java/org/apache/tuscany/sca/contribution/jee/impl/EarContributionProcessor.java
@@ -0,0 +1,140 @@
+/*
+ * 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.contribution.jee.impl;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarInputStream;
+
+import org.apache.tuscany.sca.contribution.PackageType;
+import org.apache.tuscany.sca.contribution.processor.PackageProcessor;
+import org.apache.tuscany.sca.contribution.processor.impl.JarContributionProcessor;
+import org.apache.tuscany.sca.contribution.service.ContributionException;
+
+/**
+ * Ear Contribution package processor.
+ *
+ * @version $Rev$ $Date$
+ */
+public class EarContributionProcessor implements PackageProcessor {
+
+ public URL getArtifactURL(URL packageSourceURL, URI artifact)
+ throws MalformedURLException {
+ if (packageSourceURL.toString().startsWith("archive:")) {
+ return new URL(packageSourceURL, artifact.toString());
+ } else {
+ return new URL("archive:" + packageSourceURL.toExternalForm() + "!/" + artifact);
+ }
+ }
+
+ public List<URI> getArtifacts(URL packageSourceURL, InputStream inputStream) throws ContributionException, IOException {
+ if (packageSourceURL == null) {
+ throw new IllegalArgumentException("Invalid null package source URL.");
+ }
+
+ if (inputStream == null) {
+ throw new IllegalArgumentException("Invalid null source inputstream.");
+ }
+
+ // The root is a jar file
+ JarInputStream jar = new JarInputStream(inputStream);
+ try {
+ Set<String> names = new HashSet<String>();
+ while (true) {
+ JarEntry entry = jar.getNextJarEntry();
+ if (entry == null) {
+ // EOF
+ break;
+ }
+
+ String name = entry.getName();
+ if (!name.startsWith(".")) {
+
+ // Trim trailing /
+ if (name.endsWith("/")) {
+ name = name.substring(0, name.length() - 1);
+ }
+
+ // Add the entry name
+ if (!names.contains(name)) {
+ names.add(name);
+
+ // Add parent folder names to the list too
+ for (;;) {
+ int s = name.lastIndexOf('/');
+ if (s == -1) {
+ name = "";
+ } else {
+ name = name.substring(0, s);
+ }
+ if (!names.contains(name)) {
+ names.add(name);
+ } else {
+ break;
+ }
+ }
+ }
+ }
+ if(entry.getName().indexOf("/") == -1 && (entry.getName().toLowerCase().endsWith(".war") || entry.getName().toLowerCase().endsWith(".jar"))) {
+ // A WAR or an EJB JAR file in the root of the archive.
+ // Get entries from the nested archive.
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ int b;
+ while((b = jar.read()) != -1) {
+ bout.write(b);
+ }
+ bout.close();
+ ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+
+ PackageProcessor archiveProcessor = entry.getName().toLowerCase().endsWith(".war") ? new WarContributionProcessor() : new JarContributionProcessor();
+ List<URI> artifacts = archiveProcessor.getArtifacts(packageSourceURL, bin);
+ bin.close();
+ for(URI artifact : artifacts) {
+ names.add(entry.getName()+"!/"+artifact);
+ }
+ }
+ }
+
+ // Return list of URIs
+ List<URI> artifacts = new ArrayList<URI>();
+ for (String name: names) {
+ artifacts.add(URI.create(name));
+ }
+ return artifacts;
+
+ } finally {
+ jar.close();
+ }
+ }
+
+ public String getPackageType() {
+ return PackageType.EAR;
+ }
+}
diff --git a/java/sca/modules/contribution-jee/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.PackageProcessor b/java/sca/modules/contribution-jee/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.PackageProcessor
new file mode 100644
index 0000000000..88c69658f6
--- /dev/null
+++ b/java/sca/modules/contribution-jee/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.PackageProcessor
@@ -0,0 +1,19 @@
+# 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.
+
+org.apache.tuscany.sca.contribution.jee.impl.EarContributionProcessor;type=application/ear
+org.apache.tuscany.sca.contribution.jee.impl.WarContributionProcessor;type=application/war
diff --git a/java/sca/modules/contribution-jee/src/test/java/org/apache/tuscany/sca/contribution/jee/EarContributionProcessorTestCase.java b/java/sca/modules/contribution-jee/src/test/java/org/apache/tuscany/sca/contribution/jee/EarContributionProcessorTestCase.java
new file mode 100644
index 0000000000..9495df70b7
--- /dev/null
+++ b/java/sca/modules/contribution-jee/src/test/java/org/apache/tuscany/sca/contribution/jee/EarContributionProcessorTestCase.java
@@ -0,0 +1,57 @@
+/*
+ * 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.contribution.jee;
+
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URL;
+import java.util.List;
+
+import junit.framework.Assert;
+
+import org.apache.tuscany.sca.contribution.jee.impl.EarContributionProcessor;
+import org.apache.tuscany.sca.contribution.service.util.IOHelper;
+import org.junit.Test;
+
+/**
+ * Ear Contribution package processor test case.
+ * Verifies proper handling of EAR contributions.
+ *
+ * @version $Rev$ $Date$
+ */
+public class EarContributionProcessorTestCase {
+ private static final String EAR_CONTRIBUTION = "/ejb-injection-sample.ear";
+
+ @Test
+ public void testProcessPackageArtifacts() throws Exception {
+ EarContributionProcessor earProcessor = new EarContributionProcessor();
+
+ URL earURL = getClass().getResource(EAR_CONTRIBUTION);
+ InputStream earStream = earURL.openStream();
+ List<URI> artifacts = null;
+ try {
+ artifacts = earProcessor.getArtifacts(earURL, earStream);
+ } finally {
+ IOHelper.closeQuietly(earStream);
+ }
+
+ Assert.assertNotNull(artifacts);
+ }
+}