X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FCore.java;h=b16165e67360fa4b78c671452ec168a13b0bbfad;hb=3993bb581e277bc8b1a2b45122d0c7bbced9405c;hp=15a7b0e01052cd1c1b29bac1d62ec0e424791db8;hpb=4075fb19b937045f682b12c09b9873a9543f5ddb;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/core/Core.java b/src/main/java/net/pterodactylus/sone/core/Core.java index 15a7b0e..b16165e 100644 --- a/src/main/java/net/pterodactylus/sone/core/Core.java +++ b/src/main/java/net/pterodactylus/sone/core/Core.java @@ -109,6 +109,10 @@ public class Core implements IdentityListener { /** All new Sones. */ private Set newSones = new HashSet(); + /** All known Sones. */ + /* synchronize access on {@link #newSones}. */ + private Set knownSones = new HashSet(); + /** All posts. */ private Map posts = new HashMap(); @@ -203,10 +207,27 @@ public class Core implements IdentityListener { * Sone */ public Sone getSone(String id) { + return getSone(id, true); + } + + /** + * Returns the Sone with the given ID, regardless whether it’s local or + * remote. + * + * @param id + * The ID of the Sone to get + * @param create + * {@code true} to create a new Sone if none exists, + * {@code false} to return {@code null} if a Sone with the given + * ID does not exist + * @return The Sone with the given ID, or {@code null} if there is no such + * Sone + */ + public Sone getSone(String id, boolean create) { if (isLocalSone(id)) { return getLocalSone(id); } - return getRemoteSone(id); + return getRemoteSone(id, create); } /** @@ -284,9 +305,23 @@ public class Core implements IdentityListener { * @return The Sone with the given ID */ public Sone getRemoteSone(String id) { + return getRemoteSone(id, true); + } + + /** + * Returns the remote Sone with the given ID. + * + * @param id + * The ID of the remote Sone to get + * @param create + * {@code true} to always create a Sone, {@code false} to return + * {@code null} if no Sone with the given ID exists + * @return The Sone with the given ID + */ + public Sone getRemoteSone(String id, boolean create) { synchronized (remoteSones) { Sone sone = remoteSones.get(id); - if (sone == null) { + if ((sone == null) && create) { sone = new Sone(id); remoteSones.put(id, sone); } @@ -333,7 +368,9 @@ public class Core implements IdentityListener { */ public boolean isNewSone(Sone sone) { synchronized (newSones) { - return newSones.remove(sone); + boolean isNew = !knownSones.contains(sone) && newSones.remove(sone); + knownSones.add(sone); + return isNew; } } @@ -735,6 +772,11 @@ public class Core implements IdentityListener { sone.setFriends(friends); sone.setModificationCounter(soneModificationCounter); } + synchronized (newSones) { + for (Sone friend : friends) { + knownSones.add(friend); + } + } } /** @@ -984,6 +1026,17 @@ public class Core implements IdentityListener { options.getIntegerOption("InsertionDelay").set(configuration.getIntValue("Option/InsertionDelay").getValue(null)); + /* load known Sones. */ + int soneCounter = 0; + while (true) { + String knownSoneId = configuration.getStringValue("KnownSone/" + soneCounter++ + "/ID").getValue(null); + if (knownSoneId == null) { + break; + } + synchronized (newSones) { + knownSones.add(getRemoteSone(knownSoneId)); + } + } } /** @@ -995,6 +1048,16 @@ public class Core implements IdentityListener { configuration.getIntValue("Option/InsertionDelay").setValue(options.getIntegerOption("InsertionDelay").getReal()); configuration.getBooleanValue("Option/ClearOnNextRestart").setValue(options.getBooleanOption("ClearOnNextRestart").getReal()); configuration.getBooleanValue("Option/ReallyClearOnNextRestart").setValue(options.getBooleanOption("ReallyClearOnNextRestart").getReal()); + + /* save known Sones. */ + int soneCounter = 0; + synchronized (newSones) { + for (Sone knownSone : knownSones) { + configuration.getStringValue("KnownSone/" + soneCounter++ + "/ID").setValue(knownSone.getId()); + } + configuration.getStringValue("KnownSone/" + soneCounter + "/ID").setValue(null); + } + } catch (ConfigurationException ce1) { logger.log(Level.SEVERE, "Could not store configuration!", ce1); }