[300062] Performance improvement of VirtualComponent caching
diff --git a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/componentcore/util/EARVirtualComponent.java b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/componentcore/util/EARVirtualComponent.java
index 4669b87..7a803e1 100644
--- a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/componentcore/util/EARVirtualComponent.java
+++ b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/componentcore/util/EARVirtualComponent.java
@@ -30,7 +30,7 @@
 import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
 import org.eclipse.wst.common.componentcore.internal.StructureEdit;
 import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.builder.DependencyGraphManager;
+import org.eclipse.wst.common.componentcore.internal.builder.IDependencyGraph;
 import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
 import org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent;
 import org.eclipse.wst.common.componentcore.internal.util.IComponentImplFactory;
@@ -44,6 +44,7 @@
 	
 	private IVirtualReference[] cachedReferences;
 	private long depGraphModStamp;
+	
 	public EARVirtualComponent() {
 		super();
 	}
@@ -218,11 +219,19 @@
 		if (cachedReferences != null && checkIfStillValid())
 			return cachedReferences;
 		else
-			depGraphModStamp = DependencyGraphManager.getInstance().getModStamp();
+			depGraphModStamp = IDependencyGraph.INSTANCE.getModStamp();
 		return null;
 	}
 
 	private boolean checkIfStillValid() {
-		return DependencyGraphManager.getInstance().checkIfStillValid(depGraphModStamp);
+		return IDependencyGraph.INSTANCE.getModStamp() == depGraphModStamp;
+	}
+	
+	@Override
+	protected void clearCache() {
+		super.clearCache();
+		
+		depGraphModStamp = IDependencyGraph.INSTANCE.getModStamp();
+		cachedReferences = null;
 	}
 }
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/componentcore/J2EEModuleVirtualComponent.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/componentcore/J2EEModuleVirtualComponent.java
index 0a84d89..a4815bd 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/componentcore/J2EEModuleVirtualComponent.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/componentcore/J2EEModuleVirtualComponent.java
@@ -40,6 +40,7 @@
 import org.eclipse.jst.j2ee.project.EarUtilities;
 import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
 import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.builder.IDependencyGraph;
 import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
 import org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent;
 import org.eclipse.wst.common.componentcore.internal.resources.VirtualFolder;
@@ -54,6 +55,13 @@
 	public static String GET_JAVA_REFS = "GET_JAVA_REFS"; //$NON-NLS-1$
 	public static String GET_FUZZY_EAR_REFS = "GET_FUZZY_EAR_REFS"; //$NON-NLS-1$
 	
+	private long depGraphModStamp;
+	
+	private IVirtualReference[] fuzzyAndJavaRefs = null;
+	private IVirtualReference[] fuzzyRefsOnly = null;
+	private IVirtualReference[] javaRefsOnly = null;
+	private IVirtualReference[] nonJavaRefsOnly = null;
+	
 	public J2EEModuleVirtualComponent() {
 		super();
 	}
@@ -80,7 +88,10 @@
 	 * @return IVirtualReferences for all non-Java classpath entry references.
 	 */
 	public IVirtualReference[] getNonJavaReferences() {
-		return getReferences(false, false);
+		if(nonJavaRefsOnly == null || !checkIfStillValid()) {
+			nonJavaRefsOnly = getReferences(false, false);
+		}
+		return nonJavaRefsOnly;
 	}
 	
 	@Override
@@ -89,15 +100,29 @@
 		Object objGetFuzzyEarRefs = options.get(GET_FUZZY_EAR_REFS);
 		boolean getJavaRefs = objGetJavaRefs != null ? ((Boolean)objGetJavaRefs).booleanValue() : true;
 		boolean findFuzzyEARRefs = objGetFuzzyEarRefs != null ? ((Boolean)objGetFuzzyEarRefs).booleanValue() : false;
-		return getReferences(getJavaRefs, findFuzzyEARRefs);
+		
+		IVirtualReference[] cachedReferences = getCachedReference(getJavaRefs, findFuzzyEARRefs);
+		if (cachedReferences != null)
+			return cachedReferences;
+		
+		cachedReferences = getReferences(getJavaRefs, findFuzzyEARRefs);
+		setCachedReferences(getJavaRefs, findFuzzyEARRefs, cachedReferences);
+		return cachedReferences;
 	}
 	
 	@Override
 	public IVirtualReference[] getReferences() {
-		return getReferences(true, false);
+		if(javaRefsOnly == null || !checkIfStillValid()) {
+			javaRefsOnly = getReferences(true, false);
+		}
+		return javaRefsOnly;
 	}
 	
 	public IVirtualReference[] getReferences(final boolean getJavaRefs, final boolean findFuzzyEARRefs) {
+		IVirtualReference[] cachedReferences = getCachedReference(getJavaRefs, findFuzzyEARRefs);
+		if (cachedReferences != null)
+			return cachedReferences;
+		
 		IVirtualReference[] hardReferences = getNonManifestReferences(getJavaRefs);
 		
 		// retrieve the dynamic references specified via the MANIFEST.MF classpath 
@@ -113,6 +138,8 @@
 				references[hardReferences.length + i] = (IVirtualReference) dynamicReferences.get(i);
 			}
 		}
+		
+		setCachedReferences(getJavaRefs, findFuzzyEARRefs, references);
 		return references;
 	}
 	
@@ -394,5 +421,57 @@
 		}
 		return dynamicReferences;
 	}
+	
+	private void setCachedReferences(boolean getJavaRefs, boolean findFuzzyEARRefs, IVirtualReference[] references) {
+		if(findFuzzyEARRefs && getJavaRefs) {
+			fuzzyAndJavaRefs = references; 
+		}
+		else if(!findFuzzyEARRefs && !getJavaRefs) {
+			nonJavaRefsOnly = references;
+		}
+		else if(findFuzzyEARRefs) {
+			fuzzyRefsOnly = references;
+		}
+		else {
+			javaRefsOnly = references;
+		}
+	}
+	
+	private IVirtualReference[] getCachedReference(boolean getJavaRefs, boolean findFuzzyEARRefs) {
+		if(checkIfStillValid())
+		{
+			if(findFuzzyEARRefs && getJavaRefs) {
+				return fuzzyAndJavaRefs; 
+			}
+			else if(!findFuzzyEARRefs && !getJavaRefs) {
+				return nonJavaRefsOnly;
+			}
+			else if(findFuzzyEARRefs) {
+				return fuzzyRefsOnly;
+			}
+			else {
+				return javaRefsOnly;
+			}
+		}
+		return null;
+	}
 
+	private boolean checkIfStillValid() {
+		boolean valid = IDependencyGraph.INSTANCE.getModStamp() == depGraphModStamp;
+		if(!valid) {
+			clearCache();
+		}
+		return valid;
+	}
+	
+	@Override
+	protected void clearCache() {
+		super.clearCache();
+		
+		depGraphModStamp = IDependencyGraph.INSTANCE.getModStamp();
+		fuzzyAndJavaRefs = null;
+		fuzzyRefsOnly = null;
+		javaRefsOnly = null;
+		nonJavaRefsOnly = null;
+	}
 }