OSDN Git Service

お薦めURLの補完クラスの分離、デフォルト定義のキャッシュ化
authorseraphy <seraphy@users.osdn.me>
Sun, 17 Feb 2019 14:15:51 +0000 (23:15 +0900)
committerseraphy <seraphy@users.osdn.me>
Sun, 17 Feb 2019 14:15:51 +0000 (23:15 +0900)
src/main/java/charactermanaj/model/io/CharacterDataDefaultProvider.java
src/main/java/charactermanaj/model/io/CharacterDataPersistent.java
src/main/java/charactermanaj/model/io/CharacterDataXMLWriter.java
src/main/java/charactermanaj/model/io/RecommendationURLCompensator.java [new file with mode: 0644]
src/main/java/charactermanaj/ui/ProfileEditDialog.java
src/main/java/charactermanaj/ui/ProfileListManager.java
src/main/resources/languages/mainframe.xml

index 8b2c9bb..ce0b8c8 100644 (file)
@@ -8,6 +8,7 @@ import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.ref.SoftReference;
 import java.net.URI;
 import java.net.URL;
 import java.sql.Timestamp;
@@ -83,6 +84,8 @@ public class CharacterDataDefaultProvider {
 
                private final String reskey;
 
+               private transient SoftReference<CharacterData> cache;
+
                public String getResourceName() {
                        return reskey;
                }
@@ -92,7 +95,12 @@ public class CharacterDataDefaultProvider {
                                throw new IllegalArgumentException();
                        }
                        try {
-                               return prov.loadPredefinedCharacterData(reskey);
+                               CharacterData cd = (cache != null) ? cache.get() : null;
+                               if (cd == null) {
+                                       cd = prov.loadPredefinedCharacterData(reskey);
+                                       cache = new SoftReference<CharacterData>(cd);
+                               }
+                               return cd;
 
                        } catch (IOException ex) {
                                throw new RuntimeException(
index aeb8792..22f90d1 100644 (file)
@@ -37,7 +37,6 @@ import charactermanaj.model.CustomLayerOrder;
 import charactermanaj.model.CustomLayerOrderKey;
 import charactermanaj.model.Layer;
 import charactermanaj.model.PartsCategory;
-import charactermanaj.model.RecommendationURL;
 import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion;
 import charactermanaj.util.DirectoryConfig;
 import charactermanaj.util.FileNameNormalizer;
@@ -995,75 +994,4 @@ public class CharacterDataPersistent {
                        }
                }
        }
-
-       /**
-        * お勧めリンクリストが設定されていない場合(nullの場合)、デフォルトのお勧めリストを設定する.<br>
-        * すでに設定されている場合(空を含む)は何もしない.<br>
-        * <br>
-        * おすすめリンクがサポートされてなかったころのデータは、おすすめリンク用のタグそのものが存在せずnullとなる.<br>
-        * サポート後のデータでリンクを未設定にしている場合は、空のリストとなる.<br>
-        * したがって、nullの場合のみ、おすすめリンクを補完する.<br>
-        *
-        * @param characterData
-        *            キャラクターデータ
-        */
-       public void compensateRecommendationList(CharacterData characterData) {
-               if (characterData == null) {
-                       throw new IllegalArgumentException();
-               }
-
-               // キャラクターデータの構造がデフォルトのv2, v3と同一であれば、対応するリンクを設定する
-               List<RecommendationURL> recommendations = getCompensateRecommendationList(characterData);
-               if (recommendations != null) {
-                       characterData.setRecommendationURLList(recommendations);
-               }
-       }
-
-       /**
-        * キャラクターデータに対するお勧めリストの補完が必要であれば、そのリストを返す。
-        * すでに設定済みであるか、対応する補完リストがない場合はnullを返す。
-        * @param characterData
-        * @return お勧めリスト、もしくはnull
-        */
-       public List<RecommendationURL> getCompensateRecommendationList(CharacterData characterData) {
-               if (characterData.getRecommendationURLList() == null) {
-                       // 補填の必要ある場合のみ
-                       CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();
-                       for (DefaultCharacterDataVersion dataVersion : DefaultCharacterDataVersion.values()) {
-                               CharacterData defaultCd = defProv.createDefaultCharacterData(dataVersion);
-                               if (defaultCd.toSignatureString().equals(characterData.toSignatureString())) {
-                                       return defaultCd.getRecommendationURLList();
-                               }
-                       }
-               }
-               return null;
-       }
-
-       /**
-        * 補完されたものを除いたお勧めリストを取得する。
-        * デフォルト構造でデフォルトと同一のお勧めリストの場合、補完されたものとしてnullを返す。
-        * それ以外はお勧めリストをそのまま返す。
-        * @param cd
-        */
-       public List<RecommendationURL> getUncompensateRecommendationList(CharacterData cd) {
-               // デフォルトのキャラクターデータ構造で、
-               // お勧めリストと内容が同じの場合は、明示的にリストを設定しない.
-               String cdSig = cd.toStructureString();
-               List<RecommendationURL> recommendations = cd.getRecommendationURLList();
-               if (recommendations != null) {
-                       CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();
-                       for (DefaultCharacterDataVersion dataVersion : DefaultCharacterDataVersion.values()) {
-                               CharacterData defaultCd = defProv.createDefaultCharacterData(dataVersion);
-                               String defSig = defaultCd.toStructureString();
-                               if (cdSig.equals(defSig)) {
-                                       List<RecommendationURL> defaultRecommendationURLList = defaultCd.getRecommendationURLList();
-                                       if (defaultRecommendationURLList != null && defaultRecommendationURLList.equals(recommendations)) {
-                                               recommendations = null;
-                                               break;
-                                       }
-                               }
-                       }
-               }
-               return recommendations;
-       }
 }
