package com.sap.runlet.interpreter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.ocl.examples.eventmanager.EventFilter; import org.eclipse.ocl.examples.eventmanager.EventManagerFactory; import data.classes.ClassesPackage; public class MethodCallResolverCacheInvalidationListener extends AdapterImpl { private final MethodCallResolver resolver; public MethodCallResolverCacheInvalidationListener(MethodCallResolver resolver) { this.resolver = resolver; } public EventFilter getFilter() { // TODO use OCL impact analyzer on an allInstances() expression instead EventManagerFactory emf = EventManagerFactory.eINSTANCE; EventFilter ownedMethodSignaturesFilter = emf.createStructuralFeatureFilter(ClassesPackage.eINSTANCE.getSignatureOwner_OwnedSignatures()); EventFilter adaptedToFilter = emf.createStructuralFeatureFilter(ClassesPackage.eINSTANCE.getTypeAdapter_To()); EventFilter adaptersFilter = emf.createStructuralFeatureFilter(ClassesPackage.eINSTANCE.getTypeAdapter_Adapted()); // TODO what about watching delegation changes? EventFilter allFilter = emf.createOrFilterFor(ownedMethodSignaturesFilter, adaptedToFilter, adaptersFilter); return allFilter; } @Override public void notifyChanged(Notification event) { resolver.invalidateCache(); /* * TODO do more fine-grained invalidation LinkChangeEvent lce = (LinkChangeEvent) event; ResourceSet conn = * lce.getEventTriggerResourceSet(); Association a = (Association) lce.getAffectedMetaObject(conn); if * (a.equals(conn.getAssociation(OwnedSignatures.ASSOCIATION_DESCRIPTOR).refMetaObject())) { SignatureOwner owner = * (SignatureOwner) conn.getElement(lce.getFirstLinkEndMri().getLri()); MethodSignature sig = (MethodSignature) * conn.getElement(lce.getSecondLinkEndMri().getLri()); // TODO invalidate cache for owner; if owner is adapter, * invalidate all adapted transitively } else if * (a.equals(conn.getAssociation(AdaptedTo.ASSOCIATION_DESCRIPTOR).refMetaObject())) { SapClass c = (SapClass) * conn.getElement(lce.getFirstLinkEndMri().getLri()); TypeAdapter adapter = (TypeAdapter) * conn.getElement(lce.getSecondLinkEndMri().getLri()); // TODO invalidate cache for owner; if owner is adapter, * invalidate all adapted transitively } else if * (a.equals(conn.getAssociation(AdaptedTo.ASSOCIATION_DESCRIPTOR).refMetaObject())) { SapClass c = (SapClass) * conn.getElement(lce.getFirstLinkEndMri().getLri()); TypeAdapter adapter = (TypeAdapter) * conn.getElement(lce.getSecondLinkEndMri().getLri()); // TODO invalidate cache for owner; if owner is adapter, * invalidate all adapted transitively } */ } }