001    package com.hammurapi.eventbus;
002    
003    import java.util.Queue;
004    import java.util.Set;
005    
006    import com.hammurapi.common.ExceptionHandler;
007    import com.hammurapi.common.concurrent.TrackingExecutorService;
008    import com.hammurapi.eventbus.AbstractEventBus.Handle;
009    import com.hammurapi.eventbus.AbstractEventBus.Snapshot;
010    import com.hammurapi.extract.Predicate;
011    
012    /**
013     * Wrapper interface.
014     * @author Pavel Vlasov
015     *
016     * @param <E>
017     * @param <P>
018     */
019    public class EventHandlerWrapperFilter<E, P extends Comparable<P>, C, K, H extends EventBus.Handle<E, P, C>, S extends EventStore<E,P,C,H,S>> implements EventHandlerWrapper<E, P, C, K, H, S> {
020            
021            private EventHandlerWrapper<E, P, C, K, H, S> master;
022            private Predicate<E, C> predicate;
023    
024            public boolean consumes() {
025                    return master.consumes();
026            }
027    
028            public P getPriority() {
029                    return master.getPriority();
030            }
031    
032            @Override
033            public void post(EventDispatchContext<E, P, C, H, S> context,
034                            InferenceContext<E,P,C,K,H,S> inferenceContext,
035                            Handle<E, P, C, K>... events) {
036                    master.post(context, inferenceContext, events);
037            }
038    
039            public int getCardinality() {
040                    return master.getCardinality();
041            }
042    
043            public void reset() {
044                    master.reset();
045            }
046    
047            public C getContext() {
048                    return master.getContext();
049            }
050    
051            public Set<K> getRegistrationKeys() {
052                    return master.getRegistrationKeys();
053            }
054    
055            public EventHandler<E, P, C, H, S> getHandler() {
056                    return master.getHandler();
057            }
058    
059            public void takeSnapshot(Snapshot<E, P, C, K, H, S> snapshot, Set<K> taken) {
060                    master.takeSnapshot(snapshot, taken);
061            }
062    
063            public Predicate<E, C> getPredicate() {
064                    return predicate;
065            }
066    
067            public EventHandlerWrapperFilter(EventHandlerWrapper<E, P, C, K, H, S> master, Predicate<E, C> predicate) {
068                    this.master = peel(master);
069                    this.predicate = predicate;
070            }       
071            
072            public EventHandlerWrapper<E, P, C, K, H, S> getMaster() {
073                    return master;
074            }
075            
076            public static <E, P extends Comparable<P>, C, K, H extends EventBus.Handle<E, P, C>, S extends EventStore<E,P,C,H,S>> EventHandlerWrapper<E, P, C, K, H, S> peel(EventHandlerWrapper<E, P, C, K, H, S> handler) {
077                    if (handler instanceof EventHandlerWrapperFilter) {
078                            return peel(((EventHandlerWrapperFilter<E, P, C, K, H, S>) handler).getMaster());
079                    }
080                    
081                    return handler;
082            }
083    
084            @Override
085            public boolean isOneOff() {
086                    return master.isOneOff();
087            }
088    
089            @Override
090            public Mode getMode() {
091                    return master.getMode();
092            }
093    
094    }