[177198] Filter invalid module types
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleFactory.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleFactory.java
index afb0a59..59ce708 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleFactory.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleFactory.java
@@ -12,7 +12,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.IConfigurationElement;
@@ -28,7 +27,7 @@
 public class ModuleFactory implements IOrdered {
 	private IConfigurationElement element;
 	public ModuleFactoryDelegate delegate;
-	private Set moduleTypes;
+	private List moduleTypes;
 
 	/**
 	 * ModuleFactory constructor comment.
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleType.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleType.java
index 98c675a..89b14de 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleType.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleType.java
@@ -131,7 +131,12 @@
 	}
 
 	public int hashCode() {
-		return id.hashCode() + version.hashCode();
+		int hash = 17;
+		if (id != null)
+			hash += id.hashCode();
+		if (version != null)
+			hash += version.hashCode();
+		return hash;
 	}
 
 	public boolean equals(Object obj) {
@@ -142,15 +147,23 @@
 			return false;
 		
 		ModuleType mt = (ModuleType) obj;
-		if (id != null && mt.id != null && !id.equals(mt.id))
+		if (!matches(id, mt.id))
 			return false;
 		
-		if (version != null && mt.version != null && !version.equals(mt.version))
+		if (!matches(version, mt.version))
 			return false;
 		
 		return true;
 	}
 
+	private static boolean matches(String a, String b) {
+		if (a == null || b == null || "*".equals(a) || "*".equals(b) || a.startsWith(b) || b.startsWith(a)
+			|| (a.endsWith(".*") && b.startsWith(a.substring(0, a.length() - 1)))
+			|| (b.endsWith(".*") && a.startsWith(b.substring(0, b.length() - 1))))
+			return true;
+		return false;
+	}
+
 	public String toString() {
 		return "ModuleType[" + id + ", " + version + "]";
 	}
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/RuntimeType.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/RuntimeType.java
index 7afc05d..fa32434 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/RuntimeType.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/RuntimeType.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.wst.server.core.internal;
 
-import java.util.Set;
+import java.util.List;
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
@@ -22,7 +22,7 @@
  */
 public class RuntimeType implements IRuntimeType {
 	private IConfigurationElement element;
-	private Set moduleTypes;
+	private List moduleTypes;
 
 	public RuntimeType(IConfigurationElement element) {
 		super();
@@ -94,7 +94,7 @@
 			return null;
 		}
 	}
-	
+
 	/**
 	 * Return the supported module types.
 	 * 
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerPlugin.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerPlugin.java
index 86578e8..74cc9ab 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerPlugin.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerPlugin.java
@@ -347,10 +347,10 @@
 		return s;
 	}
 
-	protected static Set getModuleTypes(IConfigurationElement[] elements) {
-		Set set = new HashSet();
+	protected static List getModuleTypes(IConfigurationElement[] elements) {
+		List list = new ArrayList();
 		if (elements == null)
-			return set;
+			return list;
 		
 		int size = elements.length;
 		for (int i = 0; i < size; i++) {
@@ -360,10 +360,10 @@
 			int sizeV = versions.length;
 			for (int j = 0; j < sizeT; j++) {
 				for (int k = 0; k < sizeV; k++)
-					set.add(ModuleType.getModuleType(types[j], versions[k]));
+					list.add(ModuleType.getModuleType(types[j], versions[k]));
 			}
 		}
-		return set;
+		return list;
 	}
 
 	public static String generateId() {