X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FCore.java;h=d9060555966ca7e72ec350254fb9a7e6910be985;hb=685be6a668a5ad675760d0d1b25e1bf945dadbfb;hp=7333d6848637b719df35b07e8cbfe6d95a92b220;hpb=ce4b3424f5503697ee937efb71fb2e3bc86659bc;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 7333d68..d906055 100644 --- a/src/main/java/net/pterodactylus/sone/core/Core.java +++ b/src/main/java/net/pterodactylus/sone/core/Core.java @@ -19,19 +19,23 @@ package net.pterodactylus.sone.core; 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; 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.Profile; +import net.pterodactylus.sone.data.Reply; import net.pterodactylus.sone.data.Sone; 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; /** @@ -53,6 +57,9 @@ public class Core extends AbstractService { /** The local Sones. */ private final Set localSones = new HashSet(); + /** Sone inserters. */ + private final Map soneInserters = new HashMap(); + /** * Creates a new core. */ @@ -93,14 +100,99 @@ public class Core extends AbstractService { * * @return The local Sones */ - public Set localSones() { - return localSones; + public Set getSones() { + return Collections.unmodifiableSet(localSones); } // // ACTIONS // + /** + * Adds the given Sone. + * + * @param sone + * The Sone to add + */ + public void addSone(Sone sone) { + if (localSones.add(sone)) { + SoneInserter soneInserter = new SoneInserter(freenetInterface, sone); + soneInserter.start(); + soneInserters.put(sone, soneInserter); + } + } + + /** + * Creates a new Sone at a random location. + * + * @param name + * The name of the Sone + * @return The created Sone + * @throws SoneException + * if a Sone error occurs + */ + public Sone createSone(String name) throws SoneException { + return createSone(name, null, null); + } + + /** + * Creates a new Sone at the given location. If one of {@code requestUri} or + * {@code insertUrI} is {@code null}, the Sone is created at a random + * location. + * + * @param name + * The name of the Sone + * @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 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 = new Sone(UUID.randomUUID(), name, new FreenetURI(finalRequestUri), new FreenetURI(finalInsertUri)); + sone.setProfile(new Profile()); + /* set modification counter to 1 so it is inserted immediately. */ + sone.setModificationCounter(1); + addSone(sone); + } catch (MalformedURLException mue1) { + throw new SoneException(Type.INVALID_URI); + } + localSones.add(sone); + return sone; + } + + /** + * Deletes the given Sone from this plugin instance. + * + * @param sone + * The sone to delete + */ + public void deleteSone(Sone sone) { + SoneInserter soneInserter = soneInserters.remove(sone); + soneInserter.stop(); + localSones.remove(sone); + } + // // SERVICE METHODS // @@ -118,6 +210,10 @@ public class Core extends AbstractService { */ @Override protected void serviceStop() { + /* stop all Sone inserters. */ + for (SoneInserter soneInserter : soneInserters.values()) { + soneInserter.stop(); + } saveConfiguration(); } @@ -131,30 +227,48 @@ 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 insertUri = configuration.getStringValue("Sone/Name." + soneName + "/InsertURI").getValue(null); - String requestUri = configuration.getStringValue("Sone/Name." + soneName + "/RequestURI").getValue(null); + 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); + String firstName = configuration.getStringValue(sonePrefix + "/Profile/FirstName").getValue(null); + String middleName = configuration.getStringValue(sonePrefix + "/Profile/MiddleName").getValue(null); + String lastName = configuration.getStringValue(sonePrefix + "/Profile/LastName").getValue(null); try { - localSones.add(new Sone(soneName, new FreenetURI(requestUri), new FreenetURI(insertUri))); + Profile profile = new Profile(); + profile.setFirstName(firstName); + profile.setMiddleName(middleName); + profile.setLastName(lastName); + Sone sone = new Sone(UUID.fromString(id), name, new FreenetURI(requestUri), new FreenetURI(insertUri)); + 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); + sone.addPost(post); + } 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()"); } @@ -163,23 +277,38 @@ 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) { - configuration.getStringValue("Sone/Name." + sone.getName() + "/RequestURI").setValue(sone.getRequestUri().toString()); - configuration.getStringValue("Sone/Name." + sone.getName() + "/InsertURI").setValue(sone.getInsertUri().toString()); + 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()); + Profile profile = sone.getProfile(); + 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()); + } + 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 + "/Post").setValue(reply.getPost().getId()); + configuration.getLongValue(replyPrefix + "/Time").setValue(reply.getTime()); + configuration.getStringValue(replyPrefix + "/Text").setValue(reply.getText()); + } } } catch (ConfigurationException ce1) { logger.log(Level.WARNING, "Could not store configuration!", ce1);