Repository: karaf
Updated Branches:
  refs/heads/karaf-2.x 65e6e3260 -> f369535c1


KARAF-1047 - Add recursive support on features uninstall


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

Branch: refs/heads/karaf-2.x
Commit: f369535c17c7cfee26f0095ab0252a10e7e43876
Parents: 65e6e32
Author: Jean-Baptiste Onofré <[email protected]>
Authored: Wed Jan 20 11:51:32 2016 +0100
Committer: Jean-Baptiste Onofré <[email protected]>
Committed: Wed Jan 20 11:51:32 2016 +0100

----------------------------------------------------------------------
 .../command/UninstallFeatureCommand.java        |  6 ++++++
 .../apache/karaf/features/FeaturesService.java  |  1 +
 .../features/internal/FeaturesServiceImpl.java  | 10 +++++++++
 .../karaf/features/FeaturesServiceTest.java     |  2 --
 .../management/FeaturesServiceMBean.java        |  4 ++++
 .../internal/FeaturesServiceMBeanImpl.java      | 22 ++++++++++++++++++++
 6 files changed, 43 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/f369535c/features/command/src/main/java/org/apache/karaf/features/command/UninstallFeatureCommand.java
----------------------------------------------------------------------
diff --git 
a/features/command/src/main/java/org/apache/karaf/features/command/UninstallFeatureCommand.java
 
