package org.bushe.swing.event.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.bushe.swing.event.EventService;
import org.bushe.swing.event.EventServiceLocator;
import org.bushe.swing.event.ThreadSafeEventService;
/**
* An Annotation for adding VetoTopicPatternListener subscriptions to EventService Events.
* <p>
* This annotation simplifies much of the repetitive boilerplate used for adding veto topic pattern listeners
* (which in EventBus 2.0 will be called VetoTopicPatternSubscribers, thus this annotation name difference)
* to EventService Events. Example:
* <p>
* <pre>
* public class MyAppController {
* public MyAppController {
* AnnotationProcessor.process(this);//this line can be avoided with a compile-time tool or an Aspect
* }
* @EvenTopicSubscriber(topic="App.Close.*")
* public void onAppClosingEvent(String topic, Object payload) {
* //close connections, close windows
* }
* }
*
* public class MyDocumentController {
* @VetoTopicSubscriber(topic="App.Close.*")
* public boolean ensureDocumentIsSaved(String topic, Object payload) {
* if (docHasUnsavedChanges()) {
* boolean answer = MyModalDialog.show("Are you sure you want to close and lose your changes?");
* if (answer == StandardButtonValues.Cancel) {
* //stop processing this event
* return true;
* }
* }
* //It's OK to close
* return false;
* }
* }
* </pre>
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface VetoTopicPatternSubscriber {
/** The topic to subscribe to */
public abstract String topicPattern();
/** Determines the order in which this veto subscriber is called, default is FIFO.*/
public abstract int priority() default 0;
/** Whether to subscribe weakly or strongly. */
public abstract ReferenceStrength referenceStrength() default ReferenceStrength.WEAK;
/** The event service to subscribe to, default to the EventServiceLocator.SERVICE_NAME_EVENT_BUS. */
public abstract String eventServiceName() default EventServiceLocator.SERVICE_NAME_EVENT_BUS;
/**
* Whether or not to autocreate the event service if it doesn't exist on subscription, default is true. If the
* service needs to be created, it must have a default constructor.
*/
public abstract Class<? extends EventService> autoCreateEventServiceClass() default ThreadSafeEventService.class;
}