X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FCore.java;h=3c3a659872c6d980607cbf43840f7e9f5c92aadd;hb=adf590c0b33f1cc3f136d8d3a714f7051407535f;hp=21e3699ffa86dc0fb1e2ad2f1f8d4f32fd92af42;hpb=ce2c3f10e92b2d97891acd9d427e1c47819547e6;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 21e3699..3c3a659 100644 --- a/src/main/java/net/pterodactylus/sone/core/Core.java +++ b/src/main/java/net/pterodactylus/sone/core/Core.java @@ -21,7 +21,6 @@ import java.net.MalformedURLException; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; @@ -29,14 +28,19 @@ import java.util.logging.Level; import java.util.logging.Logger; import net.pterodactylus.sone.core.SoneException.Type; +import net.pterodactylus.sone.data.Post; +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; import net.pterodactylus.util.config.Configuration; import net.pterodactylus.util.config.ConfigurationException; import net.pterodactylus.util.logging.Logging; import net.pterodactylus.util.service.AbstractService; -import net.pterodactylus.util.text.StringEscaper; -import net.pterodactylus.util.text.TextException; import freenet.keys.FreenetURI; /** @@ -55,12 +59,26 @@ 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(); /** Sone inserters. */ private final Map soneInserters = new HashMap(); + /* various caches follow here. */ + + /** Cache for all known Sones. */ + private final ShellCache soneCache = new ShellCache(SoneShell.creator); + + /** Cache for all known posts. */ + private final ShellCache postCache = new ShellCache(PostShell.creator); + + /** Cache for all known replies. */ + private final ShellCache replyCache = new ShellCache(ReplyShell.creator); + /** * Creates a new core. */ @@ -93,6 +111,7 @@ public class Core extends AbstractService { */ public Core freenetInterface(FreenetInterface freenetInterface) { this.freenetInterface = freenetInterface; + soneDownloader = new SoneDownloader(freenetInterface); return this; } @@ -105,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 // @@ -117,8 +151,10 @@ 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); } } @@ -170,7 +206,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); @@ -178,7 +214,6 @@ public class Core extends AbstractService { } catch (MalformedURLException mue1) { throw new SoneException(Type.INVALID_URI); } - localSones.add(sone); return sone; } @@ -211,6 +246,7 @@ public class Core extends AbstractService { */ @Override protected void serviceStop() { + soneDownloader.stop(); /* stop all Sone inserters. */ for (SoneInserter soneInserter : soneInserters.values()) { soneInserter.stop(); @@ -228,24 +264,16 @@ public class Core extends AbstractService { private void loadConfiguration() { logger.entering(Core.class.getName(), "loadConfiguration()"); - /* get names of all local Sones. */ - String allSoneNamesString = configuration.getStringValue("Sone/Names").getValue(null); - if (allSoneNamesString == null) { - allSoneNamesString = ""; - } - List allSoneNames; - try { - allSoneNames = StringEscaper.parseLine(allSoneNamesString); - } catch (TextException te1) { - logger.log(Level.WARNING, "Could not parse Sone names: “" + allSoneNamesString + "”", te1); - allSoneNames = Collections.emptyList(); - } - /* parse local Sones. */ - logger.log(Level.INFO, "Loading %d Sones…", allSoneNames.size()); - for (String soneName : allSoneNames) { - String sonePrefix = "Sone/Name." + soneName; + logger.log(Level.INFO, "Loading Sones…"); + int soneId = 0; + do { + String sonePrefix = "Sone/Sone." + soneId++; String id = configuration.getStringValue(sonePrefix + "/ID").getValue(null); + if (id == null) { + break; + } + String name = configuration.getStringValue(sonePrefix + "/Name").getValue(null); String insertUri = configuration.getStringValue(sonePrefix + "/InsertURI").getValue(null); String requestUri = configuration.getStringValue(sonePrefix + "/RequestURI").getValue(null); long modificationCounter = configuration.getLongValue(sonePrefix + "/ModificationCounter").getValue((long) 0); @@ -257,14 +285,48 @@ public class Core extends AbstractService { profile.setFirstName(firstName); profile.setMiddleName(middleName); profile.setLastName(lastName); - Sone sone = new Sone(UUID.fromString(id), soneName, new FreenetURI(requestUri), new FreenetURI(insertUri)); + Sone sone = new Sone(UUID.fromString(id), name, new FreenetURI(requestUri), new FreenetURI(insertUri)); + soneCache.put(id, sone); sone.setProfile(profile); + int postId = 0; + do { + String postPrefix = sonePrefix + "/Post." + postId++; + id = configuration.getStringValue(postPrefix + "/ID").getValue(null); + if (id == null) { + break; + } + long time = configuration.getLongValue(postPrefix + "/Time").getValue(null); + String text = configuration.getStringValue(postPrefix + "/Text").getValue(null); + Post post = new Post(UUID.fromString(id), sone, time, text); + postCache.put(id, post); + sone.addPost(post); + } while (true); + int replyCounter = 0; + do { + String replyPrefix = sonePrefix + "/Reply." + replyCounter++; + String replyId = configuration.getStringValue(replyPrefix + "/ID").getValue(null); + if (replyId == null) { + break; + } + 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); sone.setModificationCounter(modificationCounter); addSone(sone); } catch (MalformedURLException mue1) { logger.log(Level.WARNING, "Could not create Sone from requestUri (“" + requestUri + "”) and insertUri (“" + insertUri + "”)!", mue1); } - } + } while (true); + logger.log(Level.INFO, "Loaded %d Sones.", getSones().size()); logger.exiting(Core.class.getName(), "loadConfiguration()"); } @@ -273,23 +335,15 @@ public class Core extends AbstractService { * Saves the configuraiton. */ private void saveConfiguration() { - - /* get the names of all Sones. */ - Set soneNames = new HashSet(); - for (Sone sone : localSones) { - soneNames.add(sone.getName()); - } - String soneNamesString = StringEscaper.escapeWords(soneNames); - - logger.log(Level.INFO, "Storing %d Sones…", soneNames.size()); + Set sones = getSones(); + logger.log(Level.INFO, "Storing %d Sones…", sones.size()); try { - /* store names of all Sones. */ - configuration.getStringValue("Sone/Names").setValue(soneNamesString); - /* store all Sones. */ + int soneId = 0; for (Sone sone : localSones) { - String sonePrefix = "Sone/Name." + sone.getName(); + String sonePrefix = "Sone/Sone." + soneId++; configuration.getStringValue(sonePrefix + "/ID").setValue(sone.getId()); + configuration.getStringValue(sonePrefix + "/Name").setValue(sone.getName()); configuration.getStringValue(sonePrefix + "/RequestURI").setValue(sone.getRequestUri().toString()); configuration.getStringValue(sonePrefix + "/InsertURI").setValue(sone.getInsertUri().toString()); configuration.getLongValue(sonePrefix + "/ModificationCounter").setValue(sone.getModificationCounter()); @@ -297,7 +351,33 @@ public class Core extends AbstractService { configuration.getStringValue(sonePrefix + "/Profile/FirstName").setValue(profile.getFirstName()); configuration.getStringValue(sonePrefix + "/Profile/MiddleName").setValue(profile.getMiddleName()); configuration.getStringValue(sonePrefix + "/Profile/LastName").setValue(profile.getLastName()); + int postId = 0; + for (Post post : sone.getPosts()) { + String postPrefix = sonePrefix + "/Post." + postId++; + configuration.getStringValue(postPrefix + "/ID").setValue(post.getId()); + 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/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); } + /* 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); }