b/features/command/src/main/java/org/apache/karaf/features/command/UninstallFeatureCommand.java
index 154ffe9..b82e0be 100644
--- 
a/features/command/src/main/java/org/apache/karaf/features/command/UninstallFeatureCommand.java
+++ 
b/features/command/src/main/java/org/apache/karaf/features/command/UninstallFeatureCommand.java
@@ -33,6 +33,9 @@ public class UninstallFeatureCommand extends 
FeaturesCommandSupport {
     @Option(name = "-r", aliases = "--no-auto-refresh", description = "Do not 
automatically refresh bundles", required = false, multiValued = false)
     boolean noRefresh;
 
+    @Option(name = "--recursive", description = "Recursively uninstall 
features", required = false, multiValued = false)
+    boolean recursive;
+
     @Option(name = "-v", aliases = "--verbose", description = "Explain what is 
being done", required = false, multiValued = false)
     boolean verbose;
 
@@ -45,6 +48,9 @@ public class UninstallFeatureCommand extends 
FeaturesCommandSupport {
         if (verbose) {
             options.add(FeaturesService.Option.Verbose);
         }
+        if (recursive) {
+            options.add(FeaturesService.Option.Recursive);
+        }
         for (String feature : features) {
             String[] split = feature.split("/");
             String name = split[0];

http://git-wip-us.apache.org/repos/asf/karaf/blob/f369535c/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java 
b/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java
index dd26698..d8c6bfc 100644
--- a/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java
+++ b/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java
@@ -31,6 +31,7 @@ public interface FeaturesService {
         NoAutoRefreshBundles,
         NoAutoStartBundles,
         ContinueBatchOnFailure,
+        Recursive,
         Verbose,
         Boot
     }

http://git-wip-us.apache.org/repos/asf/karaf/blob/f369535c/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
index a45d3e9..65f48fe 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
@@ -1153,6 +1153,13 @@ public class FeaturesServiceImpl implements 
FeaturesService {
         uninstallFeature(name, version, EnumSet.noneOf(Option.class));
     }
 
+    private void recursiveFeatures(Feature feature, ArrayList<Feature> 
dependencyFeatures) {
+        for (Feature inner : feature.getDependencies()) {
+            dependencyFeatures.add(inner);
+            recursiveFeatures(inner, dependencyFeatures);
+        }
+    }
+
     public void uninstallFeature(String name, String version, EnumSet<Option> 
options) throws Exception {
         ArrayList<Exception> exceptions = new ArrayList<Exception>();
         Feature[] features = getFeatures(name, version);
@@ -1160,6 +1167,9 @@ public class FeaturesServiceImpl implements 
FeaturesService {
         for (Feature feature : features) {
             if (installed.containsKey(feature)) {
                 featuresToUninstall.add(feature);
+                if (options.contains(Option.Recursive)) {
+                    recursiveFeatures(feature, featuresToUninstall);
+                }
             }
         }
         if (featuresToUninstall.isEmpty()) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/f369535c/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
 
b/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
index 5f6775c..c7399db 100644
--- 
a/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
+++ 
b/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
@@ -16,7 +16,6 @@
  */
 package org.apache.karaf.features;
 
-import static org.easymock.EasyMock.aryEq;
 import static org.easymock.EasyMock.eq;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.isA;
@@ -58,7 +57,6 @@ import org.osgi.framework.FrameworkEvent;
 import org.osgi.framework.FrameworkListener;
 import org.osgi.framework.wiring.FrameworkWiring;
 import org.osgi.service.log.LogService;
-import org.osgi.service.packageadmin.PackageAdmin;
 
 import static org.easymock.EasyMock.*;
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/f369535c/features/management/src/main/java/org/apache/karaf/features/management/FeaturesServiceMBean.java
----------------------------------------------------------------------
diff --git 
a/features/management/src/main/java/org/apache/karaf/features/management/FeaturesServiceMBean.java
 
b/features/management/src/main/java/org/apache/karaf/features/management/FeaturesServiceMBean.java
index 30e3d9c..a4781c6 100644
--- 
a/features/management/src/main/java/org/apache/karaf/features/management/FeaturesServiceMBean.java
+++ 
b/features/management/src/main/java/org/apache/karaf/features/management/FeaturesServiceMBean.java
@@ -58,10 +58,14 @@ public interface FeaturesServiceMBean {
 
     void uninstallFeature(String name, boolean noRefresh) throws Exception;
 
+    void uninstallFeature(String name, boolean noRefresh, boolean recursive) 
throws Exception;
+
     void uninstallFeature(String name, String version) throws Exception;
 
     void uninstallFeature(String name, String version, boolean noRefresh) 
throws Exception;
 
+    void uninstallFeature(String name, String version, boolean noRefresh, 
boolean recursive) throws Exception;
+
     String FEATURE_NAME = "Name";
 
     String FEATURE_VERSION = "Version";

http://git-wip-us.apache.org/repos/asf/karaf/blob/f369535c/features/management/src/main/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImpl.java
----------------------------------------------------------------------
diff --git 
a/features/management/src/main/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImpl.java
 
b/features/management/src/main/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImpl.java
index 0e577ea..ab9919e 100644
--- 
a/features/management/src/main/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImpl.java
+++ 
b/features/management/src/main/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImpl.java
@@ -293,6 +293,17 @@ public class FeaturesServiceMBeanImpl extends 
StandardEmitterMBean implements
         featuresService.uninstallFeature(name, options);
     }
 
+    public void uninstallFeature(String name, boolean noRefresh, boolean 
recursive) throws Exception {
+        EnumSet<FeaturesService.Option> options = 
EnumSet.noneOf(FeaturesService.Option.class);
+        if (noRefresh) {
+            options.add(FeaturesService.Option.NoAutoRefreshBundles);
+        }
+        if (recursive) {
+            options.add(FeaturesService.Option.Recursive);
+        }
+        featuresService.uninstallFeature(name, options);
+    }
+
     public void uninstallFeature(String name, String version) throws Exception 
{
         featuresService.uninstallFeature(name, version);
     }
@@ -305,6 +316,17 @@ public class FeaturesServiceMBeanImpl extends 
StandardEmitterMBean implements
         featuresService.uninstallFeature(name, version, options);
     }
 
+    public void uninstallFeature(String name, String version, boolean 
noRefresh, boolean recursive) throws Exception {
+        EnumSet<FeaturesService.Option> options = 
EnumSet.noneOf(FeaturesService.Option.class);
+        if (noRefresh) {
+            options.add(FeaturesService.Option.NoAutoRefreshBundles);
+        }
+        if (recursive) {
+            options.add(FeaturesService.Option.Recursive);
+        }
+        featuresService.uninstallFeature(name, version, options);
+    }
+
     public void setBundleContext(BundleContext bundleContext) {
         this.bundleContext = bundleContext;
     }

Reply via email to