You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2016/06/20 14:17:10 UTC

karaf-cellar git commit: [KARAF-4322] Improve features repository parsing to update the cluster map. Leverage support of install/uninstall flag of the features service.

Repository: karaf-cellar
Updated Branches:
  refs/heads/master b0d954e23 -> 037a7c9b8


[KARAF-4322] Improve features repository parsing to update the cluster map. Leverage support of install/uninstall flag of the features service.


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

Branch: refs/heads/master
Commit: 037a7c9b81e7173951af8a4275d0f726ae078669
Parents: b0d954e
Author: Jean-Baptiste Onofr� <jb...@apache.org>
Authored: Mon Jun 20 16:16:11 2016 +0200
Committer: Jean-Baptiste Onofr� <jb...@apache.org>
Committed: Mon Jun 20 16:16:11 2016 +0200

----------------------------------------------------------------------
 features/pom.xml                                |  3 +
 .../internal/CellarFeaturesMBeanImpl.java       | 90 ++++----------------
 .../cellar/features/shell/RepoAddCommand.java   | 39 ++-------
 .../features/shell/RepoRemoveCommand.java       | 37 +-------
 4 files changed, 31 insertions(+), 138 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/037a7c9b/features/pom.xml
----------------------------------------------------------------------
diff --git a/features/pom.xml b/features/pom.xml
index 10513eb..fba0212 100644
--- a/features/pom.xml
+++ b/features/pom.xml
@@ -115,8 +115,11 @@
                             *
                         </Import-Package>
                         <Private-Package>
+                            org.apache.karaf.features.internal.model,
                             org.apache.karaf.cellar.features.management.internal,
                             org.apache.karaf.cellar.features.internal.osgi,
+                            org.apache.felix.utils.version,
+                            org.apache.karaf.util,
                             org.apache.karaf.util.tracker;-split-package:=merge-first
                         </Private-Package>
                     </instructions>

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/037a7c9b/features/src/main/java/org/apache/karaf/cellar/features/management/internal/CellarFeaturesMBeanImpl.java
----------------------------------------------------------------------
diff --git a/features/src/main/java/org/apache/karaf/cellar/features/management/internal/CellarFeaturesMBeanImpl.java b/features/src/main/java/org/apache/karaf/cellar/features/management/internal/CellarFeaturesMBeanImpl.java
index 7af4e04..a4d4574 100644
--- a/features/src/main/java/org/apache/karaf/cellar/features/management/internal/CellarFeaturesMBeanImpl.java
+++ b/features/src/main/java/org/apache/karaf/cellar/features/management/internal/CellarFeaturesMBeanImpl.java
@@ -26,6 +26,8 @@ import org.apache.karaf.cellar.features.ClusterRepositoryEvent;
 import org.apache.karaf.cellar.features.management.CellarFeaturesMBean;
 import org.apache.karaf.features.*;
 // import org.osgi.framework.BundleEvent;
+import org.apache.karaf.features.internal.model.Features;
+import org.apache.karaf.features.internal.model.JaxbUtil;
 import org.osgi.service.cm.ConfigurationAdmin;
 
 import javax.management.NotCompliantMBeanException;
