Bug 367187 - [patch] Product validation doesn't find plugin needed in
two versions

Signed-off-by: George Suaridze <suag@1c.ru>
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/product/ProductValidateAction.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/product/ProductValidateAction.java
index 8693c8c..20ab180 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/product/ProductValidateAction.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/product/ProductValidateAction.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2012 EclipseSource Corporation and others.
+ * Copyright (c) 2009, 2014 EclipseSource Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -20,6 +20,7 @@
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.pde.core.plugin.IPluginModelBase;
 import org.eclipse.pde.core.plugin.PluginRegistry;
+import org.eclipse.pde.core.plugin.IMatchRules;
 import org.eclipse.pde.internal.core.*;
 import org.eclipse.pde.internal.core.ifeature.*;
 import org.eclipse.pde.internal.core.iproduct.*;
@@ -37,25 +38,25 @@
 	}
 
 	public void run() {
-		HashMap<String, IPluginModelBase> map = new HashMap<String, IPluginModelBase>();
+		Set<IPluginModelBase> launchPlugins = new HashSet<IPluginModelBase>();
 		if (fProduct.useFeatures()) {
 			IFeatureModel[] features = getUniqueFeatures();
 			for (int i = 0; i < features.length; i++) {
-				addFeaturePlugins(features[i].getFeature(), map);
+				addFeaturePlugins(features[i].getFeature(), launchPlugins);
 			}
 		} else {
 			IProductPlugin[] plugins = fProduct.getPlugins();
 			for (int i = 0; i < plugins.length; i++) {
 				String id = plugins[i].getId();
-				if (id == null || map.containsKey(id))
+				if (id == null)
 					continue;
 				IPluginModelBase model = PluginRegistry.findModel(id);
-				if (model != null && TargetPlatformHelper.matchesCurrentEnvironment(model))
-					map.put(id, model);
+				if (model != null && !launchPlugins.contains(model) && TargetPlatformHelper.matchesCurrentEnvironment(model))
+					launchPlugins.add(model);
 			}
 		}
 		try {
-			IPluginModelBase[] models = map.values().toArray(new IPluginModelBase[map.size()]);
+			IPluginModelBase[] models = launchPlugins.toArray(new IPluginModelBase[launchPlugins.size()]);
 			LaunchValidationOperation operation = new ProductValidationOperation(models);
 			LaunchPluginValidator.runValidationOperation(operation, new NullProgressMonitor());
 			if (!operation.hasErrors()) {
@@ -66,15 +67,18 @@
 		}
 	}
 
-	private void addFeaturePlugins(IFeature feature, HashMap<String, IPluginModelBase> map) {
+	private void addFeaturePlugins(IFeature feature, Set<IPluginModelBase> launchPlugins) {
 		IFeaturePlugin[] plugins = feature.getPlugins();
 		for (int i = 0; i < plugins.length; i++) {
 			String id = plugins[i].getId();
-			if (id == null || map.containsKey(id))
+			String version = plugins[i].getVersion();
+			if (id == null || version == null)
 				continue;
-			IPluginModelBase model = PluginRegistry.findModel(id);
-			if (model != null && TargetPlatformHelper.matchesCurrentEnvironment(model))
-				map.put(id, model);
+			IPluginModelBase model = PluginRegistry.findModel(id, version, IMatchRules.EQUIVALENT, null);
+			if (model == null)
+				model = PluginRegistry.findModel(id);
+			if (model != null && !launchPlugins.contains(model) && TargetPlatformHelper.matchesCurrentEnvironment(model))
+				launchPlugins.add(model);
 		}
 	}
 
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/LaunchAction.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/LaunchAction.java
index edbe486..0c6f7a7 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/LaunchAction.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/LaunchAction.java
@@ -23,6 +23,7 @@
 import org.eclipse.jface.window.Window;
 import org.eclipse.pde.core.plugin.IPluginModelBase;
 import org.eclipse.pde.core.plugin.PluginRegistry;
+import org.eclipse.pde.core.plugin.IMatchRules;
 import org.eclipse.pde.internal.core.*;
 import org.eclipse.pde.internal.core.ifeature.*;
 import org.eclipse.pde.internal.core.iproduct.*;
@@ -173,24 +174,24 @@
 	}
 
 	private IPluginModelBase[] getModels() {
-		HashMap<String, IPluginModelBase> map = new HashMap<String, IPluginModelBase>();
+		Set<IPluginModelBase> launchPlugins = new HashSet<IPluginModelBase>();
 		if (fProduct.useFeatures()) {
 			IFeatureModel[] features = getUniqueFeatures();
 			for (int i = 0; i < features.length; i++) {
-				addFeaturePlugins(features[i].getFeature(), map);
+				addFeaturePlugins(features[i].getFeature(), launchPlugins);
 			}
 		} else {
 			IProductPlugin[] plugins = fProduct.getPlugins();
 			for (int i = 0; i < plugins.length; i++) {
 				String id = plugins[i].getId();
-				if (id == null || map.containsKey(id))
+				if (id == null)
 					continue;
 				IPluginModelBase model = PluginRegistry.findModel(id);
 				if (model != null && TargetPlatformHelper.matchesCurrentEnvironment(model))
-					map.put(id, model);
+					launchPlugins.add(model);
 			}
 		}
-		return map.values().toArray(new IPluginModelBase[map.size()]);
+		return launchPlugins.toArray(new IPluginModelBase[launchPlugins.size()]);
 	}
 
 	private IFeatureModel[] getUniqueFeatures() {
@@ -218,15 +219,18 @@
 		}
 	}
 
-	private void addFeaturePlugins(IFeature feature, HashMap<String, IPluginModelBase> map) {
+	private void addFeaturePlugins(IFeature feature, Set<IPluginModelBase> launchPlugins) {
 		IFeaturePlugin[] plugins = feature.getPlugins();
 		for (int i = 0; i < plugins.length; i++) {
 			String id = plugins[i].getId();
-			if (id == null || map.containsKey(id))
+			String version = plugins[i].getVersion();
+			if (id == null || version == null)
 				continue;
-			IPluginModelBase model = PluginRegistry.findModel(id);
-			if (model != null && TargetPlatformHelper.matchesCurrentEnvironment(model))
-				map.put(id, model);
+			IPluginModelBase model = PluginRegistry.findModel(id, version, IMatchRules.EQUIVALENT, null);
+			if (model == null)
+				model = PluginRegistry.findModel(id);
+			if (model != null && !launchPlugins.contains(model) && TargetPlatformHelper.matchesCurrentEnvironment(model))
+				launchPlugins.add(model);
 		}
 	}