Restrict access to methods.
[Sone.git] / src / main / java / net / pterodactylus / sone / core / SoneDownloader.java
index 388d804..b080549 100644 (file)
@@ -31,12 +31,13 @@ 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.PostBuilder;
 import net.pterodactylus.sone.data.PostReply;
-import net.pterodactylus.sone.data.PostReplyBuilder;
 import net.pterodactylus.sone.data.Profile;
 import net.pterodactylus.sone.data.Sone;
 import net.pterodactylus.sone.data.Sone.SoneStatus;
+import net.pterodactylus.sone.data.SoneImpl;
+import net.pterodactylus.sone.database.PostBuilder;
+import net.pterodactylus.sone.database.PostReplyBuilder;
 import net.pterodactylus.util.io.Closer;
 import net.pterodactylus.util.logging.Logging;
 import net.pterodactylus.util.number.Numbers;
@@ -44,6 +45,7 @@ import net.pterodactylus.util.service.AbstractService;
 import net.pterodactylus.util.xml.SimpleXML;
 import net.pterodactylus.util.xml.XML;
 
+import com.google.common.annotations.VisibleForTesting;
 import org.w3c.dom.Document;
 
 import freenet.client.FetchResult;
@@ -104,18 +106,6 @@ public class SoneDownloader extends AbstractService {
        }
 
        /**
-        * Removes the given Sone from the downloader.
-        *
-        * @param sone
-        *            The Sone to stop watching
-        */
-       public void removeSone(Sone sone) {
-               if (sones.remove(sone)) {
-                       freenetInterface.unregisterUsk(sone);
-               }
-       }
-
-       /**
         * Fetches the updated Sone. This method is a callback method for
         * {@link FreenetInterface#registerUsk(Sone, SoneDownloader)}.
         *
@@ -166,6 +156,7 @@ public class SoneDownloader extends AbstractService {
                        Sone parsedSone = parseSone(sone, fetchResults.getFetchResult(), fetchResults.getFreenetUri());
                        if (parsedSone != null) {
                                if (!fetchOnly) {
+                                       parsedSone.setStatus((parsedSone.getTime() == 0) ? SoneStatus.unknown : SoneStatus.idle);
                                        core.updateSone(parsedSone);
                                        addSone(parsedSone);
                                }
@@ -187,7 +178,7 @@ public class SoneDownloader extends AbstractService {
         *            The requested URI
         * @return The parsed Sone, or {@code null} if the Sone could not be parsed
         */
