- * @param name
- * The name of the Sone
- * @param documentName
- * The document name in the SSK
- * @param requestUri
- * The request URI of the Sone, or {@link NullPointerException}
- * to create a Sone at a random location
- * @param insertUri
- * The insert URI of the Sone, or {@code null} to create a Sone
- * at a random location
- * @return The created Sone
- * @throws SoneException
- * if a Sone error occurs
- */
- public Sone createSone(String name, String documentName, String requestUri, String insertUri) throws SoneException {
- if ((name == null) || (name.trim().length() == 0)) {
- throw new SoneException(Type.INVALID_SONE_NAME);
- }
- String finalRequestUri;
- String finalInsertUri;
- if ((requestUri == null) || (insertUri == null)) {
- String[] keyPair = freenetInterface.generateKeyPair();
- finalRequestUri = keyPair[0];
- finalInsertUri = keyPair[1];
- } else {
- finalRequestUri = requestUri;
- finalInsertUri = insertUri;
- }
- Sone sone;
- try {
- logger.log(Level.FINEST, "Creating new Sone “%s” at %s (%s)…", new Object[] { name, finalRequestUri, finalInsertUri });
- sone = getSone(UUID.randomUUID().toString()).setName(name).setRequestUri(new FreenetURI(finalRequestUri).setKeyType("USK").setDocName(documentName)).setInsertUri(new FreenetURI(finalInsertUri).setKeyType("USK").setDocName(documentName));
- sone.setProfile(new Profile());
- /* set modification counter to 1 so it is inserted immediately. */
- sone.setModificationCounter(1);
- addLocalSone(sone);
- } catch (MalformedURLException mue1) {
- throw new SoneException(Type.INVALID_URI);
+ * @param identity
+ * The identity whose Sone to add
+ * @return The added or already existing Sone
+ */
+ public Sone addRemoteSone(Identity identity) {
+ if (identity == null) {
+ logger.log(Level.WARNING, "Given Identity is null!");
+ return null;
+ }
+ synchronized (remoteSones) {
+ final Sone sone = getRemoteSone(identity.getId()).setIdentity(identity);
+ boolean newSone = sone.getRequestUri() == null;
+ sone.setRequestUri(getSoneUri(identity.getRequestUri()));
+ sone.setLatestEdition(Numbers.safeParseLong(identity.getProperty("Sone.LatestEdition"), (long) 0));
+ if (newSone) {
+ synchronized (newSones) {
+ newSone = !knownSones.contains(sone.getId());
+ if (newSone) {
+ newSones.add(sone.getId());
+ }
+ }
+ if (newSone) {
+ coreListenerManager.fireNewSoneFound(sone);
+ }
+ }
+ remoteSones.put(identity.getId(), sone);
+ soneDownloader.addSone(sone);
+ setSoneStatus(sone, SoneStatus.unknown);
+ new Thread(new Runnable() {
+
+ @Override
+ @SuppressWarnings("synthetic-access")
+ public void run() {
+ soneDownloader.fetchSone(sone);
+ }
+
+ }, "Sone Downloader").start();
+ return sone;
+ }
+ }
+
+ /**
+ * Updates the stores Sone with the given Sone.
+ *
+ * @param sone
+ * The updated Sone
+ */
+ public void updateSone(Sone sone) {
+ if (hasSone(sone.getId())) {
+ Sone storedSone = getSone(sone.getId());
+ if (!(sone.getTime() > storedSone.getTime())) {
+ logger.log(Level.FINE, "Downloaded Sone %s is not newer than stored Sone %s.", new Object[] { sone, storedSone });
+ return;
+ }
+ synchronized (posts) {
+ for (Post post : storedSone.getPosts()) {
+ posts.remove(post.getId());
+ }
+ synchronized (newPosts) {
+ for (Post post : sone.getPosts()) {
+ if (!storedSone.getPosts().contains(post) && !knownPosts.contains(post.getId())) {
+ newPosts.add(post.getId());
+ }
+ posts.put(post.getId(), post);
+ }
+ }
+ }
+ synchronized (replies) {
+ for (Reply reply : storedSone.getReplies()) {
+ replies.remove(reply.getId());
+ }
+ synchronized (newReplies) {
+ for (Reply reply : sone.getReplies()) {
+ if (!storedSone.getReplies().contains(reply) && !knownReplies.contains(reply.getId())) {
+ newReplies.add(reply.getId());
+ }
+ replies.put(reply.getId(), reply);
+ }
+ }
+ }
+ synchronized (storedSone) {
+ storedSone.setTime(sone.getTime());
+ storedSone.setClient(sone.getClient());
+ storedSone.setProfile(sone.getProfile());
+ storedSone.setPosts(sone.getPosts());
+ storedSone.setReplies(sone.getReplies());
+ storedSone.setLikePostIds(sone.getLikedPostIds());
+ storedSone.setLikeReplyIds(sone.getLikedReplyIds());
+ storedSone.setLatestEdition(sone.getRequestUri().getEdition());
+ }