OSDN Git Service

メインスレッド判別
authoryukihane <yukihane.feather@gmail.com>
Wed, 21 Sep 2011 06:50:33 +0000 (15:50 +0900)
committeryukihane <yukihane.feather@gmail.com>
Wed, 21 Sep 2011 17:41:57 +0000 (02:41 +0900)
frontend/src/saccubus/conv/NicoXMLReader.java

index 4f58ab6..89409bf 100644 (file)
@@ -36,14 +36,47 @@ public class NicoXMLReader extends DefaultHandler {
     private final Packet packet;
     private final Pattern ngWord;
     private final Pattern ngId;
+    private String mainThreadId;
     private Chat item;
     private boolean itemKicked;
 
+    /**
+     * 処理するコメントの種別.
+     */
     public enum ProcessType {
 
-        NORMAL, OWNER;
+        /** 通常のコメント. */
+        NORMAL(false, false),
+        /** 投稿者コメント. */
+        OWNER(true, false),
+        /** オプショナルスレッドコメント. */
+        OPTIONAL(false, true),
+        /** オプショナルスレッド投稿者コメント. */
+        OPTIONAL_OWNER(true, true);
+        private final boolean owner;
+        private final boolean optional;
+
+        private ProcessType(boolean owner, boolean optional) {
+            this.owner = owner;
+            this.optional = optional;
+        }
+
+        boolean isOwner() {
+            return owner;
+        }
+
+        boolean isOptional() {
+            return optional;
+        }
     }
 
+    /**
+     * コンストラクタ.
+     * @param types 処理するコメントの種別.
+     * @param packet
+     * @param ng_id NG ID.
+     * @param ng_word NG ワード.
+     */
     public NicoXMLReader(Set<ProcessType> types, Packet packet, String ng_id, String ng_word) {
         this.processTypes = EnumSet.copyOf(types);
         this.packet = packet;
@@ -143,15 +176,26 @@ public class NicoXMLReader extends DefaultHandler {
             // 通常コメントを処理するか, 投稿者コメントを処理するか
             final String fork = attributes.getValue("fork");
             final boolean isOwner = "1".equals(fork);
-            if (isOwner) {
-                if (!processTypes.contains(ProcessType.OWNER)) {
-                    itemKicked = true;
-                }
-            } else {
-                if (!processTypes.contains(ProcessType.NORMAL)) {
-                    itemKicked = true;
+            final String th = attributes.getValue("thread");
+
+            // 初めて見つけたthreadをメインスレッドとみなす
+            if(mainThreadId == null) {
+                mainThreadId = th;
+            }
+
+            final boolean isOptional = (mainThreadId == null) ? false : !mainThreadId.equals(th);
+
+            boolean nokick = false;
+            for(ProcessType pt : processTypes) {
+                if(pt.isOwner() == isOwner && pt.isOptional() == isOptional) {
+                    nokick = true;
+                    break;
                 }
             }
+            if(!nokick) {
+                itemKicked = true;
+                return;
+            }
 
             //マイメモリ削除対象
             final String deleted = attributes.getValue("deleted");