Return-Path: X-Original-To: apmail-deltaspike-commits-archive@www.apache.org Delivered-To: apmail-deltaspike-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 7D1F8105E0 for ; Sat, 28 Dec 2013 15:41:23 +0000 (UTC) Received: (qmail 83697 invoked by uid 500); 28 Dec 2013 15:41:23 -0000 Delivered-To: apmail-deltaspike-commits-archive@deltaspike.apache.org Received: (qmail 83658 invoked by uid 500); 28 Dec 2013 15:41:22 -0000 Mailing-List: contact commits-help@deltaspike.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@deltaspike.apache.org Delivered-To: mailing list commits@deltaspike.apache.org Received: (qmail 83651 invoked by uid 99); 28 Dec 2013 15:41:22 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 28 Dec 2013 15:41:22 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 108CA880A32; Sat, 28 Dec 2013 15:41:22 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: johndament@apache.org To: commits@deltaspike.apache.org Message-Id: <25c756b33e6d433985718919036c5dda@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: git commit: DELTASPIKE-399 Added support for multi InputStream and some general clean up of how closing is handled when throwing an error. Date: Sat, 28 Dec 2013 15:41:22 +0000 (UTC) Updated Branches: refs/heads/master bcf5909dc -> 585339f89 DELTASPIKE-399 Added support for multi InputStream and some general clean up of how closing is handled when throwing an error. Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/585339f8 Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/585339f8 Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/585339f8 Branch: refs/heads/master Commit: 585339f89030b2c316e48546ea1f0fe279d64a54 Parents: bcf5909 Author: John D. Ament Authored: Sat Dec 28 10:41:11 2013 -0500 Committer: John D. Ament Committed: Sat Dec 28 10:41:11 2013 -0500 ---------------------------------------------------------------------- .../ExternalResourceProvider.java | 3 + .../resourceloader/BaseResourceProvider.java | 8 ++ .../ClasspathResourceProvider.java | 85 ++++++++++++++++---- .../ExternalResourceProducer.java | 10 +++ .../core/impl/resourceloader/Cdi10Bean.java | 7 ++ .../core/impl/resourceloader/Cdi11Bean.java | 12 +++ .../resourceloader/ClasspathResourceTest.java | 12 +++ .../impl/resourceloader/TestResourceHolder.java | 3 + 8 files changed, 123 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/deltaspike/blob/585339f8/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/spi/resourceloader/ExternalResourceProvider.java ---------------------------------------------------------------------- diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/spi/resourceloader/ExternalResourceProvider.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/spi/resourceloader/ExternalResourceProvider.java index 43dca6d..824e4d7 100644 --- a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/spi/resourceloader/ExternalResourceProvider.java +++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/spi/resourceloader/ExternalResourceProvider.java @@ -21,6 +21,7 @@ package org.apache.deltaspike.core.spi.resourceloader; import org.apache.deltaspike.core.api.resourceloader.ExternalResource; import java.io.InputStream; +import java.util.List; import java.util.Properties; /** @@ -32,6 +33,8 @@ public interface ExternalResourceProvider InputStream readStream(final ExternalResource externalResource); + List readStreams(final ExternalResource externalResource); + Properties readProperties(final ExternalResource externalResource); } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/585339f8/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceloader/BaseResourceProvider.java ---------------------------------------------------------------------- diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceloader/BaseResourceProvider.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceloader/BaseResourceProvider.java index f7bc2fc..7319213 100644 --- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceloader/BaseResourceProvider.java +++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceloader/BaseResourceProvider.java @@ -28,6 +28,8 @@ import javax.inject.Inject; import java.io.IOException; import java.io.InputStream; import java.lang.annotation.Annotation; +import java.util.Collections; +import java.util.List; import java.util.Properties; import java.util.Set; import java.util.logging.Level; @@ -89,4 +91,10 @@ public abstract class BaseResourceProvider implements ExternalResourceProvider this.loadInputStreamToProperties(inputStream, properties, name); return properties; } + + @Override + public List readStreams(ExternalResource externalResource) + { + return Collections.singletonList(this.readStream(externalResource)); + } } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/585339f8/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceloader/ClasspathResourceProvider.java ---------------------------------------------------------------------- diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceloader/ClasspathResourceProvider.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceloader/ClasspathResourceProvider.java index 67f9d81..a2cf0d7 100644 --- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceloader/ClasspathResourceProvider.java +++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceloader/ClasspathResourceProvider.java @@ -27,7 +27,9 @@ import javax.enterprise.context.ApplicationScoped; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.util.ArrayList; import java.util.Enumeration; +import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -45,7 +47,8 @@ public class ClasspathResourceProvider extends BaseResourceProvider { try { - return readClassPath(externalResource.location()); + List matchedStreams = this.readClassPath(externalResource.location(),true); + return matchedStreams.get(0); } catch (IOException e) { @@ -57,35 +60,83 @@ public class ClasspathResourceProvider extends BaseResourceProvider } } - private InputStream readClassPath(final String name) throws IOException + @Override + public List readStreams(ExternalResource externalResource) { - Enumeration urls = ClassUtils.getClassLoader(null).getResources(name); + try + { + return readClassPath(externalResource.location(),false); + } + catch (IOException e) + { + throw new IllegalStateException("Error while trying to load resources from classpath ",e); + } + } - InputStream result = null; - URL firstURL = null; + /** + * Reads all possibly matching classpath entries for the given name. + * + * If requireUnique is true, then validates that 1 element is present before returning + * + * @param name + * @param requireUnique + * @return + * @throws IOException + * @throws IllegalStateException + */ + private List readClassPath(final String name, final boolean requireUnique) + throws IllegalStateException,IOException + { + Enumeration urls = ClassUtils.getClassLoader(null).getResources(name); + List urlList = new ArrayList(); + List results = new ArrayList(); while (urls.hasMoreElements()) { URL url = urls.nextElement(); InputStream is = url.openStream(); if (is != null) { - if (firstURL != null) + results.add(is); + urlList.add(url); + } + } + if (requireUnique && results.size() != 1) + { + String msg = urlsToString(urlList,name); + for (InputStream is : results) + { + try { - try - { - result.close(); - } - finally + is.close(); + } + catch (IOException e) + { + if (logger.isLoggable(Level.FINE)) { - is.close(); + logger.log(Level.FINE,"Unable to close stream",e); } - throw new IllegalStateException("multiple files found for '" + name + - "' (" + firstURL.toExternalForm() + ", " + url.toExternalForm() + ")"); } - firstURL = url; - result = is; } + throw new IllegalStateException(msg); + } + return results; + } + + private String urlsToString(List urls, String name) + { + if (urls.size() == 0) + { + return String.format("No resources found for '%s'",name); + } + else + { + StringBuilder sb = new StringBuilder(); + sb.append(String.format("multiple resources found for '%s'",name)); + for (URL u : urls) + { + sb.append(" Match : ").append(u.toExternalForm()); + } + return sb.toString(); } - return result; } } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/585339f8/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceloader/ExternalResourceProducer.java ---------------------------------------------------------------------- diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceloader/ExternalResourceProducer.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceloader/ExternalResourceProducer.java index 57430c7..019b42a 100644 --- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceloader/ExternalResourceProducer.java +++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceloader/ExternalResourceProducer.java @@ -34,6 +34,7 @@ import javax.inject.Inject; import java.io.IOException; import java.io.InputStream; import java.lang.annotation.Annotation; +import java.util.List; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; @@ -70,6 +71,15 @@ public class ExternalResourceProducer @Produces @ExternalResource(storage = ExternalResourceStorage.class,location = "") + public List getInputStreams(final InjectionPoint injectionPoint) + { + ExternalResource externalResource = getAnnotation(injectionPoint); + ExternalResourceProvider provider = getProvider(externalResource.storage()); + return provider.readStreams(externalResource); + } + + @Produces + @ExternalResource(storage = ExternalResourceStorage.class,location = "") public Properties getProperties(final InjectionPoint injectionPoint) throws IOException { ExternalResource externalResource = getAnnotation(injectionPoint); http://git-wip-us.apache.org/repos/asf/deltaspike/blob/585339f8/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/Cdi10Bean.java ---------------------------------------------------------------------- diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/Cdi10Bean.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/Cdi10Bean.java index df5be1b..45c390b 100644 --- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/Cdi10Bean.java +++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/Cdi10Bean.java @@ -20,6 +20,7 @@ package org.apache.deltaspike.test.core.impl.resourceloader; import javax.enterprise.inject.Instance; import java.io.InputStream; +import java.util.List; import java.util.Properties; public class Cdi10Bean implements TestResourceHolder @@ -47,4 +48,10 @@ public class Cdi10Bean implements TestResourceHolder { throw new UnsupportedOperationException(); } + + @Override + public List getInputStreams() + { + throw new UnsupportedOperationException(); + } } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/585339f8/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/Cdi11Bean.java ---------------------------------------------------------------------- diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/Cdi11Bean.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/Cdi11Bean.java index 908cc38..47b7df6 100644 --- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/Cdi11Bean.java +++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/Cdi11Bean.java @@ -21,12 +21,15 @@ package org.apache.deltaspike.test.core.impl.resourceloader; import org.apache.deltaspike.core.api.resourceloader.ClasspathStorage; import org.apache.deltaspike.core.api.resourceloader.ExternalResource; +import javax.enterprise.context.Dependent; import javax.enterprise.inject.Any; import javax.enterprise.inject.Instance; import javax.inject.Inject; import java.io.InputStream; +import java.util.List; import java.util.Properties; +@Dependent public class Cdi11Bean implements TestResourceHolder { @Inject @@ -38,6 +41,10 @@ public class Cdi11Bean implements TestResourceHolder private Properties properties; @Inject + @ExternalResource(storage = ClasspathStorage.class,location="META-INF/beans.xml") + private List inputStreams; + + @Inject @Any private Instance inputStreamInstance; @@ -64,4 +71,9 @@ public class Cdi11Bean implements TestResourceHolder { return propertiesInstance; } + + @Override + public List getInputStreams() { + return inputStreams; + } } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/585339f8/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/ClasspathResourceTest.java ---------------------------------------------------------------------- diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/ClasspathResourceTest.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/ClasspathResourceTest.java index a95f6c6..694bc47 100644 --- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/ClasspathResourceTest.java +++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/ClasspathResourceTest.java @@ -38,6 +38,8 @@ import org.junit.runner.RunWith; import javax.inject.Inject; import java.io.IOException; +import java.io.InputStream; +import java.util.List; import java.util.Properties; @RunWith(Arquillian.class) @@ -93,6 +95,16 @@ public class ClasspathResourceTest .select(new ExternalResourceLiteral(ClasspathStorage.class, "META-INF/beans.xml")).get(); } + @Test + public void testSuccessfulAmbiguousLookup() + { + Assume.assumeTrue(!isOwbForCdi10()); + //note, we only test this on classpath, since File impl is always getting 1. + List streams = testResourceHolder.getInputStreams(); + Assert.assertEquals(4,streams.size()); + + } + private static boolean isOwbForCdi10() { return CdiContainerUnderTest.isCdiVersion(CdiImplementation.OWB11) || CdiContainerUnderTest.isCdiVersion(CdiImplementation.OWB12); http://git-wip-us.apache.org/repos/asf/deltaspike/blob/585339f8/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/TestResourceHolder.java ---------------------------------------------------------------------- diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/TestResourceHolder.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/TestResourceHolder.java index cf059d2..730efba 100644 --- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/TestResourceHolder.java +++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceloader/TestResourceHolder.java @@ -20,6 +20,7 @@ package org.apache.deltaspike.test.core.impl.resourceloader; import javax.enterprise.inject.Instance; import java.io.InputStream; +import java.util.List; import java.util.Properties; //just needed to build different archives - otherwise injection would fail with owb implementing cdi 1.0 @@ -32,4 +33,6 @@ public interface TestResourceHolder Instance getInputStreamInstance(); Instance getPropertiesInstance(); + + List getInputStreams(); }