Repository: karaf
Updated Branches:
  refs/heads/karaf-3.0.x 794735187 -> 869191b61


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/869191b6
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/869191b6
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/869191b6

Branch: refs/heads/karaf-3.0.x
Commit: 869191b615369e6572c9060a327e8104cade60e8
Parents: 7947351
Author: Jean-Baptiste Onofré <[email protected]>
Authored: Wed Jan 20 13:33:04 2016 +0100
Committer: Jean-Baptiste Onofré <[email protected]>
Committed: Wed Jan 20 13:33:04 2016 +0100

----------------------------------------------------------------------
 .../command/UninstallFeatureCommand.java        |  6 ++++
 .../apache/karaf/features/FeaturesService.java  |  1 +
 .../features/internal/FeaturesServiceImpl.java  | 35 ++++++++++----------
 .../management/FeaturesServiceMBean.java        |  4 +++
 .../internal/FeaturesServiceMBeanImpl.java      | 22 ++++++++++++
 5 files changed, 51 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/869191b6/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 8500f94..2e3477f 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 = "Uninstall recursive 
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/869191b6/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 52bbcec..90a77df 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,
         PrintExecptionPerFeature,
         Verbose
     }

http://git-wip-us.apache.org/repos/asf/karaf/blob/869191b6/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 dd49a85..9e65061 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
@@ -49,21 +49,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.URI;
 import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Dictionary;
-import java.util.EnumSet;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeSet;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.regex.Matcher;
@@ -730,9 +716,24 @@ public class FeaturesServiceImpl implements 
FeaturesService {
         uninstallFeature(name, version, EnumSet.noneOf(Option.class));
     }
 
+    private void recursiveFeatures(Feature feature, ArrayList<Feature> 
dependencyFeatures) throws Exception {
+        for (Dependency dependency : feature.getDependencies()) {
+            Feature inner = getFeature(dependency.getName(), 
dependency.getVersion());
+            dependencyFeatures.add(inner);
+            recursiveFeatures(inner, dependencyFeatures);
+        }
+    }
+
     public void uninstallFeature(String name, String version, EnumSet<Option> 
options) throws Exception {
-        Feature[] features = getFeatures(name, version);
-        for (Feature feature : features) {
+        ArrayList<Feature> features = new 
ArrayList<Feature>(Arrays.asList(getFeatures(name, version)));
+        ArrayList<Feature> featuresToUninstall = new ArrayList<Feature>();
+        featuresToUninstall.addAll(features);
+        if (options.contains(Option.Recursive)) {
+            for (Feature feature : features) {
+                recursiveFeatures(feature, featuresToUninstall);
+            }
+        }
+        for (Feature feature : featuresToUninstall) {
             if (installed.containsKey(feature)) {
                 boolean verbose = options != null && 
options.contains(Option.Verbose);
                 boolean refresh = options == null || 
!options.contains(Option.NoAutoRefreshBundles);

http://git-wip-us.apache.org/repos/asf/karaf/blob/869191b6/features/core/src/main/java/org/apache/karaf/features/management/FeaturesServiceMBean.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/management/FeaturesServiceMBean.java
 
b/features/core/src/main/java/org/apache/karaf/features/management/FeaturesServiceMBean.java
index 4b9284b..8b27575 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/management/FeaturesServiceMBean.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/management/FeaturesServiceMBean.java
@@ -54,10 +54,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/869191b6/features/core/src/main/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImpl.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImpl.java
 
b/features/core/src/main/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImpl.java
index bcbf199..2e33ae0 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImpl.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImpl.java
@@ -260,6 +260,17 @@ public class FeaturesServiceMBeanImpl extends 
StandardEmitterMBean implements
         featuresService.uninstallFeature(name, options);
     }
 
+    public void uninstallFeature(String name, boolean noRefresh, boolean 
recursive) throws Exception {
+        EnumSet<org.apache.karaf.features.FeaturesService.Option> options = 
EnumSet.noneOf(org.apache.karaf.features.FeaturesService.Option.class);
+        if (noRefresh) {
+            
options.add(org.apache.karaf.features.FeaturesService.Option.NoAutoRefreshBundles);
+        }
+        if (recursive) {
+            
options.add(org.apache.karaf.features.FeaturesService.Option.Recursive);
+        }
+        featuresService.uninstallFeature(name, options);
+    }
+
     public void uninstallFeature(String name, String version) throws Exception 
{
         featuresService.uninstallFeature(name, version);
     }
@@ -272,6 +283,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<org.apache.karaf.features.FeaturesService.Option> options = 
EnumSet.noneOf(org.apache.karaf.features.FeaturesService.Option.class);
+        if (noRefresh) {
+            
options.add(org.apache.karaf.features.FeaturesService.Option.NoAutoRefreshBundles);
+        }
+        if (recursive) {
+            
options.add(org.apache.karaf.features.FeaturesService.Option.Recursive);
+        }
+        featuresService.uninstallFeature(name, version, options);
+    }
+
     public void setBundleContext(BundleContext bundleContext) {
         this.bundleContext = bundleContext;
     }

Reply via email to