package net.pterodactylus.sone.core;
+import static com.google.common.base.Optional.of;
+
import java.io.InputStream;
import java.net.MalformedURLException;
-import java.util.ArrayList;
import java.util.HashSet;
-import java.util.List;
+import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.pterodactylus.sone.data.Profile;
import net.pterodactylus.sone.data.Sone;
import net.pterodactylus.sone.data.Sone.SoneStatus;
+import net.pterodactylus.sone.data.impl.DefaultSone;
+import net.pterodactylus.sone.database.ImageBuilder.ImageCreated;
+import net.pterodactylus.sone.database.PostBuilder;
+import net.pterodactylus.sone.database.PostBuilder.PostCreated;
+import net.pterodactylus.sone.database.PostReplyBuilder;
+import net.pterodactylus.sone.database.PostReplyBuilder.PostReplyCreated;
import net.pterodactylus.util.io.Closer;
import net.pterodactylus.util.logging.Logging;
+import net.pterodactylus.util.number.Numbers;
import net.pterodactylus.util.service.AbstractService;
import net.pterodactylus.util.xml.SimpleXML;
import net.pterodactylus.util.xml.XML;
-import org.w3c.dom.Document;
-
-import com.google.common.base.Optional;
-import com.google.common.primitives.Ints;
-import com.google.common.primitives.Longs;
-
import freenet.client.FetchResult;
import freenet.keys.FreenetURI;
import freenet.support.api.Bucket;
+import com.google.common.base.Optional;
+import com.google.common.collect.Maps;
+import org.w3c.dom.Document;
+
/**
* The Sone downloader is responsible for download Sones as they are updated.
*
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);
}
return null;
}
- Sone sone = new Sone(originalSone.getId(), false).setIdentity(originalSone.getIdentity());
+ Sone sone = new DefaultSone(core.getDatabase(), originalSone.getId(), originalSone.isLocal()).setIdentity(originalSone.getIdentity());
SimpleXML soneXml;
try {
Integer protocolVersion = null;
String soneProtocolVersion = soneXml.getValue("protocol-version", null);
if (soneProtocolVersion != null) {
- protocolVersion = Optional.fromNullable(Ints.tryParse(soneProtocolVersion)).or(0);
+ protocolVersion = Numbers.safeParseInteger(soneProtocolVersion);
}
if (protocolVersion == null) {
logger.log(Level.INFO, "No protocol version found, assuming 0.");
}
}
- 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");
String profileFirstName = profileXml.getValue("first-name", null);
String profileMiddleName = profileXml.getValue("middle-name", null);
String profileLastName = profileXml.getValue("last-name", null);
- Integer profileBirthDay = Ints.tryParse(profileXml.getValue("birth-day", null));
- Integer profileBirthMonth = Ints.tryParse(profileXml.getValue("birth-month", null));
- Integer profileBirthYear = Ints.tryParse(profileXml.getValue("birth-year", 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));
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. */
return null;
}
try {
- Post post = core.getPost(postId).setSone(sone).setTime(Long.parseLong(postTime)).setText(postText);
+ PostBuilder postBuilder = sone.newPostBuilder();
+ /* TODO - parse time correctly. */
+ postBuilder.withId(postId).withTime(Long.parseLong(postTime)).withText(postText);
if ((postRecipientId != null) && (postRecipientId.length() == 43)) {
- post.setRecipient(core.getSone(postRecipientId));
+ postBuilder.to(of(postRecipientId));
}
- posts.add(post);
+ posts.add(postBuilder.build(Optional.<PostCreated>absent()));
} catch (NumberFormatException nfe1) {
/* TODO - mark Sone as bad. */
logger.log(Level.WARNING, String.format("Downloaded post for Sone %s with invalid time: %s", sone, postTime));
return null;
}
try {
- replies.add(core.getPostReply(replyId, true).setSone(sone).setPost(core.getPost(replyPostId)).setTime(Long.parseLong(replyTime)).setText(replyText));
+ /* TODO - parse time correctly. */
+ PostReplyBuilder postReplyBuilder = sone.newPostReplyBuilder(replyPostId).withId(replyId).withTime(Long.parseLong(replyTime)).withText(replyText);
+ replies.add(postReplyBuilder.build(Optional.<PostReplyCreated>absent()));
} catch (NumberFormatException nfe1) {
/* TODO - mark Sone as bad. */
logger.log(Level.WARNING, String.format("Downloaded reply for Sone %s with invalid time: %s", sone, replyTime));
/* parse albums. */
SimpleXML albumsXml = soneXml.getNode("albums");
- List<Album> topLevelAlbums = new ArrayList<Album>();
+ Map<String, Album> albums = Maps.newHashMap();
if (albumsXml != null) {
for (SimpleXML albumXml : albumsXml.getNodes("album")) {
String id = albumXml.getValue("id", null);
logger.log(Level.WARNING, String.format("Downloaded Sone %s contains invalid album!", sone));
return null;
}
- Album parent = null;
+ Album parent = sone.getRootAlbum();
if (parentId != null) {
- parent = core.getAlbum(parentId, false);
+ parent = albums.get(parentId);
if (parent == null) {
logger.log(Level.WARNING, String.format("Downloaded Sone %s has album with invalid parent!", sone));
return null;
}
}
- Album album = core.getAlbum(id).setSone(sone).setTitle(title).setDescription(description);
- if (parent != null) {
- parent.addAlbum(album);
- } else {
- topLevelAlbums.add(album);
- }
+ Album album = parent.newAlbumBuilder().withId(id).build().modify().setTitle(title).setDescription(description).update();
+ albums.put(album.getId(), album);
SimpleXML imagesXml = albumXml.getNode("images");
if (imagesXml != null) {
for (SimpleXML imageXml : imagesXml.getNodes("image")) {
logger.log(Level.WARNING, String.format("Downloaded Sone %s contains invalid images!", sone));
return null;
}
- long creationTime = Optional.fromNullable(Longs.tryParse(imageCreationTimeString)).or(0L);
- int imageWidth = Optional.fromNullable(Ints.tryParse(imageWidthString)).or(0);
- int imageHeight = Optional.fromNullable(Ints.tryParse(imageHeightString)).or(0);
+ long creationTime = Numbers.safeParseLong(imageCreationTimeString, 0L);
+ int imageWidth = Numbers.safeParseInteger(imageWidthString, 0);
+ int imageHeight = Numbers.safeParseInteger(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;
}
- Image image = core.getImage(imageId).setSone(sone).setKey(imageKey).setCreationTime(creationTime);
- image.setTitle(imageTitle).setDescription(imageDescription);
- image.setWidth(imageWidth).setHeight(imageHeight);
- album.addImage(image);
+ Image image = album.newImageBuilder().withId(imageId).at(imageKey).created(creationTime).sized(imageWidth, imageHeight).build(Optional.<ImageCreated>absent());
+ image = image.modify().setTitle(imageTitle).setDescription(imageDescription).update();
}
}
- album.setAlbumImage(albumImageId);
+ album.modify().setAlbumImage(albumImageId).update();
}
}
/* process avatar. */
if (avatarId != null) {
- profile.setAvatar(core.getImage(avatarId, false));
+ profile.setAvatar(core.getImage(avatarId).orNull());
}
/* okay, apparently everything was parsed correctly. Now import. */
sone.setReplies(replies);
sone.setLikePostIds(likedPostIds);
sone.setLikeReplyIds(likedReplyIds);
- sone.setAlbums(topLevelAlbums);
}
return sone;
// SERVICE METHODS
//
- /**
- * {@inheritDoc}
- */
@Override
protected void serviceStop() {
for (Sone sone : sones) {