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/05/24 12:42:00 UTC

[sling-org-apache-sling-feature-cpconverter] branch master updated (fe34c7a -> 459e4f7)

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

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


    from fe34c7a  Merge pull request #4 from DominikSuess/issue/SLING-8420
     new 6ec4ee0  SLING-8433 - [cp2fm] handle same sub-content-package multi-versions
     new 459e4f7  Merge branch 'master' of github.com:apache/sling-org-apache-sling-feature-cpconverter

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 pom.xml                                            |  11 --
 .../ContentPackage2FeatureModelConverter.java      | 182 +++++++++++----------
 .../features/DefaultFeaturesManager.java           |   6 +-
 .../cpconverter/features/FeaturesManager.java      |   5 +-
 .../handlers/AbstractContentPackageHandler.java    |  66 ++++++++
 .../handlers/ContentPackageEntryHandler.java       |  33 +---
 .../VersionResolverContentPackageEntryHandler.java |  82 ++++++++++
 .../vltpkg/BaseVaultPackageScanner.java            |  39 ++++-
 .../vltpkg/RecollectorVaultPackageScanner.java     |  50 ++++++
 .../cpconverter/vltpkg/VaultPackageAssembler.java  |   2 +-
 .../ContentPackage2FeatureModelConverterTest.java  |  19 ++-
 .../handlers/BundleEntryHandlerTest.java           |   2 +-
 .../feature/cpconverter/test-content-package-2.zip | Bin 0 -> 56187 bytes
 13 files changed, 347 insertions(+), 150 deletions(-)
 create mode 100644 src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java
 create mode 100644 src/main/java/org/apache/sling/feature/cpconverter/handlers/VersionResolverContentPackageEntryHandler.java
 create mode 100644 src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java
 create mode 100644 src/test/resources/org/apache/sling/feature/cpconverter/test-content-package-2.zip


[sling-org-apache-sling-feature-cpconverter] 01/02: SLING-8433 - [cp2fm] handle same sub-content-package multi-versions

Posted by si...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 6ec4ee04777d59975f764548c29b7384b2a667ac
Author: Simo Tripodi <st...@adobe.com>
AuthorDate: Fri May 24 14:32:47 2019 +0200

    SLING-8433 - [cp2fm] handle same sub-content-package multi-versions
---
 pom.xml                                            |  10 --
 .../ContentPackage2FeatureModelConverter.java      | 124 +++++++++++----------
 .../features/DefaultFeaturesManager.java           |   6 +-
 .../cpconverter/features/FeaturesManager.java      |   5 +-
 .../handlers/AbstractContentPackageHandler.java    |  66 +++++++++++
 .../handlers/ContentPackageEntryHandler.java       |  33 +-----
 .../VersionResolverContentPackageEntryHandler.java |  82 ++++++++++++++
 .../vltpkg/BaseVaultPackageScanner.java            |  39 +++++--
 .../vltpkg/RecollectorVaultPackageScanner.java     |  50 +++++++++
 .../cpconverter/vltpkg/VaultPackageAssembler.java  |   2 +-
 .../ContentPackage2FeatureModelConverterTest.java  |  17 ++-
 .../handlers/BundleEntryHandlerTest.java           |   2 +-
 .../feature/cpconverter/test-content-package-2.zip | Bin 0 -> 56187 bytes
 13 files changed, 317 insertions(+), 119 deletions(-)

diff --git a/pom.xml b/pom.xml
index 7f7acd2..fda28c6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -233,16 +233,6 @@
       </plugin>
 
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <systemPropertyVariables>
-            <testDirectory>${project.build.directory}/unit-tests</testDirectory>
-          </systemPropertyVariables>
-        </configuration>
-      </plugin>
-
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>license-maven-plugin</artifactId>
         <version>1.16</version>
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 c25f819..f8c97ee 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
@@ -25,16 +25,15 @@ import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.jackrabbit.vault.fs.io.Archive;
 import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
 import org.apache.jackrabbit.vault.packaging.CyclicDependencyException;
 import org.apache.jackrabbit.vault.packaging.Dependency;
 import org.apache.jackrabbit.vault.packaging.PackageId;
-import org.apache.jackrabbit.vault.packaging.PackageManager;
 import org.apache.jackrabbit.vault.packaging.PackageProperties;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
