    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    }