--- /dev/null
+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));
+ }
+
+}