You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by si...@apache.org on 2019/07/09 14:36:46 UTC

[sling-org-apache-sling-feature-cpconverter] 01/01: SLING-8569 - Detect & reports PackageTypes and nesting structures during conversion

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

simonetripodi pushed a commit to branch SLING-8569
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-cpconverter.git

commit 8f91a8f60adfc9de869dd12b3ef114390ee566db
Author: Simo Tripodi <st...@adobe.com>
AuthorDate: Tue Jul 9 16:34:26 2019 +0200

    SLING-8569 - Detect & reports PackageTypes and nesting structures during
    conversion
    
    initial checkin
---
 pom.xml                                            |   2 +-
 .../ContentPackage2FeatureModelConverter.java      |  18 +++
 ...ntentPackage2FeatureModelConverterLauncher.java |   4 +-
 .../vltpkg/DefaultPackagesEventsEmitter.java       | 133 +++++++++++++++++++++
 .../cpconverter/vltpkg/PackagesEventsEmitter.java  |  35 ++++++
 .../vltpkg/PackagesEventsEmitterTest.java          |  69 +++++++++++
 6 files changed, 259 insertions(+), 2 deletions(-)

diff --git a/pom.xml b/pom.xml
index bc50bb7..38bef2a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@
   </parent>
 
   <artifactId>org.apache.sling.feature.cpconverter</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
+  <version>0.0.1-T20190704160700-937c5fd</version>
 
   <name>Apache Sling Content Package to Feature Model converter</name>
   <description>Content Package to Feature Model converter tools for Apache Sling</description>
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
index 83fc5d3..ec874b3 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
@@ -47,6 +47,7 @@ import org.apache.sling.feature.cpconverter.handlers.EntryHandler;
 import org.apache.sling.feature.cpconverter.handlers.EntryHandlersManager;
 import org.apache.sling.feature.cpconverter.handlers.NodeTypesEntryHandler;
 import org.apache.sling.feature.cpconverter.vltpkg.BaseVaultPackageScanner;
+import org.apache.sling.feature.cpconverter.vltpkg.PackagesEventsEmitter;
 import org.apache.sling.feature.cpconverter.vltpkg.RecollectorVaultPackageScanner;
 import org.apache.sling.feature.cpconverter.vltpkg.VaultPackageAssembler;
 
@@ -76,6 +77,8 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
 
     private RecollectorVaultPackageScanner recollectorVaultPackageScanner;
 
+    private PackagesEventsEmitter emitter;
+
     public ContentPackage2FeatureModelConverter() {
         this(false);
     }
@@ -126,6 +129,11 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
         return mainPackageAssembler;
     }
 
+    public ContentPackage2FeatureModelConverter setEmitter(PackagesEventsEmitter emitter) {
+        this.emitter = emitter;
+        return this;
+    }
+
     public void convert(File...contentPackages) throws Exception {
         requireNonNull(contentPackages , "Null content-package(s) can not be converted.");
         secondPass(firstPass(contentPackages));
@@ -166,8 +174,11 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
     }
 
     protected void secondPass(Collection<VaultPackage> orderedContentPackages) throws Exception {
+        emitter.start();
+
         for (VaultPackage vaultPackage : orderedContentPackages) {
             try {
+                emitter.startPackage(vaultPackage);
                 mainPackageAssembler = VaultPackageAssembler.create(vaultPackage);
                 assemblers.add(mainPackageAssembler);
 
@@ -196,6 +207,7 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
                 logger.info("Conversion complete!");
 
                 featuresManager.serialize();
+                emitter.endPackage();
             } finally {
                 aclManager.reset();
                 assemblers.clear();
@@ -207,6 +219,8 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
                 }
             }
         }
+
+        emitter.end();
     }
 
     private void orderDependencies(Map<PackageId, VaultPackage> idFileMap,
@@ -239,6 +253,8 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
             return;
         }
 
+        emitter.startSubPackage(path, vaultPackage);
+
         ArtifactId packageId = toArtifactId(vaultPackage);
         VaultPackageAssembler clonedPackage = VaultPackageAssembler.create(vaultPackage);
 
@@ -261,6 +277,8 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
 
         // restore the previous assembler
         mainPackageAssembler = handler;
