X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FSoneDownloader.java;h=6a6265e6a1b4efc604d11ca0958e6ddabfbe072b;hb=12802e1e1873c07135cf9c2dce7d7797e3205af1;hp=94f2b632219cd7bec49322a8f2f9964d2652dff7;hpb=544c75a3b539a2948d08f688e7c367baa3dac28b;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/core/SoneDownloader.java b/src/main/java/net/pterodactylus/sone/core/SoneDownloader.java index 94f2b63..6a6265e 100644 --- a/src/main/java/net/pterodactylus/sone/core/SoneDownloader.java +++ b/src/main/java/net/pterodactylus/sone/core/SoneDownloader.java @@ -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 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. */ @@ -260,7 +230,7 @@ public class SoneDownloader extends AbstractService { if ((soneInsertUri != null) && (sone.getInsertUri() == null)) { try { sone.setInsertUri(new FreenetURI(soneInsertUri)); - sone.updateUris(Math.max(sone.getRequestUri().getSuggestedEdition(), sone.getInsertUri().getSuggestedEdition())); + 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); @@ -364,32 +334,6 @@ public class SoneDownloader extends AbstractService { } } - /* parse known Sones. */ - SimpleXML knownSonesXml = soneXml.getNode("known-sones"); - Set knownSones = new HashSet(); - 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) { @@ -400,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; }