Author: cziegeler
Date: Wed Jul  5 14:54:19 2017
New Revision: 1800887

URL: http://svn.apache.org/viewvc?rev=1800887&view=rev
Log:
Update scanner framework

Added:
    
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactDescriptor.java
      - copied, changed from r1800886, 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactInfo.java
    
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactScanner.java
   (with props)
    
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/BundleDescriptor.java
      - copied, changed from r1800886, 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/BundleInfo.java
    
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/Descriptor.java
   (with props)
    
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ExtensionScanner.java
   (with props)
    
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/FeatureDescriptor.java
   (with props)
Removed:
    
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactInfo.java
    
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/BundleInfo.java
Modified:
    
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/Analyser.java
    
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/AnalyserTaskContext.java
    
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/tasks/CheckBundleExportsImports.java
    
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/tasks/CheckBundlesForInitialContent.java
    
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/tasks/CheckBundlesForResources.java
    
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/Scanner.java

Modified: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/Analyser.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/Analyser.java?rev=1800887&r1=1800886&r2=1800887&view=diff
==============================================================================
--- 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/Analyser.java
 (original)
+++ 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/Analyser.java
 Wed Jul  5 14:54:19 2017
@@ -27,8 +27,8 @@ import java.util.Set;
 
 import org.apache.sling.feature.Application;
 import org.apache.sling.feature.KeyValueMap;
-import org.apache.sling.feature.scanner.ArtifactInfo;
-import org.apache.sling.feature.scanner.BundleInfo;
+import org.apache.sling.feature.scanner.ArtifactDescriptor;
+import org.apache.sling.feature.scanner.BundleDescriptor;
 import org.apache.sling.feature.scanner.PackageInfo;
 import org.apache.sling.feature.scanner.Scanner;
 import org.apache.sling.feature.support.ArtifactManager;
