X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FCore.java;h=7498356224927230c1c5533418972362abd9d39d;hb=bdc25c7fe8763346b82d00971359fecdaf2f03e3;hp=f56c1cec2dffdf77e6b7c71e9c2996f7d8454d91;hpb=ca0d9d2f705bc8304f4bcd1fea1f38dec3f661e9;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 f56c1ce..7498356 100644 --- a/src/main/java/net/pterodactylus/sone/core/Core.java +++ b/src/main/java/net/pterodactylus/sone/core/Core.java @@ -22,11 +22,14 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; 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.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; @@ -87,10 +90,79 @@ public class Core extends AbstractService { return this; } + /** + * Returns the local Sones. + * + * @return The local Sones + */ + public Set localSones() { + return localSones; + } + // // ACTIONS // + /** + * 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); + } + if ((requestUri == null) || (insertUri == null)) { + String[] keyPair = freenetInterface.generateKeyPair(); + requestUri = keyPair[0]; + insertUri = keyPair[1]; + } + Sone sone; + try { + logger.log(Level.FINEST, "Creating new Sone “%s” at %s (%s)…", new Object[] { name, requestUri, insertUri }); + sone = new Sone(UUID.randomUUID(), name, new FreenetURI(requestUri), new FreenetURI(insertUri)); + } 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) { + localSones.remove(sone); + } + // // SERVICE METHODS // @@ -103,6 +175,14 @@ public class Core extends AbstractService { loadConfiguration(); } + /** + * {@inheritDoc} + */ + @Override + protected void serviceStop() { + saveConfiguration(); + } + // // PRIVATE METHODS // @@ -114,7 +194,10 @@ public class Core extends AbstractService { logger.entering(Core.class.getName(), "loadConfiguration()"); /* get names of all local Sones. */ - String allSoneNamesString = configuration.getStringValue("Sone/Names").getValue(""); + String allSoneNamesString = configuration.getStringValue("Sone/Names").getValue(null); + if (allSoneNamesString == null) { + allSoneNamesString = ""; + } List allSoneNames; try { allSoneNames = StringEscaper.parseLine(allSoneNamesString); @@ -124,11 +207,13 @@ public class Core extends AbstractService { } /* parse local Sones. */ + logger.log(Level.INFO, "Loading %d Sones…", allSoneNames.size()); for (String soneName : allSoneNames) { + String id = configuration.getStringValue("Sone/Name." + soneName + "/ID").getValue(null); String insertUri = configuration.getStringValue("Sone/Name." + soneName + "/InsertURI").getValue(null); String requestUri = configuration.getStringValue("Sone/Name." + soneName + "/RequestURI").getValue(null); try { - localSones.add(new Sone(new FreenetURI(requestUri), new FreenetURI(insertUri))); + localSones.add(new Sone(UUID.fromString(id), soneName, new FreenetURI(requestUri), new FreenetURI(insertUri))); } catch (MalformedURLException mue1) { logger.log(Level.WARNING, "Could not create Sone from requestUri (“" + requestUri + "”) and insertUri (“" + insertUri + "”)!", mue1); } @@ -137,4 +222,32 @@ public class Core extends AbstractService { logger.exiting(Core.class.getName(), "loadConfiguration()"); } + /** + * 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()); + try { + /* store names of all Sones. */ + configuration.getStringValue("Sone/Names").setValue(soneNamesString); + + /* store all Sones. */ + for (Sone sone : localSones) { + configuration.getStringValue("Sone/Name." + sone.getName() + "/ID").setValue(sone.getId()); + configuration.getStringValue("Sone/Name." + sone.getName() + "/RequestURI").setValue(sone.getRequestUri().toString()); + configuration.getStringValue("Sone/Name." + sone.getName() + "/InsertURI").setValue(sone.getInsertUri().toString()); + } + } catch (ConfigurationException ce1) { + logger.log(Level.WARNING, "Could not store configuration!", ce1); + } + } + }