+ public MemoryDatabase(Configuration configuration) {
+ this.configuration = configuration;
+ }
+
+ //
+ // DATABASE METHODS
+ //
+
+ @Override
+ public void save() throws DatabaseException {
+ saveKnownPosts();
+ saveKnownPostReplies();
+ }
+
+ //
+ // SERVICE METHODS
+ //
+
+ @Override
+ protected void doStart() {
+ loadKnownPosts();
+ loadKnownPostReplies();
+ notifyStarted();
+ }
+
+ @Override
+ protected void doStop() {
+ try {
+ save();
+ notifyStopped();
+ } catch (DatabaseException de1) {
+ notifyFailed(de1);
+ }
+ }
+
+ @Override
+ public Optional<Identity> getIdentity(String identityId) {
+ lock.readLock().lock();
+ try {
+ return fromNullable(identities.get(identityId));
+ } finally {
+ lock.readLock().unlock();
+ }
+ }
+
+ @Override
+ public void storeIdentity(Identity identitiy) {
+ lock.writeLock().lock();
+ try {
+ identities.put(identitiy.getId(), identitiy);
+ } finally {
+ lock.writeLock().unlock();
+ }
+ }
+
+ @Override
+ public Function<String, Optional<Sone>> getSone() {
+ return new Function<String, Optional<Sone>>() {
+ @Override
+ public Optional<Sone> apply(String soneId) {
+ return (soneId == null) ? Optional.<Sone>absent() : getSone(soneId);
+ }
+ };
+ }
+
+ @Override
+ public Optional<Sone> getSone(String soneId) {
+ lock.readLock().lock();
+ try {
+ return fromNullable(sones.get(soneId));
+ } finally {
+ lock.readLock().unlock();
+ }
+ }
+
+ @Override
+ public Collection<Sone> getSones() {
+ lock.readLock().lock();
+ try {
+ return Collections.unmodifiableCollection(sones.values());
+ } finally {
+ lock.readLock().unlock();
+ }
+ }
+
+ @Override
+ public Collection<Sone> getLocalSones() {
+ lock.readLock().lock();
+ try {
+ return from(getSones()).filter(LOCAL_SONE_FILTER).toSet();
+ } finally {
+ lock.readLock().unlock();
+ }
+ }
+
+ @Override
+ public Collection<Sone> getRemoteSones() {
+ lock.readLock().lock();
+ try {
+ return from(getSones()).filter(not(LOCAL_SONE_FILTER)).toSet();
+ } finally {
+ lock.readLock().unlock();
+ }
+ }
+
+ @Override
+ public SoneBuilder newSoneBuilder() {
+ return new DefaultSoneBuilder(this) {
+ @Override
+ public Sone build(Optional<SoneCreated> soneCreated) throws IllegalStateException {
+ Sone sone = super.build(soneCreated);
+ lock.writeLock().lock();
+ try {
+ sones.put(sone.getId(), sone);
+ } finally {
+ lock.writeLock().unlock();
+ }
+ return sone;
+ }
+ };