This is an automated email from the ASF dual-hosted git repository.

pauls pushed a commit to branch issues/SLING-7968
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-modelconverter.git

commit 03d2587c302d7a5fb05301700fbde82a90b054dd
Author: Karl Pauls <[email protected]>
AuthorDate: Tue Oct 2 00:58:53 2018 +0200

    SLING-7968: Use FeatureProvider instead of ArtifactManager.
---
 .../modelconverter/FeatureToProvisioning.java      | 65 +++++++---------------
 .../feature/modelconverter/ModelConverterTest.java | 41 ++++++++++----
 2 files changed, 50 insertions(+), 56 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/feature/modelconverter/FeatureToProvisioning.java
 
b/src/main/java/org/apache/sling/feature/modelconverter/FeatureToProvisioning.java
index 24fc3b7..47b089c 100644
--- 
a/src/main/java/org/apache/sling/feature/modelconverter/FeatureToProvisioning.java
+++ 
b/src/main/java/org/apache/sling/feature/modelconverter/FeatureToProvisioning.java
@@ -17,17 +17,22 @@
 package org.apache.sling.feature.modelconverter;
 
 import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
+import java.io.FileInputStream;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
 import java.io.StringReader;
+import java.io.UncheckedIOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import javax.json.Json;
 import javax.json.JsonArray;
@@ -46,8 +51,6 @@ import org.apache.sling.feature.KeyValueMap;
 import org.apache.sling.feature.builder.BuilderContext;
 import org.apache.sling.feature.builder.FeatureBuilder;
 import org.apache.sling.feature.builder.FeatureProvider;
-import org.apache.sling.feature.io.file.ArtifactHandler;
-import org.apache.sling.feature.io.file.ArtifactManager;
 import org.apache.sling.feature.io.json.FeatureJSONReader;
 import org.apache.sling.provisioning.model.Artifact;
 import org.apache.sling.provisioning.model.Configuration;
