diff options
| author | Markus Keller | 2015-08-25 14:31:28 +0000 |
|---|---|---|
| committer | Vikas Chandra | 2016-07-05 09:42:49 +0000 |
| commit | 91057909622705d35b95a262fb8492c54c8554a6 (patch) | |
| tree | a7219c94a5c9e081b655c7654dfdabd058813ee4 | |
| parent | 555f1a4f4bb5b2b1d999e9e60ca0f7a1c29a742b (diff) | |
| download | eclipse.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.java | 52 | ||||
| -rw-r--r-- | ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PluginModelManager.java | 22 |
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 |
