Always create a new Sone.
[Sone.git] / src / main / java / net / pterodactylus / sone / core / SoneDownloader.java
index 94001a7..6a6265e 100644 (file)
@@ -30,6 +30,7 @@ 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.collection.Pair;
 import net.pterodactylus.util.io.Closer;
 import net.pterodactylus.util.logging.Logging;
 import net.pterodactylus.util.number.Numbers;
@@ -119,15 +120,15 @@ public class SoneDownloader extends AbstractService {
                FreenetURI requestUri = sone.getRequestUri().setMetaString(new String[] { "sone.xml" });
                core.setSoneStatus(sone, SoneStatus.downloading);
                try {
-                       FetchResult fetchResult = freenetInterface.fetchUri(requestUri);
-                       if (fetchResult == null) {
+                       Pair<FreenetURI, FetchResult> fetchResults = freenetInterface.fetchUri(requestUri);
+                       if (fetchResults == null) {
                                /* TODO - mark Sone as bad. */
                                return;
                        }
-                       logger.log(Level.FINEST, "Got %d bytes back.", fetchResult.size());
-                       Sone parsedSone = parseSone(sone, fetchResult, requestUri);
+                       logger.log(Level.FINEST, "Got %d bytes back.", fetchResults.getRight().size());
+                       Sone parsedSone = parseSone(sone, fetchResults.getRight(), fetchResults.getLeft());
                        if (parsedSone != null) {
-                               core.addSone(parsedSone);
+                               core.updateSone(parsedSone);
                        }
                } finally {
                        core.setSoneStatus(sone, (sone.getTime() == 0) ? SoneStatus.unknown : SoneStatus.idle);
@@ -166,29 +167,17 @@ public class SoneDownloader extends AbstractService {
        }
 
        /**
-        * Parses a Sone from the given input stream.
-        *
-        * @param soneInputStream
-        *            The input stream to parse the Sone from
-        * @return The parsed Sone
-        */
-       public Sone parseSone(InputStream soneInputStream) {
-               return parseSone(null, soneInputStream);
-       }
-
-       /**
-        * Parses a Sone from the given input stream and updates the given Sone, or
-        * creates a new Sone.
+        * Parses a Sone from the given input stream and creates a new Sone from the
+        * parsed data.
         *
         * @param originalSone
-        *            The Sone to update (may be {@code null})
+        *            The Sone to update
         * @param soneInputStream
         *            The input stream to parse the Sone from
         * @return The parsed Sone
         */
        public Sone parseSone(Sone originalSone, InputStream soneInputStream) {
                /* TODO - impose a size limit? */
-               Sone sone;
 
                Document document;
                /* XML parsing is not thread-safe. */
@@ -200,37 +189,18 @@ public class SoneDownloader extends AbstractService {
                        logger.log(Level.WARNING, "Could not parse XML for Sone %s!", new Object[] { originalSone });
                        return null;
                }
+
+               Sone sone = new Sone(originalSone.getId());
+
                SimpleXML soneXml;
                try {
                        soneXml = SimpleXML.fromDocument(document);
                } catch (NullPointerException npe1) {
                        /* for some reason, invalid XML can cause NPEs. */
-                       logger.log(Level.WARNING, "XML for Sone " + originalSone + " can not be parsed!", npe1);
-                       return null;
-               }
-
-               /* check ID. */
-               String soneId = soneXml.getValue("id", null);
-               if ((originalSone != null) && !originalSone.getId().equals(soneId)) {
-                       /* TODO - mark Sone as bad. */
-                       logger.log(Level.WARNING, "Downloaded ID for Sone %s (%s) does not match known ID (%s)!", new Object[] { originalSone, originalSone.getId(), soneId });
+                       logger.log(Level.WARNING, "XML for Sone " + sone + " can not be parsed!", npe1);
                        return null;
                }
 
-               /* load Sone from core. */
-               sone = originalSone;
-               if (sone == null) {
-                       sone = core.getSone(soneId);
-               }
-
-               String soneName = soneXml.getValue("name", null);
-               if (soneName == null) {
-                       /* TODO - mark Sone as bad. */
-                       logger.log(Level.WARNING, "Downloaded name for Sone %s was null!", new Object[] { sone });
-                       return null;
-               }
-               sone.setName(soneName);
-
                String soneTime = soneXml.getValue("time", null);
                if (soneTime == null) {
                        /* TODO - mark Sone as bad. */
@@ -257,9 +227,10 @@ public class SoneDownloader extends AbstractService {
                }
 
                String soneInsertUri = soneXml.getValue("insert-uri", null);
-               if (soneInsertUri != null) {
+               if ((soneInsertUri != null) && (sone.getInsertUri() == null)) {
                        try {
                                sone.setInsertUri(new FreenetURI(soneInsertUri));
+                               sone.setLatestEdition(Math.max(sone.getRequestUri().getSuggestedEdition(), sone.getInsertUri().getSuggestedEdition()));
                        } catch (MalformedURLException mue1) {
                                /* TODO - mark Sone as bad. */
                                logger.log(Level.WARNING, "Downloaded Sone " + sone + " has invalid insert URI: " + soneInsertUri, mue1);
@@ -363,32 +334,6 @@ public class SoneDownloader extends AbstractService {
                        }
                }
 
-               /* parse known Sones. */
-               SimpleXML knownSonesXml = soneXml.getNode("known-sones");
-               Set<Sone> knownSones = new HashSet<Sone>();
-               if (knownSonesXml == null) {
-                       /* TODO - mark Sone as bad. */
-                       logger.log(Level.WARNING, "Downloaded Sone %s has no known Sones!", new Object[] { sone });
-               } else {
-                       for (SimpleXML knownSoneXml : knownSonesXml.getNodes("known-sone")) {
-                               String knownSoneId = knownSoneXml.getValue("sone-id", null);
-                               String knownSoneKey = knownSoneXml.getValue("sone-key", null);
-                               String knownSoneName = knownSoneXml.getValue("sone-name", null);
-                               if ((knownSoneId == null) || (knownSoneKey == null) || (knownSoneName == null)) {
-                                       /* TODO - mark Sone as bad. */
-                                       logger.log(Level.WARNING, "Downloaded known Sone for Sone %s with missing data! ID: %s, Key: %s, Name: %s", new Object[] { sone, knownSoneId, knownSoneKey, knownSoneName });
-                                       return null;
-                               }
-                               try {
-                                       knownSones.add(core.getSone(knownSoneId).setRequestUri(new FreenetURI(knownSoneKey)).setName(knownSoneName));
-                               } catch (MalformedURLException mue1) {
-                                       /* TODO - mark Sone as bad. */
-                                       logger.log(Level.WARNING, "Downloaded known Sone for Sone %s with invalid key: %s", new Object[] { sone, knownSoneKey });
-                                       return null;
-                               }
-                       }
-               }
-
                /* okay, apparently everything was parsed correctly. Now import. */
                /* atomic setter operation on the Sone. */
                synchronized (sone) {
@@ -399,10 +344,6 @@ public class SoneDownloader extends AbstractService {
                        sone.setModificationCounter(0);
                }
 
-               /* add all known Sones to core for downloading. */
-               for (Sone knownSone : knownSones) {
-                       core.addSone(knownSone);
-               }
                return sone;
        }