[151443] DepGraph fix
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphManager.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphManager.java
index 853a43a..3b5c328 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphManager.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphManager.java
@@ -14,10 +14,15 @@
import java.util.HashMap;
import java.util.List;
+import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Path;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jem.util.logger.proxy.Logger;
import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
@@ -37,7 +42,9 @@
}
private static DependencyGraphManager INSTANCE = null;
+ private static final String MANIFEST_URI = "META-INF/MANIFEST.MF";
private HashMap wtpModuleTimeStamps = null;
+ private HashMap manifestTimeStamps = null;
private DependencyGraphManager() {
super();
@@ -55,10 +62,50 @@
}
private void constructIfNecessary() {
- if (moduleTimeStampsChanged())
+ if (moduleTimeStampsChanged() || manifestTimeStampsChanged())
buildDependencyGraph();
}
+ private boolean manifestTimeStampsChanged() {
+ HashMap workspaceTimeStamps = collectManifestTimeStamps();
+ if (getManifestTimeStamps().equals(workspaceTimeStamps))
+ return false;
+ return true;
+ }
+
+ private HashMap getManifestTimeStamps() {
+ if (wtpModuleTimeStamps == null)
+ wtpModuleTimeStamps = new HashMap();
+ return wtpModuleTimeStamps;
+ }
+
+ private HashMap collectManifestTimeStamps() {
+ HashMap timeStamps = new HashMap();
+ IProject[] projects = ProjectUtilities.getAllProjects();
+ for (int i=0; i<projects.length; i++) {
+ IFile manifestFile = null;
+ if (projects[i]==null || !projects[i].isAccessible())
+ continue;
+ manifestFile = getManifestFile(projects[i]);
+ if (manifestFile != null) {
+ Long currentTimeStamp = new Long(manifestFile.getLocalTimeStamp());
+ timeStamps.put(projects[i],currentTimeStamp);
+ }
+ }
+ return timeStamps;
+ }
+ private IFile getManifestFile(IProject p) {
+ IVirtualComponent component = ComponentCore.createComponent(p);
+ try {
+ IFile file = ComponentUtilities.findFile(component, new Path(MANIFEST_URI));
+ if (file != null)
+ return file;
+ } catch (CoreException ce) {
+ Logger.getLogger().log(ce);
+ }
+ return null;
+ }
+
private boolean moduleTimeStampsChanged() {
HashMap workspaceTimeStamps = collectModuleTimeStamps();
if (getWtpModuleTimeStamps().equals(workspaceTimeStamps))
@@ -129,12 +176,19 @@
return false;
Long currentTimeStamp = new Long(wtpModulesFile.getLocalTimeStamp());
getWtpModuleTimeStamps().put(project,currentTimeStamp);
+ // Get the MANIFEST file for the given project
+ IResource manifestFile = getManifestFile(project);
+
+ if (manifestFile==null)
+ return false;
+ getManifestTimeStamps().put(project,currentTimeStamp);
return true;
}
private void cleanDependencyGraph() {
DependencyGraph.getInstance().clear();
getWtpModuleTimeStamps().clear();
+ getManifestTimeStamps().clear();
}
/**