+ @Override
+ public void likePostReply(PostReply postReply, Sone localSone) {
+ lock.writeLock().lock();
+ try {
+ likedPostRepliesBySone.put(localSone.getId(), postReply.getId());
+ postReplyLikingSones.put(postReply.getId(), localSone.getId());
+ } finally {
+ lock.writeLock().unlock();
+ }
+ }
+
+ @Override
+ public void unlikePostReply(PostReply postReply, Sone localSone) {
+ lock.writeLock().lock();
+ try {
+ likedPostRepliesBySone.remove(localSone.getId(), postReply.getId());
+ postReplyLikingSones.remove(postReply.getId(), localSone.getId());
+ } finally {
+ lock.writeLock().unlock();
+ }
+ }
+
+ @Override
+ public boolean isLiked(PostReply postReply, Sone sone) {
+ lock.readLock().lock();
+ try {
+ return postReplyLikingSones.containsEntry(postReply.getId(), sone.getId());
+ } finally {
+ lock.readLock().unlock();
+ }
+ }
+
+ @Override
+ public Set<Sone> getLikes(PostReply postReply) {
+ lock.readLock().lock();
+ try {
+ return from(postReplyLikingSones.get(postReply.getId())).transform(getSone()).transformAndConcat(this.<Sone>unwrap()).toSet();
+ } finally {
+ lock.readLock().unlock();
+ }
+ }
+