Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 475797 | Differences between
and this patch

Collapse All | Expand All

(-)a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PDEState.java (-2 / +50 lines)
Lines 16-27 Link Here
16
import java.util.*;
16
import java.util.*;
17
import org.eclipse.core.runtime.CoreException;
17
import org.eclipse.core.runtime.CoreException;
18
import org.eclipse.core.runtime.IProgressMonitor;
18
import org.eclipse.core.runtime.IProgressMonitor;
19
import org.eclipse.osgi.service.resolver.BundleDescription;
19
import org.eclipse.osgi.service.resolver.*;
20
import org.eclipse.osgi.service.resolver.State;
21
import org.eclipse.pde.core.plugin.IPluginModelBase;
20
import org.eclipse.pde.core.plugin.IPluginModelBase;
22
import org.eclipse.pde.core.target.LoadTargetDefinitionJob;
21
import org.eclipse.pde.core.target.LoadTargetDefinitionJob;
23
import org.eclipse.pde.internal.core.plugin.*;
22
import org.eclipse.pde.internal.core.plugin.*;
24
import org.eclipse.pde.internal.core.util.CoreUtility;
23
import org.eclipse.pde.internal.core.util.CoreUtility;
24
import org.osgi.framework.Version;
25
25
26
public class PDEState extends MinimalState {
26
public class PDEState extends MinimalState {
27
27
Lines 57-62 Link Here
57
57
58
	private void createNewTargetState(boolean resolve, URL[] urls, IProgressMonitor monitor) {
58
	private void createNewTargetState(boolean resolve, URL[] urls, IProgressMonitor monitor) {
59
		fState = stateObjectFactory.createState(resolve);
59
		fState = stateObjectFactory.createState(resolve);
60
		if (resolve) {
61
			fState.getResolver().setSelectionPolicy(new Comparator<BaseDescription>() {
62
				@Override
63
				public int compare(BaseDescription bd1, BaseDescription bd2) {
64
					Version v1 = bd1.getVersion();
65
					Version v2 = bd2.getVersion();
66
					int versionCompare = versionCompare(v1, v2);
67
					if (versionCompare != 0)
68
						return versionCompare;
69
					BundleDescription s1 = bd1.getSupplier();
70
					BundleDescription s2 = bd2.getSupplier();
71
					String n1 = s1.getName();
72
					String n2 = s2.getName();
73
					if (n1 != null && n1.equals(n2)) {
74
						return versionCompare(s1.getVersion(), s2.getVersion());
75
					}
76
					long id1 = s1.getBundleId();
77
					long id2 = s2.getBundleId();
78
					return (id1 < id2) ? -1 : ((id1 == id2) ? 0 : 1);
79
				}
80
81
				/**
82
				 * Compares the given versions and prefers ".qualifier" versions over versions
83
				 * with any concrete qualifier.
84
				 * 
85
				 * @param v1 first version
86
				 * @param v2 second version
87
				 * @return a negative number, zero, or a positive number depending on
88
				 * if the first version is more desired, equal amount of desire, or less desired
89
				 * than the second version respectively
90
				 */
91
				private int versionCompare(Version v1, Version v2) {
92
					if (v1.getMajor() == v2.getMajor() && v1.getMinor() == v2.getMinor() && v1.getMicro() == v2.getMicro()) {
93
						boolean q1 = "qualifier".equals(v1.getQualifier()); //$NON-NLS-1$
94
						boolean q2 = "qualifier".equals(v2.getQualifier()); //$NON-NLS-1$
95
						if (q1 && q2) {
96
							return 0;
97
						} else if (q1 && !q2) {
98
							return -1;
99
						} else if (q2 && !q1) {
100
							return 1;
101
						}
102
					}
103
					int versionCompare = -(v1.compareTo(v2));
104
					return versionCompare;
105
				}
106
			});
107
		}
60
		monitor.beginTask(PDECoreMessages.PDEState_CreatingTargetModelState, urls.length);
108
		monitor.beginTask(PDECoreMessages.PDEState_CreatingTargetModelState, urls.length);
61
		for (int i = 0; i < urls.length; i++) {
109
		for (int i = 0; i < urls.length; i++) {
62
			File file = new File(urls[i].getFile());
110
			File file = new File(urls[i].getFile());
(-)a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PluginModelManager.java (-20 / +23 lines)
Lines 27-33 Link Here
27
import org.eclipse.pde.core.plugin.*;
27
import org.eclipse.pde.core.plugin.*;
28
import org.eclipse.pde.core.target.*;
28
import org.eclipse.pde.core.target.*;
29
import org.eclipse.pde.internal.core.target.P2TargetUtils;
29
import org.eclipse.pde.internal.core.target.P2TargetUtils;
30
import org.osgi.framework.Version;
31
30
32
public class PluginModelManager implements IModelProviderListener {
31
public class PluginModelManager implements IModelProviderListener {
33
	private static final String fExternalPluginListFile = "SavedExternalPluginList.txt"; //$NON-NLS-1$
32
	private static final String fExternalPluginListFile = "SavedExternalPluginList.txt"; //$NON-NLS-1$
Lines 691-719 Link Here
691
	}
690
	}
692
691
693
	private synchronized void addWorkspaceBundleToState(Map<String, LocalModelEntry> entries, IPluginModelBase model) {
692
	private synchronized void addWorkspaceBundleToState(Map<String, LocalModelEntry> entries, IPluginModelBase model) {
694
		IPluginBase pluginBase = model.getPluginBase();
693
		String id = model.getPluginBase().getId();
695
		String id = pluginBase.getId();
696
		if (id == null)
694
		if (id == null)
697
			return;
695
			return;
698
696
699
		// Remove target models by the same ID from the state, iff the *.qualifier version from the workspace overrides them.
697
		// update target models by the same ID from the state, if any
700
		// Otherwise, update target models.
701
		Version version = Version.parseVersion(pluginBase.getVersion());
702
		boolean isQualifierVersion = "qualifier".equals(version.getQualifier()); //$NON-NLS-1$
703
		ModelEntry entry = entries.get(id);
698
		ModelEntry entry = entries.get(id);
704
		if (entry != null) {
699
		if (entry != null) {
705
			IPluginModelBase[] models = entry.getExternalModels();
700
			IPluginModelBase[] models = entry.getExternalModels();
706
			for (int i = 0; i < models.length; i++) {
701
			for (int i = 0; i < models.length; i++)
707
				Version entryVersion = models[i].getBundleDescription().getVersion();
702
				fState.updateBundleDescription(models[i].getBundleDescription());
708
				if (isQualifierVersion
709
						&& version.getMajor() == entryVersion.getMajor()
710
						&& version.getMinor() == entryVersion.getMinor()
711
						&& version.getMicro() == entryVersion.getMicro()) {
712
					fState.removeBundleDescription(models[i].getBundleDescription());
713
				} else {
714
					fState.updateBundleDescription(models[i].getBundleDescription());
715
				}
716
			}
717
		}
703
		}
718
704
719
		// add new bundle to the state
705
		// add new bundle to the state
Lines 939-946 Link Here
939
						break;
925
						break;
940
					}
926
					}
941
				}
927
				}
942
				if (isActive)
928
				if (isActive) {
943
					fState.addBundle(model, true);
929
					// refresh everything related to this bundle model id
930
					fEntries.remove(newID);
931
					fState.removeBundleDescription(desc);
932
					for (int i = 0; i < fExternalManager.getAllModels().length; i++) {
933
						IPluginModelBase modelExternal = fExternalManager.getAllModels()[i];
934
						if (modelExternal.getPluginBase().getId().equals(newID)) {
935
							addToTable(fEntries, new IPluginModelBase[] { modelExternal });
936
						}
937
					}
938
					IPluginModelBase[] models = fWorkspaceManager.getPluginModels();
939
					for (int i = 0; i < models.length; i++) {
940
						IPluginModelBase modelWorkspace = models[i];
941
						if (modelWorkspace.getPluginBase().getId().equals(newID)) {
942
							addToTable(fEntries, new IPluginModelBase[] { modelWorkspace });
943
							addWorkspaceBundleToState(fEntries, modelWorkspace);
944
						}
945
					}
946
				}
944
			} else
947
			} else
945
				// if the target plug-in has become disabled/unchecked, remove its bundle
948
				// if the target plug-in has become disabled/unchecked, remove its bundle
946
				// description from the state
949
				// description from the state

Return to bug 475797