X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FSoneDownloader.java;h=db1cdbcea3b3d7ade062672dea466fb6dce1dba1;hb=c830d91629b67b36e2705cea6caf817f82f3210b;hp=8a27979965322d54d1f045bc998da8cdf24a2f00;hpb=2c5b76a2fbce16ef33f079a3de9ae9fc9a9d30b8;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 8a27979..db1cdbc 100644 --- a/src/main/java/net/pterodactylus/sone/core/SoneDownloader.java +++ b/src/main/java/net/pterodactylus/sone/core/SoneDownloader.java @@ -26,10 +26,12 @@ import java.util.logging.Level; import java.util.logging.Logger; import net.pterodactylus.sone.core.Core.SoneStatus; +import net.pterodactylus.sone.data.Client; 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; @@ -112,20 +114,34 @@ public class SoneDownloader extends AbstractService { * The Sone to fetch */ public void fetchSone(Sone sone) { + fetchSone(sone, sone.getRequestUri()); + } + + /** + * Fetches the updated Sone. This method can be used to fetch a Sone from a + * specific URI (which happens when {@link Core#isSoneRescueMode() „Sone + * rescue mode“} is active). + * + * @param sone + * The Sone to fetch + * @param soneUri + * The URI to fetch the Sone from + */ + public void fetchSone(Sone sone, FreenetURI soneUri) { if (core.getSoneStatus(sone) == SoneStatus.downloading) { return; } - logger.log(Level.FINE, "Starting fetch for Sone “%s” from %s…", new Object[] { sone, sone.getRequestUri().setMetaString(new String[] { "sone.xml" }) }); - FreenetURI requestUri = sone.getRequestUri().setMetaString(new String[] { "sone.xml" }); + logger.log(Level.FINE, "Starting fetch for Sone “%s” from %s…", new Object[] { sone, soneUri }); + FreenetURI requestUri = soneUri.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.updateSone(parsedSone); } @@ -146,14 +162,18 @@ public class SoneDownloader extends AbstractService { * @return The parsed Sone, or {@code null} if the Sone could not be parsed */ public Sone parseSone(Sone originalSone, FetchResult fetchResult, FreenetURI requestUri) { - logger.log(Level.FINEST, "Persing FetchResult (%d bytes, %s) for %s…", new Object[] { fetchResult.size(), fetchResult.getMimeType(), originalSone }); + logger.log(Level.FINEST, "Parsing FetchResult (%d bytes, %s) for %s…", new Object[] { fetchResult.size(), fetchResult.getMimeType(), originalSone }); Bucket soneBucket = fetchResult.asBucket(); InputStream soneInputStream = null; try { soneInputStream = soneBucket.getInputStream(); Sone parsedSone = parseSone(originalSone, soneInputStream); if (parsedSone != null) { - parsedSone.setRequestUri(requestUri.setMetaString(new String[0])); + if (requestUri.getKeyType().equals("USK")) { + parsedSone.setRequestUri(requestUri.setMetaString(new String[0])); + } else { + parsedSone.setRequestUri(requestUri.setKeyType("USK").setDocName("Sone").setMetaString(new String[0])); + } } return parsedSone; } catch (IOException ioe1) { @@ -166,16 +186,16 @@ public class SoneDownloader extends AbstractService { } /** - * 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 sone + * @param originalSone * The Sone to update * @param soneInputStream * The input stream to parse the Sone from * @return The parsed Sone */ - public Sone parseSone(Sone sone, InputStream soneInputStream) { + public Sone parseSone(Sone originalSone, InputStream soneInputStream) { /* TODO - impose a size limit? */ Document document; @@ -185,9 +205,12 @@ public class SoneDownloader extends AbstractService { } if (document == null) { /* TODO - mark Sone as bad. */ - logger.log(Level.WARNING, "Could not parse XML for Sone %s!", new Object[] { sone }); + logger.log(Level.WARNING, "Could not parse XML for Sone %s!", new Object[] { originalSone }); return null; } + + Sone sone = new Sone(originalSone.getId()).setIdentity(originalSone.getIdentity()); + SimpleXML soneXml; try { soneXml = SimpleXML.fromDocument(document); @@ -211,6 +234,17 @@ public class SoneDownloader extends AbstractService { return null; } + SimpleXML clientXml = soneXml.getNode("client"); + if (clientXml != null) { + String clientName = clientXml.getValue("name", null); + String clientVersion = clientXml.getValue("version", null); + if ((clientName == null) || (clientVersion == null)) { + logger.log(Level.WARNING, "Download Sone %s with client XML but missing name or version!", sone); + return null; + } + sone.setClient(new Client(clientName, clientVersion)); + } + String soneRequestUri = soneXml.getValue("request-uri", null); if (soneRequestUri != null) { try { @@ -226,7 +260,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); @@ -337,7 +371,7 @@ public class SoneDownloader extends AbstractService { sone.setPosts(posts); sone.setReplies(replies); sone.setLikePostIds(likedPostIds); - sone.setModificationCounter(0); + sone.setLikeReplyIds(likedReplyIds); } return sone;