@@ -65,7 +68,7 @@ public class FeatureToProvisioning {
     static final String PROVISIONING_MODEL_NAME_VARIABLE = 
"provisioning.model.name";
     static final String PROVISIONING_RUNMODES = "provisioning.runmodes";
 
-    public static void convert(File inputFile, File outputFile, 
ArtifactManager am, File ... additionalInputFiles) throws IOException {
+    public static void convert(File inputFile, File outputFile, 
FeatureProvider fp, File ... additionalInputFiles) throws UncheckedIOException {
         if (outputFile.exists()) {
             if (outputFile.lastModified() > inputFile.lastModified()) {
                 LOGGER.debug("Skipping the generation of {} as this file 
already exists and is newer.", outputFile);
@@ -73,9 +76,9 @@ public class FeatureToProvisioning {
             }
         }
 
-        org.apache.sling.feature.Feature feature = 
getFeature(inputFile.getAbsolutePath(), am);
+        org.apache.sling.feature.Feature feature = getFeature(inputFile);
         if (feature.getInclude() != null) {
-            feature = handleIncludes(feature, additionalInputFiles, am);
+            feature = handleIncludes(feature, additionalInputFiles, fp);
         }
 
         Object featureNameVar = 
feature.getVariables().remove(PROVISIONING_MODEL_NAME_VARIABLE);
@@ -97,49 +100,23 @@ public class FeatureToProvisioning {
                 feature.getFrameworkProperties(), feature.getExtensions(), 
outputFile.getAbsolutePath(), runModes);
     }
 
-    static org.apache.sling.feature.Feature getFeature(final String url, final 
ArtifactManager am) throws FileNotFoundException, IOException {
-        final ArtifactHandler featureArtifact = am.getArtifactHandler(url);
-        try (final FileReader r = new FileReader(featureArtifact.getFile())) {
-            final org.apache.sling.feature.Feature f = 
FeatureJSONReader.read(r, featureArtifact.getUrl());
-            return f;
+    static org.apache.sling.feature.Feature getFeature(final File file) throws 
UncheckedIOException {
+        try (final Reader r = new InputStreamReader(new FileInputStream(file), 
"UTF-8")) {
+            return FeatureJSONReader.read(r, file.toURI().toURL().toString());
+        } catch (IOException ex) {
+            throw new UncheckedIOException(ex);
         }
 
     }
 
-    private static org.apache.sling.feature.Feature 
handleIncludes(org.apache.sling.feature.Feature feature, File[] 
additionalFiles, ArtifactManager am) throws IOException {
-        Map<ArtifactId, org.apache.sling.feature.Feature> features = new 
HashMap<>();
+    private static org.apache.sling.feature.Feature 
handleIncludes(org.apache.sling.feature.Feature feature, File[] 
additionalFiles, FeatureProvider fp) throws UncheckedIOException {
+        Map<ArtifactId, org.apache.sling.feature.Feature> features =
+            Stream.of(additionalFiles)
+                .map(FeatureToProvisioning::getFeature)
+                
.collect(Collectors.toMap(org.apache.sling.feature.Feature::getId, 
Function.identity()));
 
-        for (File f : additionalFiles) {
-            org.apache.sling.feature.Feature af = 
getFeature(f.getAbsolutePath(), am);
-            features.put(af.getId(), af);
-        }
-
-        BuilderContext bc = new BuilderContext(new FeatureProvider() {
-            @Override
-            public org.apache.sling.feature.Feature provide(ArtifactId id) {
-                // Check first if the feature is part of the provided context
-                org.apache.sling.feature.Feature f = features.get(id);
-                if (f != null) {
-                    return f;
-                }
+        BuilderContext bc = new BuilderContext(id -> features.containsKey(id) 
? features.get(id) : fp.provide(id));
 
-                // If not, see if it is known to Maven
-                try {
-                    ArtifactHandler ah = am.getArtifactHandler(id.toMvnUrl());
-                    if (ah != null) {
-                        org.apache.sling.feature.Feature feat = 
getFeature(ah.getUrl(), am);
-                        if (feat != null) {
-                            // Cache it
-                            features.put(feat.getId(), feat);
-                        }
-                        return feat;
-                    }
-                } catch (IOException e) {
-                    throw new RuntimeException(e);
-                }
-                return null;
-            }
-        });
         return FeatureBuilder.assemble(feature, bc);
     }
 
diff --git 
a/src/test/java/org/apache/sling/feature/modelconverter/ModelConverterTest.java 
b/src/test/java/org/apache/sling/feature/modelconverter/ModelConverterTest.java
index 27e9262..50cfe88 100644
--- 
a/src/test/java/org/apache/sling/feature/modelconverter/ModelConverterTest.java
+++ 
b/src/test/java/org/apache/sling/feature/modelconverter/ModelConverterTest.java
@@ -25,6 +25,8 @@ import static org.junit.Assert.fail;
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
+import java.io.Reader;
+import java.io.UncheckedIOException;
 import java.net.URISyntaxException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -42,14 +44,17 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.Bundles;
 import org.apache.sling.feature.Configurations;
 import org.apache.sling.feature.Extension;
 import org.apache.sling.feature.ExtensionType;
 import org.apache.sling.feature.Extensions;
+import org.apache.sling.feature.builder.FeatureProvider;
 import org.apache.sling.feature.io.file.ArtifactHandler;
 import org.apache.sling.feature.io.file.ArtifactManager;
 import org.apache.sling.feature.io.file.ArtifactManagerConfig;
+import org.apache.sling.feature.io.json.FeatureJSONReader;
 import org.apache.sling.provisioning.model.Artifact;
 import org.apache.sling.provisioning.model.ArtifactGroup;
 import org.apache.sling.provisioning.model.Configuration;
@@ -74,6 +79,7 @@ import org.mockito.stubbing.Answer;
 public class ModelConverterTest {
     private Path tempDir;
     private ArtifactManager artifactManager;
+    private FeatureProvider featureProvider;
 
     @Before
     public void setup() throws Exception {
@@ -86,6 +92,17 @@ public class ModelConverterTest {
         }
         artifactManager = ArtifactManager.getArtifactManager(
                 new ArtifactManagerConfig());
+        featureProvider =
+            id -> {
+                try {
+                    File file = 
artifactManager.getArtifactHandler(id.toMvnUrl()).getFile();
+                    try (Reader reader = new FileReader(file)) {
+                        return FeatureJSONReader.read(reader, 
file.toURI().toURL().toString());
+                    }
+                } catch (IOException e) {
+                    throw new UncheckedIOException(e);
+                }
+            };
     }
 
     @After
@@ -250,9 +267,9 @@ public class ModelConverterTest {
         assertEquals("The testing code expects a single output file here", 1, 
files.size());
         File outFile = files.get(0);
 
-        String expectedFile = new 
File(getClass().getResource(expectedJSON).toURI()).getAbsolutePath();
-        org.apache.sling.feature.Feature expected = 
FeatureToProvisioning.getFeature(expectedFile, artifactManager);
-        org.apache.sling.feature.Feature actual = 
FeatureToProvisioning.getFeature(outFile.getAbsolutePath(), artifactManager);
+        File expectedFile = new 
File(getClass().getResource(expectedJSON).toURI());
+        org.apache.sling.feature.Feature expected = 
FeatureToProvisioning.getFeature(expectedFile);
+        org.apache.sling.feature.Feature actual = 
FeatureToProvisioning.getFeature(outFile);
         assertFeaturesEqual(expected, actual);
     }
 
@@ -264,7 +281,7 @@ public class ModelConverterTest {
         File inFile = new File(getClass().getResource(originalJSON).toURI());
         File outFile = new File(tempDir.toFile(), expectedProvModel + 
".generated");
 
-        FeatureToProvisioning.convert(inFile, outFile, artifactManager);
+        FeatureToProvisioning.convert(inFile, outFile, featureProvider);
         List<String> orgLines = Files.readAllLines(outFile.toPath());
         assertNotEquals("Test precondition", "modified!", 
orgLines.get(orgLines.size() - 1));
 
@@ -272,14 +289,14 @@ public class ModelConverterTest {
         Files.write(outFile.toPath(), "\nmodified!".getBytes(), 
StandardOpenOption.APPEND);
 
         // Convert again and see that the output file is not modified
-        FeatureToProvisioning.convert(inFile, outFile, artifactManager);
+        FeatureToProvisioning.convert(inFile, outFile, featureProvider);
 
         List<String> lines = Files.readAllLines(outFile.toPath());
         assertEquals("modified!", lines.get(lines.size() - 1));
 
         // Modify the modification time of the generated file to be older than 
the input file
         outFile.setLastModified(inFile.lastModified() - 100000);
-        FeatureToProvisioning.convert(inFile, outFile, artifactManager);
+        FeatureToProvisioning.convert(inFile, outFile, featureProvider);
 
         List<String> owLines = Files.readAllLines(outFile.toPath());
         assertEquals("The file should have been overwritten since the source 
has modified since it's edit timestamp",
@@ -333,7 +350,7 @@ public class ModelConverterTest {
             assertFalse("File name cannot contain a colon", 
baseName.contains(":"));
             File genFile = new File(tempDir.toFile(), baseName + ".txt");
             allGenerateProvisioningModelFiles.add(genFile);
-            FeatureToProvisioning.convert(f, genFile, artifactManager);
+            FeatureToProvisioning.convert(f, genFile, featureProvider);
         }
 
         Model expected = readProvisioningModel(orgProvModel);
@@ -348,9 +365,9 @@ public class ModelConverterTest {
         assertEquals("The testing code expects a single output file here", 1, 
files.size());
         File outFile = files.get(0);
 
-        String expectedFile = new 
File(getClass().getResource(expectedJSON).toURI()).getAbsolutePath();
-        org.apache.sling.feature.Feature expected = 
FeatureToProvisioning.getFeature(expectedFile, artifactManager);
-        org.apache.sling.feature.Feature actual = 
FeatureToProvisioning.getFeature(outFile.getAbsolutePath(), artifactManager);
+        File expectedFile = new 
File(getClass().getResource(expectedJSON).toURI());
+        org.apache.sling.feature.Feature expected = 
FeatureToProvisioning.getFeature(expectedFile);
+        org.apache.sling.feature.Feature actual = 
FeatureToProvisioning.getFeature(outFile);
         assertFeaturesEqual(expected, actual);
     }
 
@@ -362,7 +379,7 @@ public class ModelConverterTest {
             addFiles.add(new File(getClass().getResource(af).toURI()));
         }
 
-        FeatureToProvisioning.convert(inFile, outFile, artifactManager, 
addFiles.toArray(new File[] {}));
+        FeatureToProvisioning.convert(inFile, outFile, featureProvider, 
addFiles.toArray(new File[] {}));
 
         File expectedFile = new 
File(getClass().getResource(expectedProvModel).toURI());
         Model expected = readProvisioningModel(expectedFile);
@@ -404,7 +421,7 @@ public class ModelConverterTest {
                 outFile = new File(tempDir.toFile(), inFile.getName() + 
(counter++) + ".txt.generated");
             } while (outFile.exists());
 
-            FeatureToProvisioning.convert(inFile, outFile, artifactManager);
+            FeatureToProvisioning.convert(inFile, outFile, featureProvider);
             generatedFiles.add(outFile);
         }
         return generatedFiles;

Reply via email to