+
+        emitter.endSubPackage();
     }
 
     protected boolean isSubContentPackageIncluded(String path) {
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/cli/ContentPackage2FeatureModelConverterLauncher.java b/src/main/java/org/apache/sling/feature/cpconverter/cli/ContentPackage2FeatureModelConverterLauncher.java
index ac4b92b..b1e0d4d 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/cli/ContentPackage2FeatureModelConverterLauncher.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/cli/ContentPackage2FeatureModelConverterLauncher.java
@@ -27,6 +27,7 @@ import org.apache.sling.feature.cpconverter.artifacts.DefaultArtifactsDeployer;
 import org.apache.sling.feature.cpconverter.features.DefaultFeaturesManager;
 import org.apache.sling.feature.cpconverter.filtering.RegexBasedResourceFilter;
 import org.apache.sling.feature.cpconverter.handlers.DefaultEntryHandlersManager;
+import org.apache.sling.feature.cpconverter.vltpkg.DefaultPackagesEventsEmitter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -117,7 +118,8 @@ public final class ContentPackage2FeatureModelConverterLauncher implements Runna
                                                                                                             properties))
                                                              .setBundlesDeployer(new DefaultArtifactsDeployer(artifactsOutputDirectory))
                                                              .setEntryHandlersManager(new DefaultEntryHandlersManager())
