]> git.uio.no Git - ifi-stolz-refaktor.git/blobdiff - case-study/refaktor-after/src/no/uio/ifi/refaktor/utils/caching/CompilationUnitSoftReferencesCache.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / refaktor-after / src / no / uio / ifi / refaktor / utils / caching / CompilationUnitSoftReferencesCache.java
diff --git a/case-study/refaktor-after/src/no/uio/ifi/refaktor/utils/caching/CompilationUnitSoftReferencesCache.java b/case-study/refaktor-after/src/no/uio/ifi/refaktor/utils/caching/CompilationUnitSoftReferencesCache.java
new file mode 100644 (file)
index 0000000..2c85b0c
--- /dev/null
@@ -0,0 +1,58 @@
+package no.uio.ifi.refaktor.utils.caching;
+
+import java.lang.ref.SoftReference;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+
+public class CompilationUnitSoftReferencesCache implements CompilationUnitCache {
+       private final Map<ICompilationUnit, SoftReference<CompilationUnit>> cache = new HashMap<ICompilationUnit, SoftReference<CompilationUnit>>();
+       private final Map<ICompilationUnit, Long> modificationStamps = new HashMap<ICompilationUnit, Long>();
+       private CompilationUnit tmpStrongCURef;
+
+       @Override
+       public boolean contains(ICompilationUnit unit) {
+               SoftReference<CompilationUnit> softRef = cache.get(unit);
+
+               if (softRef == null)
+                       return false;
+
+               tmpStrongCURef = softRef.get();
+               if (tmpStrongCURef != null) {
+                       Long modificationStamp = modificationStamps.get(unit);
+                       assert modificationStamp != null;
+                       boolean modificationStampMatches = CompilationUnitCacheUtils.hasMatchingModificationStamp(unit, modificationStamp);
+                       if (!modificationStampMatches)
+                               cleanCache(unit);
+                       return modificationStampMatches;
+               }
+
+               return false;
+       }
+
+       private void cleanCache(ICompilationUnit unit) {
+               cache.remove(unit);
+               modificationStamps.remove(unit);
+       }
+
+       @Override
+       public CompilationUnit get(ICompilationUnit unit) {
+               try {
+                       SoftReference<CompilationUnit> cachedRef = cache.get(unit);
+                       CompilationUnit cachedCU = cachedRef.get();
+                       assert cachedCU != null;
+                       return cachedCU;
+               } finally {
+                       tmpStrongCURef = null;
+               }
+       }
+
+       @Override
+       public void add(ICompilationUnit unit, CompilationUnit concreteCompilationUnit) {
+               cache.put(unit, new SoftReference<CompilationUnit>(concreteCompilationUnit));
+               modificationStamps.put(unit, CompilationUnitCacheUtils.getModificationStampOf(unit));
+       }
+
+}