+
+ if (insertInformation != null) {
+ logger.log(Level.INFO, "Inserting Sone “%s”…", new Object[] { sone.getName() });
+
+ boolean success = false;
+ try {
+ core.setSoneStatus(sone, SoneStatus.inserting);
+ long insertTime = System.currentTimeMillis();
+ insertInformation.setTime(insertTime);
+ FreenetURI finalUri = freenetInterface.insertDirectory(insertInformation.getInsertUri(), insertInformation.generateManifestEntries(), "index.html");
+ /* at this point we might already be stopped. */
+ if (shouldStop()) {
+ /* if so, bail out, don’t change anything. */
+ break;
+ }
+ sone.setTime(insertTime);
+ sone.setLatestEdition(finalUri.getEdition());
+ core.saveSone(sone);
+ success = true;
+ logger.log(Level.INFO, "Inserted Sone “%s” at %s.", new Object[] { sone.getName(), finalUri });
+ } catch (SoneException se1) {
+ logger.log(Level.WARNING, "Could not insert Sone “" + sone.getName() + "”!", se1);
+ } finally {
+ core.setSoneStatus(sone, SoneStatus.idle);
+ }
+
+ /*
+ * reset modification counter if Sone has not been modified
+ * while it was inserted.
+ */
+ if (success) {
+ synchronized (sone) {
+ if (lastInsertFingerprint.equals(sone.getFingerprint())) {
+ logger.log(Level.FINE, "Sone “%s” was not modified further, resetting counter…", new Object[] { sone });
+ core.saveSone(sone);
+ lastModificationTime = 0;
+ modified = false;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Container for information that are required to insert a Sone. This
+ * container merely exists to copy all relevant data without holding a lock
+ * on the {@link Sone} object for too long.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+ private class InsertInformation {
+
+ /** All properties of the Sone, copied for thread safety. */
+ private final Map<String, Object> soneProperties = new HashMap<String, Object>();
+
+ /**
+ * Creates a new insert information container.
+ *
+ * @param sone
+ * The sone to insert
+ */
+ public InsertInformation(Sone sone) {
+ soneProperties.put("id", sone.getId());
+ soneProperties.put("name", sone.getName());
+ soneProperties.put("time", sone.getTime());
+ soneProperties.put("requestUri", sone.getRequestUri());
+ soneProperties.put("insertUri", sone.getInsertUri());
+ soneProperties.put("profile", sone.getProfile());
+ soneProperties.put("posts", new ArrayList<Post>(sone.getPosts()));
+ soneProperties.put("replies", new HashSet<Reply>(sone.getReplies()));
+ soneProperties.put("likedPostIds", new HashSet<String>(sone.getLikedPostIds()));
+ soneProperties.put("likedReplyIds", new HashSet<String>(sone.getLikedReplyIds()));