X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FSoneParser.java;h=b12866a9e0953808ff5934b837b968934bc52282;hb=b55dc075f9cd34fb32baa44bbbc54a89d05e80b9;hp=fdbd9aeca7ac294c11a6ec92491c18cd4fe1d402;hpb=91b8268946412b35bcce5b4406106ecd4cb58e3c;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/core/SoneParser.java b/src/main/java/net/pterodactylus/sone/core/SoneParser.java index fdbd9ae..b12866a 100644 --- a/src/main/java/net/pterodactylus/sone/core/SoneParser.java +++ b/src/main/java/net/pterodactylus/sone/core/SoneParser.java @@ -1,5 +1,6 @@ package net.pterodactylus.sone.core; +import static java.util.concurrent.TimeUnit.*; import static java.util.logging.Logger.getLogger; import static net.pterodactylus.sone.utils.NumberParsers.parseInt; import static net.pterodactylus.sone.utils.NumberParsers.parseLong; @@ -11,9 +12,12 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.*; import java.util.logging.Level; import java.util.logging.Logger; +import javax.inject.Inject; + import net.pterodactylus.sone.data.Album; import net.pterodactylus.sone.data.Client; import net.pterodactylus.sone.data.Image; @@ -23,32 +27,37 @@ 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.Database; import net.pterodactylus.sone.database.PostBuilder; import net.pterodactylus.sone.database.PostReplyBuilder; import net.pterodactylus.sone.database.SoneBuilder; import net.pterodactylus.util.xml.SimpleXML; import net.pterodactylus.util.xml.XML; +import com.codahale.metrics.*; +import com.google.common.base.*; import org.w3c.dom.Document; /** * Parses a {@link Sone} from an XML {@link InputStream}. - * - * @author David ‘Bombe’ Roden */ public class SoneParser { private static final Logger logger = getLogger(SoneParser.class.getName()); private static final int MAX_PROTOCOL_VERSION = 0; - private final Core core; + private final Database database; + private final Histogram soneParsingDurationHistogram; - public SoneParser(Core core) { - this.core = core; + @Inject + public SoneParser(Database database, MetricRegistry metricRegistry) { + this.database = database; + this.soneParsingDurationHistogram = metricRegistry.histogram("sone.parsing.duration"); } public Sone parseSone(Sone originalSone, InputStream soneInputStream) throws SoneException { /* TODO - impose a size limit? */ + Stopwatch stopwatch = Stopwatch.createStarted(); Document document; /* XML parsing is not thread-safe. */ synchronized (this) { @@ -60,7 +69,7 @@ public class SoneParser { return null; } - SoneBuilder soneBuilder = core.soneBuilder().from(originalSone.getIdentity()); + SoneBuilder soneBuilder = database.newSoneBuilder().from(originalSone.getIdentity()); if (originalSone.isLocal()) { soneBuilder = soneBuilder.local(); } @@ -164,7 +173,7 @@ public class SoneParser { /* parse posts. */ SimpleXML postsXml = soneXml.getNode("posts"); - Set posts = new HashSet(); + Set posts = new HashSet<>(); if (postsXml == null) { /* TODO - mark Sone as bad. */ logger.log(Level.WARNING, String.format("Downloaded Sone %s has no posts!", sone)); @@ -180,7 +189,7 @@ public class SoneParser { return null; } try { - PostBuilder postBuilder = core.postBuilder(); + PostBuilder postBuilder = database.newPostBuilder(); /* TODO - parse time correctly. */ postBuilder.withId(postId).from(sone.getId()).withTime(Long.parseLong(postTime)).withText(postText); if ((postRecipientId != null) && (postRecipientId.length() == 43)) { @@ -197,7 +206,7 @@ public class SoneParser { /* 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, String.format("Downloaded Sone %s has no replies!", sone)); @@ -213,7 +222,7 @@ public class SoneParser { return null; } try { - PostReplyBuilder postReplyBuilder = core.postReplyBuilder(); + PostReplyBuilder postReplyBuilder = database.newPostReplyBuilder(); /* TODO - parse time correctly. */ postReplyBuilder.withId(replyId).from(sone.getId()).to(replyPostId).withTime(Long.parseLong(replyTime)).withText(replyText); replies.add(postReplyBuilder.build()); @@ -227,7 +236,7 @@ public class SoneParser { /* parse liked post IDs. */ SimpleXML likePostIdsXml = soneXml.getNode("post-likes"); - Set likedPostIds = new HashSet(); + Set likedPostIds = new HashSet<>(); if (likePostIdsXml == null) { /* TODO - mark Sone as bad. */ logger.log(Level.WARNING, String.format("Downloaded Sone %s has no post likes!", sone)); @@ -240,7 +249,7 @@ public class SoneParser { /* parse liked reply IDs. */ SimpleXML likeReplyIdsXml = soneXml.getNode("reply-likes"); - Set likedReplyIds = new HashSet(); + Set likedReplyIds = new HashSet<>(); if (likeReplyIdsXml == null) { /* TODO - mark Sone as bad. */ logger.log(Level.WARNING, String.format("Downloaded Sone %s has no reply likes!", sone)); @@ -253,8 +262,9 @@ public class SoneParser { /* parse albums. */ SimpleXML albumsXml = soneXml.getNode("albums"); - Map allImages = new HashMap(); - List topLevelAlbums = new ArrayList(); + Map allImages = new HashMap<>(); + List topLevelAlbums = new ArrayList<>(); + Map allAlbums = new HashMap<>(); if (albumsXml != null) { for (SimpleXML albumXml : albumsXml.getNodes("album")) { String id = albumXml.getValue("id", null); @@ -267,13 +277,13 @@ public class SoneParser { } Album parent = null; if (parentId != null) { - parent = core.getAlbum(parentId); + parent = allAlbums.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.albumBuilder() + Album album = database.newAlbumBuilder() .withId(id) .by(sone) .build() @@ -286,6 +296,7 @@ public class SoneParser { } else { topLevelAlbums.add(album); } + allAlbums.put(album.getId(), album); SimpleXML imagesXml = albumXml.getNode("images"); if (imagesXml != null) { for (SimpleXML imageXml : imagesXml.getNodes("image")) { @@ -307,7 +318,7 @@ public class SoneParser { 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.imageBuilder().withId(imageId).build().modify().setSone(sone).setKey(imageKey).setCreationTime(creationTime).update(); + Image image = database.newImageBuilder().withId(imageId).build().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); @@ -332,6 +343,10 @@ public class SoneParser { sone.getRootAlbum().addAlbum(album); } + // record the duration + stopwatch.stop(); + soneParsingDurationHistogram.update(stopwatch.elapsed(MICROSECONDS)); + return sone; }