10719 - Non-latest fragment still contributing to plugin (1.0)
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/plugins/RegistryResolver.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/plugins/RegistryResolver.java
index c120b5d..bfe6e22 100644
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/plugins/RegistryResolver.java
+++ b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/plugins/RegistryResolver.java
@@ -512,7 +512,6 @@
 private void linkFragments() {

 	ArrayList retained = new ArrayList(5);

 	PluginFragmentModel[] fragments = reg.getFragments();

-	HashSet seen = new HashSet(5);

 	for (int i = 0; i < fragments.length; i++) {

 		PluginFragmentModel fragment = fragments[i];

 		if (!requiredFragment(fragment)) {

@@ -525,9 +524,7 @@
 				error (Policy.bind("parse.fragmentMissingIdName"));

 			continue;

 		}

-		if (seen.contains(fragment.getId()))

-			continue;

-		seen.add(fragment.getId());

+

 		// Patch for doing a 'compatible' match for plugin id.

 		PluginDescriptorModel plugin = null;

 		IndexEntry ix = (IndexEntry) idmap.get(fragment.getPluginId());

@@ -548,8 +545,7 @@
 		if (plugin == null)

 			// XXX log something here?

 			continue;

-		// PluginFragmentModel[] list = reg.getFragments(fragment.getId());

-		// resolvePluginFragments(list, plugin);

+

 		PluginFragmentModel[] list = plugin.getFragments();

 		PluginFragmentModel[] newList;

 		if (list == null) {

@@ -821,51 +817,53 @@
 		for (int i = 0; i < prerequisites.length; i++)

 			addPrerequisites(prerequisites[i], plugin);

 }

+private PluginVersionIdentifier getVersionIdentifier(PluginFragmentModel fragment) {

+	String version = fragment.getVersion();

+	if (version == null)

+		return new PluginVersionIdentifier("1.0.0");

+	try {

+		return new PluginVersionIdentifier(version);

+	} catch (Throwable e) {

+		return new PluginVersionIdentifier("1.0.0");

+	}

+}

 private void resolvePluginFragments(PluginDescriptorModel plugin) {

 	PluginFragmentModel[] fragmentList = plugin.getFragments();

-	while (fragmentList != null) {

-		ArrayList fragmentsWithId = new ArrayList();

-		ArrayList fragmentsToProcessLater = new ArrayList();

-		String currentFragmentId = fragmentList[0].getId();

-		for (int i = 0; i < fragmentList.length; i++) {

-			if (currentFragmentId.equals(fragmentList[i].getId())) {

-				fragmentsWithId.add(fragmentList[i]);

-			} else {

-				fragmentsToProcessLater.add(fragmentList[i]);

-			}

-		}

-		

-		PluginFragmentModel[] fragments;

-		if (fragmentsWithId.isEmpty())

-			fragments = null;

-		else

-			fragments = (PluginFragmentModel[]) fragmentsWithId.toArray(new PluginFragmentModel[fragmentsWithId.size()]);

-		

-		if (fragmentsToProcessLater.isEmpty())

-			fragmentList = null;

-		else

-			fragmentList = (PluginFragmentModel[]) fragmentsToProcessLater.toArray(new PluginFragmentModel[fragmentsToProcessLater.size()]);

-			

-		if (fragments != null) {

-			PluginFragmentModel latestFragment = null;

-			PluginVersionIdentifier latestVersion = null;

-			PluginVersionIdentifier targetVersion = new PluginVersionIdentifier(plugin.getVersion());

-			for (int i = 0; i < fragments.length; i++) {

-				PluginFragmentModel fragment = fragments[i];

-				PluginVersionIdentifier fragmentVersion = new PluginVersionIdentifier(fragment.getVersion());

-				PluginVersionIdentifier pluginVersion = new PluginVersionIdentifier(fragment.getPluginVersion());

-				if (targetVersion.isCompatibleWith(pluginVersion))

-				// if (pluginVersion.getMajorComponent() == targetVersion.getMajorComponent() && pluginVersion.getMinorComponent() == targetVersion.getMinorComponent())

-					if (latestFragment == null || fragmentVersion.isGreaterThan(latestVersion)) {

-						latestFragment = fragment;

-						latestVersion = fragmentVersion;

-					}

-			}

-			if (latestFragment != null) {

-				resolvePluginFragment(latestFragment, plugin);

+	

+	// Iterate over all of the fragment versions to ensure that we pick up the

+	// latest one.

+	HashMap latestVersions = new HashMap(30);

+	boolean dirty = false;

+	for (int i=0; i<fragmentList.length; i++) {

+		PluginFragmentModel fragment = fragmentList[i];

+		String fragmentId = fragment.getId();

+		PluginFragmentModel latestVersion = (PluginFragmentModel) latestVersions.get(fragmentId);

+		// Haven't encountered another version of this fragment yet so add it to the table.

+		// Otherwise only add the fragment to the table if it is a greater version.

+		if (latestVersion == null) {

+			latestVersions.put(fragmentId, fragment);

+		} else {

+			dirty = true;

+			if (getVersionIdentifier(fragment).isGreaterThan(getVersionIdentifier(latestVersion))) {

+				latestVersions.put(fragmentId, fragment);

 			}

 		}

 	}

+	

+	// Resolve each fragment now that we are dealing only with the latest one.

+	Set set = new HashSet();

+	for (Iterator i=latestVersions.values().iterator(); i.hasNext();) {

+		PluginFragmentModel latest = (PluginFragmentModel) i.next();

+		if (dirty)

+			set.add(latest);

+		resolvePluginFragment(latest, plugin);

+	}

+	

+	// Currently the fragments on the plugin include all fragment versions, if we

+	// had any fragments with the same id but multiple versions, only include the latest

+	// version in the plugin's list of fragments.

+	if (dirty)

+		plugin.setFragments((PluginFragmentModel[]) set.toArray(new PluginFragmentModel[set.size()]));

 }

 private void resolvePluginRegistry() {

 	// filter out disabled plugins from "live" registry