Return to storing the ID instead of getting it from the identity.
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Thu, 4 Nov 2010 21:42:51 +0000 (22:42 +0100)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Thu, 4 Nov 2010 21:42:51 +0000 (22:42 +0100)
src/main/java/net/pterodactylus/sone/core/Core.java
src/main/java/net/pterodactylus/sone/data/Sone.java

index adf580b..6cd6135 100644 (file)
@@ -200,12 +200,10 @@ public class Core implements IdentityListener {
         *         Sone
         */
        public Sone getSone(String id) {
-               Sone sone = getRemoteSone(id);
-               if (sone != null) {
-                       return sone;
+               if (isLocalSone(id)) {
+                       return getLocalSone(id);
                }
-               sone = getLocalSone(id);
-               return sone;
+               return getRemoteSone(id);
        }
 
        /**
@@ -222,6 +220,20 @@ public class Core implements IdentityListener {
        }
 
        /**
+        * Returns whether the given ID is the ID of a local Sone.
+        *
+        * @param id
+        *            The Sone ID to check for its locality
+        * @return {@code true} if the given ID is a local Sone, {@code false}
+        *         otherwise
+        */
+       public boolean isLocalSone(String id) {
+               synchronized (localSones) {
+                       return localSones.containsKey(id);
+               }
+       }
+
+       /**
         * Returns all local Sones.
         *
         * @return All local Sones
@@ -237,11 +249,16 @@ public class Core implements IdentityListener {
         *
         * @param id
         *            The ID of the Sone to get
-        * @return The Sone, or {@code null} if there is no Sone with the given ID
+        * @return The Sone with the given ID
         */
        public Sone getLocalSone(String id) {
                synchronized (localSones) {
-                       return localSones.get(id);
+                       Sone sone = localSones.get(id);
+                       if (sone == null) {
+                               sone = new Sone(id);
+                               localSones.put(id, sone);
+                       }
+                       return sone;
                }
        }
 
@@ -261,11 +278,16 @@ public class Core implements IdentityListener {
         *
         * @param id
         *            The ID of the remote Sone to get
-        * @return The Sone, or {@code null} if there is no such Sone
+        * @return The Sone with the given ID
         */
        public Sone getRemoteSone(String id) {
                synchronized (remoteSones) {
-                       return remoteSones.get(id);
+                       Sone sone = remoteSones.get(id);
+                       if (sone == null) {
+                               sone = new Sone(id);
+                               remoteSones.put(id, sone);
+                       }
+                       return sone;
                }
        }
 
@@ -420,7 +442,7 @@ public class Core implements IdentityListener {
                        }
                        final Sone sone;
                        try {
-                               sone = new Sone(ownIdentity).setInsertUri(new FreenetURI(ownIdentity.getInsertUri())).setRequestUri(new FreenetURI(ownIdentity.getRequestUri()));
+                               sone = getLocalSone(ownIdentity.getId()).setIdentity(ownIdentity).setInsertUri(new FreenetURI(ownIdentity.getInsertUri())).setRequestUri(new FreenetURI(ownIdentity.getRequestUri()));
                                sone.setLatestEdition(Numbers.safeParseLong(ownIdentity.getProperty("Sone.LatestEdition"), (long) 0));
                        } catch (MalformedURLException mue1) {
                                logger.log(Level.SEVERE, "Could not convert the Identity’s URIs to Freenet URIs: " + ownIdentity.getInsertUri() + ", " + ownIdentity.getRequestUri(), mue1);
index 8d6a3a1..0afbf3b 100644 (file)
@@ -59,8 +59,11 @@ public class Sone {
        /** The logger. */
        private static final Logger logger = Logging.getLogger(Sone.class);
 
+       /** The ID of this Sone. */
+       private final String id;
+
        /** The identity of this Sone. */
-       private final Identity identity;
+       private Identity identity;
 
        /** The URI under which the Sone is stored in Freenet. */
        private volatile FreenetURI requestUri;
@@ -99,11 +102,11 @@ public class Sone {
        /**
         * Creates a new Sone.
         *
-        * @param identity
-        *            The identity of the Sone
+        * @param id
+        *            The ID of the Sone
         */
-       public Sone(Identity identity) {
-               this.identity = identity;
+       public Sone(String id) {
+               this.id = id;
        }
 
        //
@@ -116,7 +119,7 @@ public class Sone {
         * @return The identity of this Sone
         */
        public String getId() {
-               return identity.getId();
+               return id;
        }
 
        /**
@@ -129,12 +132,30 @@ public class Sone {
        }
 
        /**
+        * Sets the identity of this Sone. The {@link Identity#getId() ID} of the
+        * identity has to match this Sone’s {@link #getId()}.
+        *
+        * @param identity
+        *            The identity of this Sone
+        * @return This Sone (for method chaining)
+        * @throws IllegalArgumentException
+        *             if the ID of the identity does not match this Sone’s ID
+        */
+       public Sone setIdentity(Identity identity) throws IllegalArgumentException {
+               if (!identity.getId().equals(id)) {
+                       throw new IllegalArgumentException("Identity’s ID does not match Sone’s ID!");
+               }
+               this.identity = identity;
+               return this;
+       }
+
+       /**
         * Returns the name of this Sone.
         *
         * @return The name of this Sone
         */
        public String getName() {
-               return identity.getNickname();
+               return (identity != null) ? identity.getNickname() : null;
        }
 
        /**
@@ -598,7 +619,7 @@ public class Sone {
         */
        @Override
        public int hashCode() {
-               return identity.getId().hashCode();
+               return id.hashCode();
        }
 
        /**
@@ -609,7 +630,7 @@ public class Sone {
                if (!(object instanceof Sone)) {
                        return false;
                }
-               return ((Sone) object).identity.getId().equals(identity.getId());
+               return ((Sone) object).id.equals(id);
        }
 
        /**