Store a Sone’s known status in the Sone itself.
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Wed, 25 Jan 2012 09:52:38 +0000 (10:52 +0100)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Fri, 27 Jan 2012 09:18:23 +0000 (10:18 +0100)
src/main/java/net/pterodactylus/sone/core/Core.java
src/main/java/net/pterodactylus/sone/data/Sone.java
src/main/java/net/pterodactylus/sone/template/SoneAccessor.java
src/main/java/net/pterodactylus/sone/web/KnownSonesPage.java

index 7a97842..ed34ef2 100644 (file)
@@ -137,11 +137,7 @@ public class Core extends AbstractService implements IdentityListener, UpdateLis
        /* synchronize access on this on itself. */
        private Map<String, Sone> remoteSones = new HashMap<String, Sone>();
 
-       /** All new Sones. */
-       private Set<String> newSones = new HashSet<String>();
-
        /** All known Sones. */
-       /* synchronize access on {@link #newSones}. */
        private Set<String> knownSones = new HashSet<String>();
 
        /** All posts. */
@@ -504,19 +500,6 @@ public class Core extends AbstractService implements IdentityListener, UpdateLis
        }
 
        /**
-        * Returns whether the Sone with the given ID is a new Sone.
-        *
-        * @param soneId
-        *            The ID of the sone to check for
-        * @return {@code true} if the given Sone is new, false otherwise
-        */
-       public boolean isNewSone(String soneId) {
-               synchronized (newSones) {
-                       return !knownSones.contains(soneId) && newSones.contains(soneId);
-               }
-       }
-
-       /**
         * Returns whether the given Sone has been modified.
         *
         * @param sone
@@ -972,12 +955,10 @@ public class Core extends AbstractService implements IdentityListener, UpdateLis
                        sone.setRequestUri(getSoneUri(identity.getRequestUri()));
                        sone.setLatestEdition(Numbers.safeParseLong(identity.getProperty("Sone.LatestEdition"), (long) 0));
                        if (newSone) {
-                               synchronized (newSones) {
+                               synchronized (knownSones) {
                                        newSone = !knownSones.contains(sone.getId());
-                                       if (newSone) {
-                                               newSones.add(sone.getId());
-                                       }
                                }
+                               sone.setKnown(!newSone);
                                if (newSone) {
                                        coreListenerManager.fireNewSoneFound(sone);
                                        for (Sone localSone : getLocalSones()) {
@@ -1353,12 +1334,13 @@ public class Core extends AbstractService implements IdentityListener, UpdateLis
         *            The Sone to mark as known
         */
        public void markSoneKnown(Sone sone) {
-               synchronized (newSones) {
-                       if (newSones.remove(sone.getId())) {
+               if (!sone.isKnown()) {
+                       sone.setKnown(true);
+                       synchronized (knownSones) {
                                knownSones.add(sone.getId());
-                               coreListenerManager.fireMarkSoneKnown(sone);
-                               touchConfiguration();
                        }
+                       coreListenerManager.fireMarkSoneKnown(sone);
+                       touchConfiguration();
                }
        }
 
@@ -1569,7 +1551,7 @@ public class Core extends AbstractService implements IdentityListener, UpdateLis
                        sone.setAlbums(topLevelAlbums);
                        soneInserters.get(sone).setLastInsertFingerprint(lastInsertFingerprint);
                }
-               synchronized (newSones) {
+               synchronized (knownSones) {
                        for (String friend : friends) {
                                knownSones.add(friend);
                        }
@@ -2232,7 +2214,7 @@ public class Core extends AbstractService implements IdentityListener, UpdateLis
 
                        /* save known Sones. */
                        int soneCounter = 0;
-                       synchronized (newSones) {
+                       synchronized (knownSones) {
                                for (String knownSoneId : knownSones) {
                                        configuration.getStringValue("KnownSone/" + soneCounter++ + "/ID").setValue(knownSoneId);
                                }
@@ -2361,7 +2343,7 @@ public class Core extends AbstractService implements IdentityListener, UpdateLis
                        if (knownSoneId == null) {
                                break;
                        }
-                       synchronized (newSones) {
+                       synchronized (knownSones) {
                                knownSones.add(knownSoneId);
                        }
                }
@@ -2554,10 +2536,7 @@ public class Core extends AbstractService implements IdentityListener, UpdateLis
                synchronized (remoteSones) {
                        remoteSones.remove(identity.getId());
                }
-               synchronized (newSones) {
-                       newSones.remove(identity.getId());
-                       coreListenerManager.fireSoneRemoved(sone);
-               }
+               coreListenerManager.fireSoneRemoved(sone);
        }
 
        //
index 63cdbcb..c2f9ae1 100644 (file)
@@ -200,6 +200,9 @@ public class Sone implements Fingerprintable, Comparable<Sone> {
        /** The client used by the Sone. */
        private volatile Client client;
 
+       /** Whether this Sone is known. */
+       private volatile boolean known;
+
        /** All friend Sones. */
        private final Set<String> friendSones = new CopyOnWriteArraySet<String>();
 
@@ -451,6 +454,27 @@ public class Sone implements Fingerprintable, Comparable<Sone> {
        }
 
        /**
+        * Returns whether this Sone is known.
+        *
+        * @return {@code true} if this Sone is known, {@code false} otherwise
+        */
+       public boolean isKnown() {
+               return known;
+       }
+
+       /**
+        * Sets whether this Sone is known.
+        *
+        * @param known
+        *            {@code true} if this Sone is known, {@code false} otherwise
+        * @return This Sone
+        */
+       public Sone setKnown(boolean known) {
+               this.known = known;
+               return this;
+       }
+
+       /**
         * Returns all friend Sones of this Sone.
         *
         * @return The friend Sones of this Sone
index 305e9a8..c134fc0 100644 (file)
@@ -96,7 +96,7 @@ public class SoneAccessor extends ReflectionAccessor {
                } else if (member.equals("downloading")) {
                        return sone.getStatus() == SoneStatus.downloading;
                } else if (member.equals("new")) {
-                       return core.isNewSone(sone.getId());
+                       return !sone.isKnown();
                } else if (member.equals("locked")) {
                        return core.isLocked(sone);
                } else if (member.equals("lastUpdatedText")) {
index 6ed5667..f32a47d 100644 (file)
@@ -91,7 +91,7 @@ public class KnownSonesPage extends SoneTemplatePage {
                                 */
                                @Override
                                public boolean filterObject(Sone sone) {
-                                       return webInterface.getCore().isNewSone(sone.getId());
+                                       return !sone.isKnown();
                                }
                        });
                } else if ("not-new".equals(filter)) {
@@ -101,7 +101,7 @@ public class KnownSonesPage extends SoneTemplatePage {
                                 */
                                @Override
                                public boolean filterObject(Sone sone) {
-                                       return !webInterface.getCore().isNewSone(sone.getId());
+                                       return sone.isKnown();
                                }
                        });
                }