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/16 02:33:16 UTC

git commit: DELTASPIKE-399 Added code to read resources.

Updated Branches:
  refs/heads/master fc03723bb -> d0d28577f


DELTASPIKE-399 Added code to read resources.


Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/d0d28577
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/d0d28577
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/d0d28577

Branch: refs/heads/master
Commit: d0d28577f722ac159ccd09b69ff296954adcd284
Parents: fc03723
Author: John D. Ament <jo...@gmail.com>
Authored: Sun Dec 15 20:31:56 2013 -0500
Committer: John D. Ament <jo...@gmail.com>
Committed: Sun Dec 15 20:32:52 2013 -0500

----------------------------------------------------------------------
 .../api/resoureLoader/ExternalResource.java     |  41 ++++++
 .../resoureLoader/ExternalResourceLiteral.java  |  38 ++++++
 .../core/api/resoureLoader/XMLProperties.java   |  35 +++++
 .../ExternalResourceProvider.java               |  38 ++++++
 .../ClasspathResourceProvider.java              |  83 ++++++++++++
 .../ExternalResourceProducer.java               | 128 +++++++++++++++++++
 .../ExternalResourceProviderComparator.java     |  35 +++++
 .../resourceLoader/FileResourceProvider.java    |  68 ++++++++++
 .../resourceLoader/ResourceLoaderExtension.java |  40 ++++++
 .../impl/resourceLoader/InjectResourceTest.java |  78 +++++++++++
 10 files changed, 584 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/d0d28577/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/resoureLoader/ExternalResource.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/resoureLoader/ExternalResource.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/resoureLoader/ExternalResource.java