index e56f8ac..ba61ed2 100644 (file)
@@ -277,7 +277,7 @@ public class CharacterDataXMLWriter {
                }
 
                // Recommendations
-               List<RecommendationURL> recommendations = CharacterDataPersistent.getInstance()
+               List<RecommendationURL> recommendations = RecommendationURLCompensator.getInstance()
                                .getUncompensateRecommendationList(characterData); // 補完解除されたお勧めリストを取得する。
                if (recommendations != null) {
                        Element nodeRecommendations = doc.createElementNS(NS,
diff --git a/src/main/java/charactermanaj/model/io/RecommendationURLCompensator.java b/src/main/java/charactermanaj/model/io/RecommendationURLCompensator.java
new file mode 100644 (file)
index 0000000..6ffca5f
--- /dev/null
@@ -0,0 +1,115 @@
+package charactermanaj.model.io;
+
+import java.util.List;
+
+import charactermanaj.model.CharacterData;
+import charactermanaj.model.RecommendationURL;
+import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion;
+
+/**
+ * デフォルトキャラクターセット用のお薦めURLを補完・補完解除します。<br>
+ * <br>
+ * ※ これは黒魔術的に置き換えるためのものなので、XMLの書き込み時には
+ * デフォルトキャラクターセットv2, v3に該当するもので、同一のお勧めリストであれば
+ * それをnullに変える。<br>
+ * ただし、デフォルトキャラクターセットv2, v3の定義もXMLであるため、
+ * XML読み込み中のタイミングでnullを既定のお勧めリストとして補完しようとすると
+ * 循環してしまうため、XML読み込み後に補間する必要があることに注意。<br>
+ */
+public final class RecommendationURLCompensator {
+
+       /**
+        * シングルトン
+        */
+       private static final RecommendationURLCompensator INST = new RecommendationURLCompensator();
+
+       /**
+        * プライ弁ーとコンストラクタ
+        */
+       private RecommendationURLCompensator() {
+               super();
+       }
+
+       /**
+        * シングルトンインスタンすを取得する
+        * @return
+        */
+       public static RecommendationURLCompensator getInstance() {
+               return INST;
+       }
+
+       /**
+        * お勧めリンクリストが設定されていない場合(nullの場合)、デフォルトのお勧めリストを設定する.<br>
+        * すでに設定されている場合(空を含む)は何もしない.<br>
+        * <br>
+        * おすすめリンクがサポートされてなかったころのデータは、おすすめリンク用のタグそのものが存在せずnullとなる.<br>
+        * サポート後のデータでリンクを未設定にしている場合は、空のリストとなる.<br>
+        * したがって、nullの場合のみ、おすすめリンクを補完する.<br>
+        *
+        * @param characterData
+        *            キャラクターデータ
+        */
+       public void compensateRecommendationList(CharacterData characterData) {
+               if (characterData == null) {
+                       throw new IllegalArgumentException();
+               }
+
+               // キャラクターデータの構造がデフォルトのv2, v3と同一であれば、対応するリンクを設定する
+               List<RecommendationURL> recommendations = getCompensateRecommendationList(characterData);
+               if (recommendations != null) {
+                       characterData.setRecommendationURLList(recommendations);
+               }
+       }
+
+       /**
+        * キャラクターデータに対するお勧めリストの補完が必要であれば、そのリストを返す。
+        * すでに設定済みであるか、対応する補完リストがない場合はnullを返す。
+        * @param characterData
+        * @return お勧めリスト、もしくはnull
+        */
+       public List<RecommendationURL> getCompensateRecommendationList(CharacterData characterData) {
+               if (characterData != null && characterData.getRecommendationURLList() == null) {
+                       // 補填の必要ある場合のみ
+                       CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();
+                       for (DefaultCharacterDataVersion dataVersion : DefaultCharacterDataVersion.values()) {
+                               CharacterData defaultCd = defProv.createDefaultCharacterData(dataVersion);
+                               if (defaultCd.toSignatureString().equals(characterData.toSignatureString())) {
+                                       return defaultCd.getRecommendationURLList();
+                               }
+                       }
+               }
+               return null;
+       }
+
+       /**
+        * 補完されたものを除いたお勧めリストを取得する。
+        * デフォルト構造でデフォルトと同一のお勧めリストの場合、補完されたものとしてnullを返す。
+        * それ以外はお勧めリストをそのまま返す。
+        * @param cd
+        */
+       public List<RecommendationURL> getUncompensateRecommendationList(CharacterData cd) {
+               if (cd == null) {
+                       return null;
+               }
+
+               // デフォルトのキャラクターデータ構造で、
+               // お勧めリストと内容が同じの場合は、明示的にリストを設定しない.
+               String cdSig = cd.toStructureString();
+               List<RecommendationURL> recommendations = cd.getRecommendationURLList();
+               if (recommendations != null) {
+                       CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();
+                       for (DefaultCharacterDataVersion dataVersion : DefaultCharacterDataVersion.values()) {
+                               CharacterData defaultCd = defProv.createDefaultCharacterData(dataVersion);
+                               String defSig = defaultCd.toStructureString();
+                               if (cdSig.equals(defSig)) {
+                                       List<RecommendationURL> defaultRecommendationURLList = defaultCd.getRecommendationURLList();
+                                       if (defaultRecommendationURLList != null && defaultRecommendationURLList.equals(recommendations)) {
+                                               recommendations = null;
+                                               break;
+                                       }
+                               }
+                       }
+               }
+               return recommendations;
+       }
+}
index 7961438..4459934 100644 (file)
@@ -73,6 +73,7 @@ import charactermanaj.model.PartsIdentifier;
 import charactermanaj.model.PartsSet;
 import charactermanaj.model.RecommendationURL;
 import charactermanaj.model.io.CharacterDataPersistent;
+import charactermanaj.model.io.RecommendationURLCompensator;
 import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel;
 import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.util.DesktopUtilities;
@@ -1217,12 +1218,12 @@ public class ProfileEditDialog extends JDialog {
                partssetsTableModel.setDefaultPartsSetId(original.getDefaultPartsSetId());
 
                // お勧めリンク
-               CharacterDataPersistent persist = CharacterDataPersistent.getInstance();
                List<RecommendationURL> recommendationURLList = original.getRecommendationURLList();
                if (recommendationURLList == null) {
                        // お勧めリンクが設定されていない場合は、キャラクターデータに対応する
                        // 既定のお勧めリストがあれば取得する (なければnull)
-                       recommendationURLList = persist.getCompensateRecommendationList(original);
+                       RecommendationURLCompensator compensator = RecommendationURLCompensator.getInstance();
+                       recommendationURLList = compensator.getCompensateRecommendationList(original);
                }
                if (recommendationURLList != null) {
                        for (RecommendationURL recommendationURL : recommendationURLList) {
index ca40f67..fd762bb 100644 (file)
@@ -32,6 +32,7 @@ import charactermanaj.model.io.PartsInfoXMLReader;
 import charactermanaj.model.io.PartsManageDataDecorateLoader;
 import charactermanaj.model.io.PartsSpecDecorateLoader;
 import charactermanaj.model.io.RecentDataPersistent;
+import charactermanaj.model.io.RecommendationURLCompensator;
 import charactermanaj.util.ErrorMessageHelper;
 
 /**
@@ -444,8 +445,8 @@ public final class ProfileListManager {
                                CharacterData v2 = defProv.createDefaultCharacterData(DefaultCharacterDataVersion.V2);
                                if (v2.toStructureString().equals(structureSig) || v3.toStructureString().equals(structureSig)) {
                                        // デフォルトのキャラクターセット(v2, v3)と同一構造であれば、デフォルトで補完する
-                                       final CharacterDataPersistent persistent = CharacterDataPersistent.getInstance();
-                                       persistent.compensateRecommendationList(characterData);
+                                       RecommendationURLCompensator compensator = RecommendationURLCompensator.getInstance();
+                                       compensator.compensateRecommendationList(characterData);
                                }
                        }
                }
index 0b521d1..7ae108d 100644 (file)
@@ -16,7 +16,7 @@
        <entry key="help.forum.description">Forum</entry>
        <entry key="help.forum.url">http://osdn.net/projects/charactermanaj/forums/</entry>
 
-       <entry key="defaultdatadownload.confirm.message">There is default character data. Do you want to download it?</entry>
+       <entry key="defaultdatadownload.confirm.message">You can download the default parts set. Do you want to download it?</entry>
        <entry key="defaultdatadownload.confirm.title">Default character data download</entry>
        <entry key="noDownloadAndDoNotAskAgain">I do not want to download, and do not ask me again.</entry>
 </properties>