Let core be an album provider
[Sone.git] / src / main / java / net / pterodactylus / sone / core / SoneParser.java
index 213be03..24b856f 100644 (file)
@@ -1,6 +1,8 @@
 package net.pterodactylus.sone.core;
 
 import static java.util.logging.Logger.getLogger;
+import static net.pterodactylus.sone.utils.NumberParsers.parseInt;
+import static net.pterodactylus.sone.utils.NumberParsers.parseLong;
 
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -18,14 +20,16 @@ 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.Profile.DuplicateField;
+import net.pterodactylus.sone.data.Profile.EmptyFieldName;
 import net.pterodactylus.sone.data.Sone;
 import net.pterodactylus.sone.database.PostBuilder;
 import net.pterodactylus.sone.database.PostReplyBuilder;
 import net.pterodactylus.sone.database.SoneBuilder;
-import net.pterodactylus.util.number.Numbers;
 import net.pterodactylus.util.xml.SimpleXML;
 import net.pterodactylus.util.xml.XML;
 
+import com.google.common.base.Optional;
 import org.w3c.dom.Document;
 
 /**
@@ -35,7 +39,7 @@ import org.w3c.dom.Document;
  */
 public class SoneParser {
 
-       private static final Logger logger = getLogger("Sone.Parser");
+       private static final Logger logger = getLogger(SoneParser.class.getName());
        private static final int MAX_PROTOCOL_VERSION = 0;
        private final Core core;
 
@@ -75,7 +79,7 @@ public class SoneParser {
                Integer protocolVersion = null;
                String soneProtocolVersion = soneXml.getValue("protocol-version", null);
                if (soneProtocolVersion != null) {
-                       protocolVersion = Numbers.safeParseInteger(soneProtocolVersion);
+                       protocolVersion = parseInt(soneProtocolVersion, null);
                }
                if (protocolVersion == null) {
                        logger.log(Level.INFO, "No protocol version found, assuming 0.");
@@ -129,9 +133,9 @@ public class SoneParser {
                String profileFirstName = profileXml.getValue("first-name", null);
                String profileMiddleName = profileXml.getValue("middle-name", null);
                String profileLastName = profileXml.getValue("last-name", null);
-               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));
+               Integer profileBirthDay = parseInt(profileXml.getValue("birth-day", ""), null);
+               Integer profileBirthMonth = parseInt(profileXml.getValue("birth-month", ""), null);
+               Integer profileBirthYear = parseInt(profileXml.getValue("birth-year", ""), null);
                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. */
@@ -149,8 +153,11 @@ public class SoneParser {
                                }
                                try {
                                        profile.addField(fieldName.trim()).setValue(fieldValue);
-                               } catch (IllegalArgumentException iae1) {
-                                       logger.log(Level.WARNING, String.format("Duplicate field: %s", fieldName), iae1);
+                               } catch (EmptyFieldName efn1) {
+                                       logger.log(Level.WARNING, "Empty field name!", efn1);
+                                       return null;
+                               } catch (DuplicateField df1) {
+                                       logger.log(Level.WARNING, String.format("Duplicate field: %s", fieldName), df1);
                                        return null;
                                }
                        }
@@ -260,10 +267,10 @@ public class SoneParser {
                                        logger.log(Level.WARNING, String.format("Downloaded Sone %s contains invalid album!", sone));
                                        return null;
                                }
-                               Album parent = null;
+                               Optional<Album> parent = Optional.absent();
                                if (parentId != null) {
                                        parent = core.getAlbum(parentId);
-                                       if (parent == null) {
+                                       if (!parent.isPresent()) {
                                                logger.log(Level.WARNING, String.format("Downloaded Sone %s has album with invalid parent!", sone));
                                                return null;
                                        }
@@ -276,8 +283,8 @@ public class SoneParser {
                                                .setTitle(title)
                                                .setDescription(description)
                                                .update();
-                               if (parent != null) {
-                                       parent.addAlbum(album);
+                               if (parent.isPresent()) {
+                                       parent.get().addAlbum(album);
                                } else {
                                        topLevelAlbums.add(album);
                                }
@@ -295,9 +302,9 @@ public class SoneParser {
                                                        logger.log(Level.WARNING, String.format("Downloaded Sone %s contains invalid images!", sone));
                                                        return null;
                                                }
-                                               long creationTime = Numbers.safeParseLong(imageCreationTimeString, 0L);
-                                               int imageWidth = Numbers.safeParseInteger(imageWidthString, 0);
-                                               int imageHeight = Numbers.safeParseInteger(imageHeightString, 0);
+                                               long creationTime = parseLong(imageCreationTimeString, 0L);
+                                               int imageWidth = parseInt(imageWidthString, 0);
+                                               int imageHeight = parseInt(imageHeightString, 0);
                                                if ((imageWidth < 1) || (imageHeight < 1)) {
                                                        logger.log(Level.WARNING, String.format("Downloaded Sone %s contains image %s with invalid dimensions (%s, %s)!", sone, imageId, imageWidthString, imageHeightString));
                                                        return null;