SLING-9080 : Support ArtifactProvider and FeatureProvider through ArtifactManager
diff --git a/pom.xml b/pom.xml
index 8b44535..3bbe8c9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,7 @@
     </parent>
 
     <artifactId>org.apache.sling.feature.io</artifactId>
-    <version>1.2.3-SNAPSHOT</version>
+    <version>1.3.0-SNAPSHOT</version>
 
     <name>Apache Sling Feature IO Module</name>
     <description>
diff --git a/src/main/java/org/apache/sling/feature/io/artifacts/ArtifactManager.java b/src/main/java/org/apache/sling/feature/io/artifacts/ArtifactManager.java
index 0d91332..223ca78 100644
--- a/src/main/java/org/apache/sling/feature/io/artifacts/ArtifactManager.java
+++ b/src/main/java/org/apache/sling/feature/io/artifacts/ArtifactManager.java
@@ -24,6 +24,7 @@
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
+import java.io.Reader;
 import java.net.MalformedURLException;
 import java.net.URISyntaxException;
 import java.net.URL;
@@ -34,8 +35,11 @@
 import java.util.ServiceLoader;
 
 import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.Feature;
+import org.apache.sling.feature.builder.FeatureProvider;
 import org.apache.sling.feature.io.artifacts.spi.ArtifactProvider;
 import org.apache.sling.feature.io.artifacts.spi.ArtifactProviderContext;
+import org.apache.sling.feature.io.json.FeatureJSONReader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,7 +48,8 @@
  * It uses {@link ArtifactProvider}s to get artifacts. The
  * providers are loaded using the service loader.
  */
-public class ArtifactManager implements AutoCloseable {
+public class ArtifactManager
+        implements AutoCloseable, org.apache.sling.feature.builder.ArtifactProvider {
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
@@ -106,11 +111,35 @@
     }
 
     @Override
-    public void close()
-    {
+    public void close() {
         shutdown();
     }
 
+    @Override
+    public URL provide(final ArtifactId id) {
+        try {
+            final ArtifactHandler handler = this.getArtifactHandler(id.toMvnUrl());
+            return handler.getLocalURL();
+        } catch (final IOException e) {
+            // ignore
+            return null;
+        }
+    }
+
+    public FeatureProvider toFeatureProvider() {
+        return (id -> {
+            try {
+                final ArtifactHandler handler = this.getArtifactHandler(id.toMvnUrl());
+                try (final Reader r = new InputStreamReader(handler.getLocalURL().openStream(), "UTF-8")) {
+                    final Feature f = FeatureJSONReader.read(r, handler.getUrl());
+                    return f;
+                }
+            } catch (final IOException e) {
+                // ignore
+                return null;
+            }
+        });
+    }
     private final URL getArtifactFromProviders(final String url, final String relativeCachePath) throws IOException {
         final int pos = url.indexOf(":");
         final String scheme = url.substring(0, pos);
@@ -127,9 +156,10 @@
 
     /**
      * Get the full artifact url and file for an artifact.
+     * 
      * @param url Artifact url or relative path.
      * @return Absolute url and file in the form of a handler.
-     * @throws IOException If something goes wrong.
+     * @throws IOException If something goes wrong or the artifact can't be found.
      */
     public ArtifactHandler getArtifactHandler(final String url) throws IOException {
         logger.debug("Trying to get artifact for {}", url);
diff --git a/src/main/java/org/apache/sling/feature/io/artifacts/package-info.java b/src/main/java/org/apache/sling/feature/io/artifacts/package-info.java
index 08e8d2c..f2229fb 100644
--- a/src/main/java/org/apache/sling/feature/io/artifacts/package-info.java
+++ b/src/main/java/org/apache/sling/feature/io/artifacts/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@org.osgi.annotation.versioning.Version("1.0.0")
+@org.osgi.annotation.versioning.Version("1.1.0")
 package org.apache.sling.feature.io.artifacts;