Parse album:// links
[Sone.git] / src / main / java / net / pterodactylus / sone / text / SoneTextParser.java
index f628279..9fcce7a 100644 (file)
@@ -28,9 +28,11 @@ import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import net.pterodactylus.sone.data.Album;
 import net.pterodactylus.sone.data.Post;
 import net.pterodactylus.sone.data.Sone;
 import net.pterodactylus.sone.data.impl.IdOnlySone;
+import net.pterodactylus.sone.database.AlbumProvider;
 import net.pterodactylus.sone.database.PostProvider;
 import net.pterodactylus.sone.database.SoneProvider;
 import net.pterodactylus.util.io.Closer;
@@ -66,7 +68,8 @@ public class SoneTextParser implements Parser<SoneTextParserContext> {
                HTTP("http://", false),
                HTTPS("https://", false),
                SONE("sone://", false),
-               POST("post://", false);
+               POST("post://", false),
+               ALBUM("album://", false);
 
                private final String scheme;
                private final boolean freenetLink;
@@ -91,23 +94,14 @@ public class SoneTextParser implements Parser<SoneTextParserContext> {
 
        }
 
-       /** The Sone provider. */
        private final SoneProvider soneProvider;
-
-       /** The post provider. */
        private final PostProvider postProvider;
+       private final AlbumProvider albumProvider;
 
-       /**
-        * Creates a new freenet link parser.
-        *
-        * @param soneProvider
-        *            The Sone provider
-        * @param postProvider
-        *            The post provider
-        */
-       public SoneTextParser(SoneProvider soneProvider, PostProvider postProvider) {
+       public SoneTextParser(SoneProvider soneProvider, PostProvider postProvider, AlbumProvider albumProvider) {
                this.soneProvider = soneProvider;
                this.postProvider = postProvider;
+               this.albumProvider = albumProvider;
        }
 
        //
@@ -168,7 +162,6 @@ public class SoneTextParser implements Parser<SoneTextParserContext> {
                                        if (next > 0) {
                                                parts.add(new PlainTextPart(line.substring(0, next)));
                                                line = line.substring(next);
-                                               next = 0;
                                        }
                                        lineComplete = false;
 
@@ -205,23 +198,27 @@ public class SoneTextParser implements Parser<SoneTextParserContext> {
                                                continue;
                                        }
                                        if (linkType == LinkType.POST) {
-                                               if (line.length() >= (7 + 36)) {
-                                                       String postId = line.substring(7, 43);
-                                                       Optional<Post> post = postProvider.getPost(postId);
-                                                       if (post.isPresent()) {
-                                                               parts.add(new PostPart(post.get()));
-                                                       } else {
-                                                               parts.add(new PlainTextPart(line.substring(0, 43)));
-                                                       }
-                                                       line = line.substring(43);
+                                               Optional<Post> post = postProvider.getPost(link.substring(7));
+                                               if (post.isPresent()) {
+                                                       parts.add(new PostPart(post.get(), link.substring(7).equals(post.get().getInternalId())));
                                                } else {
-                                                       parts.add(new PlainTextPart(line));
-                                                       line = "";
+                                                       parts.add(new PlainTextPart(link));
+                                               }
+                                               line = line.substring(link.length());
+                                               continue;
+                                       }
+                                       if (linkType == LinkType.ALBUM) {
+                                               Optional<Album> album = albumProvider.getAlbum(link.substring(linkType.getScheme().length()));
+                                               if (album.isPresent()) {
+                                                       parts.add(new AlbumPart(album.get()));
+                                               } else {
+                                                       parts.add(new PlainTextPart(link));
                                                }
+                                               line = line.substring(link.length());
                                                continue;
                                        }
 
-                                       if ((linkType == LinkType.KSK) || (linkType == LinkType.CHK) || (linkType == LinkType.SSK) || (linkType == LinkType.USK)) {
+                                       if (linkType.isFreenetLink()) {
                                                FreenetURI uri;
                                                if (name.indexOf('?') > -1) {
                                                        name = name.substring(0, name.indexOf('?'));
@@ -279,7 +276,7 @@ public class SoneTextParser implements Parser<SoneTextParserContext> {
                }
                for (int partIndex = parts.size() - 1; partIndex >= 0; --partIndex) {
                        Part part = parts.getPart(partIndex);
-                       if (!(part instanceof PlainTextPart) || !"\n".equals(((PlainTextPart) part).getText())) {
+                       if (!(part instanceof PlainTextPart) || !"\n".equals(part.getText())) {
                                break;
                        }
                        parts.removePart(partIndex);