[126291] clean up .component redundant maps
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java
index 12f017e..0f9b892 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java
@@ -11,8 +11,14 @@
 package org.eclipse.wst.common.componentcore.internal;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 
+import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IStatus;
@@ -22,6 +28,8 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.xmi.XMIResource;
+import org.eclipse.wst.common.componentcore.internal.impl.ResourceTreeNode;
+import org.eclipse.wst.common.componentcore.internal.impl.ResourceTreeRoot;
 import org.eclipse.wst.common.componentcore.internal.impl.WTPModulesResource;
 import org.eclipse.wst.common.componentcore.internal.impl.WTPModulesResourceFactory;
 import org.eclipse.wst.common.internal.emf.resource.ReferencedResource;
@@ -97,9 +105,67 @@
 		synchronized (this) {
 			modelRoot = super.getPrimaryRootObject();
 		}
+		if (modelRoot != null) {
+			// if the workspace tree is locked we cannot try to change the .component resource
+			if (ResourcesPlugin.getWorkspace().isTreeLocked())
+				return modelRoot;
+			List components = ((ProjectComponents)modelRoot).getComponents();
+			if (components.size()>0) {
+				WorkbenchComponent wbComp = (WorkbenchComponent)components.get(0);
+				// Check and see if we need to clean up spurrious redundant map entries
+				cleanupWTPModules(wbComp);
+			}
+		}
 		return modelRoot;
 	}
-       
+	
+	/**
+	 * This method is used to remove spurrious redundant entries from the .component file
+	 * 
+	 * @param wbComp
+	 */
+	public void cleanupWTPModules(WorkbenchComponent wbComp) {
+		ModuleStructuralModel model = new ModuleStructuralModel(getEditModelID(),getEmfContext(),false);
+		if (wbComp == null || model == null)
+			return;
+		try {
+			model.access(this);
+			ResourceTreeRoot root = ResourceTreeRoot.getSourceResourceTreeRoot(wbComp);
+			List rootResources = getModuleResources(root);
+			// Only if we need to do a clean, do we clear, add all required root resource mappings, and save
+			if (!(wbComp.getResources().containsAll(rootResources) && wbComp.getResources().size()==rootResources.size())) {
+				wbComp.getResources().clear();
+				wbComp.getResources().addAll(rootResources);
+				model.save(this);
+			}
+		} finally {
+			if (model != null)
+				model.dispose();
+		}
+	}
+    
+	/**
+	 * This is a recursive method to find all the root level resources in the children's resource tree roots
+	 * 
+	 * @param node
+	 * @return List of module resources
+	 */
+	public List getModuleResources(ResourceTreeNode node) {
+		// If the resource node has module resources just return them
+		if (node.getModuleResources().length>0)
+			return Arrays.asList(node.getModuleResources());
+		// Otherwise, the root resource maps are really at the next level or lower
+		List rootResources = new ArrayList();
+		Map children = node.getChildren();
+		Iterator iter = children.values().iterator();
+		while (iter.hasNext()) {
+			ResourceTreeNode subNode = (ResourceTreeNode) iter.next();
+			// recursively call method to obtain module resources
+			rootResources.addAll(getModuleResources(subNode));
+		}
+		return rootResources;
+	}
+	
 	public WTPModulesResource  makeWTPModulesResource() {
 		return (WTPModulesResource) createResource(WTPModulesResourceFactory.WTP_MODULES_URI_OBJ);
 	}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeNode.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeNode.java
index 04bc5ad..0eda447 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeNode.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeNode.java
@@ -281,4 +281,8 @@
 	/* package */IPathProvider getPathProvider() {
 		return pathProvider;
 	}
+
+	public Map getChildren() {
+		return children;
+	}
 }
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeRoot.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeRoot.java
index 86f4ce3..c2d5a33 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeRoot.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeRoot.java
@@ -56,10 +56,12 @@
 						resource.eAdapters().remove(getResourcePathListenerAdapter());
 					break;
 				case Notification.REMOVE_MANY:
-					List removedValues = (List) msg.getNewValue();					
-					for (int i = 0; i < removedValues.size(); i++) {
-						resource = (ComponentResource) removedValues.get(i);
-						resource.eAdapters().remove(getResourcePathListenerAdapter());
+					List removedValues = (List) msg.getNewValue();
+					if (removedValues != null) {
+						for (int i = 0; i < removedValues.size(); i++) {
+							resource = (ComponentResource) removedValues.get(i);
+							resource.eAdapters().remove(getResourcePathListenerAdapter());
+						}
 					}
 					break;
 				}