X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FCore.java;h=2e1b5fb84b45d46e91732046325dcb66c6210147;hb=ae7ed7856de14eb339e77ae86e6d4a8b9284162d;hp=b4854457e2d15c1af5e3e14d47527d680f29331c;hpb=fd88107b013522d7620f5297386472206f320e10;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 b485445..2e1b5fb 100644 --- a/src/main/java/net/pterodactylus/sone/core/Core.java +++ b/src/main/java/net/pterodactylus/sone/core/Core.java @@ -143,23 +143,17 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, /** The trust updater. */ private final WebOfTrustUpdater webOfTrustUpdater; - /** The times Sones were followed. */ - private final Map soneFollowingTimes = new HashMap(); - /** Locked local Sones. */ /* synchronize on itself. */ - private final Set lockedSones = new HashSet(); + private final Set lockedSones = new HashSet(); /** Sone inserters. */ /* synchronize access on this on sones. */ - private final Map soneInserters = new HashMap(); + private final Map soneInserters = new HashMap(); /** Sone rescuers. */ /* synchronize access on this on sones. */ - private final Map soneRescuers = new HashMap(); - - /** All known Sones. */ - private final Set knownSones = new HashSet(); + private final Map soneRescuers = new HashMap(); /** The post database. */ private final Database database; @@ -269,9 +263,8 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, * The local Sone to get the rescuer for * @return The Sone rescuer for the given Sone */ - public SoneRescuer getSoneRescuer(Sone sone) { + public SoneRescuer getSoneRescuer(LocalSone sone) { checkNotNull(sone, "sone must not be null"); - checkArgument(sone.isLocal(), "sone must be local"); synchronized (soneRescuers) { SoneRescuer soneRescuer = soneRescuers.get(sone); if (soneRescuer == null) { @@ -290,7 +283,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, * The sone to check * @return {@code true} if the Sone is locked, {@code false} if it is not */ - public boolean isLocked(Sone sone) { + public boolean isLocked(LocalSone sone) { synchronized (lockedSones) { return lockedSones.contains(sone); } @@ -364,7 +357,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, * @return {@code true} if a modification has been detected in the Sone, * {@code false} otherwise */ - public boolean isModifiedSone(Sone sone) { + public boolean isModifiedSone(LocalSone sone) { return soneInserters.containsKey(sone) && soneInserters.get(sone).isModified(); } @@ -377,9 +370,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, * been followed, or {@link Long#MAX_VALUE} */ public long getSoneFollowingTime(Sone sone) { - synchronized (soneFollowingTimes) { - return Optional.fromNullable(soneFollowingTimes.get(sone.getId())).or(Long.MAX_VALUE); - } + return database.getSoneFollowingTime(sone.getId()).or(Long.MAX_VALUE); } /** @@ -573,13 +564,13 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, /** * Locks the given Sone. A locked Sone will not be inserted by - * {@link SoneInserter} until it is {@link #unlockSone(Sone) unlocked} + * {@link SoneInserter} until it is {@link #unlockSone(LocalSone) unlocked} * again. * * @param sone * The sone to lock */ - public void lockSone(Sone sone) { + public void lockSone(LocalSone sone) { synchronized (lockedSones) { if (lockedSones.add(sone)) { eventBus.post(new SoneLockedEvent(sone)); @@ -590,11 +581,11 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, /** * Unlocks the given Sone. * - * @see #lockSone(Sone) + * @see #lockSone(LocalSone) * @param sone * The sone to unlock */ - public void unlockSone(Sone sone) { + public void unlockSone(LocalSone sone) { synchronized (lockedSones) { if (lockedSones.remove(sone)) { eventBus.post(new SoneUnlockedEvent(sone)); @@ -609,14 +600,14 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, * The own identity to create a Sone from * @return The added (or already existing) Sone */ - public Sone addLocalSone(OwnIdentity ownIdentity) { + public LocalSone addLocalSone(OwnIdentity ownIdentity) { if (ownIdentity == null) { logger.log(Level.WARNING, "Given OwnIdentity is null!"); return null; } logger.info(String.format("Adding Sone from OwnIdentity: %s", ownIdentity)); - Sone sone = database.registerLocalSone(ownIdentity); - SoneInserter soneInserter = new SoneInserter(this, eventBus, freenetInterface, ownIdentity.getId()); + LocalSone sone = database.registerLocalSone(ownIdentity); + SoneInserter soneInserter = new SoneInserter(this, eventBus, freenetInterface, database, ownIdentity.getId()); eventBus.register(soneInserter); synchronized (soneInserters) { soneInserters.put(sone, soneInserter); @@ -641,7 +632,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, logger.log(Level.SEVERE, String.format("Could not add “Sone” context to own identity: %s", ownIdentity)); return null; } - Sone sone = addLocalSone(ownIdentity); + LocalSone sone = addLocalSone(ownIdentity); followSone(sone, "nwa8lHa271k2QvJ8aa0Ov7IHAV-DFOCFgmDt3X6BpCI"); touchConfiguration(); @@ -670,13 +661,11 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, Sone sone = !newSone ? existingSone.get() : database.newSoneBuilder().from(identity).build(); sone.setLatestEdition(latestEdition); if (newSone) { - synchronized (knownSones) { - newSone = !knownSones.contains(sone.getId()); - } + newSone = !database.isSoneKnown(sone); sone.setKnown(!newSone); if (newSone) { eventBus.post(new NewSoneFoundEvent(sone)); - for (Sone localSone : getLocalSones()) { + for (LocalSone localSone : getLocalSones()) { if (localSone.getOptions().isAutoFollow()) { followSone(localSone, sone.getId()); } @@ -697,31 +686,28 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, * @param soneId * The ID of the Sone to follow */ - public void followSone(Sone sone, String soneId) { + public void followSone(LocalSone sone, String soneId) { checkNotNull(sone, "sone must not be null"); checkNotNull(soneId, "soneId must not be null"); + boolean newFriend = !database.getSoneFollowingTime(soneId).isPresent(); database.addFriend(sone, soneId); - synchronized (soneFollowingTimes) { - if (!soneFollowingTimes.containsKey(soneId)) { - long now = System.currentTimeMillis(); - soneFollowingTimes.put(soneId, now); - Optional followedSone = getSone(soneId); - if (!followedSone.isPresent()) { - return; - } - for (Post post : followedSone.get().getPosts()) { - if (post.getTime() < now) { - markPostKnown(post); - } + if (newFriend) { + long now = System.currentTimeMillis(); + Optional followedSone = getSone(soneId); + if (!followedSone.isPresent()) { + return; + } + for (Post post : followedSone.get().getPosts()) { + if (post.getTime() < now) { + markPostKnown(post); } - for (PostReply reply : followedSone.get().getReplies()) { - if (reply.getTime() < now) { - markReplyKnown(reply); - } + } + for (PostReply reply : followedSone.get().getReplies()) { + if (reply.getTime() < now) { + markReplyKnown(reply); } } } - touchConfiguration(); } /** @@ -732,20 +718,10 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, * @param soneId * The ID of the Sone being unfollowed */ - public void unfollowSone(Sone sone, String soneId) { + public void unfollowSone(LocalSone sone, String soneId) { checkNotNull(sone, "sone must not be null"); checkNotNull(soneId, "soneId must not be null"); database.removeFriend(sone, soneId); - boolean unfollowedSoneStillFollowed = false; - for (Sone localSone : getLocalSones()) { - unfollowedSoneStillFollowed |= localSone.hasFriend(soneId); - } - if (!unfollowedSoneStillFollowed) { - synchronized (soneFollowingTimes) { - soneFollowingTimes.remove(soneId); - } - } - touchConfiguration(); } /** @@ -940,9 +916,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, public void markSoneKnown(Sone sone) { if (!sone.isKnown()) { sone.setKnown(true); - synchronized (knownSones) { - knownSones.add(sone.getId()); - } + database.setSoneKnown(sone); eventBus.post(new MarkSoneKnownEvent(sone)); touchConfiguration(); } @@ -975,7 +949,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, final Post post = postBuilder.build(); database.storePost(post); eventBus.post(new NewPostFoundEvent(post)); - sone.addPost(post); touchConfiguration(); localElementTicker.schedule(new MarkPostKnown(post), 10, TimeUnit.SECONDS); return post; @@ -1251,7 +1224,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, public void serviceStop() { localElementTicker.shutdownNow(); synchronized (soneInserters) { - for (Entry soneInserter : soneInserters.entrySet()) { + for (Entry soneInserter : soneInserters.entrySet()) { soneInserter.getValue().stop(); } } @@ -1284,26 +1257,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, try { preferences.saveTo(configuration); - /* save known Sones. */ - int soneCounter = 0; - synchronized (knownSones) { - for (String knownSoneId : knownSones) { - configuration.getStringValue("KnownSone/" + soneCounter++ + "/ID").setValue(knownSoneId); - } - configuration.getStringValue("KnownSone/" + soneCounter + "/ID").setValue(null); - } - - /* save Sone following times. */ - soneCounter = 0; - synchronized (soneFollowingTimes) { - for (Entry soneFollowingTime : soneFollowingTimes.entrySet()) { - configuration.getStringValue("SoneFollowingTimes/" + soneCounter + "/Sone").setValue(soneFollowingTime.getKey()); - configuration.getLongValue("SoneFollowingTimes/" + soneCounter + "/Time").setValue(soneFollowingTime.getValue()); - ++soneCounter; - } - configuration.getStringValue("SoneFollowingTimes/" + soneCounter + "/Sone").setValue(null); - } - /* save known posts. */ database.save(); @@ -1326,32 +1279,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, */ private void loadConfiguration() { new PreferencesLoader(preferences).loadFrom(configuration); - - /* load known Sones. */ - int soneCounter = 0; - while (true) { - String knownSoneId = configuration.getStringValue("KnownSone/" + soneCounter++ + "/ID").getValue(null); - if (knownSoneId == null) { - break; - } - synchronized (knownSones) { - knownSones.add(knownSoneId); - } - } - - /* load Sone following times. */ - soneCounter = 0; - while (true) { - String soneId = configuration.getStringValue("SoneFollowingTimes/" + soneCounter + "/Sone").getValue(null); - if (soneId == null) { - break; - } - long time = configuration.getLongValue("SoneFollowingTimes/" + soneCounter + "/Time").getValue(Long.MAX_VALUE); - synchronized (soneFollowingTimes) { - soneFollowingTimes.put(soneId, time); - } - ++soneCounter; - } } /**