public void uninstallFeature(String name, String version) throws Exception {
uninstallFeature(name, version, EnumSet.noneOf(Option.class));
}
public void uninstallFeature(String name, String version, EnumSet<Option> options) throws Exception {
Feature feature = getFeature(name, version);
if (feature == null || !installed.containsKey(feature)) {
throw new Exception("Feature named '" + name + "' with version '" + version + "' is not installed");
}
boolean verbose = options != null && options.contains(Option.Verbose);
boolean refresh = options == null || !options.contains(Option.NoAutoRefreshBundles);
String msg = "Uninstalling feature " + feature.getName() + " " + feature.getVersion();
LOGGER.info(msg);
if (verbose) {
System.out.println(msg);
}
// Grab all the bundles installed by this feature
// and remove all those who will still be in use.
// This gives this list of bundles to uninstall.
Set<Long> bundles = installed.remove(feature);
//Also remove bundles installed as conditionals
for (Conditional conditional : feature.getConditional()) {
Feature conditionalFeature = conditional.asFeature(feature.getName(),feature.getVersion());
if (installed.containsKey(conditionalFeature)) {
msg = "Uninstalling feature " + conditionalFeature.getName() + " " + conditionalFeature.getVersion();
LOGGER.info(msg);
if (verbose) {
System.out.println(msg);
}
bundles.addAll(installed.remove(conditionalFeature));
} else {
LOGGER.info("Conditional feature {}, hasn't been installed!");
}
}
for (Feature f : new HashSet<Feature>(installed.keySet())) {
f = getFeature(f.getName(), f.getVersion());
if (f != null) {
for (Conditional conditional : f.getConditional()) {
boolean satisfied = true;
for (Dependency dep : conditional.getCondition()) {
Feature df = getFeatureForDependency(dep);
satisfied &= installed.containsKey(df);
}
if (!satisfied) {
Feature conditionalFeature = conditional.asFeature(f.getName(), f.getVersion());
if (installed.containsKey(conditionalFeature)) {
msg = "Uninstalling feature " + conditionalFeature.getName() + " " + conditionalFeature.getVersion();
LOGGER.info(msg);
if (verbose) {
System.out.println(msg);
}
bundles.addAll(installed.remove(conditionalFeature));