001    package com.hammurapi.eventbus.local;
002    
003    import java.util.concurrent.locks.ReadWriteLock;
004    
005    import com.hammurapi.eventbus.AbstractEventBus;
006    import com.hammurapi.eventbus.HandleExtractor;
007    import com.hammurapi.extract.Predicate;
008    import com.hammurapi.store.AbstractStore;
009    import com.hammurapi.store.DeputyStore;
010    import com.hammurapi.store.LiveView;
011    import com.hammurapi.store.UnmodifiableStore;
012    import com.hammurapi.store.local.LocalStoreBase;
013    
014    /**
015     * Implementation of event store.
016     * @author Pavel Vlasov
017     *
018     * @param <E>
019     * @param <P>
020     * @param <C>
021     */
022    public class LocalEventStoreImpl<E,P extends Comparable<P>,C> extends LocalStoreBase<AbstractEventBus.Handle<E,P,C,Long>, E, LocalEventStore<E,P,C>> implements LocalEventStore<E,P,C> {
023    
024            /**
025             * Config class with bound generic parameters. 
026             * @author Pavel Vlasov
027             *
028             */
029            public static class Config<E,P extends Comparable<P>,C> extends LocalStoreBase.Config<AbstractEventBus.Handle<E,P,C,Long>, E, LocalEventStore<E,P,C>> {
030                    
031                    public Config() {
032                            setPrimaryKeyExtractor(new HandleExtractor<E, P, C, Long, AbstractEventBus.Handle<E,P,C,Long>, LocalEventStore<E,P,C>>());
033                    }
034            }
035    
036            public LocalEventStoreImpl(Config<E,P,C> config) {
037                    super(config);
038            }
039            
040            protected static class LocalEventDeputyStore<E,P extends Comparable<P>,C> extends DeputyStore<AbstractEventBus.Handle<E,P,C,Long>, E, LocalEventStore<E,P,C>> implements LocalEventStore<E,P,C> {
041    
042                    public LocalEventDeputyStore(
043                                    AbstractStore<AbstractEventBus.Handle<E, P, C, Long>, E, LocalEventStore<E, P, C>> master,
044                                    ReadWriteLock masterLock) {
045                            super(master, masterLock);
046                    }
047    
048                    @Override
049                    protected LocalEventStore<E,P,C> createDeputy() {
050                            return new LocalEventDeputyStore<E,P,C>(this, createMasterLock());
051                    }
052                    
053                    @Override
054                    public LocalEventStore<E,P,C> createUnmodifiableFacade() {
055                            return new LocalEventUnmodifiableStore<E,P,C>(this);
056                    }
057    
058                    @Override
059                    protected LocalEventStore<E,P,C> createLiveView(Predicate<AbstractEventBus.Handle<E,P,C,Long>, LocalEventStore<E,P,C>> selector) {
060                            return new LocalEventLiveView<E,P,C>(this, selector);
061                    }
062                    
063            }
064            
065            protected static class LocalEventUnmodifiableStore<E,P extends Comparable<P>,C> extends UnmodifiableStore<AbstractEventBus.Handle<E,P,C,Long>, E, LocalEventStore<E,P,C>> implements LocalEventStore<E,P,C> {
066    
067                    public LocalEventUnmodifiableStore(LocalEventStore<E, P, C> master) {
068                            super(master);
069                    }
070    
071                    
072            }
073            
074            protected static class LocalEventLiveView<E,P extends Comparable<P>,C> extends LiveView<AbstractEventBus.Handle<E,P,C,Long>, E, LocalEventStore<E,P,C>> implements LocalEventStore<E,P,C> {
075                    
076                    public LocalEventLiveView(
077                                    LocalEventStore<E, P, C> master,
078                                    Predicate<AbstractEventBus.Handle<E, P, C, Long>, LocalEventStore<E, P, C>> selector) {
079                            super(master, selector);
080                    }
081    
082                    @Override
083                    public LocalEventStore<E,P,C> createUnmodifiableFacade() {
084                            return new LocalEventUnmodifiableStore(this);
085                    }
086                    
087            }
088    
089            @Override
090            protected LocalEventStore<E,P,C> createDeputy() {
091                    return new LocalEventDeputyStore<E,P,C>(this, createMasterLock());
092            }
093            
094            @Override
095            public LocalEventStore<E,P,C> createUnmodifiableFacade() {
096                    return new LocalEventUnmodifiableStore<E,P,C>(this);
097            }
098    
099            @Override
100            protected LocalEventStore<E,P,C> createLiveView(Predicate<AbstractEventBus.Handle<E,P,C,Long>, LocalEventStore<E,P,C>> selector) {
101                    return new LocalEventLiveView<E,P,C>(this, selector);
102            }
103    
104    }