X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FSoneDownloader.java;h=90f926a69e46cd739731be188976d83b4beee9ee;hp=e8d452bfc18a3d9c294bef5e9df28d690b0503a7;hb=4314a29fdeb9766e198b7144a9724422d0df84dc;hpb=91fe1db0decb574940c657ab243ae1c3bec6cf42 diff --git a/src/main/java/net/pterodactylus/sone/core/SoneDownloader.java b/src/main/java/net/pterodactylus/sone/core/SoneDownloader.java index e8d452b..90f926a 100644 --- a/src/main/java/net/pterodactylus/sone/core/SoneDownloader.java +++ b/src/main/java/net/pterodactylus/sone/core/SoneDownloader.java @@ -26,14 +26,14 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import net.pterodactylus.sone.core.Core.SoneStatus; import net.pterodactylus.sone.data.Album; import net.pterodactylus.sone.data.Client; import net.pterodactylus.sone.data.Image; import net.pterodactylus.sone.data.Post; +import net.pterodactylus.sone.data.PostReply; import net.pterodactylus.sone.data.Profile; -import net.pterodactylus.sone.data.Reply; import net.pterodactylus.sone.data.Sone; +import net.pterodactylus.sone.data.Sone.SoneStatus; import net.pterodactylus.util.collection.Pair; import net.pterodactylus.util.io.Closer; import net.pterodactylus.util.logging.Logging; @@ -153,7 +153,7 @@ public class SoneDownloader extends AbstractService { public Sone fetchSone(Sone sone, FreenetURI soneUri, boolean fetchOnly) { 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); + sone.setStatus(SoneStatus.downloading); try { Pair fetchResults = freenetInterface.fetchUri(requestUri); if (fetchResults == null) { @@ -170,7 +170,7 @@ public class SoneDownloader extends AbstractService { } return parsedSone; } finally { - core.setSoneStatus(sone, (sone.getTime() == 0) ? SoneStatus.unknown : SoneStatus.idle); + sone.setStatus((sone.getTime() == 0) ? SoneStatus.unknown : SoneStatus.idle); } } @@ -219,8 +219,10 @@ public class SoneDownloader extends AbstractService { * @param soneInputStream * The input stream to parse the Sone from * @return The parsed Sone + * @throws SoneException + * if a parse error occurs, or the protocol is invalid */ - public Sone parseSone(Sone originalSone, InputStream soneInputStream) { + public Sone parseSone(Sone originalSone, InputStream soneInputStream) throws SoneException { /* TODO - impose a size limit? */ Document document; @@ -328,16 +330,18 @@ public class SoneDownloader extends AbstractService { Integer profileBirthDay = Numbers.safeParseInteger(profileXml.getValue("birth-day", null)); Integer profileBirthMonth = Numbers.safeParseInteger(profileXml.getValue("birth-month", null)); Integer profileBirthYear = Numbers.safeParseInteger(profileXml.getValue("birth-year", null)); - Profile profile = new Profile().setFirstName(profileFirstName).setMiddleName(profileMiddleName).setLastName(profileLastName); + Profile profile = new Profile(sone).setFirstName(profileFirstName).setMiddleName(profileMiddleName).setLastName(profileLastName); profile.setBirthDay(profileBirthDay).setBirthMonth(profileBirthMonth).setBirthYear(profileBirthYear); + /* avatar is processed after images are loaded. */ + String avatarId = profileXml.getValue("avatar", null); /* parse profile fields. */ SimpleXML profileFieldsXml = profileXml.getNode("fields"); if (profileFieldsXml != null) { for (SimpleXML fieldXml : profileFieldsXml.getNodes("field")) { String fieldName = fieldXml.getValue("field-name", null); - String fieldValue = fieldXml.getValue("field-value", null); - if ((fieldName == null) || (fieldValue == null)) { + String fieldValue = fieldXml.getValue("field-value", ""); + if (fieldName == null) { logger.log(Level.WARNING, "Downloaded profile field for Sone %s with missing data! Name: %s, Value: %s", new Object[] { sone, fieldName, fieldValue }); return null; } @@ -383,7 +387,7 @@ public class SoneDownloader extends AbstractService { /* parse replies. */ SimpleXML repliesXml = soneXml.getNode("replies"); - Set replies = new HashSet(); + Set replies = new HashSet(); if (repliesXml == null) { /* TODO - mark Sone as bad. */ logger.log(Level.WARNING, "Downloaded Sone %s has no replies!", new Object[] { sone }); @@ -442,7 +446,7 @@ public class SoneDownloader extends AbstractService { String id = albumXml.getValue("id", null); String parentId = albumXml.getValue("parent", null); String title = albumXml.getValue("title", null); - String description = albumXml.getValue("description", null); + String description = albumXml.getValue("description", ""); String albumImageId = albumXml.getValue("album-image", null); if ((id == null) || (title == null) || (description == null)) { logger.log(Level.WARNING, "Downloaded Sone %s contains invalid album!", new Object[] { sone }); @@ -456,7 +460,7 @@ public class SoneDownloader extends AbstractService { return null; } } - Album album = core.getAlbum(id).setSone(sone).setTitle(title).setDescription(description).setAlbumImage(albumImageId); + Album album = core.getAlbum(id).setSone(sone).setTitle(title).setDescription(description); if (parent != null) { parent.addAlbum(album); } else { @@ -489,9 +493,15 @@ public class SoneDownloader extends AbstractService { album.addImage(image); } } + album.setAlbumImage(albumImageId); } } + /* process avatar. */ + if (avatarId != null) { + profile.setAvatar(core.getImage(avatarId, false)); + } + /* okay, apparently everything was parsed correctly. Now import. */ /* atomic setter operation on the Sone. */ synchronized (sone) {