001 package com.hammurapi.eventbus;
002
003 import java.util.ArrayList;
004 import java.util.Collection;
005
006 import com.hammurapi.common.TokenExpander;
007 import com.hammurapi.extract.Predicate;
008
009 /**
010 * This class adds a single method to the base class - it creates predicate/handler pairs from
011 * @author Pavel Vlasov
012 *
013 * @param <E>
014 * @param <C>
015 */
016 public class ReflectiveEventHandlerFactory<E, C, H extends EventBus.Handle<E,Integer,C>, S extends EventStore<E,Integer,C,H,S>> extends IntrospectorBase<E, C> {
017
018 protected ReflectiveEventHandlerFactory(ClassLoader classLoader, TokenExpander tokenExpander) {
019 super(classLoader, tokenExpander);
020 }
021
022 /**
023 * Introspects class and creates predicate/handler pairs.
024 * @param handlerClass
025 * @param eventType
026 * @return
027 */
028 @SuppressWarnings("unchecked")
029 public Collection<ReflectiveEventHandler<E,C,H,S>> createHandlers(C instance, Class<E> eventType) {
030 Collection<ReflectiveEventHandler<E,C,H,S>> ret = new ArrayList<ReflectiveEventHandler<E,C,H,S>>();
031 for (IntrospectionResult<E, C> ir: introspect((Class<C>) instance.getClass(), eventType)) {
032 ReflectiveEventHandler<E, C, H, S> handler = new ReflectiveEventHandler<E,C,H,S>(instance, ir.getOffset(), ir.getMethod(), ir.getParameterTypes(), ir.getHandlerAnnotation(), eventType, ir.getPredicates());
033 ret.add(handler);
034 }
035
036 return ret;
037 }
038 }