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; }
