package be.ac.vub.object_annotations.examples.blackboard.aspect; import java.lang.annotation.Annotation; import be.ac.vub.object_annotations.AnnotationManager; import be.ac.vub.object_annotations.MutableAnnotation; import be.ac.vub.object_annotations.examples.blackboard.Blackboard; import be.ac.vub.object_annotations.examples.blackboard.annotations.Lock; public aspect Guardian { pointcut published(Object o) : execution(* Blackboard.publish(Object)) && args(o); pointcut retracted(Object o) : execution(* Blackboard.retract(Object)) && args(o); after(Object o): retracted(o){ Lock lock = AnnotationManager.getAnnotationOf(o); ((MutableAnnotation)lock).change("value", false); } after(Object o) : published(o) { Lock lock = AnnotationManager.activate(o, Lock.class); ((MutableAnnotation)lock).change("value", true); } pointcut propagateTo(Object from) : get(* *) && target(from) && if(AnnotationManager.isActive(from,Lock.class)); after(Object from) returning(Object to): propagateTo(from){ Annotation a = AnnotationManager.getAnnotationOf(from); AnnotationManager.activate(to, a); } }