import net.pterodactylus.sone.data.Sone;
import net.pterodactylus.util.config.Configuration;
import net.pterodactylus.util.config.ConfigurationException;
+import net.pterodactylus.util.filter.Filter;
+import net.pterodactylus.util.filter.Filters;
import net.pterodactylus.util.logging.Logging;
import net.pterodactylus.util.service.AbstractService;
import freenet.client.FetchResult;
}
/**
- * Creates a new post.
+ * Gets all known Sones that are not local Sones.
+ *
+ * @return All remote Sones
+ */
+ public Collection<Sone> getRemoteSones() {
+ return Filters.filteredCollection(getKnownSones(), new Filter<Sone>() {
+
+ @Override
+ @SuppressWarnings("synthetic-access")
+ public boolean filterObject(Sone object) {
+ return !localSones.contains(object);
+ }
+ });
+ }
+
+ /**
+ * Creates a new post and adds it to the given Sone.
*
* @param sone
* The sone that creates the post
}
/**
- * Creates a new post.
+ * Creates a new post and adds it to the given Sone.
*
* @param sone
* The Sone that creates the post
*/
public void addSone(Sone sone) {
soneCache.put(sone.getId(), sone);
- soneDownloader.addSone(sone);
+ if (!localSones.contains(sone)) {
+ soneDownloader.addSone(sone);
+ }
}
/**
}
/**
- * Loads the Sone from the given request URI.
+ * Loads the Sone from the given request URI. The fetching of the data is
+ * performed in a new thread so this method returns immediately.
*
* @param requestUri
* The request URI to load the Sone from
}
/**
+ * Loads and updates the given Sone.
+ *
+ * @param sone
+ * The Sone to load
+ */
+ public void loadSone(final Sone sone) {
+ new Thread(new Runnable() {
+
+ @Override
+ @SuppressWarnings("synthetic-access")
+ public void run() {
+ FreenetURI realRequestUri = sone.getRequestUri().setMetaString(new String[] { "sone.xml" });
+ FetchResult fetchResult = freenetInterface.fetchUri(realRequestUri);
+ Sone parsedSone = soneDownloader.parseSone(sone, fetchResult, realRequestUri);
+ if (parsedSone != null) {
+ addSone(parsedSone);
+ }
+ }
+ }, "Sone Downloader").start();
+ }
+
+ /**
* Deletes the given Sone from this plugin instance.
*
* @param sone
String friendKey = configuration.getStringValue(friendPrefix + "/Key").getValue(null);
String friendName = configuration.getStringValue(friendPrefix + "/Name").getValue(null);
friendSone.setRequestUri(new FreenetURI(friendKey)).setName(friendName);
- loadSone(friendKey);
sone.addFriend(friendSone);
}
} while (true);
logger.log(Level.INFO, "Loaded %d Sones.", getSones().size());
+ /* load all remote Sones. */
+ for (Sone remoteSone : getRemoteSones()) {
+ loadSone(remoteSone);
+ }
+
logger.exiting(Core.class.getName(), "loadConfiguration()");
}