[KARAF-2951] Transitive repositories and bundles are not added to system repo

Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/fd0143a1
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/fd0143a1
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/fd0143a1

Branch: refs/heads/master
Commit: fd0143a1e4895dfc8af04efd33ec3445b9278f00
Parents: 24c00ae
Author: Guillaume Nodet <gno...@gmail.com>
Authored: Tue Apr 29 01:19:28 2014 +0200
Committer: Guillaume Nodet <gno...@gmail.com>
Committed: Tue Apr 29 01:19:28 2014 +0200

----------------------------------------------------------------------
 .../karaf/tooling/features/InstallKarsMojo.java | 117 ++++++++++---------
 1 file changed, 64 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/fd0143a1/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java
----------------------------------------------------------------------
diff --git 
a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java
 
b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java
index f58ca37..ef06c6d 100644
--- 
a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java
+++ 
b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java
@@ -44,6 +44,7 @@ import org.apache.karaf.features.Dependency;
 import org.apache.karaf.features.FeaturesService;
 import org.apache.karaf.features.Repository;
 import org.apache.karaf.features.internal.model.Bundle;
+import org.apache.karaf.features.internal.model.Conditional;
 import org.apache.karaf.features.internal.model.Feature;
 import org.apache.karaf.features.internal.model.Features;
 import org.apache.karaf.features.internal.model.JaxbUtil;
