Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Keller2015-08-25 14:31:28 +0000
committerVikas Chandra2016-07-05 09:42:49 +0000
commit91057909622705d35b95a262fb8492c54c8554a6 (patch)
treea7219c94a5c9e081b655c7654dfdabd058813ee4
parent555f1a4f4bb5b2b1d999e9e60ca0f7a1c29a742b (diff)
downloadeclipse.pde.ui-91057909622705d35b95a262fb8492c54c8554a6.tar.gz
eclipse.pde.ui-91057909622705d35b95a262fb8492c54c8554a6.tar.xz
eclipse.pde.ui-91057909622705d35b95a262fb8492c54c8554a6.zip
Bug 475797: Target platform misses bundle after version of workspace bundle gets changed
Change-Id: I99506076c9e8068d4ce8cb9b3711e3eb8ee0ccbe Signed-off-by: Markus Keller <markus_keller@ch.ibm.com>
-rw-r--r--ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PDEState.java52
-rw-r--r--ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PluginModelManager.java22
2 files changed, 54 insertions, 20 deletions
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PDEState.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PDEState.java
index 51aae7e500..74f4f10fb1 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PDEState.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PDEState.java
@@ -16,12 +16,12 @@ import java.net.URL;
import java.util.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.osgi.service.resolver.BundleDescription;
-import org.eclipse.osgi.service.resolver.State;
+import org.eclipse.osgi.service.resolver.*;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.target.LoadTargetDefinitionJob;
import org.eclipse.pde.internal.core.plugin.*;
import org.eclipse.pde.internal.core.util.CoreUtility;
+import org.osgi.framework.Version;
public class PDEState extends MinimalState {
@@ -57,6 +57,54 @@ public class PDEState extends MinimalState {
private void createNewTargetState(boolean resolve, URL[] urls, IProgressMonitor monitor) {
fState = stateObjectFactory.createState(resolve);
+ if (resolve) {
+ fState.getResolver().setSelectionPolicy(new Comparator<BaseDescription>() {
+ @Override
+ public int compare(BaseDescription bd1, BaseDescription bd2) {
+ Version v1 = bd1.getVersion();
+ Version v2 = bd2.getVersion();
+ int versionCompare = versionCompare(v1, v2);
+ if (versionCompare != 0)
+ return versionCompare;
+ BundleDescription s1 = bd1.getSupplier();
+ BundleDescription s2 = bd2.getSupplier();
+ String n1 = s1.getName();
+ String n2 = s2.getName();
+ if (n1 != null && n1.equals(n2)) {
+ return versionCompare(s1.getVersion(), s2.getVersion());
+ }
+ long id1 = s1.getBundleId();
+ long id2 = s2.getBundleId();
+ return (id1 < id2) ? -1 : ((id1 == id2) ? 0 : 1);
+ }
+
+ /**
+ * Compares the given versions and prefers ".qualifier" versions over versions
+ * with any concrete qualifier.
+ *
+ * @param v1 first version
+ * @param v2 second version
+ * @return a negative number, zero, or a positive number depending on
+ * if the first version is more desired, equal amount of desire, or less desired
+ * than the second version respectively
+ */
+ private int versionCompare(Version v1, Version v2) {
+ if (v1.getMajor() == v2.getMajor() && v1.getMinor() == v2.getMinor() && v1.getMicro() == v2.getMicro()) {
+ boolean q1 = "qualifier".equals(v1.getQualifier()); //$NON-NLS-1$
+ boolean q2 = "qualifier".equals(v2.getQualifier()); //$NON-NLS-1$
+ if (q1 && q2) {
+ return 0;
+ } else if (q1 && !q2) {
+ return -1;
+ } else if (q2 && !q1) {
+ return 1;
+ }
+ }
+ int versionCompare = -(v1.compareTo(v2));
+ return versionCompare;
+ }
+ });
+ }
monitor.beginTask(PDECoreMessages.PDEState_CreatingTargetModelState, urls.length);
for (int i = 0; i < urls.length; i++) {
File file = new File(urls[i].getFile());
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PluginModelManager.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PluginModelManager.java
index dff784959c..86acef46f2 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PluginModelManager.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PluginModelManager.java
@@ -27,7 +27,6 @@ import org.eclipse.pde.core.build.IBuildEntry;
import org.eclipse.pde.core.plugin.*;
import org.eclipse.pde.core.target.*;
import org.eclipse.pde.internal.core.target.P2TargetUtils;
-import org.osgi.framework.Version;
public class PluginModelManager implements IModelProviderListener {
private static final String fExternalPluginListFile = "SavedExternalPluginList.txt"; //$NON-NLS-1$
@@ -691,29 +690,16 @@ public class PluginModelManager implements IModelProviderListener {
}
private synchronized void addWorkspaceBundleToState(Map<String, LocalModelEntry> entries, IPluginModelBase model) {
- IPluginBase pluginBase = model.getPluginBase();
- String id = pluginBase.getId();
+ String id = model.getPluginBase().getId();
if (id == null)
return;
- // Remove target models by the same ID from the state, iff the *.qualifier version from the workspace overrides them.
- // Otherwise, update target models.
- Version version = Version.parseVersion(pluginBase.getVersion());
- boolean isQualifierVersion = "qualifier".equals(version.getQualifier()); //$NON-NLS-1$
+ // update target models by the same ID from the state, if any
ModelEntry entry = entries.get(id);
if (entry != null) {
IPluginModelBase[] models = entry.getExternalModels();
- for (int i = 0; i < models.length; i++) {
- Version entryVersion = models[i].getBundleDescription().getVersion();
- if (isQualifierVersion
- && version.getMajor() == entryVersion.getMajor()
- && version.getMinor() == entryVersion.getMinor()
- && version.getMicro() == entryVersion.getMicro()) {
- fState.removeBundleDescription(models[i].getBundleDescription());
- } else {
- fState.updateBundleDescription(models[i].getBundleDescription());
- }
- }
+ for (int i = 0; i < models.length; i++)
+ fState.updateBundleDescription(models[i].getBundleDescription());
}
// add new bundle to the state

Back to the top