@@ -94,8 +94,8 @@ public class Analyser {
 
         final List<PackageInfo> systemPackages = 
scanner.calculateSystemPackages(app);
 
-        final List<BundleInfo> bundleInfos = scanner.getBundleInfos(app);
-        final List<ArtifactInfo> artifactInfos = scanner.getArtifactInfos(app);
+        final List<BundleDescriptor> bundleInfos = scanner.getBundleInfos(app);
+        final List<ArtifactDescriptor> artifactInfos = 
scanner.getArtifactInfos(app);
 
         final List<String> warnings = new ArrayList<>();
         final List<String> errors = new ArrayList<>();
@@ -111,12 +111,12 @@ public class Analyser {
                 }
 
                 @Override
-                public List<BundleInfo> getBundleInfos() {
+                public List<BundleDescriptor> getBundleInfos() {
                     return bundleInfos;
                 }
 
                 @Override
-                public List<ArtifactInfo> getArtifactInfos() {
+                public List<ArtifactDescriptor> getArtifactInfos() {
                     return artifactInfos;
                 }
 

Modified: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/AnalyserTaskContext.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/AnalyserTaskContext.java?rev=1800887&r1=1800886&r2=1800887&view=diff
==============================================================================
--- 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/AnalyserTaskContext.java
 (original)
+++ 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/AnalyserTaskContext.java
 Wed Jul  5 14:54:19 2017
@@ -19,8 +19,8 @@ package org.apache.sling.feature.analyse
 import java.util.List;
 
 import org.apache.sling.feature.Application;
-import org.apache.sling.feature.scanner.ArtifactInfo;
-import org.apache.sling.feature.scanner.BundleInfo;
+import org.apache.sling.feature.scanner.ArtifactDescriptor;
+import org.apache.sling.feature.scanner.BundleDescriptor;
 import org.apache.sling.feature.scanner.PackageInfo;
 
 public interface AnalyserTaskContext {
@@ -41,13 +41,13 @@ public interface AnalyserTaskContext {
      * Get the list of bundle infos.
      * @return The unmodifiable list of bundle infos
      */
-    List<BundleInfo> getBundleInfos();
+    List<BundleDescriptor> getBundleInfos();
 
     /**
      * Get the list artifact infos
      * @return The unmodifiable list of artifact infos
      */
-    List<ArtifactInfo> getArtifactInfos();
+    List<ArtifactDescriptor> getArtifactInfos();
 
     /**
      * This method is invoked by a {@link AnalyserTask} to report

Modified: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/tasks/CheckBundleExportsImports.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/tasks/CheckBundleExportsImports.java?rev=1800887&r1=1800886&r2=1800887&view=diff
==============================================================================
--- 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/tasks/CheckBundleExportsImports.java
 (original)
+++ 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/tasks/CheckBundleExportsImports.java
 Wed Jul  5 14:54:19 2017
@@ -29,7 +29,7 @@ import java.util.TreeMap;
 import org.apache.sling.feature.Artifact;
 import org.apache.sling.feature.analyser.AnalyserTask;
 import org.apache.sling.feature.analyser.AnalyserTaskContext;
-import org.apache.sling.feature.scanner.BundleInfo;
+import org.apache.sling.feature.scanner.BundleDescriptor;
 import org.apache.sling.feature.scanner.PackageInfo;
 import org.osgi.framework.Version;
 
@@ -60,7 +60,7 @@ public class CheckBundleExportsImports i
         public List<PackageInfo> missingExportsForOptional = new ArrayList<>();
     }
 
-    private Report getReport(final Map<BundleInfo, Report> reports, final 
BundleInfo info) {
+    private Report getReport(final Map<BundleDescriptor, Report> reports, 
final BundleDescriptor info) {
         Report report = reports.get(info);
         if ( report == null ) {
             report = new Report();
@@ -69,8 +69,8 @@ public class CheckBundleExportsImports i
         return report;
     }
 
-    private void checkForVersionOnExportedPackages(final AnalyserTaskContext 
ctx, final Map<BundleInfo, Report> reports) {
-        for(final BundleInfo info : ctx.getBundleInfos()) {
+    private void checkForVersionOnExportedPackages(final AnalyserTaskContext 
ctx, final Map<BundleDescriptor, Report> reports) {
+        for(final BundleDescriptor info : ctx.getBundleInfos()) {
             if ( info.getExportedPackages() != null ) {
                 for(final PackageInfo i : info.getExportedPackages()) {
                     if ( i.getPackageVersion().compareTo(Version.emptyVersion) 
== 0 ) {
@@ -81,8 +81,8 @@ public class CheckBundleExportsImports i
         }
     }
 
-    private void checkForVersionOnImportingPackages(final AnalyserTaskContext 
ctx, final Map<BundleInfo, Report> reports) {
-        for(final BundleInfo info : ctx.getBundleInfos()) {
+    private void checkForVersionOnImportingPackages(final AnalyserTaskContext 
ctx, final Map<BundleDescriptor, Report> reports) {
+        for(final BundleDescriptor info : ctx.getBundleInfos()) {
             if ( info.getImportedPackages() != null ) {
                 for(final PackageInfo i : info.getImportedPackages()) {
                     if ( i.getVersion() == null ) {
@@ -101,13 +101,13 @@ public class CheckBundleExportsImports i
     @Override
     public void execute(final AnalyserTaskContext ctx) throws IOException {
         // basic checks
-        final Map<BundleInfo, Report> reports = new HashMap<>();
+        final Map<BundleDescriptor, Report> reports = new HashMap<>();
         checkForVersionOnExportedPackages(ctx, reports);
         checkForVersionOnImportingPackages(ctx, reports);
 
-        final SortedMap<Integer, List<BundleInfo>> bundlesMap = new 
TreeMap<>();
-        for(final BundleInfo bi : ctx.getBundleInfos()) {
-            List<BundleInfo> list = bundlesMap.get(bi.getBundleStartLevel());
+        final SortedMap<Integer, List<BundleDescriptor>> bundlesMap = new 
TreeMap<>();
+        for(final BundleDescriptor bi : ctx.getBundleInfos()) {
+            List<BundleDescriptor> list = 
bundlesMap.get(bi.getBundleStartLevel());
             if ( list == null ) {
                 list = new ArrayList<>();
                 bundlesMap.put(bi.getBundleStartLevel(), list);
@@ -116,24 +116,24 @@ public class CheckBundleExportsImports i
         }
 
         // create a synthetic bundle info for the system bundle
-        final BundleInfo system = new BundleInfo(new 
Artifact(ctx.getApplication().getFramework()), ctx.getSystemPackages());
+        final BundleDescriptor system = new BundleDescriptor(new 
Artifact(ctx.getApplication().getFramework()), ctx.getSystemPackages());
 
         // add all system packages
-        final List<BundleInfo> exportingBundles = new ArrayList<>();
+        final List<BundleDescriptor> exportingBundles = new ArrayList<>();
         exportingBundles.add(system);
 
-        for(final Map.Entry<Integer, List<BundleInfo>> entry : 
bundlesMap.entrySet()) {
+        for(final Map.Entry<Integer, List<BundleDescriptor>> entry : 
bundlesMap.entrySet()) {
             // first add all exporting bundles
-            for(final BundleInfo info : entry.getValue()) {
+            for(final BundleDescriptor info : entry.getValue()) {
                 if ( info.getExportedPackages() != null ) {
                     exportingBundles.add(info);
                 }
             }
             // check importing bundles
-            for(final BundleInfo info : entry.getValue()) {
+            for(final BundleDescriptor info : entry.getValue()) {
                 if ( info.getImportedPackages() != null ) {
                     for(final PackageInfo pck : info.getImportedPackages() ) {
-                        final List<BundleInfo> candidates = 
getCandidates(exportingBundles, pck);
+                        final List<BundleDescriptor> candidates = 
getCandidates(exportingBundles, pck);
                         if ( candidates.isEmpty() ) {
                             if ( pck.isOptional() ) {
                                 getReport(reports, 
info).missingExportsForOptional.add(pck);
@@ -141,8 +141,8 @@ public class CheckBundleExportsImports i
                                 getReport(reports, 
info).missingExports.add(pck);
                             }
                         } else {
-                            final List<BundleInfo> matchingCandidates = new 
ArrayList<>();
-                            for(final BundleInfo i : candidates) {
+                            final List<BundleDescriptor> matchingCandidates = 
new ArrayList<>();
+                            for(final BundleDescriptor i : candidates) {
                                 if ( i.isExportingPackage(pck) ) {
                                     matchingCandidates.add(i);
                                 }
@@ -162,7 +162,7 @@ public class CheckBundleExportsImports i
             }
         }
 
-        for(final Map.Entry<BundleInfo, Report> entry : reports.entrySet()) {
+        for(final Map.Entry<BundleDescriptor, Report> entry : 
reports.entrySet()) {
             final String key = "Bundle " + 
entry.getKey().getArtifact().getId().getArtifactId() + ":" + 
entry.getKey().getArtifact().getId().getVersion();
 
             if ( !entry.getValue().importWithoutVersion.isEmpty() ) {
@@ -210,9 +210,9 @@ public class CheckBundleExportsImports i
         return sb.toString();
     }
 
-    private List<BundleInfo> getCandidates(final List<BundleInfo> 
exportingBundles, final PackageInfo pck) {
-        final List<BundleInfo> candidates = new ArrayList<>();
-        for(final BundleInfo info : exportingBundles) {
+    private List<BundleDescriptor> getCandidates(final List<BundleDescriptor> 
exportingBundles, final PackageInfo pck) {
+        final List<BundleDescriptor> candidates = new ArrayList<>();
+        for(final BundleDescriptor info : exportingBundles) {
             if ( info.isExportingPackage(pck.getName()) ) {
                 candidates.add(info);
             }

Modified: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/tasks/CheckBundlesForInitialContent.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/tasks/CheckBundlesForInitialContent.java?rev=1800887&r1=1800886&r2=1800887&view=diff
==============================================================================
--- 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/tasks/CheckBundlesForInitialContent.java
 (original)
+++ 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/tasks/CheckBundlesForInitialContent.java
 Wed Jul  5 14:54:19 2017
@@ -18,12 +18,26 @@
  */
 package org.apache.sling.feature.analyser.tasks;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.jar.Manifest;
+
+import org.apache.sling.commons.osgi.ManifestHeader;
 import org.apache.sling.feature.analyser.AnalyserTask;
 import org.apache.sling.feature.analyser.AnalyserTaskContext;
-import org.apache.sling.feature.scanner.BundleInfo;
+import org.apache.sling.feature.scanner.BundleDescriptor;
 
 public class CheckBundlesForInitialContent implements AnalyserTask {
 
+    /** The manifest header to specify initial content to be loaded. */
+    private static final String CONTENT_HEADER = "Sling-Initial-Content";
+
+    /**
+     * The path directive specifying the target node where initial content will
+     * be loaded.
+     */
+    private static final String PATH_DIRECTIVE = "path";
+
     @Override
     public String getName() {
         return "Bundle Initial Content Check";
@@ -37,10 +51,34 @@ public class CheckBundlesForInitialConte
     @Override
     public void execute(final AnalyserTaskContext ctx) {
         // check for initial content
-        for(final BundleInfo info : ctx.getBundleInfos()) {
-            if ( !info.getInitialContent().isEmpty() ) {
-                ctx.reportWarning("Found initial content in " + 
info.getArtifact() + " : " + info.getInitialContent());
+        for(final BundleDescriptor info : ctx.getBundleInfos()) {
+            final List<String> initialContent = 
extractInitialContent(info.getManifest());
+
+            if ( !initialContent.isEmpty() ) {
+                ctx.reportWarning("Found initial content in " + 
info.getArtifact() + " : " + initialContent);
+            }
+        }
+    }
+
+    private List<String> extractInitialContent(final Manifest m) {
+        final List<String> initialContent = new ArrayList<>();
+        if ( m != null ) {
+            final String root =  
m.getMainAttributes().getValue(CONTENT_HEADER);
+            if (root != null) {
+                final ManifestHeader header = ManifestHeader.parse(root);
+                for (final ManifestHeader.Entry entry : header.getEntries()) {
+
+                    String path = entry.getDirectiveValue(PATH_DIRECTIVE);
+                    if (path == null) {
+                        path = "/";
+                    } else if (!path.startsWith("/")) {
+                        // make relative path absolute
+                        path = "/" + path;
+                    }
+                    initialContent.add(path);
+                }
             }
         }
+        return initialContent;
     }
 }

Modified: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/tasks/CheckBundlesForResources.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/tasks/CheckBundlesForResources.java?rev=1800887&r1=1800886&r2=1800887&view=diff
==============================================================================
--- 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/tasks/CheckBundlesForResources.java
 (original)
+++ 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/analyser/tasks/CheckBundlesForResources.java
 Wed Jul  5 14:54:19 2017
@@ -18,12 +18,26 @@
  */
 package org.apache.sling.feature.analyser.tasks;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.jar.Manifest;
+
+import org.apache.sling.commons.osgi.ManifestHeader;
 import org.apache.sling.feature.analyser.AnalyserTask;
 import org.apache.sling.feature.analyser.AnalyserTaskContext;
-import org.apache.sling.feature.scanner.BundleInfo;
+import org.apache.sling.feature.scanner.BundleDescriptor;
 
 public class CheckBundlesForResources implements AnalyserTask {
 
+    /** The manifest header to specify bundle resources. */
+    private static final String BUNDLE_RESOURCE_ROOTS = 
"Sling-Bundle-Resources";
+
+    /**
+     * The path directive specifying the target node where initial content will
+     * be loaded.
+     */
+    private static final String PATH_DIRECTIVE = "path";
+
     @Override
     public String getName() {
         return "Bundle Resources Check";
@@ -37,10 +51,31 @@ public class CheckBundlesForResources im
     @Override
     public void execute(final AnalyserTaskContext ctx) {
         // check for initial content
-        for(final BundleInfo info : ctx.getBundleInfos()) {
-            if ( !info.getBundleResources().isEmpty() ) {
-                ctx.reportWarning("Found bundle resources in " + 
info.getArtifact() + " : " + info.getBundleResources());
+        for(final BundleDescriptor info : ctx.getBundleInfos()) {
+            final List<String> bundleResources = 
extractBundleResources(info.getManifest());
+            if ( !bundleResources.isEmpty() ) {
+                ctx.reportWarning("Found bundle resources in " + 
info.getArtifact() + " : " + bundleResources);
+            }
+        }
+    }
+
+    private List<String> extractBundleResources(final Manifest m) {
+        final List<String> bundleResources = new ArrayList<>();
+        if ( m != null ) {
+            final String root =  
m.getMainAttributes().getValue(BUNDLE_RESOURCE_ROOTS);
+            if (root != null) {
+                final ManifestHeader header = ManifestHeader.parse(root);
+                for (final ManifestHeader.Entry entry : header.getEntries()) {
+                    final String resourceRoot = entry.getValue();
+                    final String pathDirective = 
entry.getDirectiveValue(PATH_DIRECTIVE);
+                    if (pathDirective != null) {
+                        bundleResources.add(resourceRoot + "!" + 
pathDirective);
+                    } else {
+                        bundleResources.add(resourceRoot);
+                    }
+                }
             }
         }
+        return bundleResources;
     }
 }

Copied: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactDescriptor.java
 (from r1800886, 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactInfo.java)
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactDescriptor.java?p2=sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactDescriptor.java&p1=sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactInfo.java&r1=1800886&r2=1800887&rev=1800887&view=diff
==============================================================================
--- 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactInfo.java
 (original)
+++ 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactDescriptor.java
 Wed Jul  5 14:54:19 2017
@@ -18,13 +18,14 @@ package org.apache.sling.feature.scanner
 
 import java.io.File;
 import java.io.IOException;
+import java.util.jar.Manifest;
 
 import org.apache.sling.feature.Artifact;
 
 /**
  * Information about an artifact
  */
-public class ArtifactInfo  {
+public class ArtifactDescriptor extends Descriptor {
 
     /** The physical file for analysing. */
     private final File artifactFile;
@@ -32,7 +33,7 @@ public class ArtifactInfo  {
     /** The corresponding artifact from the feature. */
     private final Artifact artifact;
 
-    public ArtifactInfo(final Artifact a,
+    public ArtifactDescriptor(final Artifact a,
             final File file) throws IOException {
         this.artifact = a;
         this.artifactFile = file;
@@ -54,10 +55,19 @@ public class ArtifactInfo  {
         return artifact;
     }
 
+    /**
+     * If the artifact has a manifest, return it
+     * @return The manifest or {@code null}
+     */
+    public Manifest getManifest() {
+        return null;
+    }
+
+
     @Override
-    public boolean equals(Object obj) {
-        if ( obj instanceof ArtifactInfo ) {
-            return 
this.getArtifact().getId().toMvnId().equals(((ArtifactInfo)obj).getArtifact().getId().toMvnId());
+    public boolean equals(final Object obj) {
+        if ( obj instanceof ArtifactDescriptor ) {
+            return 
this.getArtifact().getId().toMvnId().equals(((ArtifactDescriptor)obj).getArtifact().getId().toMvnId());
         }
         return false;
     }
@@ -72,4 +82,5 @@ public class ArtifactInfo  {
     public String toString() {
         return "ArtifactInfo [artifact=" + 
this.getArtifact().getId().toMvnId() + "]";
     }
+
 }
\ No newline at end of file

Added: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactScanner.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactScanner.java?rev=1800887&view=auto
==============================================================================
--- 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactScanner.java
 (added)
+++ 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactScanner.java
 Wed Jul  5 14:54:19 2017
@@ -0,0 +1,41 @@
+/*
+ * 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.scanner;
+
+import java.io.IOException;
+
+import org.apache.sling.feature.Artifact;
+
+/**
+ * The artifact scanner scans an artifact.
+ */
+public interface ArtifactScanner  {
+
+    /** A unique (short) id. */
+    String getId();
+
+    /** A human readable name to identify the scanner. */
+    String getName();
+
+    /**
+     * Try to scan the artifact
+     * @param artifact The artifact
+     * @return An artifact info or {@code null} if the scanner can't process 
the artifact
+     * @throws IOException If an error occurs while scanning the  artifact or 
the artifact is invalid
+     */
+    ArtifactDescriptor scan(Artifact artifact) throws IOException;
+}
\ No newline at end of file

Propchange: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactScanner.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ArtifactScanner.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Copied: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/BundleDescriptor.java
 (from r1800886, 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/BundleInfo.java)
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/BundleDescriptor.java?p2=sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/BundleDescriptor.java&p1=sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/BundleInfo.java&r1=1800886&r2=1800887&rev=1800887&view=diff
==============================================================================
--- 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/BundleInfo.java
 (original)
+++ 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/BundleDescriptor.java
 Wed Jul  5 14:54:19 2017
@@ -23,26 +23,13 @@ import java.util.Collections;
 import java.util.List;
 import java.util.jar.Manifest;
 
-import org.apache.sling.commons.osgi.ManifestHeader;
 import org.apache.sling.feature.Artifact;
 import org.osgi.framework.Constants;
 
 /**
  * Information about a bundle
  */
-public class BundleInfo extends ArtifactInfo implements Comparable<BundleInfo> 
{
-
-    /** The manifest header to specify initial content to be loaded. */
-    private static final String CONTENT_HEADER = "Sling-Initial-Content";
-
-    /** The manifest header to specify bundle resources. */
-    private static final String BUNDLE_RESOURCE_ROOTS = 
"Sling-Bundle-Resources";
-
-    /**
-     * The path directive specifying the target node where initial content will
-     * be loaded.
-     */
-    private static final String PATH_DIRECTIVE = "path";
+public class BundleDescriptor extends ArtifactDescriptor implements 
Comparable<BundleDescriptor> {
 
     /** The bundle symbolic name. */
     private String symbolicName;
@@ -62,16 +49,10 @@ public class BundleInfo extends Artifact
     /** Information about dynamic imported packages. */
     private final List<PackageInfo> dynamicImportedPackages = new 
ArrayList<>();
 
-    /** Initial content */
-    private final List<String> initialContent = new ArrayList<>();
-
-    /** Bundle resources */
-    private final List<String> bundleResources = new ArrayList<>();
-
     /** Manifest */
     private final Manifest manifest;
 
-    public BundleInfo(final Artifact a,
+    public BundleDescriptor(final Artifact a,
             final File file,
             final int startLevel) throws IOException  {
         super(a, file);
@@ -84,7 +65,7 @@ public class BundleInfo extends Artifact
         this.analyze();
     }
 
-    public BundleInfo(final Artifact artifact,
+    public BundleDescriptor(final Artifact artifact,
             final List<PackageInfo> pcks) throws IOException {
         super(artifact, null);
         this.startLevel = 0;
@@ -119,18 +100,11 @@ public class BundleInfo extends Artifact
         return startLevel;
     }
 
-    public List<String> getInitialContent() {
-        return Collections.unmodifiableList(this.initialContent);
-    }
-
-    public List<String> getBundleResources() {
-        return Collections.unmodifiableList(this.bundleResources);
-    }
-
     public List<PackageInfo> getExportedPackages() {
         return Collections.unmodifiableList(this.exportedPackages);
     }
 
+    @Override
     public Manifest getManifest() {
         return this.manifest;
     }
@@ -158,10 +132,12 @@ public class BundleInfo extends Artifact
         return false;
     }
 
+    @Override
     public List<PackageInfo> getImportedPackages() {
         return Collections.unmodifiableList(this.importedPackages);
     }
 
+    @Override
     public List<PackageInfo> getDynamicImportedPackages() {
         return Collections.unmodifiableList(this.dynamicImportedPackages);
     }
@@ -183,52 +159,16 @@ public class BundleInfo extends Artifact
             
this.exportedPackages.addAll(ManifestUtil.extractExportedPackages(this.manifest));
             
this.importedPackages.addAll(ManifestUtil.extractImportedPackages(this.manifest));
             
this.dynamicImportedPackages.addAll(ManifestUtil.extractDynamicImportedPackages(this.manifest));
-            extractInitialContent(this.manifest);
-            extractBundleResources(this.manifest);
 
         } else {
             throw new IOException("Unable to get bundle symbolic name from 
artifact " + getArtifact().getId().toMvnId());
         }
     }
 
-    private void extractBundleResources(final Manifest m) {
-        final String root =  
m.getMainAttributes().getValue(BUNDLE_RESOURCE_ROOTS);
-        if (root != null) {
-            final ManifestHeader header = ManifestHeader.parse(root);
-            for (final ManifestHeader.Entry entry : header.getEntries()) {
-                final String resourceRoot = entry.getValue();
-                final String pathDirective = 
entry.getDirectiveValue(PATH_DIRECTIVE);
-                if (pathDirective != null) {
-                    this.bundleResources.add(resourceRoot + "!" + 
pathDirective);
-                } else {
-                    this.bundleResources.add(resourceRoot);
-                }
-            }
-        }
-    }
-
-    private void extractInitialContent(final Manifest m) {
-        final String root =  m.getMainAttributes().getValue(CONTENT_HEADER);
-        if (root != null) {
-            final ManifestHeader header = ManifestHeader.parse(root);
-            for (final ManifestHeader.Entry entry : header.getEntries()) {
-
-                String path = entry.getDirectiveValue(PATH_DIRECTIVE);
-                if (path == null) {
-                    path = "/";
-                } else if (!path.startsWith("/")) {
-                    // make relative path absolute
-                    path = "/" + path;
-                }
-                this.initialContent.add(path);
-            }
-        }
-    }
-
     @Override
     public boolean equals(Object obj) {
-        if ( obj instanceof BundleInfo ) {
-            return this.symbolicName.equals(((BundleInfo)obj).symbolicName) && 
this.bundleVersion.equals(((BundleInfo)obj).bundleVersion);
+        if ( obj instanceof BundleDescriptor ) {
+            return 
this.symbolicName.equals(((BundleDescriptor)obj).symbolicName) && 
this.bundleVersion.equals(((BundleDescriptor)obj).bundleVersion);
         }
         return false;
     }
@@ -245,7 +185,7 @@ public class BundleInfo extends Artifact
     }
 
     @Override
-    public int compareTo(final BundleInfo o) {
+    public int compareTo(final BundleDescriptor o) {
         return (this.symbolicName + ':' + 
this.bundleVersion).compareTo((o.symbolicName + ':' + o.bundleVersion));
     }
 }
\ No newline at end of file

Added: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/Descriptor.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/Descriptor.java?rev=1800887&view=auto
==============================================================================
--- 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/Descriptor.java
 (added)
+++ 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/Descriptor.java
 Wed Jul  5 14:54:19 2017
@@ -0,0 +1,53 @@
+/*
+ * 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.scanner;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.sling.feature.Capability;
+import org.apache.sling.feature.Requirement;
+
+/**
+ * A descriptor holds information about requirements and capabilities
+ */
+public class Descriptor  {
+
+    public List<PackageInfo> getImportedPackages() {
+        return Collections.emptyList();
+    }
+
+    public List<PackageInfo> getDynamicImportedPackages() {
+        return Collections.emptyList();
+    }
+
+    /**
+     * Return the list of requirements.
+     * @return The list of requirements. The list might be empty.
+     */
+    public List<Requirement> getRequirements() {
+        return Collections.emptyList();
+    }
+
+    /**
+     * Return the list of capabilities.
+     * @return The list of capabilities. The list might be empty.
+     */
+    public List<Capability> getCapabilities() {
+        return Collections.emptyList();
+    }
+}
\ No newline at end of file

Propchange: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/Descriptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/Descriptor.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Added: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ExtensionScanner.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ExtensionScanner.java?rev=1800887&view=auto
==============================================================================
--- 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ExtensionScanner.java
 (added)
+++ 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ExtensionScanner.java
 Wed Jul  5 14:54:19 2017
@@ -0,0 +1,43 @@
+/*
+ * 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.scanner;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.sling.feature.Extension;
+
+/**
+ * The extension scanner scans an extension.
+ */
+public interface ExtensionScanner  {
+
+    /** A unique (short) id. */
+    String getId();
+
+    /** A human readable name to identify the scanner. */
+    String getName();
+
+    /**
+     * Try to scan the extension and return a descriptor
+     * @param extension The extension
+     * @param descs A list of scanned artifact descriptors if the extension is 
of type artifacts, {@code null} otherwise.
+     * @return The descriptor or {@code null} if the scanner does not know the 
extension
+     * @throws IOException If an error occurs while scanning the extension or 
the extension is invalid
+     */
+    Descriptor scan(Extension extension, List<ArtifactDescriptor> descs) 
throws IOException;
+}
\ No newline at end of file

Propchange: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ExtensionScanner.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/ExtensionScanner.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Added: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/FeatureDescriptor.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/FeatureDescriptor.java?rev=1800887&view=auto
==============================================================================
--- 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/FeatureDescriptor.java
 (added)
+++ 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/FeatureDescriptor.java
 Wed Jul  5 14:54:19 2017
@@ -0,0 +1,26 @@
+/*
+ * 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.scanner;
+
+/**
+ * Information about a feature.
+ * This is the aggregated information.
+ */
+public class FeatureDescriptor extends Descriptor {
+
+
+}
\ No newline at end of file

Propchange: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/FeatureDescriptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/FeatureDescriptor.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Modified: 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/Scanner.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/Scanner.java?rev=1800887&r1=1800886&r2=1800887&view=diff
==============================================================================
--- 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/Scanner.java
 (original)
+++ 
sling/whiteboard/cziegeler/feature-analyser/src/main/java/org/apache/sling/feature/scanner/Scanner.java
 Wed Jul  5 14:54:19 2017
@@ -32,6 +32,7 @@ import org.apache.sling.feature.Applicat
 import org.apache.sling.feature.Artifact;
 import org.apache.sling.feature.Extension;
 import org.apache.sling.feature.ExtensionType;
+import org.apache.sling.feature.Feature;
 import org.apache.sling.feature.KeyValueMap;
 import org.apache.sling.feature.support.ArtifactManager;
 import org.apache.sling.feature.support.ArtifactManagerConfig;
@@ -46,30 +47,34 @@ public class Scanner {
         this.artifactManager = ArtifactManager.getArtifactManager(amConfig);
     }
 
-    public ArtifactInfo scan(final Artifact artifact) throws IOException {
+    public ArtifactDescriptor scan(final Artifact artifact) throws IOException 
{
         final File file = 
artifactManager.getArtifactHandler(artifact.getId().toMvnUrl()).getFile();
         if ( file == null ) {
             throw new IOException("Unable to find file for " + 
artifact.getId());
         }
 
-        ArtifactInfo info = null;
+        ArtifactDescriptor info = null;
 
-        info = new ArtifactInfo(artifact, file);
+        info = new ArtifactDescriptor(artifact, file);
 
         return info;
     }
 
-    public BundleInfo scanBundle(final Artifact artifact, final int 
startLevel) throws IOException {
+    public BundleDescriptor scanBundle(final Artifact artifact, final int 
startLevel) throws IOException {
         final File file = 
artifactManager.getArtifactHandler(artifact.getId().toMvnUrl()).getFile();
         if ( file == null ) {
             throw new IOException("Unable to find file for " + 
artifact.getId());
         }
 
-        return new BundleInfo(artifact, file, startLevel);
+        return new BundleDescriptor(artifact, file, startLevel);
     }
 
-    public List<BundleInfo> getBundleInfos(final Application app)  throws 
Exception {
-        final List<BundleInfo> bundleInfos = new ArrayList<>();
+    public FeatureDescriptor scanFeature(final Feature feature) throws 
IOException {
+        return null; // TBD
+    }
+
+    public List<BundleDescriptor> getBundleInfos(final Application app)  
throws Exception {
+        final List<BundleDescriptor> bundleInfos = new ArrayList<>();
 
         for(final Map.Entry<Integer, List<Artifact>> entry : 
app.getBundles().getBundlesByStartLevel().entrySet()) {
             for(final Artifact bundle : entry.getValue() ) {
@@ -80,8 +85,8 @@ public class Scanner {
         return bundleInfos;
     }
 
-    public List<ArtifactInfo> getArtifactInfos(final Application app)  throws 
Exception {
-        final List<ArtifactInfo> artifactInfos = new ArrayList<>();
+    public List<ArtifactDescriptor> getArtifactInfos(final Application app)  
throws Exception {
+        final List<ArtifactDescriptor> artifactInfos = new ArrayList<>();
 
         for(final Extension ext : app.getExtensions()) {
             if ( ext.getType() == ExtensionType.ARTIFACTS ) {


Reply via email to