new file mode 100644
index 0000000..1102c14
--- /dev/null
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/resoureLoader/ExternalResource.java
@@ -0,0 +1,41 @@
+/*
+ * 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.deltaspike.core.api.resoureLoader;
+
+import javax.enterprise.util.Nonbinding;
+import javax.inject.Qualifier;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.METHOD;
+
+@Target( { TYPE, METHOD, PARAMETER, FIELD })
+@Retention(value = RetentionPolicy.RUNTIME)
+@Documented
+@Qualifier
+public @interface ExternalResource
+{
+    @Nonbinding
+    String value();
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/d0d28577/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/resoureLoader/ExternalResourceLiteral.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/resoureLoader/ExternalResourceLiteral.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/resoureLoader/ExternalResourceLiteral.java
new file mode 100644
index 0000000..d1ed1d1
--- /dev/null
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/resoureLoader/ExternalResourceLiteral.java
@@ -0,0 +1,38 @@
+/*
+ * 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.deltaspike.core.api.resoureLoader;
+
+import javax.enterprise.util.AnnotationLiteral;
+
+/**
+ *
+ */
+public class ExternalResourceLiteral extends AnnotationLiteral<ExternalResource> implements ExternalResource
+{
+    private String value;
+    public ExternalResourceLiteral(final String value)
+    {
+        this.value = value;
+    }
+    @Override
+    public String value()
+    {
+        return this.value;
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/d0d28577/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/resoureLoader/XMLProperties.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/resoureLoader/XMLProperties.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/resoureLoader/XMLProperties.java
new file mode 100644
index 0000000..9e8caac
--- /dev/null
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/resoureLoader/XMLProperties.java
@@ -0,0 +1,35 @@
+/*
+ * 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.deltaspike.core.api.resoureLoader;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.METHOD;
+
+@Target( { METHOD, PARAMETER, FIELD })
+@Retention(value = RetentionPolicy.RUNTIME)
+@Documented
+public @interface XMLProperties
+{
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/d0d28577/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
new file mode 100644
index 0000000..f65f57f
--- /dev/null
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/spi/resourceLoader/ExternalResourceProvider.java
@@ -0,0 +1,38 @@
+/*
+ * 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.deltaspike.core.spi.resourceLoader;
+
+import org.apache.deltaspike.core.api.resoureLoader.ExternalResource;
+
+import javax.enterprise.inject.spi.InjectionPoint;
+import java.io.InputStream;
+
+/**
+ * Provides lookup capability to find a resource.
+ *
+ * @author johndament
+ */
+public interface ExternalResourceProvider
+{
+
+    InputStream readStream(final ExternalResource externalResource, final InjectionPoint injectionPoint);
+
+    int getPriority();
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/d0d28577/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
new file mode 100644
index 0000000..dfc25e4
--- /dev/null
+++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceLoader/ClasspathResourceProvider.java
@@ -0,0 +1,83 @@
+/*
+ * 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.deltaspike.core.impl.resourceLoader;
+
+import org.apache.deltaspike.core.api.resoureLoader.ExternalResource;
+import org.apache.deltaspike.core.spi.resourceLoader.ExternalResourceProvider;
+import org.apache.deltaspike.core.util.ClassUtils;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.spi.InjectionPoint;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * A classpath based resource provider
+ */
+@ApplicationScoped
+public class ClasspathResourceProvider implements ExternalResourceProvider
+{
+    private static final Logger logger = Logger.getLogger(ClasspathResourceProvider.class.getCanonicalName());
+
+    @Override
+    public InputStream readStream(final ExternalResource externalResource, final InjectionPoint injectionPoint)
+    {
+        try
+        {
+            return readClassPath(externalResource.value());
+        }
+        catch (IOException e)
+        {
+            if (logger.isLoggable(Level.FINE))
+            {
+                logger.log(Level.FINE, "Problem reading resource.", e);
+            }
+            return null;
+        }
+    }
+
+    @Override
+    public int getPriority()
+    {
+        return 10;
+    }
+
+    private InputStream readClassPath(final String name) throws IOException
+    {
+        Enumeration<URL> urls = ClassUtils.getClassLoader(null).getResources(name);
+        if (logger.isLoggable(Level.FINEST))
+        {
+            logger.finest("Found URLS " + urls);
+        }
+        while (urls.hasMoreElements())
+        {
+            URL url = urls.nextElement();
+            InputStream is = url.openStream();
+            if (is != null)
+            {
+                return is;
+            }
+        }
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/d0d28577/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
new file mode 100644
index 0000000..f880d66
--- /dev/null
+++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceLoader/ExternalResourceProducer.java
@@ -0,0 +1,128 @@
+/*
+ * 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.deltaspike.core.impl.resourceLoader;
+
+import org.apache.deltaspike.core.api.resoureLoader.ExternalResource;
+import org.apache.deltaspike.core.api.resoureLoader.XMLProperties;
+import org.apache.deltaspike.core.spi.resourceLoader.ExternalResourceProvider;
+import org.apache.deltaspike.core.util.BeanUtils;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Any;
+import javax.enterprise.inject.Disposes;
+import javax.enterprise.inject.Instance;
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.inject.Inject;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Properties;
+import java.util.logging.Logger;
+
+/**
+ * Handles the creation/loading of external resources.
+ *
+ */
+@ApplicationScoped
+public class ExternalResourceProducer
+{
+    private static final Logger logger = Logger.getLogger(ExternalResourceProducer.class.getCanonicalName());
+
+    @Inject
+    @Any
+    private Instance<ExternalResourceProvider> resourceProviders;
+
+    @Produces
+    @ExternalResource("")
+    public InputStream getInputStream(final InjectionPoint injectionPoint)
+    {
+        final InputStream is = findInputStream(injectionPoint);
+        return is;
+    }
+
+    @Produces
+    @ExternalResource("")
+    public Properties getProperties(final InjectionPoint injectionPoint) throws IOException
+    {
+        final InputStream is = findInputStream(injectionPoint);
+        final boolean isXml = BeanUtils.extractAnnotation(injectionPoint.getAnnotated(), XMLProperties.class) != null;
+        if (is != null)
+        {
+            Properties properties = new Properties();
+            if (isXml)
+            {
+                properties.loadFromXML(is);
+            }
+            else
+            {
+                properties.load(is);
+            }
+            is.close();
+            return properties;
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+    public void closeInputStream(@Disposes @ExternalResource("") InputStream inputStream)
+    {
+        if (inputStream != null)
+        {
+            try
+            {
+                inputStream.close();
+            }
+            catch (IOException e)
+            {
+
+            }
+        }
+    }
+
+    private ExternalResource getAnnotation(final InjectionPoint injectionPoint)
+    {
+        return BeanUtils.extractAnnotation(injectionPoint.getAnnotated(),ExternalResource.class);
+    }
+
+    private InputStream findInputStream(final InjectionPoint injectionPoint)
+    {
+        final ExternalResource externalResource = getAnnotation(injectionPoint);
+        final List<ExternalResourceProvider> providerList = new ArrayList<ExternalResourceProvider>();
+        for (ExternalResourceProvider erp : resourceProviders)
+        {
+            providerList.add(erp);
+        }
+        Collections.sort(providerList,new ExternalResourceProviderComparator());
+        for (final ExternalResourceProvider provider : providerList)
+        {
+            final InputStream is = provider.readStream(externalResource,injectionPoint);
+            if (is != null)
+            {
+                return is;
+            }
+        }
+        return null;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/d0d28577/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceLoader/ExternalResourceProviderComparator.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceLoader/ExternalResourceProviderComparator.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceLoader/ExternalResourceProviderComparator.java
new file mode 100644
index 0000000..2ad601b
--- /dev/null
+++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceLoader/ExternalResourceProviderComparator.java
@@ -0,0 +1,35 @@
+/*
+ * 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.deltaspike.core.impl.resourceLoader;
+
+import org.apache.deltaspike.core.spi.resourceLoader.ExternalResourceProvider;
+
+import java.util.Comparator;
+
+/**
+ * Compares two external resources.
+ */
+public class ExternalResourceProviderComparator implements Comparator<ExternalResourceProvider>
+{
+    @Override
+    public int compare(ExternalResourceProvider o1, ExternalResourceProvider o2)
+    {
+        return o1.getPriority() - o2.getPriority();
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/d0d28577/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceLoader/FileResourceProvider.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceLoader/FileResourceProvider.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceLoader/FileResourceProvider.java
new file mode 100644
index 0000000..ddabf41
--- /dev/null
+++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceLoader/FileResourceProvider.java
@@ -0,0 +1,68 @@
+/*
+ * 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.deltaspike.core.impl.resourceLoader;
+
+import org.apache.deltaspike.core.api.resoureLoader.ExternalResource;
+import org.apache.deltaspike.core.spi.resourceLoader.ExternalResourceProvider;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.spi.InjectionPoint;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+
+/**
+ * A file based resource provider, looking for a file based on the name.
+ */
+@ApplicationScoped
+public class FileResourceProvider implements ExternalResourceProvider
+{
+    @Override
+    public InputStream readStream(final ExternalResource externalResource, final InjectionPoint injectionPoint)
+    {
+        return readFile(externalResource.value());
+    }
+
+    @Override
+    public int getPriority()
+    {
+        return 20;
+    }
+
+    InputStream readFile(final String name)
+    {
+        File f = new File(name);
+        if (f.exists() && f.canRead() && f.isFile())
+        {
+            try
+            {
+                return new FileInputStream(f);
+            }
+            catch (FileNotFoundException e)
+            {
+                return null;
+            }
+        }
+        else
+        {
+            return null;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/d0d28577/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceLoader/ResourceLoaderExtension.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceLoader/ResourceLoaderExtension.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceLoader/ResourceLoaderExtension.java
new file mode 100644
index 0000000..344c5c4
--- /dev/null
+++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/resourceLoader/ResourceLoaderExtension.java
@@ -0,0 +1,40 @@
+/*
+ * 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.deltaspike.core.impl.resourceLoader;
+
+import javax.enterprise.inject.spi.*;
+
+/**
+ * This is needed for certain class loading cases (EARs, external modules).
+ * Simply registers additional resource loader classes to the context.
+ */
+public class ResourceLoaderExtension implements Extension
+{
+    public void addResourceLoaders(final BeforeBeanDiscovery beforeBeanDiscovery, final BeanManager beanManager)
+    {
+        beforeBeanDiscovery.addAnnotatedType(this.createAnnotatedType(ClasspathResourceProvider.class,beanManager));
+        beforeBeanDiscovery.addAnnotatedType(this.createAnnotatedType(ExternalResourceProducer.class,beanManager));
+        beforeBeanDiscovery.addAnnotatedType(this.createAnnotatedType(FileResourceProvider.class,beanManager));
+    }
+
+    private AnnotatedType<?> createAnnotatedType(final Class<?> clazz, final BeanManager beanManager)
+    {
+        return beanManager.createAnnotatedType(clazz);
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/d0d28577/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceLoader/InjectResourceTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceLoader/InjectResourceTest.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceLoader/InjectResourceTest.java
new file mode 100644
index 0000000..473167e
--- /dev/null
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/resourceLoader/InjectResourceTest.java
@@ -0,0 +1,78 @@
+/*
+ * 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.deltaspike.test.core.impl.resourceLoader;
+
+
+import org.apache.deltaspike.core.api.resoureLoader.ExternalResource;
+import org.apache.deltaspike.core.impl.resourceLoader.ClasspathResourceProvider;
+import org.apache.deltaspike.core.impl.resourceLoader.ExternalResourceProducer;
+import org.apache.deltaspike.core.impl.resourceLoader.FileResourceProvider;
+import org.apache.deltaspike.test.util.ArchiveUtils;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.inject.Inject;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+@RunWith(Arquillian.class)
+public class InjectResourceTest {
+    @Deployment
+    public static Archive<?> createResourceLoaderArchive()
+    {
+        Archive<?> arch = ShrinkWrap.create(JavaArchive.class, "resourceLoader.jar")
+                .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml")
+                .addClasses(ExternalResourceProducer.class, FileResourceProvider.class, ClasspathResourceProvider.class);
+        for(JavaArchive ja : ArchiveUtils.getDeltaSpikeCoreArchive())
+        {
+            arch.merge(ja);
+        }
+        return arch;
+    }
+
+    @Inject
+    @ExternalResource("myconfig.properties")
+    private InputStream inputStream;
+
+    @Inject
+    @ExternalResource("myconfig.properties")
+    private Properties props;
+
+    @Test
+    public void testInputStream() throws IOException {
+        Assert.assertNotNull(inputStream);
+        Properties p = new Properties();
+        p.load(inputStream);
+        Assert.assertEquals("somevalue", p.getProperty("some.propertykey", "wrong answer"));
+    }
+
+    @Test
+    public void testProperties() {
+        Assert.assertEquals("somevalue", props.getProperty("some.propertykey", "wrong answer"));
+    }
+}