/** The trust updater. */
private final WebOfTrustUpdater webOfTrustUpdater;
- /** The times Sones were followed. */
- private final Map<String, Long> soneFollowingTimes = new HashMap<String, Long>();
-
/** Locked local Sones. */
/* synchronize on itself. */
private final Set<LocalSone> lockedSones = new HashSet<LocalSone>();
/* synchronize access on this on sones. */
private final Map<LocalSone, SoneRescuer> soneRescuers = new HashMap<LocalSone, SoneRescuer>();
- /** All known Sones. */
- private final Set<String> knownSones = new HashSet<String>();
-
/** The post database. */
private final Database database;
* 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);
}
/**
* 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.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();
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());
}
* @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<Sone> 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<Sone> 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();
}
/**
* @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();
}
/**
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();
}
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<String, Long> 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();
*/
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;
- }
}
/**