-import org.apache.jackrabbit.vault.packaging.impl.PackageManagerImpl;
 import org.apache.sling.feature.cpconverter.acl.AclManager;
 import org.apache.sling.feature.cpconverter.artifacts.ArtifactsDeployer;
 import org.apache.sling.feature.cpconverter.artifacts.FileArtifactWriter;
@@ -43,9 +42,8 @@ import org.apache.sling.feature.cpconverter.filtering.ResourceFilter;
 import org.apache.sling.feature.cpconverter.handlers.EntryHandler;
 import org.apache.sling.feature.cpconverter.handlers.EntryHandlersManager;
 import org.apache.sling.feature.cpconverter.vltpkg.BaseVaultPackageScanner;
+import org.apache.sling.feature.cpconverter.vltpkg.RecollectorVaultPackageScanner;
 import org.apache.sling.feature.cpconverter.vltpkg.VaultPackageAssembler;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanner {
 
@@ -55,9 +53,7 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
 
     private static final String DEFEAULT_VERSION = "0.0.0";
 
-    private final Logger logger = LoggerFactory.getLogger(getClass());
-
-    private final PackageManager packageManager = new PackageManagerImpl();
+    private final Map<PackageId, String> subContentPackages = new HashMap<>();
 
     private EntryHandlersManager handlersManager;
 
@@ -71,12 +67,15 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
 
     private VaultPackageAssembler mainPackageAssembler = null;
 
+    private RecollectorVaultPackageScanner recollectorVaultPackageScanner;
+
     public ContentPackage2FeatureModelConverter() {
         this(false);
     }
 
     public ContentPackage2FeatureModelConverter(boolean strictValidation) {
         super(strictValidation);
+        this.recollectorVaultPackageScanner = new RecollectorVaultPackageScanner(this, this.packageManager, strictValidation, subContentPackages);
     }
 
     public ContentPackage2FeatureModelConverter setEntryHandlersManager(EntryHandlersManager handlersManager) {
@@ -122,38 +121,68 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
 
     public void convert(File...contentPackages) throws Exception {
         requireNonNull(contentPackages , "Null content-package(s) can not be converted.");
+        secondPass(firstPass(contentPackages));
+    }
+
+    protected Collection<VaultPackage> firstPass(File...contentPackages) throws Exception {
+        Map<PackageId, VaultPackage> idFileMap = new LinkedHashMap<>();
+        Map<PackageId, VaultPackage> idPackageMapping = new ConcurrentHashMap<>();
+
+        for (File contentPackage : contentPackages) {
+            requireNonNull(contentPackage, "Null content-package can not be converted.");
+
+            if (!contentPackage.exists() || !contentPackage.isFile()) {
+                throw new IllegalArgumentException("File " + contentPackage + " does not exist or it is a directory");
+            }
+
+            logger.info("Reading content-package '{}'...", contentPackage);
 
-        Collection<VaultPackage> orderedContentPackages = firstPass(contentPackages);
+            VaultPackage pack = open(contentPackage);
+            idPackageMapping.put(pack.getId(), pack);
 
+            // analyze sub-content packages in order to filter out
+            // possible outdated conflictring packages
+            recollectorVaultPackageScanner.traverse(pack);
+
+            logger.info("content-package '{}' successfully read!", contentPackage);
+        }
+
+        logger.info("Ordering input content-package(s) {}...", idPackageMapping.keySet());
+
+        for (VaultPackage pack : idPackageMapping.values()) {
+            orderDependencies(idFileMap, idPackageMapping, pack, new HashSet<PackageId>());
+        }
+
+        logger.info("New content-package(s) order: {}", idFileMap.keySet());
+
+        return idFileMap.values();
+    }
+
+    protected void secondPass(Collection<VaultPackage> orderedContentPackages) throws Exception {
         for (VaultPackage vaultPackage : orderedContentPackages) {
             try {
                 mainPackageAssembler = VaultPackageAssembler.create(vaultPackage);
-                PackageProperties packageProperties = vaultPackage.getProperties();
+                PackageId packageProperties = vaultPackage.getId();
 
-                String group = requireNonNull(packageProperties.getProperty(PackageProperties.NAME_GROUP),
+                String group = requireNonNull(packageProperties.getGroup(),
                                               PackageProperties.NAME_GROUP
                                               + " property not found in content-package "
                                               + vaultPackage
                                               + ", please check META-INF/vault/properties.xml")
                                               .replace('/', '.');
 
-                String name = requireNonNull(packageProperties.getProperty(PackageProperties.NAME_NAME),
+                String name = requireNonNull(packageProperties.getName(),
                                             PackageProperties.NAME_NAME
                                             + " property not found in content-package "
                                             + vaultPackage
                                             + ", please check META-INF/vault/properties.xml");
 
-                String version = packageProperties.getProperty(PackageProperties.NAME_VERSION);
+                String version = packageProperties.getVersionString();
                 if (version == null || version.isEmpty()) {
                     version = DEFEAULT_VERSION;
                 }
 
-                String description = packageProperties.getDescription();
-
-                featuresManager.init(group,
-                                     name,
-                                     version,
-                                     description);
+                featuresManager.init(group, name, version);
 
                 logger.info("Converting content-package '{}'...", vaultPackage.getId());
 
@@ -198,36 +227,6 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
         }
     }
 
-    protected Collection<VaultPackage> firstPass(File...contentPackages) throws Exception {
-        Map<PackageId, VaultPackage> idFileMap = new LinkedHashMap<>();
-        Map<PackageId, VaultPackage> idPackageMapping = new HashMap<>();
-
-        for (File contentPackage : contentPackages) {
-            requireNonNull(contentPackage, "Null content-package can not be converted.");
-
-            if (!contentPackage.exists() || !contentPackage.isFile()) {
-                throw new IllegalArgumentException("File " + contentPackage + " does not exist or it is a directory");
-            }
-
-            logger.info("Reading content-package '{}'...", contentPackage);
-
-            VaultPackage pack = packageManager.open(contentPackage, isStrictValidation());
-            idPackageMapping.put(pack.getId(), pack);
-
-            logger.info("content-package '{}' successfully read!", contentPackage);
-        }
-
-        logger.info("Ordering input content-package(s) {}...", idFileMap.keySet());
-
-        for (VaultPackage pack : new HashSet<VaultPackage>(idPackageMapping.values())) {
-            orderDependencies(idFileMap, idPackageMapping, pack, new HashSet<PackageId>());
-        }
-
-        logger.info("New content-package(s) order: {}", idFileMap.keySet());
-
-        return idFileMap.values();
-    }
-
     private void orderDependencies(Map<PackageId, VaultPackage> idFileMap,
                                    Map<PackageId, VaultPackage> idPackageMapping,
                                    VaultPackage pack,
@@ -249,21 +248,28 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
         idPackageMapping.remove(pack.getId());
     }
 
-    public void processSubPackage(String path, File contentPackage) throws Exception {
+    public void processSubPackage(String path, VaultPackage vaultPackage) throws Exception {
         requireNonNull(path, "Impossible to process a null vault package");
-        requireNonNull(contentPackage, "Impossible to process a null vault package");
+        requireNonNull(vaultPackage, "Impossible to process a null vault package");
 
-        try (VaultPackage vaultPackage = packageManager.open(contentPackage, isStrictValidation())) {
-            // scan the detected package, first
-            traverse(vaultPackage);
+        if (!isSubContentPackageIncluded(path)) {
+            logger.info("Sub content-package {} is filtered out, so it won't be processed.", path);
+            return;
+        }
 
-            // merge filters to the main new package
-            mainPackageAssembler.mergeFilters(vaultPackage.getMetaInf().getFilter());
+        // scan the detected package, first
+        traverse(vaultPackage);
 
-            // add the metadata-only package one to the main package
-            File clonedPackage = VaultPackageAssembler.create(vaultPackage).createPackage();
-            mainPackageAssembler.addEntry(path, clonedPackage);
-        }
+        // merge filters to the main new package
+        mainPackageAssembler.mergeFilters(vaultPackage.getMetaInf().getFilter());
+
+        // add the metadata-only package one to the main package
+        File clonedPackage = VaultPackageAssembler.create(vaultPackage).createPackage();
+        mainPackageAssembler.addEntry(path, clonedPackage);
+    }
+
+    protected boolean isSubContentPackageIncluded(String path) {
+        return subContentPackages.containsValue(path);
     }
 
     @Override
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManager.java b/src/main/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManager.java
index ff55d14..526cd9e 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManager.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManager.java
@@ -86,12 +86,8 @@ public class DefaultFeaturesManager implements FeaturesManager {
         this.properties = properties;
     }
 
-    public void init(String groupId,
-                     String artifactId,
-                     String version,
-                     String description) {
+    public void init(String groupId, String artifactId, String version) {
         targetFeature = new Feature(new ArtifactId(groupId, artifactId, version, null, SLING_OSGI_FEATURE_TILE_TYPE));
-        targetFeature.setDescription(description);
         runModes.clear();
     }
 
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/features/FeaturesManager.java b/src/main/java/org/apache/sling/feature/cpconverter/features/FeaturesManager.java
index 6c2f8b5..5c0b672 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/features/FeaturesManager.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/features/FeaturesManager.java
@@ -22,10 +22,7 @@ import org.apache.sling.feature.Feature;
 
 public interface FeaturesManager {
 
-    void init(String groupId,
-              String artifactId,
-              String version,
-              String description);
+    void init(String groupId, String artifactId, String version);
 
     Feature getTargetFeature();
 
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java
new file mode 100644
index 0000000..103a18f
--- /dev/null
+++ b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java
@@ -0,0 +1,66 @@
+/*
+ * 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.handlers;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.jackrabbit.vault.fs.io.Archive;
+import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
+import org.apache.jackrabbit.vault.packaging.VaultPackage;
+import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
+
+public abstract class AbstractContentPackageHandler extends AbstractRegexEntryHandler {
+
+    private final File temporaryDir = new File(System.getProperty("java.io.tmpdir"), "sub-content-packages");
+
+    public AbstractContentPackageHandler() {
+        super("(?:jcr_root)?/etc/packages/.+\\.zip");
+        temporaryDir.mkdirs();
+    }
+
+    @Override
+    public final void handle(String path, Archive archive, Entry entry, ContentPackage2FeatureModelConverter converter)
+            throws Exception {
+        logger.info("Processing sub-content package '{}'...", entry.getName());
+
+        File temporaryContentPackage = new File(temporaryDir, entry.getName());
+
+        if (!temporaryContentPackage.exists()) {
+            logger.debug("Extracting sub-content package '{}' to {} for future analysis...", entry.getName(), temporaryContentPackage);
+
+            try (InputStream input = archive.openInputStream(entry);
+                    OutputStream output = new FileOutputStream(temporaryContentPackage)) {
+                IOUtils.copy(input, output);
+            }
+
+            logger.debug("Sub-content package '{}' successfully extracted to {} ", entry.getName(), temporaryContentPackage);
+        }
+
+        try (VaultPackage vaultPackage = converter.open(temporaryContentPackage)) {
+            processSubPackage(path, vaultPackage, converter);
+        }
+
+        logger.info("Sub-content package '{}' processing is over", entry.getName());
+    }
+
+    protected abstract void processSubPackage(String path, VaultPackage contentPackage, ContentPackage2FeatureModelConverter converter) throws Exception;
+
+}
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/handlers/ContentPackageEntryHandler.java b/src/main/java/org/apache/sling/feature/cpconverter/handlers/ContentPackageEntryHandler.java
index c849015..2fde1a0 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/handlers/ContentPackageEntryHandler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/handlers/ContentPackageEntryHandler.java
@@ -16,38 +16,15 @@
  */
 package org.apache.sling.feature.cpconverter.handlers;
 
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.jackrabbit.vault.fs.io.Archive;
-import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
+import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
 
-public final class ContentPackageEntryHandler extends AbstractRegexEntryHandler {
-
-    public ContentPackageEntryHandler() {
-        super("(?:jcr_root)?/etc/packages/.+\\.zip");
-    }
+public final class ContentPackageEntryHandler extends AbstractContentPackageHandler {
 
     @Override
-    public void handle(String path, Archive archive, Entry entry, ContentPackage2FeatureModelConverter converter) throws Exception {
-        logger.info("Processing sub-content package '{}'...", entry.getName());
-
-        File temporaryContentPackage = File.createTempFile("content-package", entry.getName());
-
-        try (InputStream input = archive.openInputStream(entry);
-                OutputStream output = new FileOutputStream(temporaryContentPackage)) {
-            IOUtils.copy(input, output);
-        }
-
-        try {
-            converter.processSubPackage(path, temporaryContentPackage);
-        } finally {
-            temporaryContentPackage.delete();
-        }
+    protected void processSubPackage(String path, VaultPackage contentPackage, ContentPackage2FeatureModelConverter converter)
+            throws Exception {
+        converter.processSubPackage(path, contentPackage);
     }
 
 }
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/handlers/VersionResolverContentPackageEntryHandler.java b/src/main/java/org/apache/sling/feature/cpconverter/handlers/VersionResolverContentPackageEntryHandler.java
new file mode 100644
index 0000000..2a57822
--- /dev/null
+++ b/src/main/java/org/apache/sling/feature/cpconverter/handlers/VersionResolverContentPackageEntryHandler.java
@@ -0,0 +1,82 @@
+/*
+ * 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.handlers;
+
+import java.util.Map;
+
+import org.apache.jackrabbit.vault.packaging.PackageId;
+import org.apache.jackrabbit.vault.packaging.VaultPackage;
+import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class VersionResolverContentPackageEntryHandler extends AbstractContentPackageHandler {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+    private final Map<PackageId, String> subContentPackages;
+
+    public VersionResolverContentPackageEntryHandler(Map<PackageId, String> subContentPackages) {
+        this.subContentPackages = subContentPackages;
+    }
+
+    @Override
+    protected void processSubPackage(String path, VaultPackage contentPackage, ContentPackage2FeatureModelConverter converter)
+            throws Exception {
+
+        boolean addPackage = false;
+        PackageId currentId = contentPackage.getId();
+
+        logger.info("Checking if other {}:{} content-package versions were handled already", currentId.getGroup(), currentId.getName());
+
+        PackageId olderId = getPackage(currentId);
+
+        if (olderId != null) {
+            logger.info("Comparing {}:{} package versions: current one is {}, previous one is {} ",
+                        currentId.getGroup(), currentId.getName(), currentId.getVersionString(), olderId.getVersionString());
+
+            addPackage = currentId.compareTo(olderId) > 0;
+
+            if (addPackage) {
+                logger.info("Replacing version {} of content-package {}:{} with version {}",
+                            olderId.getVersionString(), currentId.getGroup(), currentId.getName(), currentId.getVersionString());
+
+                subContentPackages.remove(olderId);
+            }
+        } else {
+            logger.info("There were not other version of {}:{} content-package", currentId.getGroup(), currentId.getName());
+
+            addPackage = true;
+        }
+
+        if (addPackage) {
+            subContentPackages.put(currentId, path);
+        }
+    }
+
+    private PackageId getPackage(PackageId expectedId) {
+        for (PackageId currentId : subContentPackages.keySet()) {
+            if (expectedId.getGroup().equals(currentId.getGroup())
+                    && expectedId.getName().equals(currentId.getName())) {
+                return currentId;
+            }
+        }
+
+        return null;
+    }
+
+}
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/BaseVaultPackageScanner.java b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/BaseVaultPackageScanner.java
index 3fb300d..5b67e06 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/BaseVaultPackageScanner.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/BaseVaultPackageScanner.java
@@ -14,29 +14,54 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-
 package org.apache.sling.feature.cpconverter.vltpkg;
 
 import static java.util.Objects.requireNonNull;
 
+import java.io.File;
+
 import org.apache.jackrabbit.vault.fs.io.Archive;
 import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
+import org.apache.jackrabbit.vault.packaging.PackageManager;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
+import org.apache.jackrabbit.vault.packaging.impl.PackageManagerImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public abstract class BaseVaultPackageScanner {
 
-    private final Logger logger = LoggerFactory.getLogger(getClass());
+    protected final Logger logger = LoggerFactory.getLogger(getClass());
+
+    protected final PackageManager packageManager;
 
-    private final boolean strictValidation;
+    protected final boolean strictValidation;
 
     public BaseVaultPackageScanner(boolean strictValidation) {
+        this(new PackageManagerImpl(), strictValidation);
+    }
+
+    public BaseVaultPackageScanner(PackageManager packageManager, boolean strictValidation) {
+        this.packageManager = packageManager;
         this.strictValidation = strictValidation;
     }
 
-    public final boolean isStrictValidation() {
-        return strictValidation;
+    public VaultPackage open(File vaultPackage) throws Exception {
+        requireNonNull(vaultPackage, "Impossible to process a null vault package");
+        return packageManager.open(vaultPackage, strictValidation);
+    }
+
+    public final void traverse(File vaultPackageFile, boolean closeOnTraversed) throws Exception {
+        VaultPackage vaultPackage = null;
+        try {
+            vaultPackage = open(vaultPackageFile);
+            traverse(vaultPackage);
+        } finally {
+            if (closeOnTraversed) {
+                if (vaultPackage != null) {
+                    vaultPackage.close();
+                }
+            }
+        }
     }
 
     public final void traverse(VaultPackage vaultPackage) throws Exception {
@@ -66,11 +91,11 @@ public abstract class BaseVaultPackageScanner {
             return;
         }
 
-        logger.info("Processing entry {}...", entryPath);
+        logger.debug("Processing entry {}...", entryPath);
 
         onFile(entryPath, archive, entry);
 
-        logger.info("Entry {} successfully processed.", entryPath);
+        logger.debug("Entry {} successfully processed.", entryPath);
     }
 
     private static String newPath(String path, String entryName) {
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java
new file mode 100644
index 0000000..1d0a747
--- /dev/null
+++ b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java
@@ -0,0 +1,50 @@
+/*
+ * 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.util.Map;
+
+import org.apache.jackrabbit.vault.fs.io.Archive;
+import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
+import org.apache.jackrabbit.vault.packaging.PackageId;
+import org.apache.jackrabbit.vault.packaging.PackageManager;
+import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
+import org.apache.sling.feature.cpconverter.handlers.VersionResolverContentPackageEntryHandler;
+
+public final class RecollectorVaultPackageScanner extends BaseVaultPackageScanner {
+
+    private final ContentPackage2FeatureModelConverter converter;
+
+    private final VersionResolverContentPackageEntryHandler handler;
+
+    public RecollectorVaultPackageScanner(ContentPackage2FeatureModelConverter converter,
+                                          PackageManager packageManager,
+                                          boolean strictValidation,
+                                          Map<PackageId, String> subContentPackages) {
+        super(packageManager, strictValidation);
+        this.converter = converter;
+        handler = new VersionResolverContentPackageEntryHandler(subContentPackages);
+    }
+
+    @Override
+    protected void onFile(String path, Archive archive, Entry entry) throws Exception {
+        if (handler.matches(path)) {
+            handler.handle(path, archive, entry, converter);
+        }
+    }
+
+}
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
index fd3c754..366b8e0 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
@@ -56,7 +56,7 @@ public class VaultPackageAssembler implements EntryHandler {
 
     private static final String[] INCLUDE_RESOURCES = { "definition/.content.xml", "config.xml", "settings.xml" };
 
-    private static final File TMP_DIR = new File(System.getProperty("java.io.tmpdir"));
+    private static final File TMP_DIR = new File(System.getProperty("java.io.tmpdir"), "syntethic-content-packages");
 
     private static final Pattern OSGI_BUNDLE_PATTERN = Pattern.compile("(jcr_root)?/apps/[^/]+/install(\\.([^/]+))?/.+\\.jar");
 
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java b/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
index 5ccb4ab..ea6e83e 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
@@ -112,7 +112,7 @@ public class ContentPackage2FeatureModelConverterTest {
         URL packageUrl = getClass().getResource("test-content-package.zip");
         File packageFile = FileUtils.toFile(packageUrl);
 
-        File outputDirectory = new File(System.getProperty("testDirectory"), getClass().getName() + '_' + System.currentTimeMillis());
+        File outputDirectory = new File(System.getProperty("java.io.tmpdir"), getClass().getName() + '_' + System.currentTimeMillis());
 
         converter.setFeaturesManager(new DefaultFeaturesManager(true, 5, outputDirectory, null, null))
                  .setBundlesDeployer(new DefaultArtifactsDeployer(outputDirectory))
@@ -237,7 +237,7 @@ public class ContentPackage2FeatureModelConverterTest {
         URL packageUrl = getClass().getResource("test-content-package-unacceptable.zip");
         File packageFile = FileUtils.toFile(packageUrl);
 
-        File outputDirectory = new File(System.getProperty("testDirectory"), getClass().getName() + '_' + System.currentTimeMillis());
+        File outputDirectory = new File(System.getProperty("java.io.tmpdir"), getClass().getName() + '_' + System.currentTimeMillis());
 
         converter.setFeaturesManager(new DefaultFeaturesManager(true, 5, outputDirectory, null, null))
                  .setBundlesDeployer(new DefaultArtifactsDeployer(outputDirectory))
@@ -255,7 +255,7 @@ public class ContentPackage2FeatureModelConverterTest {
     }
 
     private void addSamePidConfiguration(String runmodeA, String runmodeB) throws Exception {
-        File outputDirectory = new File(System.getProperty("testDirectory"), getClass().getName() + '_' + System.currentTimeMillis());
+        File outputDirectory = new File(System.getProperty("java.io.tmpdir"), getClass().getName() + '_' + System.currentTimeMillis());
         URL packageUrl = getClass().getResource("test-content-package.zip");
         File packageFile = FileUtils.toFile(packageUrl);
 
@@ -273,7 +273,7 @@ public class ContentPackage2FeatureModelConverterTest {
         URL packageUrl = getClass().getResource("test-content-package.zip");
         File packageFile = FileUtils.toFile(packageUrl);
 
-        File outputDirectory = new File(System.getProperty("testDirectory"), getClass().getName() + '_' + System.currentTimeMillis());
+        File outputDirectory = new File(System.getProperty("java.io.tmpdir"), getClass().getName() + '_' + System.currentTimeMillis());
 
         String overrideId = "${project.groupId}:${project.artifactId}:slingosgifeature:asd.test.all-1.0.0:${project.version}";
         converter.setFeaturesManager(new DefaultFeaturesManager(true, 5, outputDirectory, overrideId, null))
@@ -337,6 +337,15 @@ public class ContentPackage2FeatureModelConverterTest {
         converter.firstPass(contentPackages);
     }
 
+    @Test
+    public void includeLatestUpdatedContentPackagesOnly() throws Exception {
+        File[] contentPackages = load("test-content-package.zip", "test-content-package-2.zip");
+        converter.firstPass(contentPackages);
+
+        assertTrue(converter.isSubContentPackageIncluded("jcr_root/etc/packages/asd/test-content-0.2.zip"));
+        assertFalse(converter.isSubContentPackageIncluded("jcr_root/etc/packages/asd/test-content.zip"));
+    }
+
     private File[] load(String...resources) {
         File[] loadedResources = new File[resources.length];
 
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandlerTest.java b/src/test/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandlerTest.java
index 24a9e19..e336785 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandlerTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandlerTest.java
@@ -95,7 +95,7 @@ public final class BundleEntryHandlerTest {
 
         ContentPackage2FeatureModelConverter converter = spy(ContentPackage2FeatureModelConverter.class);
 
-        File testDirectory = new File(System.getProperty("testDirectory"), getClass().getName() + '_' + System.currentTimeMillis());
+        File testDirectory = new File(System.getProperty("java.io.tmpdir"), getClass().getName() + '_' + System.currentTimeMillis());
         when(converter.getArtifactsDeployer()).thenReturn(new DefaultArtifactsDeployer(testDirectory));
         when(converter.getFeaturesManager()).thenReturn(featuresManager);
 
diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/test-content-package-2.zip b/src/test/resources/org/apache/sling/feature/cpconverter/test-content-package-2.zip
new file mode 100644
index 0000000..87cfa94
Binary files /dev/null and b/src/test/resources/org/apache/sling/feature/cpconverter/test-content-package-2.zip differ


[sling-org-apache-sling-feature-cpconverter] 02/02: Merge branch 'master' of github.com:apache/sling-org-apache-sling-feature-cpconverter

Posted by si...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 459e4f7ace7e7421acdc1231f2b22d5c23294f87
Merge: 6ec4ee0 fe34c7a
Author: Simo Tripodi <st...@adobe.com>
AuthorDate: Fri May 24 14:41:53 2019 +0200

    Merge branch 'master' of
    github.com:apache/sling-org-apache-sling-feature-cpconverter
    
    # Conflicts:
    #	pom.xml
    #	src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
    #	src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java

 .../ContentPackage2FeatureModelConverter.java      | 36 ++++++++++++++++++++--
 .../cpconverter/vltpkg/VaultPackageAssembler.java  | 11 ++++---
 .../vltpkg/VaultPackageAssemblerTest.java          |  8 -----
 3 files changed, 40 insertions(+), 15 deletions(-)

diff --cc src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
index f8c97ee,9e79404..4094db2
--- a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
@@@ -25,8 -25,12 +25,13 @@@ import java.util.HashSet
  import java.util.LinkedHashMap;
  import java.util.Map;
  import java.util.Set;
 +import java.util.concurrent.ConcurrentHashMap;
  
+ import org.apache.jackrabbit.vault.fs.api.DumpContext;
+ import org.apache.jackrabbit.vault.fs.api.ImportMode;
+ import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
+ import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
+ import org.apache.jackrabbit.vault.fs.filter.DefaultPathFilter;
  import org.apache.jackrabbit.vault.fs.io.Archive;
  import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
  import org.apache.jackrabbit.vault.packaging.CyclicDependencyException;
@@@ -248,28 -254,48 +253,55 @@@ public class ContentPackage2FeatureMode
          idPackageMapping.remove(pack.getId());
      }
  
 -    public void processSubPackage(String path, File contentPackage) throws Exception {
 +    public void processSubPackage(String path, VaultPackage vaultPackage) throws Exception {
          requireNonNull(path, "Impossible to process a null vault package");
 -        requireNonNull(contentPackage, "Impossible to process a null vault package");
 -
 -        try (VaultPackage vaultPackage = packageManager.open(contentPackage, isStrictValidation())) {
 -            // scan the detected package, first
 -            traverse(vaultPackage);
 -
 -            // merge filters to the main new package
 -            mainPackageAssembler.mergeFilters(vaultPackage.getMetaInf().getFilter());
 -
 -            // add the metadata-only package one to the main package with overriden filter
 -            DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
 -            PathFilterSet pfs = new PathFilterSet();
 -            DefaultPathFilter dpf = new DefaultPathFilter() {
 -                
 -               @Override
 -               public boolean matches(String path) {
 -                   return true;
 -               }
 -
 -               @Override
 -               public void dump(DumpContext ctx, boolean isLast) {
 -                   ctx.println(isLast, "ALL");
 -               }
 -
 -               @Override
 -               public boolean isAbsolute() {
 -                   return true;
 -               }
 -               
 -               @Override
 -               public String getPattern() {
 -                   return ".*";
 -               }
 -            };
 -            pfs.addExclude(dpf);
 -            pfs.setImportMode(ImportMode.MERGE);
 -            filter.add(pfs);
 -            File clonedPackage = VaultPackageAssembler.create(vaultPackage, filter).createPackage();
 -            mainPackageAssembler.addEntry(path, clonedPackage);
 +        requireNonNull(vaultPackage, "Impossible to process a null vault package");
 +
 +        if (!isSubContentPackageIncluded(path)) {
 +            logger.info("Sub content-package {} is filtered out, so it won't be processed.", path);
 +            return;
          }
 +
 +        // scan the detected package, first
 +        traverse(vaultPackage);
 +
 +        // merge filters to the main new package
 +        mainPackageAssembler.mergeFilters(vaultPackage.getMetaInf().getFilter());
 +
-         // add the metadata-only package one to the main package
-         File clonedPackage = VaultPackageAssembler.create(vaultPackage).createPackage();
++        // add the metadata-only package one to the main package with overriden filter
++        DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
++        PathFilterSet pfs = new PathFilterSet();
++        DefaultPathFilter dpf = new DefaultPathFilter() {
++            
++           @Override
++           public boolean matches(String path) {
++               return true;
++           }
++
++           @Override
++           public void dump(DumpContext ctx, boolean isLast) {
++               ctx.println(isLast, "ALL");
++           }
++
++           @Override
++           public boolean isAbsolute() {
++               return true;
++           }
++           
++           @Override
++           public String getPattern() {
++               return ".*";
++           }
++        };
++        pfs.addExclude(dpf);
++        pfs.setImportMode(ImportMode.MERGE);
++        filter.add(pfs);
++        File clonedPackage = VaultPackageAssembler.create(vaultPackage, filter).createPackage();
 +        mainPackageAssembler.addEntry(path, clonedPackage);
 +    }
 +
 +    protected boolean isSubContentPackageIncluded(String path) {
 +        return subContentPackages.containsValue(path);
      }
  
      @Override
diff --cc src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
index 366b8e0,d47413e..f24f2d9
--- a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
@@@ -56,11 -55,15 +55,15 @@@ public class VaultPackageAssembler impl
  
      private static final String[] INCLUDE_RESOURCES = { "definition/.content.xml", "config.xml", "settings.xml" };
  
 -    private static final File TMP_DIR = new File(System.getProperty("java.io.tmpdir"));
 +    private static final File TMP_DIR = new File(System.getProperty("java.io.tmpdir"), "syntethic-content-packages");
  
      private static final Pattern OSGI_BUNDLE_PATTERN = Pattern.compile("(jcr_root)?/apps/[^/]+/install(\\.([^/]+))?/.+\\.jar");
- 
+     
      public static VaultPackageAssembler create(VaultPackage vaultPackage) {
+         return create(vaultPackage, vaultPackage.getMetaInf().getFilter());
+     }
+ 
+     public static VaultPackageAssembler create(VaultPackage vaultPackage, WorkspaceFilter filter) {
          File storingDirectory = new File(TMP_DIR, vaultPackage.getFile().getName() + "-deflated");
          // avoid any possible Stream is not a content package. Missing 'jcr_root' error
          File jcrRootDirectory = new File(storingDirectory, JCR_ROOT_DIR_NAME);