[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;
}