Add method to check for the remoteness of a Sone by its ID.
[Sone.git] / src / main / java / net / pterodactylus / sone / core / Core.java
index e4814fe..af1523a 100644 (file)
@@ -306,6 +306,20 @@ public class Core implements IdentityListener {
        }
 
        /**
+        * Returns whether the Sone with the given ID is a remote Sone.
+        *
+        * @param id
+        *            The ID of the Sone to check
+        * @return {@code true} if the Sone with the given ID is a remote Sone,
+        *         {@code false} otherwise
+        */
+       public boolean isRemoteSone(String id) {
+               synchronized (remoteSones) {
+                       return remoteSones.containsKey(id);
+               }
+       }
+
+       /**
         * Returns the post with the given ID.
         *
         * @param postId
@@ -389,7 +403,7 @@ public class Core implements IdentityListener {
        public Set<Sone> getLikes(Reply reply) {
                Set<Sone> sones = new HashSet<Sone>();
                for (Sone sone : getSones()) {
-                       if (sone.getLikedPostIds().contains(reply.getId())) {
+                       if (sone.getLikedReplyIds().contains(reply.getId())) {
                                sones.add(sone);
                        }
                }
@@ -436,10 +450,6 @@ public class Core implements IdentityListener {
                        return null;
                }
                synchronized (localSones) {
-                       if (localSones.containsKey(ownIdentity.getId())) {
-                               logger.log(Level.FINE, "Tried to add known local Sone: %s", ownIdentity);
-                               return localSones.get(ownIdentity.getId());
-                       }
                        final Sone sone;
                        try {
                                sone = getLocalSone(ownIdentity.getId()).setIdentity(ownIdentity).setInsertUri(new FreenetURI(ownIdentity.getInsertUri())).setRequestUri(new FreenetURI(ownIdentity.getRequestUri()));
@@ -454,6 +464,7 @@ public class Core implements IdentityListener {
                        soneInserters.put(sone, soneInserter);
                        soneInserter.start();
                        setSoneStatus(sone, SoneStatus.idle);
+                       loadSone(sone);
                        new Thread(new Runnable() {
 
                                @Override
@@ -497,15 +508,21 @@ public class Core implements IdentityListener {
                        return null;
                }
                synchronized (remoteSones) {
-                       if (remoteSones.containsKey(identity.getId())) {
-                               logger.log(Level.FINE, "Identity already exists: %s", identity);
-                               return remoteSones.get(identity.getId());
-                       }
-                       Sone sone = new Sone(identity);
-                       sone.setRequestUri(getSoneUri(identity.getRequestUri(), identity.getProperty("Sone.LatestEdition")));
+                       final Sone sone = getRemoteSone(identity.getId()).setIdentity(identity);
+                       sone.setRequestUri(getSoneUri(identity.getRequestUri()));
+                       sone.setLatestEdition(Numbers.safeParseLong(identity.getProperty("Sone.LatestEdition"), (long) 0));
                        remoteSones.put(identity.getId(), sone);
                        soneDownloader.addSone(sone);
-                       setSoneStatus(sone, SoneStatus.idle);
+                       setSoneStatus(sone, SoneStatus.unknown);
+                       new Thread(new Runnable() {
+
+                               @Override
+                               @SuppressWarnings("synthetic-access")
+                               public void run() {
+                                       soneDownloader.fetchSone(sone);
+                               }
+
+                       }, "Sone Downloader").start();
                        return sone;
                }
        }
@@ -547,8 +564,8 @@ public class Core implements IdentityListener {
                                storedSone.setLikePostIds(sone.getLikedPostIds());
                                storedSone.setLikeReplyIds(sone.getLikedReplyIds());
                                storedSone.setLatestEdition(sone.getRequestUri().getEdition());
+                               storedSone.setModificationCounter(0);
                        }
-                       saveSone(storedSone);
                }
        }
 
@@ -571,9 +588,15 @@ public class Core implements IdentityListener {
                                return;
                        }
                        localSones.remove(sone.getId());
-                       soneInserters.remove(sone.getId()).stop();
+                       soneInserters.remove(sone).stop();
                }
                identityManager.removeContext((OwnIdentity) sone.getIdentity(), "Sone");
+               identityManager.removeProperty((OwnIdentity) sone.getIdentity(), "Sone.LatestEdition");
+               try {
+                       configuration.getLongValue("Sone/" + sone.getId() + "/Time").setValue(null);
+               } catch (ConfigurationException ce1) {
+                       logger.log(Level.WARNING, "Could not remove Sone from configuration!", ce1);
+               }
        }
 
        /**
@@ -591,7 +614,11 @@ public class Core implements IdentityListener {
 
                /* load Sone. */
                String sonePrefix = "Sone/" + sone.getId();
-               long soneTime = configuration.getLongValue(sonePrefix + "/Time").getValue((long) 0);
+               Long soneTime = configuration.getLongValue(sonePrefix + "/Time").getValue(null);
+               if (soneTime == null) {
+                       logger.log(Level.INFO, "Could not load Sone because no Sone has been saved.");
+                       return;
+               }
                long soneModificationCounter = configuration.getLongValue(sonePrefix + "/ModificationCounter").getValue((long) 0);
 
                /* load profile. */
@@ -954,13 +981,11 @@ public class Core implements IdentityListener {
         *
         * @param uriString
         *            The URI to derive the Sone URI from
-        * @param latestEditionString
-        *            The latest edition as a {@link String}, or {@code null}
         * @return The derived URI
         */
-       private FreenetURI getSoneUri(String uriString, String latestEditionString) {
+       private FreenetURI getSoneUri(String uriString) {
                try {
-                       FreenetURI uri = new FreenetURI(uriString).setDocName("Sone").setMetaString(new String[0]).setSuggestedEdition(Numbers.safeParseLong(latestEditionString, (long) 0));
+                       FreenetURI uri = new FreenetURI(uriString).setDocName("Sone").setMetaString(new String[0]);
                        return uri;
                } catch (MalformedURLException mue1) {
                        logger.log(Level.WARNING, "Could not create Sone URI from URI: " + uriString, mue1);
@@ -988,7 +1013,7 @@ public class Core implements IdentityListener {
         */
        @Override
        public void ownIdentityRemoved(OwnIdentity ownIdentity) {
-               /* TODO */
+               logger.log(Level.FINEST, "Removing OwnIdentity: " + ownIdentity);
        }
 
        /**
@@ -1004,8 +1029,16 @@ public class Core implements IdentityListener {
         * {@inheritDoc}
         */
        @Override
-       public void identityUpdated(Identity identity) {
-               /* TODO */
+       public void identityUpdated(final Identity identity) {
+               new Thread(new Runnable() {
+
+                       @Override
+                       @SuppressWarnings("synthetic-access")
+                       public void run() {
+                               Sone sone = getRemoteSone(identity.getId());
+                               soneDownloader.fetchSone(sone);
+                       }
+               }).start();
        }
 
        /**