You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by jo...@apache.org on 2013/12/28 16:41:22 UTC

git commit: DELTASPIKE-399 Added support for multi InputStream and some general clean up of how closing is handled when throwing an error.

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 <jo...@gmail.com>
Authored: Sat Dec 28 10:41:11 2013 -0500
Committer: John D. Ament <jo...@gmail.com>
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<InputStream> 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<InputStream> 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<InputStream> 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<InputStream> readStreams(ExternalResource externalResource)
     {
-        Enumeration<URL> 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<InputStream> readClassPath(final String name, final boolean requireUnique)
+        throws IllegalStateException,IOException
+    {
+        Enumeration<URL> urls = ClassUtils.getClassLoader(null).getResources(name);
+        List<URL> urlList = new ArrayList<URL>();
+        List<InputStream> results = new ArrayList<InputStream>();
         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<URL> 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<InputStream> 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<InputStream> 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<InputStream> inputStreams;
+
+    @Inject
     @Any
     private Instance<InputStream> inputStreamInstance;
 
@@ -64,4 +71,9 @@ public class Cdi11Bean implements TestResourceHolder
     {
         return propertiesInstance;
     }
+
+    @Override
+    public List<InputStream> 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<InputStream> 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<InputStream> getInputStreamInstance();
 
     Instance<Properties> getPropertiesInstance();
+
+    List<InputStream> getInputStreams();
 }