Add method to not create a new post automatically.
[Sone.git] / src / main / java / net / pterodactylus / sone / core / Core.java
index 5b1b9f6..ea491bb 100644 (file)
@@ -102,6 +102,10 @@ public class Core implements IdentityListener {
        /* synchronize access on itself. */
        private final Map<Sone, SoneStatus> soneStatuses = new HashMap<Sone, SoneStatus>();
 
+       /** Locked local Sones. */
+       /* synchronize on itself. */
+       private final Set<Sone> lockedSones = new HashSet<Sone>();
+
        /** Sone inserters. */
        /* synchronize access on this on localSones. */
        private final Map<Sone, SoneInserter> soneInserters = new HashMap<Sone, SoneInserter>();
@@ -241,6 +245,19 @@ public class Core implements IdentityListener {
        }
 
        /**
+        * Returns whether the given Sone is currently locked.
+        *
+        * @param sone
+        *            The sone to check
+        * @return {@code true} if the Sone is locked, {@code false} if it is not
+        */
+       public boolean isLocked(Sone sone) {
+               synchronized (lockedSones) {
+                       return lockedSones.contains(sone);
+               }
+       }
+
+       /**
         * Returns all Sones, remote and local.
         *
         * @return All Sones
@@ -478,9 +495,23 @@ public class Core implements IdentityListener {
         * @return The post, or {@code null} if there is no such post
         */
        public Post getPost(String postId) {
+               return getPost(postId, true);
+       }
+
+       /**
+        * Returns the post with the given ID, optionally creating a new post.
+        *
+        * @param postId
+        *            The ID of the post to get
+        * @param create
+        *            {@code true} it create a new post if no post with the given ID
+        *            exists, {@code false} to return {@code null}
+        * @return The post, or {@code null} if there is no such post
+        */
+       public Post getPost(String postId, boolean create) {
                synchronized (posts) {
                        Post post = posts.get(postId);
-                       if (post == null) {
+                       if ((post == null) && create) {
                                post = new Post(postId);
                                posts.put(postId, post);
                        }
@@ -605,6 +636,33 @@ public class Core implements IdentityListener {
        //
 
        /**
+        * Locks the given Sone. A locked Sone will not be inserted by
+        * {@link SoneInserter} until it is {@link #unlockSone(Sone) unlocked}
+        * again.
+        *
+        * @param sone
+        *            The sone to lock
+        */
+       public void lockSone(Sone sone) {
+               synchronized (lockedSones) {
+                       lockedSones.add(sone);
+               }
+       }
+
+       /**
+        * Unlocks the given Sone.
+        *
+        * @see #lockSone(Sone)
+        * @param sone
+        *            The sone to unlock
+        */
+       public void unlockSone(Sone sone) {
+               synchronized (lockedSones) {
+                       lockedSones.remove(sone);
+               }
+       }
+
+       /**
         * Adds a local Sone from the given ID which has to be the ID of an own
         * identity.
         *
@@ -668,6 +726,8 @@ public class Core implements IdentityListener {
                                                return;
                                        }
                                        logger.log(Level.INFO, "Trying to restore Sone from Freenet…");
+                                       coreListenerManager.fireRescuingSone(sone);
+                                       lockSone(sone);
                                        long edition = sone.getLatestEdition();
                                        while (!stopped && (edition >= 0) && isSoneRescueMode()) {
                                                logger.log(Level.FINE, "Downloading edition " + edition + "…");
@@ -675,6 +735,7 @@ public class Core implements IdentityListener {
                                                --edition;
                                        }
                                        logger.log(Level.INFO, "Finished restoring Sone from Freenet, starting Inserter…");
+                                       coreListenerManager.fireRescuedSone(sone);
                                        soneInserter.start();
                                }
 
@@ -763,6 +824,7 @@ public class Core implements IdentityListener {
                                synchronized (newPosts) {
                                        for (Post post : sone.getPosts()) {
                                                if (!storedSone.getPosts().contains(post) && !knownPosts.contains(post.getId())) {
+                                                       post.setSone(getSone(post.getSone().getId()));
                                                        newPosts.add(post.getId());
                                                        coreListenerManager.fireNewPostFound(post);
                                                }