-       public Sone parseSone(Sone originalSone, FetchResult fetchResult, FreenetURI requestUri) {
+       private Sone parseSone(Sone originalSone, FetchResult fetchResult, FreenetURI requestUri) {
                logger.log(Level.FINEST, String.format("Parsing FetchResult (%d bytes, %s) for %s…", fetchResult.size(), fetchResult.getMimeType(), originalSone));
                Bucket soneBucket = fetchResult.asBucket();
                InputStream soneInputStream = null;
@@ -224,7 +215,8 @@ public class SoneDownloader extends AbstractService {
         * @throws SoneException
         *             if a parse error occurs, or the protocol is invalid
         */
-       public Sone parseSone(Sone originalSone, InputStream soneInputStream) throws SoneException {
+       @VisibleForTesting
+       protected Sone parseSone(Sone originalSone, InputStream soneInputStream) throws SoneException {
                /* TODO - impose a size limit? */
 
                Document document;
@@ -238,7 +230,7 @@ public class SoneDownloader extends AbstractService {
                        return null;
                }
 
-               Sone sone = new Sone(originalSone.getId(), false).setIdentity(originalSone.getIdentity());
+               Sone sone = new SoneImpl(originalSone.getId(), originalSone.isLocal()).setIdentity(originalSone.getIdentity());
 
                SimpleXML soneXml;
                try {
@@ -306,16 +298,8 @@ public class SoneDownloader extends AbstractService {
                        }
                }
 
-               String soneInsertUri = soneXml.getValue("insert-uri", null);
-               if ((soneInsertUri != null) && (sone.getInsertUri() == null)) {
-                       try {
-                               sone.setInsertUri(new FreenetURI(soneInsertUri));
-                               sone.setLatestEdition(Math.max(sone.getRequestUri().getEdition(), sone.getInsertUri().getEdition()));
-                       } catch (MalformedURLException mue1) {
-                               /* TODO - mark Sone as bad. */
-                               logger.log(Level.WARNING, String.format("Downloaded Sone %s has invalid insert URI: %s", sone, soneInsertUri), mue1);
-                               return null;
-                       }
+               if (originalSone.getInsertUri() != null) {
+                       sone.setInsertUri(originalSone.getInsertUri());
                }
 
                SimpleXML profileXml = soneXml.getNode("profile");
@@ -348,7 +332,7 @@ public class SoneDownloader extends AbstractService {
                                        return null;
                                }
                                try {
-                                       profile.addField(fieldName).setValue(fieldValue);
+                                       profile.addField(fieldName.trim()).setValue(fieldValue);
                                } catch (IllegalArgumentException iae1) {
                                        logger.log(Level.WARNING, String.format("Duplicate field: %s", fieldName), iae1);
                                        return null;
@@ -455,7 +439,7 @@ public class SoneDownloader extends AbstractService {
                                String title = albumXml.getValue("title", null);
                                String description = albumXml.getValue("description", "");
                                String albumImageId = albumXml.getValue("album-image", null);
-                               if ((id == null) || (title == null) || (description == null)) {
+                               if ((id == null) || (title == null)) {
                                        logger.log(Level.WARNING, String.format("Downloaded Sone %s contains invalid album!", sone));
                                        return null;
                                }
@@ -467,7 +451,7 @@ public class SoneDownloader extends AbstractService {
                                                return null;
                                        }
                                }
-                               Album album = core.getAlbum(id).setSone(sone).setTitle(title).setDescription(description);
+                               Album album = core.getAlbum(id).setSone(sone).modify().setTitle(title).setDescription(description).update();
                                if (parent != null) {
                                        parent.addAlbum(album);
                                } else {
@@ -494,13 +478,13 @@ public class SoneDownloader extends AbstractService {
                                                        logger.log(Level.WARNING, String.format("Downloaded Sone %s contains image %s with invalid dimensions (%s, %s)!", sone, imageId, imageWidthString, imageHeightString));
                                                        return null;
                                                }
-                                               Image image = core.getImage(imageId).setSone(sone).setKey(imageKey).setCreationTime(creationTime);
-                                               image.setTitle(imageTitle).setDescription(imageDescription);
-                                               image.setWidth(imageWidth).setHeight(imageHeight);
+                                               Image image = core.getImage(imageId).modify().setSone(sone).setKey(imageKey).setCreationTime(creationTime).update();
+                                               image = image.modify().setTitle(imageTitle).setDescription(imageDescription).update();
+                                               image = image.modify().setWidth(imageWidth).setHeight(imageHeight).update();
                                                album.addImage(image);
                                        }
                                }
-                               album.setAlbumImage(albumImageId);
+                               album.modify().setAlbumImage(albumImageId).update();
                        }
                }
 
@@ -517,7 +501,9 @@ public class SoneDownloader extends AbstractService {
                        sone.setReplies(replies);
                        sone.setLikePostIds(likedPostIds);
                        sone.setLikeReplyIds(likedReplyIds);
-                       sone.setAlbums(topLevelAlbums);
+                       for (Album album : topLevelAlbums) {
+                               sone.getRootAlbum().addAlbum(album);
+                       }
                }
 
                return sone;
@@ -537,4 +523,34 @@ public class SoneDownloader extends AbstractService {
                }
        }
 
+       public class FetchSoneWithUri implements Runnable {
+
+               private final Sone sone;
+
+               public FetchSoneWithUri(Sone sone) {
+                       this.sone = sone;
+               }
+
+               @Override
+               public void run() {
+                       fetchSone(sone, sone.getRequestUri());
+               }
+
+       }
+
+       public class FetchSone implements Runnable {
+
+               private final Sone sone;
+
+               public FetchSone(Sone sone) {
+                       this.sone = sone;
+               }
+
+               @Override
+               public void run() {
+                       fetchSone(sone);
+               }
+
+       }
+
 }