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;