diff --git a/src/main/java/org/mbassy/subscription/FilteredAsynchronousSubscription.java b/src/main/java/org/mbassy/subscription/FilteredAsynchronousSubscription.java new file mode 100644 index 0000000..fedb2a5 --- /dev/null +++ b/src/main/java/org/mbassy/subscription/FilteredAsynchronousSubscription.java @@ -0,0 +1,33 @@ +package org.mbassy.subscription; + +import org.mbassy.IMessageBus; +import org.mbassy.IPublicationErrorHandler; +import org.mbassy.listener.MessageFilter; +import org.mbassy.listener.MessageHandlerMetadata; + +import java.lang.reflect.Method; +import java.util.Collection; + +/** +* Created with IntelliJ IDEA. +* User: benni +* Date: 11/14/12 +* Time: 3:50 PM +* To change this template use File | Settings | File Templates. +*/ +public class FilteredAsynchronousSubscription extends FilteredSubscription{ + + public FilteredAsynchronousSubscription(IMessageBus mBassador, MessageHandlerMetadata messageHandler) { + super(mBassador, messageHandler); + } + + protected void dispatch(final Object message, final Object listener){ + + getMessageBus().getExecutor().execute(new Runnable() { + @Override + public void run() { + invokeHandler(message, listener); + } + }); + } +} diff --git a/src/main/java/org/mbassy/subscription/FilteredSubscription.java b/src/main/java/org/mbassy/subscription/FilteredSubscription.java new file mode 100644 index 0000000..b811ac0 --- /dev/null +++ b/src/main/java/org/mbassy/subscription/FilteredSubscription.java @@ -0,0 +1,53 @@ +package org.mbassy.subscription; + +import org.mbassy.IMessageBus; +import org.mbassy.IPublicationErrorHandler; +import org.mbassy.MBassador; +import org.mbassy.listener.MessageFilter; +import org.mbassy.listener.MessageHandlerMetadata; + +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.Iterator; + +/** +* Created with IntelliJ IDEA. +* User: benni +* Date: 11/14/12 +* Time: 3:48 PM +* To change this template use File | Settings | File Templates. +*/ +public abstract class FilteredSubscription extends Subscription{ + + private final MessageFilter[] filter; + + + public FilteredSubscription(IMessageBus mBassador, MessageHandlerMetadata messageHandler) { + super(mBassador, messageHandler); + this.filter = messageHandler.getFilter(); + } + + private boolean passesFilter(Object message, Object listener) { + + if (filter == null) { + return true; + } + else { + for (int i = 0; i < filter.length; i++) { + if (!filter[i].accepts(message, listener)) return false; + } + return true; + } + } + + public void publish(Object message) { + + Iterator iterator = listeners.iterator(); + Object listener = null; + while ((listener = iterator.next()) != null) { + if(passesFilter(message, listener)) { + dispatch(message, listener); + } + } + } +} diff --git a/src/main/java/org/mbassy/subscription/FilteredSynchronousSubscription.java b/src/main/java/org/mbassy/subscription/FilteredSynchronousSubscription.java new file mode 100644 index 0000000..1ce3a0c --- /dev/null +++ b/src/main/java/org/mbassy/subscription/FilteredSynchronousSubscription.java @@ -0,0 +1,28 @@ +package org.mbassy.subscription; + +import org.mbassy.IMessageBus; +import org.mbassy.IPublicationErrorHandler; +import org.mbassy.listener.MessageFilter; +import org.mbassy.listener.MessageHandlerMetadata; + +import java.lang.reflect.Method; +import java.util.Collection; + +/** +* Created with IntelliJ IDEA. +* User: benni +* Date: 11/14/12 +* Time: 3:49 PM +* To change this template use File | Settings | File Templates. +*/ +public class FilteredSynchronousSubscription extends FilteredSubscription { + + + public FilteredSynchronousSubscription(IMessageBus mBassador, MessageHandlerMetadata messageHandler) { + super(mBassador, messageHandler); + } + + protected void dispatch(final Object message, final Object listener){ + invokeHandler(message, listener); + } +}