@@ -438,39 +440,14 @@ public class CellarFeaturesMBeanImpl extends StandardMBean implements CellarFeat
                 }
             }
             if (name == null) {
-                // update the repository temporary locally
-                Repository repository = null;
-                boolean localRegistered = false;
-                // local lookup
-                for (Repository registeredRepository : featuresService.listRepositories()) {
-                    if (registeredRepository.getURI().equals(uri)) {
-                        repository = registeredRepository;
-                        break;
-                    }
-                }
-                if (repository == null) {
-                    // registered locally
-                    try {
-                        featuresService.addRepository(uri);
-                    } catch (Exception e) {
-                        throw new IllegalArgumentException("Features repository URL " + uri + " is not valid: " + e.getMessage());
-                    }
-                    // get the repository
-                    for (Repository registeredRepository : featuresService.listRepositories()) {
-                        if (registeredRepository.getURI().equals(uri)) {
-                            repository = registeredRepository;
-                            break;
-                        }
-                    }
-                    name = repository.getName();
-                } else {
-                    localRegistered = true;
-                }
+                // parsing the features repository to get content
+                Features repository = JaxbUtil.unmarshal(uri.toASCIIString(), true);
 
                 // update the cluster group
                 clusterRepositories.put(uri.toString(), name);
 
-                for (Feature feature : repository.getFeatures()) {
+                // update the features in the cluster group
+                for (Feature feature : repository.getFeature()) {
                     FeatureState state = new FeatureState();
                     state.setName(feature.getName());
                     state.setVersion(feature.getVersion());
@@ -478,10 +455,6 @@ public class CellarFeaturesMBeanImpl extends StandardMBean implements CellarFeat
                     clusterFeatures.put(feature.getName() + "/" + feature.getVersion(), state);
                 }
 
-                // un-register the repository if it's not local registered
-                if (!localRegistered)
-                    featuresService.removeRepository(uri);
-
                 // broadcast the cluster event
                 ClusterRepositoryEvent event = new ClusterRepositoryEvent(uri.toString(), RepositoryEvent.EventType.RepositoryAdded);
                 event.setInstall(install);
@@ -549,58 +522,31 @@ public class CellarFeaturesMBeanImpl extends StandardMBean implements CellarFeat
 
             for (String url : urls) {
                 // looking for the URL in the list
-                String name = null;
-                for (String clusterRepository : clusterRepositories.keySet()) {
-                    if (clusterRepository.equals(url)) {
-                        name = clusterRepositories.get(clusterRepository);
+                boolean found = false;
+                for (String repository : clusterRepositories.keySet()) {
+                    if (repository.equals(repository)) {
+                        found = true;
                         break;
                     }
                 }
-                if (name == null) {
-                    // update the repository temporary locally
-                    Repository repository = null;
-                    boolean localRegistered = false;
-                    // local lookup
-                    for (Repository registeredRepository : featuresService.listRepositories()) {
-                        if (registeredRepository.getURI().equals(new URI(url))) {
-                            repository = registeredRepository;
-                            break;
-                        }
-                    }
-                    if (repository == null) {
-                        // registered locally
-                        try {
-                            featuresService.addRepository(new URI(url));
-                        } catch (Exception e) {
-                            throw new IllegalArgumentException("Features repository URL " + url + " is not valid: " + e.getMessage());
-                        }
-                        // get the repository
-                        for (Repository registeredRepository : featuresService.listRepositories()) {
-                            if (registeredRepository.getURI().equals(new URI(url))) {
-                                repository = registeredRepository;
-                                break;
-                            }
-                        }
-                    } else {
-                        localRegistered = true;
-                    }
+                if (found) {
+                    Features repositoryModel = JaxbUtil.unmarshal(url, true);
 
-                    // update the cluster group
+                    // update the features repositories in the cluster group
                     clusterRepositories.remove(url);
 
-                    for (Feature feature : repository.getFeatures()) {
+                    // update the features in the cluster group
+                    for (Feature feature : repositoryModel.getFeature()) {
                         clusterFeatures.remove(feature.getName() + "/" + feature.getVersion());
                     }
 
-                    // un-register the repository if it's not local registered
-                    if (!localRegistered)
-                        featuresService.removeRepository(new URI(url));
-
                     // broadcast a cluster event
-                    ClusterRepositoryEvent event = new ClusterRepositoryEvent(repo, RepositoryEvent.EventType.RepositoryRemoved);
+                    ClusterRepositoryEvent event = new ClusterRepositoryEvent(url, RepositoryEvent.EventType.RepositoryRemoved);
                     event.setUninstall(uninstall);
                     event.setSourceGroup(group);
                     eventProducer.produce(event);
+                } else {
+                    throw new IllegalArgumentException("Features repository URL " + url + " not found in cluster group " + groupName);
                 }
             }
         } finally {

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/037a7c9b/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoAddCommand.java
----------------------------------------------------------------------
diff --git a/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoAddCommand.java b/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoAddCommand.java
index b00a111..549e887 100644
--- a/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoAddCommand.java
+++ b/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoAddCommand.java
@@ -27,6 +27,8 @@ import org.apache.karaf.features.FeaturesService;
 import org.apache.karaf.features.Repository;
 import org.apache.karaf.features.RepositoryEvent;
 import org.apache.karaf.features.command.completers.AvailableRepoNameCompleter;
+import org.apache.karaf.features.internal.model.Features;
+import org.apache.karaf.features.internal.model.JaxbUtil;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
 import org.apache.karaf.shell.api.action.Completion;
@@ -97,41 +99,16 @@ public class RepoAddCommand extends CellarCommandSupport {
                     break;
                 }
             }
+
             if (name == null) {
-                // update the repository temporary locally
-                Repository repository = null;
-                boolean localRegistered = false;
-                // local lookup
-                for (Repository registeredRepository : featuresService.listRepositories()) {
-                    if (registeredRepository.getURI().equals(uri)) {
-                        repository = registeredRepository;
-                        break;
-                    }
-                }
-                if (repository == null) {
-                    // registered locally
-                    try {
-                        featuresService.addRepository(uri);
-                    } catch (Exception e) {
-                        System.err.println("Repository URL " + uri + " is not valid: " + e.getMessage());
-                        return null;
-                    }
-                    // get the repository
-                    for (Repository registeredRepository : featuresService.listRepositories()) {
-                        if (registeredRepository.getURI().equals(uri)) {
-                            repository = registeredRepository;
-                            break;
-                        }
-                    }
-                } else {
-                    localRegistered = true;
-                }
+                // parsing the features repository to get content
+                Features repository = JaxbUtil.unmarshal(uri.toASCIIString(), true);
 
                 // update the features repositories in the cluster group
                 clusterRepositories.put(uri.toString(), repository.getName());
 
                 // update the features in the cluster group
-                for (Feature feature : repository.getFeatures()) {
+                for (Feature feature : repository.getFeature()) {
                     FeatureState featureState = new FeatureState();
                     featureState.setName(feature.getName());
                     featureState.setVersion(feature.getVersion());
@@ -139,10 +116,6 @@ public class RepoAddCommand extends CellarCommandSupport {
                     clusterFeatures.put(feature.getName() + "/" + feature.getVersion(), featureState);
                 }
 
-                // un-register the repository if it's not local registered
-                if (!localRegistered)
-                    featuresService.removeRepository(uri);
-
                 // broadcast the cluster event
                 ClusterRepositoryEvent event = new ClusterRepositoryEvent(uri.toString(), RepositoryEvent.EventType.RepositoryAdded);
                 event.setInstall(install);

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/037a7c9b/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoRemoveCommand.java
----------------------------------------------------------------------
diff --git a/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoRemoveCommand.java b/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoRemoveCommand.java
index df03c29..65bd6df 100644
--- a/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoRemoveCommand.java
+++ b/features/src/main/java/org/apache/karaf/cellar/features/shell/RepoRemoveCommand.java
@@ -27,6 +27,8 @@ import org.apache.karaf.features.FeaturesService;
 import org.apache.karaf.features.Repository;
 import org.apache.karaf.features.RepositoryEvent;
 import org.apache.karaf.features.command.completers.InstalledRepoNameCompleter;
+import org.apache.karaf.features.internal.model.Features;
+import org.apache.karaf.features.internal.model.JaxbUtil;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
 import org.apache.karaf.shell.api.action.Completion;
@@ -121,47 +123,16 @@ public class RepoRemoveCommand extends CellarCommandSupport {
                     }
                 }
                 if (found) {
-                    // update the repository temporary locally
-                    Repository repository = null;
-                    boolean localRegistered = false;
-                    // local lookup
-                    for (Repository registeredRepository : featuresService.listRepositories()) {
-                        if (registeredRepository.getURI().equals(new URI(url))) {
-                            repository = registeredRepository;
-                            break;
-                        }
-                    }
-                    if (repository == null) {
-                        // registered locally
-                        try {
-                            featuresService.addRepository(new URI(url));
-                        } catch (Exception e) {
-                            System.err.println("Repository URL " + url + " is not valid: " + e.getMessage());
-                            continue;
-                        }
-                        // get the repository
-                        for (Repository registeredRepository : featuresService.listRepositories()) {
-                            if (registeredRepository.getURI().equals(new URI(url))) {
-                                repository = registeredRepository;
-                                break;
-                            }
-                        }
-                    } else {
-                        localRegistered = true;
-                    }
+                    Features repositoryModel = JaxbUtil.unmarshal(url, true);
 
                     // update the features repositories in the cluster group
                     clusterRepositories.remove(url);
 
                     // update the features in the cluster group
-                    for (Feature feature : repository.getFeatures()) {
+                    for (Feature feature : repositoryModel.getFeature()) {
                         clusterFeatures.remove(feature.getName() + "/" + feature.getVersion());
                     }
 
-                    // un-register the repository if it's not local registered
-                    if (!localRegistered)
-                        featuresService.removeRepository(new URI(url));
-
                     // broadcast a cluster event
                     ClusterRepositoryEvent event = new ClusterRepositoryEvent(url, RepositoryEvent.EventType.RepositoryRemoved);
                     event.setUninstall(uninstall);