-                                                             .setAclManager(new DefaultAclManager());
+                                                             .setAclManager(new DefaultAclManager())
+                                                             .setEmitter(DefaultPackagesEventsEmitter.open(featureModelsOutputDirectory));
 
             if (filteringPatterns != null && filteringPatterns.length > 0) {
                 RegexBasedResourceFilter filter = new RegexBasedResourceFilter();
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/DefaultPackagesEventsEmitter.java b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/DefaultPackagesEventsEmitter.java
new file mode 100644
index 0000000..a37ad08
--- /dev/null
+++ b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/DefaultPackagesEventsEmitter.java
@@ -0,0 +1,133 @@
+/*
+ * 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.sling.feature.cpconverter.vltpkg;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.Writer;
+import java.util.Date;
+import java.util.Stack;
+
+import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
+import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter;
+import org.apache.jackrabbit.vault.packaging.PackageType;
+import org.apache.jackrabbit.vault.packaging.VaultPackage;
+
+/**
+ * Writes a CSV file <code>containerFile,packageId,packageType[,parentId,pathInParent]</code>
+ */
+public final class DefaultPackagesEventsEmitter implements PackagesEventsEmitter {
+
+    private static final String FILENAME = "content-packages.csv";
+
+    public static DefaultPackagesEventsEmitter open(File featureModelsOutputDirectory) throws IOException {
+        if (!featureModelsOutputDirectory.exists()) {
+            featureModelsOutputDirectory.mkdirs();
+        }
+
+        File contentPackagesFiles = new File(featureModelsOutputDirectory, FILENAME);
+        return new DefaultPackagesEventsEmitter(new FileWriter(contentPackagesFiles));
+    }
+
+    private final Stack<VaultPackage> hierarchy = new Stack<>();
+
+    private final PrintWriter writer;
+
+    protected DefaultPackagesEventsEmitter(Writer writer) {
+        this.writer = new PrintWriter(writer, true);
+    }
+
+    @Override
+    public void start() {
+        writer.printf("# File created on %s by the Apache Sling Content Package to Sling Feature converter%n", new Date());
+    }
+
+    @Override
+    public void end() {
+        writer.close();
+    }
+
+    @Override
+    public void startPackage(VaultPackage vaultPackage) {
+        hierarchy.add(vaultPackage);
+
+        writer.printf("%s,%s,%s,,%n",
+                      vaultPackage.getFile(),
+                      vaultPackage.getId(),
+                      detectPackageType(vaultPackage));
+    }
+
+    @Override
+    public void endPackage() {
+        hierarchy.pop();
+    }
+
+    @Override
+    public void startSubPackage(String path, VaultPackage vaultPackage) {
+        VaultPackage parent = hierarchy.peek();
+
+        writer.printf("%s,%s,%s,%s,%s%n",
+                      parent.getFile(),
+                      vaultPackage.getId(),
+                      detectPackageType(vaultPackage),
+                      parent.getId(),
+                      path);
+
+        hierarchy.add(vaultPackage);
+    }
+
+    @Override
+    public void endSubPackage() {
+        hierarchy.pop();
+    }
+
+    private static PackageType detectPackageType(VaultPackage vaultPackage) {
+        PackageType packageType = vaultPackage.getPackageType();
+        if (packageType != null) {
+            return packageType;
+        }
+
+        // borrowed from org.apache.jackrabbit.vault.fs.io.AbstractExporter
+        WorkspaceFilter filter = vaultPackage.getMetaInf().getFilter();
+
+        boolean hasApps = false;
+        boolean hasOther = false;
+        for (PathFilterSet p : filter.getFilterSets()) {
+            if ("cleanup".equals(p.getType())) {
+                continue;
+            }
+            String root = p.getRoot();
+            if ("/apps".equals(root)
+                    || root.startsWith("/apps/")
+                    || "/libs".equals(root)
+                    || root.startsWith("/libs/")) {
+                hasApps = true;
+            } else {
+                hasOther = true;
+            }
+        }
+        if (hasApps && !hasOther) {
+            return PackageType.APPLICATION;
+        } else if (hasOther && !hasApps) {
+            return PackageType.CONTENT;
+        }
+        return PackageType.MIXED;
+    }
+
+}
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitter.java b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitter.java
new file mode 100644
index 0000000..a854b06
--- /dev/null
+++ b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitter.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.sling.feature.cpconverter.vltpkg;
+
+import org.apache.jackrabbit.vault.packaging.VaultPackage;
+
+public interface PackagesEventsEmitter {
+
+    void start();
+
+    void end();
+
+    void startPackage(VaultPackage vaultPackage);
+
+    void endPackage();
+
+    void startSubPackage(String path, VaultPackage vaultPackage);
+
+    void endSubPackage();
+
+}
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitterTest.java b/src/test/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitterTest.java
new file mode 100644
index 0000000..0f1ef7c
--- /dev/null
+++ b/src/test/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitterTest.java
@@ -0,0 +1,69 @@
+/*
+ * 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.sling.feature.cpconverter.vltpkg;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.StringWriter;
+
+import org.apache.jackrabbit.vault.packaging.PackageId;
+import org.apache.jackrabbit.vault.packaging.PackageType;
+import org.apache.jackrabbit.vault.packaging.VaultPackage;
+import org.junit.Test;
+
+public class PackagesEventsEmitterTest {
+
+    @Test
+    public void justCheckEmissions() {
+        VaultPackage parent = mock(VaultPackage.class);
+        when(parent.getPackageType()).thenReturn(PackageType.MIXED);
+        when(parent.getId()).thenReturn(new PackageId("apache/sling", "parent", "1.0.0"));
+        when(parent.getFile()).thenReturn(new File("/org/apache/sling/content-package.zip"));
+
+        StringWriter stringWriter = new StringWriter();
+        PackagesEventsEmitter emitter = new DefaultPackagesEventsEmitter(stringWriter);
+        emitter.start();
+        emitter.startPackage(parent);
+
+        VaultPackage contentChild = mock(VaultPackage.class);
+        when(contentChild.getPackageType()).thenReturn(PackageType.CONTENT);
+        when(contentChild.getId()).thenReturn(new PackageId("apache/sling", "content-child", "1.0.0"));
+        emitter.startSubPackage("/jcr_root/etc/packages/org/apache/sling/content-child-1.0.zip", contentChild);
+        emitter.endPackage();
+
+        VaultPackage applicationChild = mock(VaultPackage.class);
+        when(applicationChild.getPackageType()).thenReturn(PackageType.APPLICATION);
+        when(applicationChild.getId()).thenReturn(new PackageId("apache/sling", "application-child", "1.0.0"));
+        emitter.startSubPackage("/jcr_root/etc/packages/org/apache/sling/application-child-1.0.zip", applicationChild);
+        emitter.endPackage();
+
+        emitter.endPackage();
+        emitter.end();
+
+        String actual = stringWriter.toString();
+
+        String expected = "/org/apache/sling/content-package.zip,apache/sling:parent:1.0.0,MIXED,,\n" + 
+                "/org/apache/sling/content-package.zip,apache/sling:content-child:1.0.0,CONTENT,apache/sling:parent:1.0.0,/jcr_root/etc/packages/org/apache/sling/content-child-1.0.zip\n" + 
+                "/org/apache/sling/content-package.zip,apache/sling:application-child:1.0.0,APPLICATION,apache/sling:parent:1.0.0,/jcr_root/etc/packages/org/apache/sling/application-child-1.0.zip\n";
+
+        assertTrue(actual.endsWith(expected));
+    }
+
+}