@@ -249,37 +250,40 @@ public class InstallKarsMojo extends MojoSupport {
 
         // install bundles listed in install features not in system
         for (Feature feature : localRepoFeatures) {
-            for (Bundle bundle : feature.getBundle()) {
-                if (!bundle.isDependency()) {
-                    String key = bundle.getLocation();
-                    // remove wrap: protocol to resolve from maven
-                    if (key.startsWith("wrap:")) {
-                        key = key.substring(5);
-                    }
-                    String path = this.dependencyHelper.pathFromMaven(key);
-                    File test = new File(system.resolve(path));
-                    if (!test.exists()) {
-                        File target = new File(system.resolve(path));
-                        if (!target.exists()) {
-                            install(key, target);
-                            Artifact artifact = 
this.dependencyHelper.mvnToArtifact(key);
-                            if (artifact.isSnapshot()) {
-                                // generate maven-metadata-local.xml for the 
artifact
-                                File metadataSource = new 
File(this.dependencyHelper.resolveById(key, getLog()).getParentFile(), 
"maven-metadata-local.xml");
-                                File metadataTarget = new 
File(target.getParentFile(), "maven-metadata-local.xml");
-                                metadataTarget.getParentFile().mkdirs();
-                                try {
-                                    if (!metadataSource.exists()) {
-                                        // the maven-metadata-local.xml 
doesn't exist in the local repo, generate one
-                                        
MavenUtil.generateMavenMetadata(artifact, metadataTarget);
-                                    } else {
-                                        // copy the metadata to the target
-                                        copy(metadataSource, metadataTarget);
-                                    }
-                                } catch (IOException ioException) {
-                                    getLog().warn(ioException);
-                                    getLog().warn("Unable to copy the 
maven-metadata-local.xml, it means that this SNAPSHOT will be overwritten by a 
remote one (if exist)");
+            List<Bundle> bundles = new ArrayList<Bundle>();
+            bundles.addAll(feature.getBundle());
+            for (Conditional cond : feature.getConditional()) {
+                bundles.addAll(cond.getBundle());
+            }
+            for (Bundle bundle : bundles) {
+                String key = bundle.getLocation();
+                // remove wrap: protocol to resolve from maven
+                if (key.startsWith("wrap:")) {
+                    key = key.substring(5);
+                }
+                String path = this.dependencyHelper.pathFromMaven(key);
+                File test = new File(system.resolve(path));
+                if (!test.exists()) {
+                    File target = new File(system.resolve(path));
+                    if (!target.exists()) {
+                        install(key, target);
+                        Artifact artifact = 
this.dependencyHelper.mvnToArtifact(key);
+                        if (artifact.isSnapshot()) {
+                            // generate maven-metadata-local.xml for the 
artifact
+                            File metadataSource = new 
File(this.dependencyHelper.resolveById(key, getLog()).getParentFile(), 
"maven-metadata-local.xml");
+                            File metadataTarget = new 
File(target.getParentFile(), "maven-metadata-local.xml");
+                            metadataTarget.getParentFile().mkdirs();
+                            try {
+                                if (!metadataSource.exists()) {
+                                    // the maven-metadata-local.xml doesn't 
exist in the local repo, generate one
+                                    MavenUtil.generateMavenMetadata(artifact, 
metadataTarget);
+                                } else {
+                                    // copy the metadata to the target
+                                    copy(metadataSource, metadataTarget);
                                 }
+                            } catch (IOException ioException) {
+                                getLog().warn(ioException);
+                                getLog().warn("Unable to copy the 
maven-metadata-local.xml, it means that this SNAPSHOT will be overwritten by a 
remote one (if exist)");
                             }
                         }
                     }
@@ -332,29 +336,7 @@ public class InstallKarsMojo extends MojoSupport {
                         existingFeatureRepos = existingFeatureRepos + 
uri.toString();
                         properties.put(FEATURES_REPOSITORIES, 
existingFeatureRepos);
                     }
-                    Features repo = readFeatures(uri);
-                    for (String innerRepository : repo.getRepository()) {
-                        String innerRepositoryPath = 
dependencyHelper.pathFromMaven(innerRepository);
-                        File innerRepositoryTargetInSystemRepository = new 
File(system.resolve(innerRepositoryPath));
-                        if (!innerRepositoryTargetInSystemRepository.exists()) 
{
-                            File innerRepositorySourceFile = 
dependencyHelper.resolveById(innerRepository, getLog());
-                            
innerRepositoryTargetInSystemRepository.getParentFile().mkdirs();
-                            copy(innerRepositorySourceFile, 
innerRepositoryTargetInSystemRepository);
-
-                            // add metadata for snapshot
-                            Artifact innerRepositoryArtifact = 
dependencyHelper.mvnToArtifact(innerRepository);
-                            if (innerRepositoryArtifact.isSnapshot()) {
-                                getLog().debug("Feature repository " + 
innerRepository + " is a SNAPSHOT, generate the maven-metadata-local.xml file");
-                                File metadataTarget = new 
File(innerRepositoryTargetInSystemRepository.getParentFile(), 
"maven-metadata-local.xml");
-                                try {
-                                    
MavenUtil.generateMavenMetadata(innerRepositoryArtifact, metadataTarget);
-                                } catch (Exception e) {
-                                    getLog().warn("Could not create 
maven-metadata-local.xml", e);
-                                    getLog().warn("It means that this SNAPSHOT 
could be overwritten by an older one present on remote repositories");
-                                }
-                            }
-                        }
-                    }
+                    Features repo = loadAndCopyRepo(uri);
                     for (Feature feature : repo.getFeature()) {
                         featureSet.add(feature);
                         if (startupFeatures != null && 
startupFeatures.contains(feature.getName())) {
@@ -391,6 +373,35 @@ public class InstallKarsMojo extends MojoSupport {
             }
         }
 
+        private Features loadAndCopyRepo(URI uri) throws 
MojoExecutionException, MojoFailureException, JAXBException, 
XMLStreamException, IOException {
+            String repositoryPath = 
dependencyHelper.pathFromMaven(uri.toASCIIString());
+            getLog().info("Copying repo " + uri);
+            File repositoryTargetInSystemRepository = new 
File(system.resolve(repositoryPath));
+            if (!repositoryTargetInSystemRepository.exists()) {
+                File innerRepositorySourceFile = 
dependencyHelper.resolveById(uri.toASCIIString(), getLog());
+                repositoryTargetInSystemRepository.getParentFile().mkdirs();
+                copy(innerRepositorySourceFile, 
repositoryTargetInSystemRepository);
+
+                // add metadata for snapshot
+                Artifact innerRepositoryArtifact = 
dependencyHelper.mvnToArtifact(uri.toASCIIString());
+                if (innerRepositoryArtifact.isSnapshot()) {
+                    getLog().debug("Feature repository " + uri + " is a 
SNAPSHOT, generate the maven-metadata-local.xml file");
+                    File metadataTarget = new 
File(repositoryTargetInSystemRepository.getParentFile(), 
"maven-metadata-local.xml");
+                    try {
+                        
MavenUtil.generateMavenMetadata(innerRepositoryArtifact, metadataTarget);
+                    } catch (Exception e) {
+                        getLog().warn("Could not create 
maven-metadata-local.xml", e);
+                        getLog().warn("It means that this SNAPSHOT could be 
overwritten by an older one present on remote repositories");
+                    }
+                }
+            }
+            Features features = 
readFeatures(repositoryTargetInSystemRepository.toURI());
+            for (String innerRepository : features.getRepository()) {
+                loadAndCopyRepo(URI.create(innerRepository));
+            }
+            return features;
+        }
+
         private void addMissingDependenciesToRepo() {
             for (ListIterator<Dependency> iterator = 
missingDependencies.listIterator(); iterator.hasNext(); ) {
                 Dependency dependency = iterator.next();

Reply via email to