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

cziegeler pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-io.git


The following commit(s) were added to refs/heads/master by this push:
     new 6944ad3  SLING-9262 : Add prototype feature to feature archive
6944ad3 is described below

commit 6944ad374f5a1c19b0e1db60cbf65a1976f66fa4
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Fri Mar 27 08:02:39 2020 +0100

    SLING-9262 : Add prototype feature to feature archive
---
 .../sling/feature/io/archive/ArchiveWriter.java    | 63 ++++++++++++++++++----
 1 file changed, 54 insertions(+), 9 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/feature/io/archive/ArchiveWriter.java 
b/src/main/java/org/apache/sling/feature/io/archive/ArchiveWriter.java
index a4d6e29..3207e56 100644
--- a/src/main/java/org/apache/sling/feature/io/archive/ArchiveWriter.java
+++ b/src/main/java/org/apache/sling/feature/io/archive/ArchiveWriter.java
@@ -16,12 +16,16 @@
  */
 package org.apache.sling.feature.io.archive;
 
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.StringReader;
 import java.io.Writer;
 import java.net.URL;
+import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
@@ -37,6 +41,7 @@ import org.apache.sling.feature.Extension;
 import org.apache.sling.feature.ExtensionType;
 import org.apache.sling.feature.Feature;
 import org.apache.sling.feature.builder.ArtifactProvider;
+import org.apache.sling.feature.io.json.FeatureJSONReader;
 import org.apache.sling.feature.io.json.FeatureJSONWriter;
 
 /**
@@ -87,23 +92,19 @@ public class ArchiveWriter {
         manifest.getMainAttributes().putValue(CONTENTS_HEADER, 
String.join(",", Arrays.asList(features).stream()
                 .map(feature -> 
feature.getId().toMvnId()).collect(Collectors.toList())));
 
+        final Set<ArtifactId> artifacts = new HashSet<>();
+        final byte[] buffer = new byte[1024*1024*256];
+
         // create archive
         final JarOutputStream jos = new JarOutputStream(out, manifest);
 
         // write everything without compression
         jos.setLevel(Deflater.NO_COMPRESSION);
         for (final Feature feature : features) {
-            final JarEntry entry = new JarEntry(feature.getId().toMvnPath());
-            jos.putNextEntry(entry);
-            final Writer writer = new OutputStreamWriter(jos, "UTF-8");
-            FeatureJSONWriter.write(writer, feature);
-            writer.flush();
-            jos.closeEntry();
+            writeFeature(artifacts, feature, provider, jos, buffer);
         }
 
-        final byte[] buffer = new byte[1024*1024*256];
 
-        final Set<ArtifactId> artifacts = new HashSet<>();
 
         for (final Feature feature : features) {
             for (final Artifact a : feature.getBundles()) {
@@ -112,8 +113,13 @@ public class ArchiveWriter {
 
             for (final Extension e : feature.getExtensions()) {
                 if (e.getType() == ExtensionType.ARTIFACTS) {
+                    final boolean isFeature = 
Extension.EXTENSION_NAME_ASSEMBLED_FEATURES.equals(e.getName());
                     for (final Artifact a : e.getArtifacts()) {
-                        writeArtifact(artifacts, provider, a, jos, buffer);
+                        if ( isFeature ) {
+                            writeFeature(artifacts, provider, a.getId(), jos, 
buffer);
+                        } else {
+                            writeArtifact(artifacts, provider, a, jos, buffer);
+                        }
                     }
                 }
             }
@@ -121,6 +127,45 @@ public class ArchiveWriter {
         return jos;
     }
 
+    private static void writeFeature(final Set<ArtifactId> artifacts,
+            final Feature feature,
+            final ArtifactProvider provider,
+            final JarOutputStream jos, final byte[] buffer) throws IOException 
{
+        if ( artifacts.add(feature.getId())) {
+            final JarEntry entry = new JarEntry(feature.getId().toMvnPath());
+            jos.putNextEntry(entry);
+            final Writer writer = new OutputStreamWriter(jos, 
StandardCharsets.UTF_8);
+            FeatureJSONWriter.write(writer, feature);
+            writer.flush();
+            jos.closeEntry();
+
+            if ( feature.getPrototype() != null ) {
+                writeFeature(artifacts, provider, 
feature.getPrototype().getId(), jos, buffer);
+            }
+        }
+    }
+
+    private static void writeFeature(final Set<ArtifactId> artifacts,
+            final ArtifactProvider provider,
+            final ArtifactId featureId,
+            final JarOutputStream jos, final byte[] buffer) throws IOException 
{
+        if ( !artifacts.contains(featureId)) {
+            final URL url = provider.provide(featureId);
+            try ( final ByteArrayOutputStream baos = new 
ByteArrayOutputStream();
+                  final InputStream is = url.openStream()) {
+                int l = 0;
+                while ( (l = is.read(buffer)) > 0 ) {
+                    baos.write(buffer, 0, l);
+                }
+                final String contents = new String(baos.toByteArray(), 
StandardCharsets.UTF_8);
+                try ( final Reader reader = new StringReader(contents)) {
+                    final Feature feature = FeatureJSONReader.read(reader, 
featureId.toMvnId());
+                    writeFeature(artifacts, feature, provider, jos, buffer);
+                }
+            }
+        }
+    }
+
     private static void writeArtifact(final Set<ArtifactId> artifacts,
             final ArtifactProvider provider,
             final Artifact artifact,

Reply via email to