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 }