anchela commented on code in PR #158:
URL: 
https://github.com/apache/sling-org-apache-sling-feature-cpconverter/pull/158#discussion_r1112675670


##########
src/main/java/org/apache/sling/feature/cpconverter/repoinit/createpath/CreatePathSegmentProcessor.java:
##########
@@ -27,52 +29,97 @@
 import java.io.FileInputStream;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 import static org.apache.jackrabbit.vault.util.Constants.DOT_CONTENT_XML;
 
 public class CreatePathSegmentProcessor {
 
-    private CreatePathSegmentProcessor() {
+    private final RepoPath path;
+    private final Collection<VaultPackageAssembler> packageAssemblers;
+    private final CreatePath cp;
+    private boolean foundType = false;
+    private String repositoryPath = "";
+
+    private Map<String,String> primaryTypeMap = new LinkedHashMap<>();
+    private Map<String,List<String>> mixinTypeMap = new LinkedHashMap<>();
+    
+    public CreatePathSegmentProcessor(@NotNull RepoPath path, 
+                                      @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, 
+                                      @NotNull CreatePath cp) {
+        this.path = path;
+        this.packageAssemblers = packageAssemblers;
+        this.cp = cp;
     }
 
     /**
      * Process segments of a repopath to createpath, checking 
packageassemblers for existing primaryType definitions.
-     *
-     * @param path
-     * @param packageAssemblers
-     * @param cp
      * @return
      */
-    public static boolean processSegments(@NotNull RepoPath path, @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, @NotNull CreatePath cp) {
-        String repositoryPath = "";
-        boolean foundType = false;
+    public boolean processSegments() {
         for (final String part : path.getSegments()) {
-            final String platformName = 
PlatformNameFormat.getPlatformName(part);
-            repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+            repositoryPath = processSegment(part);
+        }
+        return foundType;
+    }
 
-            boolean segmentAdded = false;
-            //loop all package assemblers and check if .content.xml is defined
-            for (VaultPackageAssembler packageAssembler : packageAssemblers) {
-                File currentContent = 
packageAssembler.getFileEntry(repositoryPath.concat(ConverterConstants.SLASH).concat(DOT_CONTENT_XML));
-                if (currentContent.exists() && currentContent.isFile()) {
-                    //add segment if jcr:primaryType is defined.
-                    segmentAdded = addSegment(cp, part, currentContent);
-                    if (segmentAdded) {
-                        foundType = true;
-                        break;
+    @NotNull
+    private String processSegment(String part) {
+        final String platformName = PlatformNameFormat.getPlatformName(part);
+        repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+        
+        //loop all package assemblers and check if .content.xml is defined
+        collectTypeDataForSegment();
+        addSegment(part);
+        
+        return repositoryPath;
+    }
+    
+    private void addSegment(String part){
+        //add segment if jcr:primaryType is defined.
+        if(primaryTypeMap.containsKey(repositoryPath)){
+            cp.addSegment(
+                    part, 
+                    primaryTypeMap.get(repositoryPath), 
+                    mixinTypeMap.get(repositoryPath)
+            );
+        }else{

Review Comment:
   formatting



##########
src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java:
##########
@@ -286,11 +295,9 @@ public void convert(@NotNull File... contentPackages) 
throws IOException, Conver
             // analyze sub-content packages in order to filter out
             // possible outdated conflicting packages
             recollectorVaultPackageScanner.traverse(pack);
-
             logger.info("content-package '{}' successfully read!", 
contentPackage);
 
             aclManager.reset();
-            bundleSlingInitialContentExtractor.reset();

Review Comment:
   @niekraaijmakers , the method '`reset`' on the 
`BundleSlingInitialContentExtractor` is now no longer used anywhere..... but it 
is still present in the code.
   
   please remove it....
   
   and on a second look: could it be a problem that the reset method is never 
called? after all it was there for a reason, wasn't it?
   



##########
src/main/java/org/apache/sling/feature/cpconverter/repoinit/createpath/CreatePathSegmentProcessor.java:
##########
@@ -27,52 +29,97 @@
 import java.io.FileInputStream;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 import static org.apache.jackrabbit.vault.util.Constants.DOT_CONTENT_XML;
 
 public class CreatePathSegmentProcessor {
 
-    private CreatePathSegmentProcessor() {
+    private final RepoPath path;
+    private final Collection<VaultPackageAssembler> packageAssemblers;
+    private final CreatePath cp;
+    private boolean foundType = false;
+    private String repositoryPath = "";
+
+    private Map<String,String> primaryTypeMap = new LinkedHashMap<>();
+    private Map<String,List<String>> mixinTypeMap = new LinkedHashMap<>();
+    
+    public CreatePathSegmentProcessor(@NotNull RepoPath path, 
+                                      @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, 
+                                      @NotNull CreatePath cp) {
+        this.path = path;
+        this.packageAssemblers = packageAssemblers;
+        this.cp = cp;
     }
 
     /**
      * Process segments of a repopath to createpath, checking 
packageassemblers for existing primaryType definitions.
-     *
-     * @param path
-     * @param packageAssemblers
-     * @param cp
      * @return
      */
-    public static boolean processSegments(@NotNull RepoPath path, @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, @NotNull CreatePath cp) {
-        String repositoryPath = "";
-        boolean foundType = false;
+    public boolean processSegments() {
         for (final String part : path.getSegments()) {
-            final String platformName = 
PlatformNameFormat.getPlatformName(part);
-            repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+            repositoryPath = processSegment(part);
+        }
+        return foundType;
+    }
 
-            boolean segmentAdded = false;
-            //loop all package assemblers and check if .content.xml is defined
-            for (VaultPackageAssembler packageAssembler : packageAssemblers) {
-                File currentContent = 
packageAssembler.getFileEntry(repositoryPath.concat(ConverterConstants.SLASH).concat(DOT_CONTENT_XML));
-                if (currentContent.exists() && currentContent.isFile()) {
-                    //add segment if jcr:primaryType is defined.
-                    segmentAdded = addSegment(cp, part, currentContent);
-                    if (segmentAdded) {
-                        foundType = true;
-                        break;
+    @NotNull
+    private String processSegment(String part) {
+        final String platformName = PlatformNameFormat.getPlatformName(part);
+        repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+        
+        //loop all package assemblers and check if .content.xml is defined
+        collectTypeDataForSegment();
+        addSegment(part);
+        
+        return repositoryPath;
+    }
+    
+    private void addSegment(String part){
+        //add segment if jcr:primaryType is defined.
+        if(primaryTypeMap.containsKey(repositoryPath)){
+            cp.addSegment(
+                    part, 
+                    primaryTypeMap.get(repositoryPath), 
+                    mixinTypeMap.get(repositoryPath)
+            );
+        }else{
+            cp.addSegment(part, null);
+        }
+    }
+
+    private void collectTypeDataForSegment() {
+        for (VaultPackageAssembler packageAssembler : packageAssemblers) {
+            
+            if(primaryTypeMap.containsKey(repositoryPath)){
+                boolean merge = true;
+                for(PathFilterSet set: 
packageAssembler.getFilter().getFilterSets()){
+                    if(set.covers(repositoryPath) && (set.getImportMode() != 
ImportMode.MERGE && set.getImportMode() != ImportMode.MERGE_PROPERTIES)){

Review Comment:
   formatting
   
   in addition: this condition is too complex to read -> i would suggest to 
extract it into a separate method that helps understanding what you are doing.



##########
src/main/java/org/apache/sling/feature/cpconverter/repoinit/createpath/CreatePathSegmentProcessor.java:
##########
@@ -27,52 +29,97 @@
 import java.io.FileInputStream;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 import static org.apache.jackrabbit.vault.util.Constants.DOT_CONTENT_XML;
 
 public class CreatePathSegmentProcessor {
 
-    private CreatePathSegmentProcessor() {
+    private final RepoPath path;
+    private final Collection<VaultPackageAssembler> packageAssemblers;
+    private final CreatePath cp;
+    private boolean foundType = false;
+    private String repositoryPath = "";
+
+    private Map<String,String> primaryTypeMap = new LinkedHashMap<>();
+    private Map<String,List<String>> mixinTypeMap = new LinkedHashMap<>();
+    
+    public CreatePathSegmentProcessor(@NotNull RepoPath path, 
+                                      @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, 
+                                      @NotNull CreatePath cp) {
+        this.path = path;
+        this.packageAssemblers = packageAssemblers;
+        this.cp = cp;
     }
 
     /**
      * Process segments of a repopath to createpath, checking 
packageassemblers for existing primaryType definitions.
-     *
-     * @param path
-     * @param packageAssemblers
-     * @param cp
      * @return
      */
-    public static boolean processSegments(@NotNull RepoPath path, @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, @NotNull CreatePath cp) {
-        String repositoryPath = "";
-        boolean foundType = false;
+    public boolean processSegments() {
         for (final String part : path.getSegments()) {
-            final String platformName = 
PlatformNameFormat.getPlatformName(part);
-            repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+            repositoryPath = processSegment(part);
+        }
+        return foundType;
+    }
 
-            boolean segmentAdded = false;
-            //loop all package assemblers and check if .content.xml is defined
-            for (VaultPackageAssembler packageAssembler : packageAssemblers) {
-                File currentContent = 
packageAssembler.getFileEntry(repositoryPath.concat(ConverterConstants.SLASH).concat(DOT_CONTENT_XML));
-                if (currentContent.exists() && currentContent.isFile()) {
-                    //add segment if jcr:primaryType is defined.
-                    segmentAdded = addSegment(cp, part, currentContent);
-                    if (segmentAdded) {
-                        foundType = true;
-                        break;
+    @NotNull
+    private String processSegment(String part) {
+        final String platformName = PlatformNameFormat.getPlatformName(part);
+        repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+        
+        //loop all package assemblers and check if .content.xml is defined
+        collectTypeDataForSegment();
+        addSegment(part);
+        
+        return repositoryPath;
+    }
+    
+    private void addSegment(String part){
+        //add segment if jcr:primaryType is defined.
+        if(primaryTypeMap.containsKey(repositoryPath)){
+            cp.addSegment(
+                    part, 
+                    primaryTypeMap.get(repositoryPath), 
+                    mixinTypeMap.get(repositoryPath)
+            );
+        }else{
+            cp.addSegment(part, null);
+        }
+    }
+
+    private void collectTypeDataForSegment() {
+        for (VaultPackageAssembler packageAssembler : packageAssemblers) {
+            
+            if(primaryTypeMap.containsKey(repositoryPath)){
+                boolean merge = true;
+                for(PathFilterSet set: 
packageAssembler.getFilter().getFilterSets()){
+                    if(set.covers(repositoryPath) && (set.getImportMode() != 
ImportMode.MERGE && set.getImportMode() != ImportMode.MERGE_PROPERTIES)){
+                        //found a path with a mode other than merge, proceed 
to replace the type definitions
+                        merge = false;
+                    }else if(set.covers(repositoryPath)){
+                        // merge is flipped to true again by another filter 
defined after the previous ones
+                        merge = true;
                     }
                 }
+                if(merge){
+                    // we already got the path defined by an earlier package. 
only proceed to replace if the filter is not merge.
+                    continue;
+                }
             }
-            if (!segmentAdded) {
-                //use sling:Folder (defined by repo-init runtime module)
-                cp.addSegment(part, null);
+            
+            File currentContent = 
packageAssembler.getFileEntry(repositoryPath.concat(ConverterConstants.SLASH).concat(DOT_CONTENT_XML));
+            if (currentContent.exists() && currentContent.isFile()) {
+                //collect the primary Data up ahead
+                collectTypeData(repositoryPath, currentContent);
             }
         }
-        return foundType;
     }
 
-    private static boolean addSegment(@NotNull CreatePath cp, @NotNull String 
part, @NotNull File currentContent) {
+    
+    private boolean collectTypeData(String repositoryPath, @NotNull File 
currentContent) {

Review Comment:
   please add annotation to repositoryPath param. i believe you don't expect 
this to be null and thus it should have notnull annotation.



##########
src/main/java/org/apache/sling/feature/cpconverter/repoinit/createpath/CreatePathSegmentProcessor.java:
##########
@@ -27,52 +29,97 @@
 import java.io.FileInputStream;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 import static org.apache.jackrabbit.vault.util.Constants.DOT_CONTENT_XML;
 
 public class CreatePathSegmentProcessor {
 
-    private CreatePathSegmentProcessor() {
+    private final RepoPath path;
+    private final Collection<VaultPackageAssembler> packageAssemblers;
+    private final CreatePath cp;
+    private boolean foundType = false;
+    private String repositoryPath = "";
+
+    private Map<String,String> primaryTypeMap = new LinkedHashMap<>();
+    private Map<String,List<String>> mixinTypeMap = new LinkedHashMap<>();
+    
+    public CreatePathSegmentProcessor(@NotNull RepoPath path, 
+                                      @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, 
+                                      @NotNull CreatePath cp) {
+        this.path = path;
+        this.packageAssemblers = packageAssemblers;
+        this.cp = cp;
     }
 
     /**
      * Process segments of a repopath to createpath, checking 
packageassemblers for existing primaryType definitions.
-     *
-     * @param path
-     * @param packageAssemblers
-     * @param cp
      * @return
      */
-    public static boolean processSegments(@NotNull RepoPath path, @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, @NotNull CreatePath cp) {
-        String repositoryPath = "";
-        boolean foundType = false;
+    public boolean processSegments() {
         for (final String part : path.getSegments()) {
-            final String platformName = 
PlatformNameFormat.getPlatformName(part);
-            repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+            repositoryPath = processSegment(part);
+        }
+        return foundType;
+    }
 
-            boolean segmentAdded = false;
-            //loop all package assemblers and check if .content.xml is defined
-            for (VaultPackageAssembler packageAssembler : packageAssemblers) {
-                File currentContent = 
packageAssembler.getFileEntry(repositoryPath.concat(ConverterConstants.SLASH).concat(DOT_CONTENT_XML));
-                if (currentContent.exists() && currentContent.isFile()) {
-                    //add segment if jcr:primaryType is defined.
-                    segmentAdded = addSegment(cp, part, currentContent);
-                    if (segmentAdded) {
-                        foundType = true;
-                        break;
+    @NotNull
+    private String processSegment(String part) {
+        final String platformName = PlatformNameFormat.getPlatformName(part);
+        repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+        
+        //loop all package assemblers and check if .content.xml is defined
+        collectTypeDataForSegment();
+        addSegment(part);
+        
+        return repositoryPath;
+    }
+    
+    private void addSegment(String part){
+        //add segment if jcr:primaryType is defined.
+        if(primaryTypeMap.containsKey(repositoryPath)){

Review Comment:
   formatting



##########
src/main/java/org/apache/sling/feature/cpconverter/repoinit/createpath/CreatePathSegmentProcessor.java:
##########
@@ -27,52 +29,97 @@
 import java.io.FileInputStream;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 import static org.apache.jackrabbit.vault.util.Constants.DOT_CONTENT_XML;
 
 public class CreatePathSegmentProcessor {
 
-    private CreatePathSegmentProcessor() {
+    private final RepoPath path;
+    private final Collection<VaultPackageAssembler> packageAssemblers;
+    private final CreatePath cp;
+    private boolean foundType = false;
+    private String repositoryPath = "";
+
+    private Map<String,String> primaryTypeMap = new LinkedHashMap<>();
+    private Map<String,List<String>> mixinTypeMap = new LinkedHashMap<>();
+    
+    public CreatePathSegmentProcessor(@NotNull RepoPath path, 
+                                      @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, 
+                                      @NotNull CreatePath cp) {
+        this.path = path;
+        this.packageAssemblers = packageAssemblers;
+        this.cp = cp;
     }
 
     /**
      * Process segments of a repopath to createpath, checking 
packageassemblers for existing primaryType definitions.
-     *
-     * @param path
-     * @param packageAssemblers
-     * @param cp
      * @return
      */
-    public static boolean processSegments(@NotNull RepoPath path, @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, @NotNull CreatePath cp) {
-        String repositoryPath = "";
-        boolean foundType = false;
+    public boolean processSegments() {
         for (final String part : path.getSegments()) {
-            final String platformName = 
PlatformNameFormat.getPlatformName(part);
-            repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+            repositoryPath = processSegment(part);
+        }
+        return foundType;
+    }
 
-            boolean segmentAdded = false;
-            //loop all package assemblers and check if .content.xml is defined
-            for (VaultPackageAssembler packageAssembler : packageAssemblers) {
-                File currentContent = 
packageAssembler.getFileEntry(repositoryPath.concat(ConverterConstants.SLASH).concat(DOT_CONTENT_XML));
-                if (currentContent.exists() && currentContent.isFile()) {
-                    //add segment if jcr:primaryType is defined.
-                    segmentAdded = addSegment(cp, part, currentContent);
-                    if (segmentAdded) {
-                        foundType = true;
-                        break;
+    @NotNull
+    private String processSegment(String part) {
+        final String platformName = PlatformNameFormat.getPlatformName(part);
+        repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+        
+        //loop all package assemblers and check if .content.xml is defined
+        collectTypeDataForSegment();
+        addSegment(part);
+        
+        return repositoryPath;
+    }
+    
+    private void addSegment(String part){
+        //add segment if jcr:primaryType is defined.
+        if(primaryTypeMap.containsKey(repositoryPath)){
+            cp.addSegment(
+                    part, 
+                    primaryTypeMap.get(repositoryPath), 
+                    mixinTypeMap.get(repositoryPath)
+            );
+        }else{
+            cp.addSegment(part, null);
+        }
+    }
+
+    private void collectTypeDataForSegment() {
+        for (VaultPackageAssembler packageAssembler : packageAssemblers) {
+            
+            if(primaryTypeMap.containsKey(repositoryPath)){
+                boolean merge = true;
+                for(PathFilterSet set: 
packageAssembler.getFilter().getFilterSets()){
+                    if(set.covers(repositoryPath) && (set.getImportMode() != 
ImportMode.MERGE && set.getImportMode() != ImportMode.MERGE_PROPERTIES)){
+                        //found a path with a mode other than merge, proceed 
to replace the type definitions
+                        merge = false;
+                    }else if(set.covers(repositoryPath)){
+                        // merge is flipped to true again by another filter 
defined after the previous ones
+                        merge = true;
                     }
                 }
+                if(merge){
+                    // we already got the path defined by an earlier package. 
only proceed to replace if the filter is not merge.
+                    continue;

Review Comment:
   wait-what.... ? ah.... that's the outer for-loop..... 
   that code looks quite brittle IMHO. plese refactor the code such that you 
don't need the 'continue' and make the code easy to understand/read/maintain.



##########
src/main/java/org/apache/sling/feature/cpconverter/repoinit/createpath/CreatePathSegmentProcessor.java:
##########
@@ -27,52 +29,97 @@
 import java.io.FileInputStream;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 import static org.apache.jackrabbit.vault.util.Constants.DOT_CONTENT_XML;
 
 public class CreatePathSegmentProcessor {
 
-    private CreatePathSegmentProcessor() {
+    private final RepoPath path;
+    private final Collection<VaultPackageAssembler> packageAssemblers;
+    private final CreatePath cp;
+    private boolean foundType = false;
+    private String repositoryPath = "";
+
+    private Map<String,String> primaryTypeMap = new LinkedHashMap<>();
+    private Map<String,List<String>> mixinTypeMap = new LinkedHashMap<>();
+    
+    public CreatePathSegmentProcessor(@NotNull RepoPath path, 
+                                      @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, 
+                                      @NotNull CreatePath cp) {
+        this.path = path;
+        this.packageAssemblers = packageAssemblers;
+        this.cp = cp;
     }
 
     /**
      * Process segments of a repopath to createpath, checking 
packageassemblers for existing primaryType definitions.
-     *
-     * @param path
-     * @param packageAssemblers
-     * @param cp
      * @return
      */
-    public static boolean processSegments(@NotNull RepoPath path, @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, @NotNull CreatePath cp) {
-        String repositoryPath = "";
-        boolean foundType = false;
+    public boolean processSegments() {
         for (final String part : path.getSegments()) {
-            final String platformName = 
PlatformNameFormat.getPlatformName(part);
-            repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+            repositoryPath = processSegment(part);
+        }
+        return foundType;
+    }
 
-            boolean segmentAdded = false;
-            //loop all package assemblers and check if .content.xml is defined
-            for (VaultPackageAssembler packageAssembler : packageAssemblers) {
-                File currentContent = 
packageAssembler.getFileEntry(repositoryPath.concat(ConverterConstants.SLASH).concat(DOT_CONTENT_XML));
-                if (currentContent.exists() && currentContent.isFile()) {
-                    //add segment if jcr:primaryType is defined.
-                    segmentAdded = addSegment(cp, part, currentContent);
-                    if (segmentAdded) {
-                        foundType = true;
-                        break;
+    @NotNull
+    private String processSegment(String part) {

Review Comment:
   i believe you want 'part' to be notnull... -> add nullable or notnull 
annotations.



##########
src/main/java/org/apache/sling/feature/cpconverter/repoinit/createpath/CreatePathSegmentProcessor.java:
##########
@@ -27,52 +29,97 @@
 import java.io.FileInputStream;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 import static org.apache.jackrabbit.vault.util.Constants.DOT_CONTENT_XML;
 
 public class CreatePathSegmentProcessor {
 
-    private CreatePathSegmentProcessor() {
+    private final RepoPath path;
+    private final Collection<VaultPackageAssembler> packageAssemblers;
+    private final CreatePath cp;
+    private boolean foundType = false;
+    private String repositoryPath = "";
+
+    private Map<String,String> primaryTypeMap = new LinkedHashMap<>();
+    private Map<String,List<String>> mixinTypeMap = new LinkedHashMap<>();
+    
+    public CreatePathSegmentProcessor(@NotNull RepoPath path, 
+                                      @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, 
+                                      @NotNull CreatePath cp) {
+        this.path = path;
+        this.packageAssemblers = packageAssemblers;
+        this.cp = cp;
     }
 
     /**
      * Process segments of a repopath to createpath, checking 
packageassemblers for existing primaryType definitions.
-     *
-     * @param path
-     * @param packageAssemblers
-     * @param cp
      * @return
      */
-    public static boolean processSegments(@NotNull RepoPath path, @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, @NotNull CreatePath cp) {
-        String repositoryPath = "";
-        boolean foundType = false;
+    public boolean processSegments() {
         for (final String part : path.getSegments()) {
-            final String platformName = 
PlatformNameFormat.getPlatformName(part);
-            repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+            repositoryPath = processSegment(part);
+        }
+        return foundType;
+    }
 
-            boolean segmentAdded = false;
-            //loop all package assemblers and check if .content.xml is defined
-            for (VaultPackageAssembler packageAssembler : packageAssemblers) {
-                File currentContent = 
packageAssembler.getFileEntry(repositoryPath.concat(ConverterConstants.SLASH).concat(DOT_CONTENT_XML));
-                if (currentContent.exists() && currentContent.isFile()) {
-                    //add segment if jcr:primaryType is defined.
-                    segmentAdded = addSegment(cp, part, currentContent);
-                    if (segmentAdded) {
-                        foundType = true;
-                        break;
+    @NotNull
+    private String processSegment(String part) {
+        final String platformName = PlatformNameFormat.getPlatformName(part);
+        repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+        
+        //loop all package assemblers and check if .content.xml is defined
+        collectTypeDataForSegment();
+        addSegment(part);
+        
+        return repositoryPath;
+    }
+    
+    private void addSegment(String part){

Review Comment:
   please add notnull/nullable annotation. (i believe you want it to be notnull)
   
   missing space before {



##########
src/main/java/org/apache/sling/feature/cpconverter/repoinit/createpath/CreatePathSegmentProcessor.java:
##########
@@ -27,52 +29,97 @@
 import java.io.FileInputStream;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 import static org.apache.jackrabbit.vault.util.Constants.DOT_CONTENT_XML;
 
 public class CreatePathSegmentProcessor {
 
-    private CreatePathSegmentProcessor() {
+    private final RepoPath path;
+    private final Collection<VaultPackageAssembler> packageAssemblers;
+    private final CreatePath cp;
+    private boolean foundType = false;
+    private String repositoryPath = "";
+
+    private Map<String,String> primaryTypeMap = new LinkedHashMap<>();
+    private Map<String,List<String>> mixinTypeMap = new LinkedHashMap<>();
+    
+    public CreatePathSegmentProcessor(@NotNull RepoPath path, 
+                                      @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, 
+                                      @NotNull CreatePath cp) {
+        this.path = path;
+        this.packageAssemblers = packageAssemblers;
+        this.cp = cp;
     }
 
     /**
      * Process segments of a repopath to createpath, checking 
packageassemblers for existing primaryType definitions.
-     *
-     * @param path
-     * @param packageAssemblers
-     * @param cp
      * @return
      */
-    public static boolean processSegments(@NotNull RepoPath path, @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, @NotNull CreatePath cp) {
-        String repositoryPath = "";
-        boolean foundType = false;
+    public boolean processSegments() {
         for (final String part : path.getSegments()) {
-            final String platformName = 
PlatformNameFormat.getPlatformName(part);
-            repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+            repositoryPath = processSegment(part);
+        }
+        return foundType;
+    }
 
-            boolean segmentAdded = false;
-            //loop all package assemblers and check if .content.xml is defined
-            for (VaultPackageAssembler packageAssembler : packageAssemblers) {
-                File currentContent = 
packageAssembler.getFileEntry(repositoryPath.concat(ConverterConstants.SLASH).concat(DOT_CONTENT_XML));
-                if (currentContent.exists() && currentContent.isFile()) {
-                    //add segment if jcr:primaryType is defined.
-                    segmentAdded = addSegment(cp, part, currentContent);
-                    if (segmentAdded) {
-                        foundType = true;
-                        break;
+    @NotNull
+    private String processSegment(String part) {
+        final String platformName = PlatformNameFormat.getPlatformName(part);
+        repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+        
+        //loop all package assemblers and check if .content.xml is defined
+        collectTypeDataForSegment();
+        addSegment(part);
+        
+        return repositoryPath;
+    }
+    
+    private void addSegment(String part){
+        //add segment if jcr:primaryType is defined.
+        if(primaryTypeMap.containsKey(repositoryPath)){
+            cp.addSegment(
+                    part, 
+                    primaryTypeMap.get(repositoryPath), 
+                    mixinTypeMap.get(repositoryPath)
+            );
+        }else{
+            cp.addSegment(part, null);
+        }
+    }
+
+    private void collectTypeDataForSegment() {
+        for (VaultPackageAssembler packageAssembler : packageAssemblers) {
+            
+            if(primaryTypeMap.containsKey(repositoryPath)){
+                boolean merge = true;
+                for(PathFilterSet set: 
packageAssembler.getFilter().getFilterSets()){

Review Comment:
   formatting



##########
src/main/java/org/apache/sling/feature/cpconverter/repoinit/createpath/CreatePathSegmentProcessor.java:
##########
@@ -27,52 +29,97 @@
 import java.io.FileInputStream;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 import static org.apache.jackrabbit.vault.util.Constants.DOT_CONTENT_XML;
 
 public class CreatePathSegmentProcessor {
 
-    private CreatePathSegmentProcessor() {
+    private final RepoPath path;
+    private final Collection<VaultPackageAssembler> packageAssemblers;
+    private final CreatePath cp;
+    private boolean foundType = false;
+    private String repositoryPath = "";
+
+    private Map<String,String> primaryTypeMap = new LinkedHashMap<>();
+    private Map<String,List<String>> mixinTypeMap = new LinkedHashMap<>();
+    
+    public CreatePathSegmentProcessor(@NotNull RepoPath path, 
+                                      @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, 
+                                      @NotNull CreatePath cp) {
+        this.path = path;
+        this.packageAssemblers = packageAssemblers;
+        this.cp = cp;
     }
 
     /**
      * Process segments of a repopath to createpath, checking 
packageassemblers for existing primaryType definitions.
-     *
-     * @param path
-     * @param packageAssemblers
-     * @param cp
      * @return
      */
-    public static boolean processSegments(@NotNull RepoPath path, @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, @NotNull CreatePath cp) {
-        String repositoryPath = "";
-        boolean foundType = false;
+    public boolean processSegments() {
         for (final String part : path.getSegments()) {
-            final String platformName = 
PlatformNameFormat.getPlatformName(part);
-            repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+            repositoryPath = processSegment(part);
+        }
+        return foundType;
+    }
 
-            boolean segmentAdded = false;
-            //loop all package assemblers and check if .content.xml is defined
-            for (VaultPackageAssembler packageAssembler : packageAssemblers) {
-                File currentContent = 
packageAssembler.getFileEntry(repositoryPath.concat(ConverterConstants.SLASH).concat(DOT_CONTENT_XML));
-                if (currentContent.exists() && currentContent.isFile()) {
-                    //add segment if jcr:primaryType is defined.
-                    segmentAdded = addSegment(cp, part, currentContent);
-                    if (segmentAdded) {
-                        foundType = true;
-                        break;
+    @NotNull
+    private String processSegment(String part) {
+        final String platformName = PlatformNameFormat.getPlatformName(part);
+        repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+        
+        //loop all package assemblers and check if .content.xml is defined
+        collectTypeDataForSegment();
+        addSegment(part);
+        
+        return repositoryPath;
+    }
+    
+    private void addSegment(String part){
+        //add segment if jcr:primaryType is defined.
+        if(primaryTypeMap.containsKey(repositoryPath)){
+            cp.addSegment(
+                    part, 
+                    primaryTypeMap.get(repositoryPath), 
+                    mixinTypeMap.get(repositoryPath)
+            );
+        }else{
+            cp.addSegment(part, null);
+        }
+    }
+
+    private void collectTypeDataForSegment() {
+        for (VaultPackageAssembler packageAssembler : packageAssemblers) {
+            
+            if(primaryTypeMap.containsKey(repositoryPath)){

Review Comment:
   formatting... you even don't do it consistently in your own code :(



##########
src/main/java/org/apache/sling/feature/cpconverter/repoinit/createpath/CreatePathSegmentProcessor.java:
##########
@@ -27,52 +29,97 @@
 import java.io.FileInputStream;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 import static org.apache.jackrabbit.vault.util.Constants.DOT_CONTENT_XML;
 
 public class CreatePathSegmentProcessor {
 
-    private CreatePathSegmentProcessor() {
+    private final RepoPath path;
+    private final Collection<VaultPackageAssembler> packageAssemblers;
+    private final CreatePath cp;
+    private boolean foundType = false;
+    private String repositoryPath = "";
+
+    private Map<String,String> primaryTypeMap = new LinkedHashMap<>();
+    private Map<String,List<String>> mixinTypeMap = new LinkedHashMap<>();
+    
+    public CreatePathSegmentProcessor(@NotNull RepoPath path, 
+                                      @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, 
+                                      @NotNull CreatePath cp) {
+        this.path = path;
+        this.packageAssemblers = packageAssemblers;
+        this.cp = cp;
     }
 
     /**
      * Process segments of a repopath to createpath, checking 
packageassemblers for existing primaryType definitions.
-     *
-     * @param path
-     * @param packageAssemblers
-     * @param cp
      * @return
      */
-    public static boolean processSegments(@NotNull RepoPath path, @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, @NotNull CreatePath cp) {
-        String repositoryPath = "";
-        boolean foundType = false;
+    public boolean processSegments() {
         for (final String part : path.getSegments()) {
-            final String platformName = 
PlatformNameFormat.getPlatformName(part);
-            repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+            repositoryPath = processSegment(part);
+        }
+        return foundType;
+    }
 
-            boolean segmentAdded = false;
-            //loop all package assemblers and check if .content.xml is defined
-            for (VaultPackageAssembler packageAssembler : packageAssemblers) {
-                File currentContent = 
packageAssembler.getFileEntry(repositoryPath.concat(ConverterConstants.SLASH).concat(DOT_CONTENT_XML));
-                if (currentContent.exists() && currentContent.isFile()) {
-                    //add segment if jcr:primaryType is defined.
-                    segmentAdded = addSegment(cp, part, currentContent);
-                    if (segmentAdded) {
-                        foundType = true;
-                        break;
+    @NotNull
+    private String processSegment(String part) {
+        final String platformName = PlatformNameFormat.getPlatformName(part);
+        repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+        
+        //loop all package assemblers and check if .content.xml is defined
+        collectTypeDataForSegment();
+        addSegment(part);
+        
+        return repositoryPath;
+    }
+    
+    private void addSegment(String part){
+        //add segment if jcr:primaryType is defined.
+        if(primaryTypeMap.containsKey(repositoryPath)){
+            cp.addSegment(
+                    part, 
+                    primaryTypeMap.get(repositoryPath), 
+                    mixinTypeMap.get(repositoryPath)
+            );
+        }else{
+            cp.addSegment(part, null);
+        }
+    }
+
+    private void collectTypeDataForSegment() {
+        for (VaultPackageAssembler packageAssembler : packageAssemblers) {
+            
+            if(primaryTypeMap.containsKey(repositoryPath)){
+                boolean merge = true;
+                for(PathFilterSet set: 
packageAssembler.getFilter().getFilterSets()){
+                    if(set.covers(repositoryPath) && (set.getImportMode() != 
ImportMode.MERGE && set.getImportMode() != ImportMode.MERGE_PROPERTIES)){
+                        //found a path with a mode other than merge, proceed 
to replace the type definitions
+                        merge = false;
+                    }else if(set.covers(repositoryPath)){
+                        // merge is flipped to true again by another filter 
defined after the previous ones
+                        merge = true;
                     }
                 }
+                if(merge){

Review Comment:
   formatting



##########
src/main/java/org/apache/sling/feature/cpconverter/repoinit/createpath/CreatePathSegmentProcessor.java:
##########
@@ -27,52 +29,97 @@
 import java.io.FileInputStream;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 import static org.apache.jackrabbit.vault.util.Constants.DOT_CONTENT_XML;
 
 public class CreatePathSegmentProcessor {
 
-    private CreatePathSegmentProcessor() {
+    private final RepoPath path;
+    private final Collection<VaultPackageAssembler> packageAssemblers;
+    private final CreatePath cp;
+    private boolean foundType = false;
+    private String repositoryPath = "";
+
+    private Map<String,String> primaryTypeMap = new LinkedHashMap<>();
+    private Map<String,List<String>> mixinTypeMap = new LinkedHashMap<>();
+    
+    public CreatePathSegmentProcessor(@NotNull RepoPath path, 
+                                      @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, 
+                                      @NotNull CreatePath cp) {
+        this.path = path;
+        this.packageAssemblers = packageAssemblers;
+        this.cp = cp;
     }
 
     /**
      * Process segments of a repopath to createpath, checking 
packageassemblers for existing primaryType definitions.
-     *
-     * @param path
-     * @param packageAssemblers
-     * @param cp
      * @return
      */
-    public static boolean processSegments(@NotNull RepoPath path, @NotNull 
Collection<VaultPackageAssembler> packageAssemblers, @NotNull CreatePath cp) {
-        String repositoryPath = "";
-        boolean foundType = false;
+    public boolean processSegments() {
         for (final String part : path.getSegments()) {
-            final String platformName = 
PlatformNameFormat.getPlatformName(part);
-            repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+            repositoryPath = processSegment(part);
+        }
+        return foundType;
+    }
 
-            boolean segmentAdded = false;
-            //loop all package assemblers and check if .content.xml is defined
-            for (VaultPackageAssembler packageAssembler : packageAssemblers) {
-                File currentContent = 
packageAssembler.getFileEntry(repositoryPath.concat(ConverterConstants.SLASH).concat(DOT_CONTENT_XML));
-                if (currentContent.exists() && currentContent.isFile()) {
-                    //add segment if jcr:primaryType is defined.
-                    segmentAdded = addSegment(cp, part, currentContent);
-                    if (segmentAdded) {
-                        foundType = true;
-                        break;
+    @NotNull
+    private String processSegment(String part) {
+        final String platformName = PlatformNameFormat.getPlatformName(part);
+        repositoryPath = 
repositoryPath.concat(ConverterConstants.SLASH).concat(platformName);
+        
+        //loop all package assemblers and check if .content.xml is defined
+        collectTypeDataForSegment();
+        addSegment(part);
+        
+        return repositoryPath;
+    }
+    
+    private void addSegment(String part){
+        //add segment if jcr:primaryType is defined.
+        if(primaryTypeMap.containsKey(repositoryPath)){
+            cp.addSegment(
+                    part, 
+                    primaryTypeMap.get(repositoryPath), 
+                    mixinTypeMap.get(repositoryPath)
+            );
+        }else{
+            cp.addSegment(part, null);
+        }
+    }
+
+    private void collectTypeDataForSegment() {
+        for (VaultPackageAssembler packageAssembler : packageAssemblers) {
+            
+            if(primaryTypeMap.containsKey(repositoryPath)){
+                boolean merge = true;
+                for(PathFilterSet set: 
packageAssembler.getFilter().getFilterSets()){
+                    if(set.covers(repositoryPath) && (set.getImportMode() != 
ImportMode.MERGE && set.getImportMode() != ImportMode.MERGE_PROPERTIES)){
+                        //found a path with a mode other than merge, proceed 
to replace the type definitions
+                        merge = false;
+                    }else if(set.covers(repositoryPath)){

Review Comment:
   formatting
   
   in addition: you have twice the condition `set.covers(repositoryPath)` in 
both the if and the else-if. that doesn't look good. i believe this could be 
heavily improved in terms of readability if you would extract that into a 
separate method.... e.g. 'doMerge'
   
   also note: merge is already the default in the init of the boolean.... so 
this looks a bit odd at a first glance and becomes only understandable in the 
context of the for-loop and with the comment.
   
   added benefit of extracting into a separate method: the complexity of the 
method does down, which will avoid having sonar complaining about it



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to