bug 232405
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/UpdateCore.java b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/UpdateCore.java
index 249e947..2a6c7be 100644
--- a/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/UpdateCore.java
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/UpdateCore.java
@@ -282,7 +282,7 @@
}
}
- BundleContext getBundleContext() {
+ public BundleContext getBundleContext() {
return context;
}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/internal/operations/OperationValidator.java b/update/org.eclipse.update.core/src/org/eclipse/update/internal/operations/OperationValidator.java
index ed18e40..0ff9ba5 100644
--- a/update/org.eclipse.update.core/src/org/eclipse/update/internal/operations/OperationValidator.java
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/internal/operations/OperationValidator.java
@@ -13,44 +13,26 @@
//import java.io.*;
//import java.net.*;
//import java.nio.channels.*;
+import org.eclipse.osgi.service.resolver.PlatformAdmin;
+
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProduct;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.PluginVersionIdentifier;
+import java.util.*;
+import org.eclipse.core.runtime.*;
+import org.eclipse.osgi.service.resolver.*;
import org.eclipse.osgi.util.NLS;
-import org.eclipse.update.configuration.IConfiguredSite;
-import org.eclipse.update.configuration.IInstallConfiguration;
-import org.eclipse.update.configuration.ILocalSite;
+import org.eclipse.update.configuration.*;
import org.eclipse.update.configurator.ConfiguratorUtils;
import org.eclipse.update.configurator.IPlatformConfiguration;
-import org.eclipse.update.core.IFeature;
-import org.eclipse.update.core.IFeatureReference;
-import org.eclipse.update.core.IImport;
-import org.eclipse.update.core.IIncludedFeatureReference;
-import org.eclipse.update.core.IPluginEntry;
-import org.eclipse.update.core.ISiteFeatureReference;
-import org.eclipse.update.core.IURLEntry;
-import org.eclipse.update.core.SiteManager;
-import org.eclipse.update.core.VersionedIdentifier;
+import org.eclipse.update.core.*;
import org.eclipse.update.internal.configurator.PlatformConfiguration;
import org.eclipse.update.internal.core.Messages;
import org.eclipse.update.internal.core.UpdateCore;
import org.eclipse.update.operations.IInstallFeatureOperation;
import org.eclipse.update.operations.IOperationValidator;
-import org.osgi.framework.Bundle;
+import org.osgi.framework.*;
/**
*
@@ -926,6 +908,11 @@
if (found)
break;
}
+
+ // perhaps the bundle that we are looking for was installed
+ // but isn't a part of a feature
+ if (!found && !featurePrereq)
+ found = isInstalled(iid, rule, ignoreVersion);
if (!found) {
// report status
@@ -975,6 +962,46 @@
return result;
}
+
+ /*
+ * Return a boolean value indicating whether or not the bundle with the given id and version
+ * is installed in the system.
+ */
+ private static boolean isInstalled(VersionedIdentifier vid, int rule, boolean ignoreVersion) {
+ BundleContext context = UpdateCore.getPlugin().getBundleContext();
+ if (context == null)
+ return false;
+ ServiceReference reference = context.getServiceReference(PlatformAdmin.class.getName());
+ if (reference == null)
+ return false;
+ PlatformAdmin admin = (PlatformAdmin) context.getService(reference);
+ try {
+ State state = admin.getState(false);
+ String id = vid.getIdentifier();
+ PluginVersionIdentifier version = vid.getVersion();
+ BundleDescription[] bundles = state.getBundles(id);
+ if (bundles == null || bundles.length == 0)
+ return false;
+ for (int i=0; i<bundles.length; i++) {
+ BundleDescription bundle = bundles[i];
+ PluginVersionIdentifier cversion = new PluginVersionIdentifier(bundle.getVersion().toString());
+ // have a candidate
+ if (ignoreVersion)
+ return true;
+ if (rule == IImport.RULE_PERFECT && cversion.isPerfect(version))
+ return true;
+ else if (rule == IImport.RULE_EQUIVALENT && cversion.isEquivalentTo(version))
+ return true;
+ else if (rule == IImport.RULE_COMPATIBLE && cversion.isCompatibleWith(version))
+ return true;
+ else if (rule == IImport.RULE_GREATER_OR_EQUAL && cversion.isGreaterOrEqualTo(version))
+ return true;
+ }
+ return false;
+ } finally {
+ context.ungetService(reference);
+ }
+ }
/*
* Verify we end up with valid nested features after revert