[177198] Filter invalid module types from factory
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/ServerCore.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/ServerCore.java
index fcf4333..b2812a4 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/ServerCore.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/ServerCore.java
@@ -1,5 +1,5 @@
 /**********************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
+ * Copyright (c) 2003, 2007 IBM 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
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/ServerUtil.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/ServerUtil.java
index c2af851..477aea4 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/ServerUtil.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/ServerUtil.java
@@ -98,12 +98,8 @@
 				if (modules != null) {
 					int size2 = modules.length;
 					for (int j = 0; j < size2; j++) {
-						if (!set.contains(modules[j])) {
-							if (isSupportedModule(factories[i].getModuleTypes(), modules[j].getModuleType()))
-								set.add(modules[j]);
-							else
-								Trace.trace(Trace.WARNING, "Invalid module returned from factory, ignored: " + modules[j]);
-						}
+						if (!set.contains(modules[j]))
+							set.add(modules[j]);
 					}
 				}
 			}
@@ -201,7 +197,7 @@
 					if (modules != null) {
 						int size2 = modules.length;
 						for (int j = 0; j < size2; j++)
-							if(type.equals(modules[j].getModuleType().getId()))
+							if (type.equals(modules[j].getModuleType().getId()))
 								list.add(modules[j]);
 					}
 				}
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/DeletedModule.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/DeletedModule.java
index a33d5d5..06f64fb 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/DeletedModule.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/DeletedModule.java
@@ -49,14 +49,6 @@
 		return null;
 	}
 
-	public void addModuleListener(IModuleListener listener) {
-		// ignore
-	}
-
-	public void removeModuleListener(IModuleListener listener) {
-		// ignore
-	}
-
 	public IModule[] getChildModules(IProgressMonitor monitor) {
 		return null;
 	}
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/IModuleListener.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/IModuleListener.java
deleted file mode 100644
index ad03292..0000000
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/IModuleListener.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.server.core.internal;
-/**
- * 
- */
-public interface IModuleListener {
-	/**
-	 * A module has been changed as specified in the event.
-	 *
-	 * @param event org.eclipse.wst.server.core.model.ModuleEvent
-	 */
-	public void moduleChanged(ModuleEvent event);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Module.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Module.java
index da6c864..fdf0036 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Module.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Module.java
@@ -23,8 +23,7 @@
 	protected String id;
 	protected String name;
 	protected ModuleFactory factory;
-	protected String type;
-	protected String version;
+	protected ModuleType moduleType;
 	protected IProject project;
 	protected ModuleDelegate delegate;
 	protected String id2;
@@ -43,8 +42,7 @@
 		super();
 		this.factory = factory;
 		this.project = project;
-		this.type = type;
-		this.version = version;
+		this.moduleType = ModuleType.getModuleType(type, version);
 		this.id = id;
 		this.name = name;
 		if (factory != null)
@@ -78,7 +76,7 @@
 	 * @return the module type
 	 */
 	public IModuleType getModuleType() {
-		return new ModuleType(type, version);
+		return moduleType;
 	}
 
 	/**
@@ -215,6 +213,9 @@
 	}
 
 	public boolean equals(Object obj) {
+		if (obj == this)
+			return true;
+		
 		if (!(obj instanceof IModule))
 			return false;
 		
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleEvent.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleEvent.java
deleted file mode 100644
index a39dd4f..0000000
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleEvent.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2003, 2005 IBM 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- **********************************************************************/
-package org.eclipse.wst.server.core.internal;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.wst.server.core.IModule;
-/**
- * An event fired when a module changes.
- */
-public class ModuleEvent {
-	private IModule module;
-	private boolean isChanged;
-	private IModule[] added;
-	private IModule[] changed;
-	private IModule[] removed;
-
-	class IModuleArtifact {
-		IPath path;
-		long timestamp;
-	}
-
-	/**
-	 * Create a new module event.
-	 * 
-	 * @param module the module that has been changed
-	 * @param isChanged true if the module has changed
-	 * @param added added child modules
-	 * @param changed changed child modules
-	 * @param removed removed child modules
-	 */
-	public ModuleEvent(IModule module, boolean isChanged, IModule[] added, IModule[] changed, IModule[] removed) {
-		this.module = module;
-		this.isChanged = isChanged;
-		this.added = added;
-		this.changed = changed;
-		this.removed = removed;
-	}
-
-	/**
-	 * Returns the module that has been changed.
-	 *
-	 * @return the module
-	 */
-	public IModule getModule() {
-		return module;
-	}
-
-	/**
-	 * Returns true if this module's settings have changed.
-	 * 
-	 * @return <code>true</code> if the contents have changed
-	 */
-	public boolean isChanged() {
-		return isChanged;
-	}
-
-	/**
-	 * Returns any child modules that have been added.
-	 * 
-	 * @return the added child modules, or null if no modules have been added
-	 */
-	public IModule[] getAddedChildModules() {
-		return added;
-	}
-
-	/**
-	 * Returns any child modules that have been changed.
-	 * 
-	 * @return the changed child modules, or null if no modules have been changed
-	 */
-	public IModule[] getChangedChildModules() {
-		return changed;
-	}
-
-	/**
-	 * Returns any child modules that have been removed.
-	 * 
-	 * @return the removed child modules, or null if no modules have been removed
-	 */
-	public IModule[] getRemovedChildModules() {
-		return removed;
-	}
-
-	/**
-	 * Returns the module artifacts that have changed.
-	 * 
-	 * @return the changed module artifacts
-	 */
-	public IModuleArtifact[] getChangedArtifacts() {
-		return null;
-	}
-}
\ No newline at end of file
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 3d41df8..afb0a59 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
@@ -10,7 +10,9 @@
  *******************************************************************************/
 package org.eclipse.wst.server.core.internal;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.IConfigurationElement;
@@ -26,7 +28,7 @@
 public class ModuleFactory implements IOrdered {
 	private IConfigurationElement element;
 	public ModuleFactoryDelegate delegate;
-	private List moduleTypes;
+	private Set moduleTypes;
 
 	/**
 	 * ModuleFactory constructor comment.
@@ -112,7 +114,10 @@
 	 */
 	public IModule[] getModules(IProgressMonitor monitor) {
 		try {
-			return getDelegate(monitor).getModules();
+			IModule[] modules = getDelegate(monitor).getModules();
+			if (hasInvalidModules(modules))
+				modules = filter(modules);
+			return modules;
 		} catch (Throwable t) {
 			Trace.trace(Trace.SEVERE, "Error calling delegate " + toString(), t);
 			return new IModule[0];
@@ -124,7 +129,10 @@
 	 */
 	public IModule[] getModules(IProject project, IProgressMonitor monitor) {
 		try {
-			return getDelegate(monitor).getModules(project);
+			IModule[] modules = getDelegate(monitor).getModules(project);
+			if (hasInvalidModules(modules))
+				modules = filter(modules);
+			return modules;
 		} catch (Throwable t) {
 			Trace.trace(Trace.SEVERE, "Error calling delegate " + toString(), t);
 			return new IModule[0];
@@ -136,13 +144,56 @@
 	 */
 	public IModule findModule(String id, IProgressMonitor monitor) {
 		try {
-			return getDelegate(monitor).findModule(id);
+			IModule module = getDelegate(monitor).findModule(id);
+			if (module == null)
+				return null;
+			
+			getModuleTypes();
+			if (!moduleTypes.contains(module.getModuleType()))
+				return null;
+			
+			return module;
 		} catch (Throwable t) {
 			Trace.trace(Trace.SEVERE, "Error calling delegate " + toString(), t);
 			return null;
 		}
 	}
 
+	private boolean hasInvalidModules(IModule[] modules) {
+		if (modules == null)
+			return false;
+		
+		getModuleTypes();
+		
+		int size = modules.length;
+		for (int i = 0; i < size; i++) {
+			if (!moduleTypes.contains(modules[i].getModuleType()))
+				return true;
+		}
+		return false;
+	}
+
+	private IModule[] filter(IModule[] modules) {
+		if (modules == null)
+			return modules;
+		
+		getModuleTypes();
+		List list = new ArrayList();
+		
+		int size = modules.length;
+		for (int i = 0; i < size; i++) {
+			IModule m = modules[i];
+			if (moduleTypes.contains(m.getModuleType()))
+				list.add(m);
+			else
+				Trace.trace(Trace.WARNING, "Invalid module returned from factory, ignored: " + m);
+		}
+		
+		IModule[] m = new IModule[list.size()];
+		list.toArray(m);
+		return m;
+	}
+
 	/**
 	 * Return a string representation of this object.
 	 * 
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleFactoryEvent.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleFactoryEvent.java
deleted file mode 100644
index 0f2877a..0000000
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleFactoryEvent.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2003, 2005 IBM 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- **********************************************************************/
-package org.eclipse.wst.server.core.internal;
-
-import org.eclipse.wst.server.core.IModule;
-/**
- * An event fired when a module factory changes.
- */
-public class ModuleFactoryEvent {
-	protected IModule[] added;
-	protected IModule[] removed;
-
-	/**
-	 * Create a new event.
-	 * 
-	 * @param added added modules
-	 * @param removed removed modules
-	 */
-	public ModuleFactoryEvent(IModule[] added, IModule[] removed) {
-		this.added = added;
-		this.removed = removed;
-	}
-
-	/**
-	 * Returns any modules that have been added.
-	 * 
-	 * @return org.eclipse.wst.server.core.model.IModule[]
-	 */
-	public IModule[] getAddedModules() {
-		return added;
-	}
-
-	/**
-	 * Returns any modules that have been removed.
-	 * 
-	 * @return org.eclipse.wst.server.core.model.IModule[]
-	 */
-	public IModule[] getRemovedModules() {
-		return removed;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleFile.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleFile.java
index 177c0d8..50dc45c 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleFile.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleFile.java
@@ -107,6 +107,9 @@
 	}
 
 	public boolean equals(Object obj) {
+		if (obj == this)
+			return true;
+		
 		if (!(obj instanceof IModuleFile))
 			return false;
 		
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleFolder.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleFolder.java
index c1f4b1f..f808b15 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleFolder.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleFolder.java
@@ -82,6 +82,9 @@
 	}
 
 	public boolean equals(Object obj) {
+		if (obj == this)
+			return true;
+		
 		if (!(obj instanceof ModuleFolder))
 			return false;
 		
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleKind.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleKind.java
index 7bd8184..7c8a207 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleKind.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModuleKind.java
@@ -17,19 +17,19 @@
 public class ModuleKind {
 	protected String id;
 	protected String name;
-	
+
 	public ModuleKind(IConfigurationElement ce) {
 		super();
 		this.id = ce.getAttribute("id");
 		this.name = ce.getAttribute("name");
 	}
-	
+
 	public ModuleKind(String id, String name) {
 		super();
 		this.id = id;
 		this.name = name;
 	}
-	
+
 	public String getId() {
 		return id;
 	}
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModulePublishInfo.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModulePublishInfo.java
index c3d4afc..8dbfe66 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModulePublishInfo.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ModulePublishInfo.java
@@ -114,7 +114,7 @@
 			String mt = memento.getString(MODULE_TYPE_ID);
 			String mv = memento.getString(MODULE_TYPE_VERSION);
 			if (mt != null && mt.length() > 0)
-				moduleType = new ModuleType(mt, mv);
+				moduleType = ModuleType.getModuleType(mt, mv);
 			
 			resources = loadResource(memento, new Path(""));
 		} catch (Exception e) {
@@ -175,7 +175,7 @@
 			String mt = in.readUTF();
 			String mv = in.readUTF();
 			if (mt != null && mt.length() > 0)
-				moduleType = new ModuleType(mt, mv);
+				moduleType = ModuleType.getModuleType(mt, mv);
 		} else
 			moduleType = null;
 		
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 c3f0281..98c675a 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
@@ -24,10 +24,12 @@
 public class ModuleType implements IModuleType {
 	protected String id;
 	protected String version;
-	
-	//	cached copy of all module types
+
+	//	cached copy of all module kinds
+	private static List moduleKinds;
+
 	private static List moduleTypes;
-	
+
 	public ModuleType(String id, String version) {
 		super();
 		this.id = id;
@@ -37,7 +39,7 @@
 	public String getId() {
 		return id;
 	}
-	
+
 	public String getName() {
 		ModuleKind mt = findModuleType(id);
 		if (mt != null)
@@ -48,23 +50,34 @@
 	public String getVersion() {
 		return version;
 	}
-	
+
 	/**
-	 * Returns an array of all known module types.
-	 * <p>
-	 * A new array is returned on each call, so clients may store or modify the result.
-	 * </p>
+	 * Returns the module type with the given id and version, or create a new one if
+	 * none already exists.
 	 * 
-	 * @return the array of module types {@link IModuleType}
+	 * @param id the module type id
+	 * @param version the module type version
+	 * @return the module type
 	 */
-	/*public static IModuleType[] getModuleTypes() {
+	public static ModuleType getModuleType(String id, String version) {
 		if (moduleTypes == null)
-			loadModuleTypes();
+			moduleTypes = new ArrayList();
 		
-		IModuleType[] mt = new IModuleType[moduleTypes.size()];
-		moduleTypes.toArray(mt);
+		// look for an existing one first
+		Iterator iterator = moduleTypes.iterator();
+		while (iterator.hasNext()) {
+			ModuleType mt = (ModuleType) iterator.next();
+			if ((id == null && mt.id == null) || (id != null && id.equals(mt.id))) {
+				if ((version == null && mt.version == null) || (version != null && version.equals(mt.version)))
+					return mt;
+			}
+		}
+		
+		// otherwise create one
+		ModuleType mt = new ModuleType(id, version);
+		moduleTypes.add(mt);
 		return mt;
-	}*/
+	}
 
 	/**
 	 * Returns the module type with the given id, or <code>null</code>
@@ -76,14 +89,14 @@
 	 * @return the module type, or <code>null</code> if there is no module type
 	 * with the given id
 	 */
-	public static ModuleKind findModuleType(String id) {
+	private static ModuleKind findModuleType(String id) {
 		if (id == null)
 			throw new IllegalArgumentException();
 
-		if (moduleTypes == null)
+		if (moduleKinds == null)
 			loadModuleTypes();
 		
-		Iterator iterator = moduleTypes.iterator();
+		Iterator iterator = moduleKinds.iterator();
 		while (iterator.hasNext()) {
 			ModuleKind moduleType = (ModuleKind) iterator.next();
 			if (id.equals(moduleType.getId()))
@@ -91,23 +104,23 @@
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Load the module types.
 	 */
 	private static synchronized void loadModuleTypes() {
-		if (moduleTypes != null)
+		if (moduleKinds != null)
 			return;
 		Trace.trace(Trace.EXTENSION_POINT, "->- Loading .moduleTypes extension point ->-");
 		IExtensionRegistry registry = Platform.getExtensionRegistry();
 		IConfigurationElement[] cf = registry.getConfigurationElementsFor(ServerPlugin.PLUGIN_ID, "moduleTypes");
 
 		int size = cf.length;
-		moduleTypes = new ArrayList(size);
+		moduleKinds = new ArrayList(size);
 		for (int i = 0; i < size; i++) {
 			try {
 				ModuleKind moduleType = new ModuleKind(cf[i]);
-				moduleTypes.add(moduleType);
+				moduleKinds.add(moduleType);
 				Trace.trace(Trace.EXTENSION_POINT, "  Loaded moduleType: " + cf[i].getAttribute("id"));
 			} catch (Throwable t) {
 				Trace.trace(Trace.SEVERE, "  Could not load moduleType: " + cf[i].getAttribute("id"), t);
@@ -117,6 +130,27 @@
 		Trace.trace(Trace.EXTENSION_POINT, "-<- Done loading .moduleTypes extension point -<-");
 	}
 
+	public int hashCode() {
+		return id.hashCode() + version.hashCode();
+	}
+
+	public boolean equals(Object obj) {
+		if (obj == this)
+			return true;
+		
+		if (!(obj instanceof ModuleType))
+			return false;
+		
+		ModuleType mt = (ModuleType) obj;
+		if (id != null && mt.id != null && !id.equals(mt.id))
+			return false;
+		
+		if (version != null && mt.version != null && !version.equals(mt.version))
+			return false;
+		
+		return true;
+	}
+
 	public String toString() {
 		return "ModuleType[" + id + ", " + version + "]";
 	}
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ResourceManager.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ResourceManager.java
index 386d253..1239292 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ResourceManager.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ResourceManager.java
@@ -1073,10 +1073,6 @@
 			activeBundles.add(bundleId);
 	}
 
-	protected void fireModuleServerEvent(ModuleFactoryEvent[] factoryEvents, ModuleEvent[] events) {
-		// do nothing
-	}
-
 	public String toString() {
 		return "Server resource manager";
 	}
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 9cc6671..7afc05d 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
+ * Copyright (c) 2003, 2007 IBM 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
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.wst.server.core.internal;
 
-import java.util.List;
+import java.util.Set;
 
 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 List moduleTypes;
+	private Set moduleTypes;
 
 	public RuntimeType(IConfigurationElement element) {
 		super();
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java
index 34e62d8..1d2789c 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java
@@ -2196,7 +2196,7 @@
 				if (module == null) {
 					IModuleType moduleType = null;
 					if (moduleTypeId != null)
-						moduleType = new ModuleType(moduleTypeId, moduleTypeVersion);
+						moduleType = ModuleType.getModuleType(moduleTypeId, moduleTypeVersion);
 					module = new DeletedModule(moduleId, name, moduleType);
 				}
 				modules.add(module);
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 54f52d2..86578e8 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,11 +347,11 @@
 		return s;
 	}
 
-	protected static List getModuleTypes(IConfigurationElement[] elements) {
-		List list = new ArrayList();
+	protected static Set getModuleTypes(IConfigurationElement[] elements) {
+		Set set = new HashSet();
 		if (elements == null)
-			return list;
-	
+			return set;
+		
 		int size = elements.length;
 		for (int i = 0; i < size; i++) {
 			String[] types = tokenize(elements[i].getAttribute("types"), ",");
@@ -359,15 +359,13 @@
 			int sizeT = types.length;
 			int sizeV = versions.length;
 			for (int j = 0; j < sizeT; j++) {
-				for (int k = 0; k < sizeV; k++) {
-					ModuleType module = new ModuleType(types[j], versions[k]);
-					list.add(module);
-				}
+				for (int k = 0; k < sizeV; k++)
+					set.add(ModuleType.getModuleType(types[j], versions[k]));
 			}
 		}
-		return list;
+		return set;
 	}
-	
+
 	public static String generateId() {
 		String s = df.format(new Date()).toString() + num++;
 		s = s.replace(' ', '_');