X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FCore.java;h=72c36d823853c1d55a8059afd42b7644de16a077;hb=78cd820b392069def4640d45497e4097ef031d53;hp=4a75a0397c8d4c5b32d5d120d8432e4b0d7cc972;hpb=e122164af747b806cc0b3d8cc17e82fa88aabaef;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 4a75a03..72c36d8 100644 --- a/src/main/java/net/pterodactylus/sone/core/Core.java +++ b/src/main/java/net/pterodactylus/sone/core/Core.java @@ -33,6 +33,7 @@ import net.pterodactylus.sone.data.PostShell; import net.pterodactylus.sone.data.Profile; import net.pterodactylus.sone.data.Reply; import net.pterodactylus.sone.data.ReplyShell; +import net.pterodactylus.sone.data.Shell; import net.pterodactylus.sone.data.ShellCache; import net.pterodactylus.sone.data.Sone; import net.pterodactylus.sone.data.SoneShell; @@ -58,6 +59,9 @@ public class Core extends AbstractService { /** Interface to freenet. */ private FreenetInterface freenetInterface; + /** The Sone downloader. */ + private SoneDownloader soneDownloader; + /** The local Sones. */ private final Set localSones = new HashSet(); @@ -107,6 +111,7 @@ public class Core extends AbstractService { */ public Core freenetInterface(FreenetInterface freenetInterface) { this.freenetInterface = freenetInterface; + soneDownloader = new SoneDownloader(freenetInterface); return this; } @@ -119,6 +124,21 @@ public class Core extends AbstractService { return Collections.unmodifiableSet(localSones); } + /** + * Returns a Sone or a {@link Shell} around one for the given ID. + * + * @param soneId + * The ID of the Sone + * @return The Sone, or a {@link Shell} around one + */ + public Sone getSone(String soneId) { + Sone sone = soneCache.get(soneId); + if (sone instanceof SoneShell) { + soneCache.put(soneId, sone = ((SoneShell) sone).getShelled()); + } + return sone; + } + // // ACTIONS // @@ -131,13 +151,26 @@ public class Core extends AbstractService { */ public void addSone(Sone sone) { if (localSones.add(sone)) { + soneCache.put(sone.getId(), sone); SoneInserter soneInserter = new SoneInserter(freenetInterface, sone); soneInserter.start(); + soneDownloader.addSone(sone); soneInserters.put(sone, soneInserter); } } /** + * Adds a remote Sone so that it is watched for updates. + * + * @param sone + * The sone to watch + */ + public void addRemoteSone(Sone sone) { + Sone updatedSone = soneCache.put(sone.getId(), sone); + soneDownloader.addSone(updatedSone); + } + + /** * Creates a new Sone at a random location. * * @param name @@ -184,7 +217,7 @@ public class Core extends AbstractService { Sone sone; try { logger.log(Level.FINEST, "Creating new Sone “%s” at %s (%s)…", new Object[] { name, finalRequestUri, finalInsertUri }); - sone = new Sone(UUID.randomUUID(), name, new FreenetURI(finalRequestUri), new FreenetURI(finalInsertUri)); + sone = new Sone(UUID.randomUUID(), name, new FreenetURI(finalRequestUri).setKeyType("USK").setDocName("Sone-" + name), new FreenetURI(finalInsertUri).setKeyType("USK").setDocName("Sone-" + name)); sone.setProfile(new Profile()); /* set modification counter to 1 so it is inserted immediately. */ sone.setModificationCounter(1); @@ -192,7 +225,6 @@ public class Core extends AbstractService { } catch (MalformedURLException mue1) { throw new SoneException(Type.INVALID_URI); } - localSones.add(sone); return sone; } @@ -225,6 +257,7 @@ public class Core extends AbstractService { */ @Override protected void serviceStop() { + soneDownloader.stop(); /* stop all Sone inserters. */ for (SoneInserter soneInserter : soneInserters.values()) { soneInserter.stop(); @@ -286,13 +319,37 @@ public class Core extends AbstractService { if (replyId == null) { break; } - Sone replySone = soneCache.get(configuration.getStringValue(replyPrefix + "/Sone").getValue(null)); + Sone replySone = soneCache.get(configuration.getStringValue(replyPrefix + "/Sone/ID").getValue(null)); + String replySoneKey = configuration.getStringValue(replyPrefix + "/Sone/Key").getValue(null); + String replySoneName = configuration.getStringValue(replyPrefix + "/Sone/Name").getValue(null); + if (replySone instanceof SoneShell) { + ((SoneShell) replySone).setRequestUri(new FreenetURI(replySoneKey)).setName(replySoneName); + } Post replyPost = postCache.get(configuration.getStringValue(replyPrefix + "/Post").getValue(null)); long replyTime = configuration.getLongValue(replyPrefix + "/Time").getValue(null); String replyText = configuration.getStringValue(replyPrefix + "/Text").getValue(null); Reply reply = new ReplyShell().setSone(replySone).setPost(replyPost).setTime(replyTime).setText(replyText).getShelled(); replyCache.put(replyId, reply); } while (true); + + /* load friends. */ + int friendCounter = 0; + while (true) { + String friendPrefix = sonePrefix + "/Friend." + friendCounter++; + String friendId = configuration.getStringValue(friendPrefix + "/ID").getValue(null); + if (friendId == null) { + break; + } + Sone friendSone = soneCache.get(friendId); + if (friendSone instanceof SoneShell) { + String friendKey = configuration.getStringValue(friendPrefix + "/Key").getValue(null); + String friendName = configuration.getStringValue(friendPrefix + "/Name").getValue(null); + ((SoneShell) friendSone).setRequestUri(new FreenetURI(friendKey)).setName(friendName); + } + addRemoteSone(friendSone); + sone.addFriend(sone); + } + sone.setModificationCounter(modificationCounter); addSone(sone); } catch (MalformedURLException mue1) { @@ -331,16 +388,37 @@ public class Core extends AbstractService { configuration.getLongValue(postPrefix + "/Time").setValue(post.getTime()); configuration.getStringValue(postPrefix + "/Text").setValue(post.getText()); } + /* write null ID as terminator. */ + configuration.getStringValue(sonePrefix + "/Post." + postId + "/ID").setValue(null); + int replyId = 0; for (Reply reply : sone.getReplies()) { String replyPrefix = sonePrefix + "/Reply." + replyId++; configuration.getStringValue(replyPrefix + "/ID").setValue(reply.getId()); - configuration.getStringValue(replyPrefix + "/Sone").setValue(reply.getSone().getId()); + configuration.getStringValue(replyPrefix + "/Sone/ID").setValue(reply.getSone().getId()); + configuration.getStringValue(replyPrefix + "/Sone/Key").setValue(reply.getSone().getRequestUri().toString()); + configuration.getStringValue(replyPrefix + "/Sone/Name").setValue(reply.getSone().getName()); configuration.getStringValue(replyPrefix + "/Post").setValue(reply.getPost().getId()); configuration.getLongValue(replyPrefix + "/Time").setValue(reply.getTime()); configuration.getStringValue(replyPrefix + "/Text").setValue(reply.getText()); } + /* write null ID as terminator. */ + configuration.getStringValue(sonePrefix + "/Reply." + replyId + "/ID").setValue(null); + + int friendId = 0; + for (Sone friend : sone.getFriends()) { + String friendPrefix = sonePrefix + "/Friend." + friendId++; + configuration.getStringValue(friendPrefix + "/ID").setValue(friend.getId()); + configuration.getStringValue(friendPrefix + "/Key").setValue(friend.getRequestUri().toString()); + configuration.getStringValue(friendPrefix + "/Name").setValue(friend.getName()); + } + /* write null ID as terminator. */ + configuration.getStringValue(sonePrefix + "/Friend." + friendId + "/ID").setValue(null); + } + /* write null ID as terminator. */ + configuration.getStringValue("Sone/Sone." + soneId + "/ID").setValue(null); + } catch (ConfigurationException ce1) { logger.log(Level.WARNING, "Could not store configuration!", ce1); }