OSDN Git Service

split PeriodLoader from Period.
authorOlyutorskii <olyutorskii@users.osdn.me>
Wed, 19 Feb 2020 16:12:21 +0000 (01:12 +0900)
committerOlyutorskii <olyutorskii@users.osdn.me>
Wed, 19 Feb 2020 16:12:21 +0000 (01:12 +0900)
src/main/java/jp/sfjp/jindolf/Controller.java
src/main/java/jp/sfjp/jindolf/data/Period.java
src/main/java/jp/sfjp/jindolf/data/PeriodLoader.java [new file with mode: 0644]
src/main/java/jp/sfjp/jindolf/data/Village.java

index d2e06d5..a5383ed 100644 (file)
@@ -53,6 +53,7 @@ import jp.sfjp.jindolf.data.DialogPref;
 import jp.sfjp.jindolf.data.Land;
 import jp.sfjp.jindolf.data.LandsModel;
 import jp.sfjp.jindolf.data.Period;
+import jp.sfjp.jindolf.data.PeriodLoader;
 import jp.sfjp.jindolf.data.RegexPattern;
 import jp.sfjp.jindolf.data.Talk;
 import jp.sfjp.jindolf.data.Village;
@@ -770,7 +771,7 @@ public class Controller
                         + "日目のデータを読み込んでいます";
                 updateStatusBar(message);
                 try{
-                    Period.parsePeriod(period, true);
+                    PeriodLoader.parsePeriod(period, true);
                 }catch(IOException e){
                     showNetworkError(village, e);
                     return;
@@ -1022,7 +1023,7 @@ public class Controller
                         + "日目のデータを読み込んでいます";
                 updateStatusBar(message);
                 try{
-                    Period.parsePeriod(period, false);
+                    PeriodLoader.parsePeriod(period, false);
                 }catch(IOException e){
                     showNetworkError(village, e);
                     return;
@@ -1246,7 +1247,7 @@ public class Controller
                 try{
                     wasHot = period.isHot();
                     try{
-                        Period.parsePeriod(period, force);
+                        PeriodLoader.parsePeriod(period, force);
                     }catch(IOException e){
                         showNetworkError(village, e);
                     }
index 9053880..1a969fd 100644 (file)
@@ -7,23 +7,14 @@
 
 package jp.sfjp.jindolf.data;
 
-import java.io.IOException;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import jp.osdn.jindolf.parser.HtmlParseException;
-import jp.osdn.jindolf.parser.HtmlParser;
-import jp.osdn.jindolf.parser.content.DecodedContent;
-import jp.sfjp.jindolf.net.HtmlSequence;
-import jp.sfjp.jindolf.net.ServerAccess;
 import jp.sourceforge.jindolf.corelib.LandDef;
 import jp.sourceforge.jindolf.corelib.PeriodType;
 import jp.sourceforge.jindolf.corelib.SysEventType;
-import jp.sourceforge.jindolf.corelib.VillageState;
 
 /**
  * いわゆる「日」。
@@ -36,18 +27,6 @@ import jp.sourceforge.jindolf.corelib.VillageState;
 public class Period{
     // TODO Comparable も implement する?
 
-    private static final HtmlParser PARSER = new HtmlParser();
-    private static final PeriodHandler HANDLER =
-            new PeriodHandler();
-
-    private static final Logger LOGGER = Logger.getAnonymousLogger();
-
-    static{
-        PARSER.setBasicHandler   (HANDLER);
-        PARSER.setSysEventHandler(HANDLER);
-        PARSER.setTalkHandler    (HANDLER);
-    }
-
     private final Village homeVillage;
     private final PeriodType periodType;
     private final int day;
@@ -133,51 +112,6 @@ public class Period{
 
 
     /**
-     * Periodを更新する。Topicのリストが更新される。
-     * @param period 日
-     * @param force trueなら強制再読み込み。
-     *     falseならまだ読み込んで無い時のみ読み込み。
-     * @throws IOException ネットワーク入力エラー
-     */
-    public static void parsePeriod(Period period, boolean force)
-            throws IOException{
-        if( ! force && period.hasLoaded() ) return;
-
-        Village village = period.getVillage();
-        Land land = village.getParentLand();
-        ServerAccess server = land.getServerAccess();
-
-        if(village.getState() != VillageState.PROGRESS){
-            period.isFullOpen = true;
-        }else if(period.getType() != PeriodType.PROGRESS){
-            period.isFullOpen = true;
-        }else{
-            period.isFullOpen = false;
-        }
-
-        HtmlSequence html = server.getHTMLPeriod(period);
-
-        period.topicList.clear();
-
-        boolean wasHot = period.isHot();
-
-        HANDLER.setPeriod(period);
-        DecodedContent content = html.getContent();
-        try{
-            PARSER.parseAutomatic(content);
-        }catch(HtmlParseException e){
-            LOGGER.log(Level.WARNING, "発言抽出に失敗", e);
-        }
-
-        if(wasHot && ! period.isHot() ){
-            parsePeriod(period, true);
-            return;
-        }
-
-        return;
-    }
-
-    /**
      * 所属する村を返す。
      * @return 村
      */
@@ -433,14 +367,33 @@ public class Period{
     }
 
     /**
-     * このPeriodの内容にゲーム進行上隠された部分がある可能性を判定する。
-     * @return 隠れた要素がありうるならfalse
+     * このPeriodの内容が全て公に開示されたものであるか判定する。
+     *
+     * <p>公に開示とは、非狼プレイヤーでも赤ログを閲覧できる状況を指す。
+     *
+     * <p>※ 2020-02の時点で、全てのPeriodは公に開示されているものとする。
+     *
+     * @return すべて開示されているならtrue
      */
     public boolean isFullOpen(){
         return this.isFullOpen;
     }
 
     /**
+     * このPeriodの内容が全て公に開示されたものであるか設定する。
+     *
+     * <p>公に開示とは、非狼プレイヤーでも赤ログを閲覧できる状況を指す。
+     *
+     * <p>※ 2020-02の時点で、全てのPeriodは公に開示されているものとする。
+     *
+     * @param fullOpen すべて開示されているならtrue
+     */
+    public void setFullOpen(boolean fullOpen){
+        this.isFullOpen = fullOpen;
+        return;
+    }
+
+    /**
      * ロード済みか否かチェックする。
      * @return ロード済みならtrue
      */
diff --git a/src/main/java/jp/sfjp/jindolf/data/PeriodLoader.java b/src/main/java/jp/sfjp/jindolf/data/PeriodLoader.java
new file mode 100644 (file)
index 0000000..38d06bb
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * period loader
+ *
+ * License : The MIT License
+ * Copyright(c) 2020 olyutorskii
+ */
+
+package jp.sfjp.jindolf.data;
+
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import jp.osdn.jindolf.parser.HtmlParseException;
+import jp.osdn.jindolf.parser.HtmlParser;
+import jp.osdn.jindolf.parser.content.DecodedContent;
+import jp.sfjp.jindolf.net.HtmlSequence;
+import jp.sfjp.jindolf.net.ServerAccess;
+import jp.sourceforge.jindolf.corelib.PeriodType;
+import jp.sourceforge.jindolf.corelib.VillageState;
+
+/**
+ * 人狼各国のHTTPサーバから各村の個別の日(Period)をHTMLで取得する。
+ *
+ * <p>Periodには、プレイヤー同士の会話や
+ * システムが自動生成するメッセージが正しい順序で納められる。
+ *
+ * <p>※ 人狼BBS:G国におけるG2087村のエピローグが終了した段階で、
+ * 人狼BBSは過去ログの提供しか行っていない。
+ * だがこのクラスには進行中の村の各日をパースするための
+ * 冗長な処理が若干残っている。
+ */
+public final class PeriodLoader {
+
+    private static final HtmlParser PARSER = new HtmlParser();
+    private static final PeriodHandler HANDLER =
+            new PeriodHandler();
+
+    private static final Logger LOGGER = Logger.getAnonymousLogger();
+
+    static{
+        PARSER.setBasicHandler   (HANDLER);
+        PARSER.setSysEventHandler(HANDLER);
+        PARSER.setTalkHandler    (HANDLER);
+    }
+
+
+    /**
+     * hidden constructor.
+     */
+    private PeriodLoader(){
+        assert false;
+    }
+
+
+    /**
+     * Periodを更新する。Topicのリストが更新される。
+     *
+     * @param period 日
+     * @param force trueなら強制再読み込み。
+     *     falseならまだ読み込んで無い時のみ読み込み。
+     * @throws IOException ネットワーク入力エラー
+     */
+    public static void parsePeriod(Period period, boolean force)
+            throws IOException{
+        if( ! force && period.hasLoaded() ) return;
+
+        Village village = period.getVillage();
+        Land land = village.getParentLand();
+        ServerAccess server = land.getServerAccess();
+
+        if(village.getState() != VillageState.PROGRESS){
+            period.setFullOpen(true);
+        }else if(period.getType() != PeriodType.PROGRESS){
+            period.setFullOpen(true);
+        }else{
+            period.setFullOpen(false);
+        }
+
+        HtmlSequence html = server.getHTMLPeriod(period);
+
+        period.clearTopicList();
+
+        boolean wasHot = period.isHot();
+
+        HANDLER.setPeriod(period);
+        DecodedContent content = html.getContent();
+        try{
+            PARSER.parseAutomatic(content);
+        }catch(HtmlParseException e){
+            LOGGER.log(Level.WARNING, "発言抽出に失敗", e);
+        }
+
+        if(wasHot && ! period.isHot() ){
+            parsePeriod(period, true);
+            return;
+        }
+
+        return;
+    }
+
+}
index d5fe525..4629fdd 100644 (file)
@@ -511,7 +511,7 @@ public class Village implements Comparable<Village> {
         Period anchorPeriod = getPeriod(anchor);
         if(anchorPeriod == null) return result;
 
-        Period.parsePeriod(anchorPeriod, false);
+        PeriodLoader.parsePeriod(anchorPeriod, false);
 
         for(Topic topic : anchorPeriod.getTopicList()){
             if( ! (topic instanceof Talk) ) continue;