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