001package com.hammurapi.store.local;
002
003import java.util.concurrent.locks.ReadWriteLock;
004
005import com.hammurapi.extract.Predicate;
006import com.hammurapi.store.AbstractStore;
007import com.hammurapi.store.DeputyStore;
008import com.hammurapi.store.LiveView;
009import com.hammurapi.store.UnmodifiableStore;
010
011/**
012 * In-memory object store.
013 * @author Pavel Vlasov
014 *
015 * @param <T>
016 */
017public class LocalStoreImpl<T, PK> extends LocalStoreBase<T, PK, LocalStore<T,PK>> implements LocalStore<T, PK> {
018
019
020        public LocalStoreImpl(Config<T, PK, LocalStore<T, PK>> config) {
021                super(config);
022        }
023        
024        protected static class LocalDeputyStore<T, PK> extends DeputyStore<T, PK, LocalStore<T,PK>> implements LocalStore<T,PK> {
025
026                public LocalDeputyStore(AbstractStore<T, PK, LocalStore<T, PK>> master,     ReadWriteLock masterLock) {
027                        super(master, masterLock);
028                }
029
030                @Override
031                protected LocalStore<T, PK> createDeputy() {
032                        return new LocalDeputyStore<T, PK>(this, createMasterLock());
033                }
034                
035                @Override
036                public LocalStore<T, PK> createUnmodifiableFacade() {
037                        return new LocalUnmodifiableStore<T, PK>(this);
038                }
039
040                @Override
041                protected LocalStore<T, PK> createLiveView(Predicate<T, LocalStore<T, PK>> selector) {
042                        return new LocalLiveView<T, PK>(this, selector);
043                }
044                
045        }
046        
047        protected static class LocalUnmodifiableStore<T, PK> extends UnmodifiableStore<T, PK, LocalStore<T, PK>> implements LocalStore<T, PK> {
048
049                public LocalUnmodifiableStore(LocalStore<T, PK> master) {
050                        super(master);
051                }
052                
053        }
054        
055        protected static class LocalLiveView<T, PK> extends LiveView<T, PK, LocalStore<T, PK>> implements LocalStore<T, PK> {
056
057                public LocalLiveView(LocalStore<T, PK> master, Predicate<T, LocalStore<T, PK>> selector) {
058                        super(master, selector);
059                }
060                
061                @Override
062                public LocalStore<T, PK> createUnmodifiableFacade() {
063                        return new LocalUnmodifiableStore<T, PK>(this);
064                }
065                
066        }
067
068        @Override
069        protected LocalStore<T, PK> createDeputy() {
070                return new LocalDeputyStore<T,PK>(this, createMasterLock());
071        }
072        
073        @Override
074        public LocalStore<T, PK> createUnmodifiableFacade() {
075                return new LocalUnmodifiableStore<T, PK>(this);
076        }
077
078        @Override
079        protected LocalStore<T, PK> createLiveView(Predicate<T, LocalStore<T, PK>> selector) {
080                return new LocalLiveView<T,PK>(this, selector);
081        }
082        
083}