/** * <copyright> * </copyright> * * */ package org.dresdenocl.language.ocl.resource.ocl.analysis; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; /** * A ReferenceCache can be used to improve the performance of the reference * resolving. This default implementation is initialized by traversing the content * of the current resource. During this traversal, two maps are created. One (the * classToObject map) can be used to retrieve all objects of a given type. The * other one (the nameToObjects map) can be used to retrieve all objects for a * given name. */ public class OclReferenceCache extends AdapterImpl implements org.dresdenocl.language.ocl.resource.ocl.IOclReferenceCache { private Map<EClass, Set<EObject>> classToObjectsMap = new LinkedHashMap<EClass, Set<EObject>>(); private Map<String, Set<EObject>> nameToObjectsMap = new LinkedHashMap<String, Set<EObject>>(); private boolean isInitialized; private org.dresdenocl.language.ocl.resource.ocl.IOclNameProvider nameProvider; public OclReferenceCache(org.dresdenocl.language.ocl.resource.ocl.IOclNameProvider nameProvider) { super(); this.nameProvider = nameProvider; } public Set<EObject> getObjects(EClass type) { return classToObjectsMap.get(type); } public void initialize(EObject root) { if (isInitialized) { return; } put(root); Iterator<EObject> it = root.eAllContents(); while (it.hasNext()) { put(it.next()); } isInitialized = true; } public Map<String, Set<EObject>> getNameToObjectsMap() { return nameToObjectsMap; } private void put(EObject object) { EClass eClass = object.eClass(); put(classToObjectsMap, eClass, object); List<String> names = nameProvider.getNames(object); for (String name : names) { put(nameToObjectsMap, name, object); } } private <T> void put(Map<T, Set<EObject>> map, T key, EObject object) { if (!map.containsKey(key)) { map.put(key, new LinkedHashSet<EObject>()); } map.get(key).add(object); } public void clear() { classToObjectsMap.clear(); nameToObjectsMap.clear(); isInitialized = false; } }