OSDN Git Service

お勧めリスト補完の修正
authorseraphy <seraphy@users.osdn.me>
Wed, 6 Feb 2019 23:25:31 +0000 (08:25 +0900)
committerseraphy <seraphy@users.osdn.me>
Wed, 6 Feb 2019 23:29:29 +0000 (08:29 +0900)
src/main/java/charactermanaj/model/io/CharacterDataPersistent.java
src/main/java/charactermanaj/model/io/CharacterDataXMLWriter.java
src/main/java/charactermanaj/ui/ProfileEditDialog.java
src/main/java/charactermanaj/ui/ProfileListManager.java

index 42fa09e..aeb8792 100644 (file)
@@ -37,6 +37,7 @@ 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;
@@ -1010,14 +1011,59 @@ public class CharacterDataPersistent {
                if (characterData == null) {
                        throw new IllegalArgumentException();
                }
-               if (characterData.getRecommendationURLList() != null) {
-                       // 補填の必要なし
-                       return;
+
+               // キャラクターデータの構造がデフォルトの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;
+                                       }
+                               }
+                       }
                }
-               CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();
-               CharacterData defaultCd = defProv
-                               .createDefaultCharacterData(DefaultCharacterDataVersion.V3);
-               characterData.setRecommendationURLList(defaultCd
-                               .getRecommendationURLList());
+               return recommendations;
        }
 }
index 5a408f4..e56f8ac 100644 (file)
@@ -277,8 +277,8 @@ public class CharacterDataXMLWriter {
                }
 
                // Recommendations
-               List<RecommendationURL> recommendations = characterData
-                               .getRecommendationURLList();
+               List<RecommendationURL> recommendations = CharacterDataPersistent.getInstance()
+                               .getUncompensateRecommendationList(characterData); // 補完解除されたお勧めリストを取得する。
                if (recommendations != null) {
                        Element nodeRecommendations = doc.createElementNS(NS,
                                        "recommendations");
index 9e8f762..7961438 100644 (file)
@@ -72,8 +72,6 @@ import charactermanaj.model.PartsCategory;
 import charactermanaj.model.PartsIdentifier;
 import charactermanaj.model.PartsSet;
 import charactermanaj.model.RecommendationURL;
-import charactermanaj.model.io.CharacterDataDefaultProvider;
-import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion;
 import charactermanaj.model.io.CharacterDataPersistent;
 import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel;
 import charactermanaj.ui.util.ScaleSupport;
@@ -1219,13 +1217,12 @@ public class ProfileEditDialog extends JDialog {
                partssetsTableModel.setDefaultPartsSetId(original.getDefaultPartsSetId());
 
                // お勧めリンク
+               CharacterDataPersistent persist = CharacterDataPersistent.getInstance();
                List<RecommendationURL> recommendationURLList = original.getRecommendationURLList();
                if (recommendationURLList == null) {
-                       // キャラクターデータのお勧めリンクがnull(古い形式)の場合は、デフォルトのお勧めリンクで代替する.
-                       CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();
-                       CharacterData defaultCd = defProv
-                                       .createDefaultCharacterData(DefaultCharacterDataVersion.V3);
-                       recommendationURLList = defaultCd.getRecommendationURLList();
+                       // お勧めリンクが設定されていない場合は、キャラクターデータに対応する
+                       // 既定のお勧めリストがあれば取得する (なければnull)
+                       recommendationURLList = persist.getCompensateRecommendationList(original);
                }
                if (recommendationURLList != null) {
                        for (RecommendationURL recommendationURL : recommendationURLList) {
@@ -1234,7 +1231,6 @@ public class ProfileEditDialog extends JDialog {
                }
        }
 
-
        protected void onOpenDir() {
                try {
                        URI docBase = original.getDocBase();
@@ -1470,14 +1466,6 @@ public class ProfileEditDialog extends JDialog {
                                recommendationURLList.add(recommendationURL);
                        }
                }
-               CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();
-               CharacterData defaultCd = defProv
-                               .createDefaultCharacterData(DefaultCharacterDataVersion.V3);
-               List<RecommendationURL> defaultRecommendationURLList = defaultCd.getRecommendationURLList();
-               if (defaultRecommendationURLList != null && defaultRecommendationURLList.equals(recommendationURLList)) {
-                       // デフォルトのお勧めリストと内容が同じの場合は、明示的にリストを設定しない.
-                       recommendationURLList = null;
-               }
                cd.setRecommendationURLList(recommendationURLList);
 
                return cd;
index 928455c..ca40f67 100644 (file)
@@ -441,7 +441,7 @@ public final class ProfileListManager {
                        // rev:c587663f3dda3a4a874ef6810a336126f07d482c まではMainFrameのお薦めリンクメニュー構築時に補完していた。
                        // キャラクターデータのダウンロード問い合わせ対応のため、ここで先に補完しておく。
                        if (characterData.getRecommendationURLList() == null) {
-                               CharacterData v2 = defProv.createDefaultCharacterData(DefaultCharacterDataVersion.V3);
+                               CharacterData v2 = defProv.createDefaultCharacterData(DefaultCharacterDataVersion.V2);
                                if (v2.toStructureString().equals(structureSig) || v3.toStructureString().equals(structureSig)) {
                                        // デフォルトのキャラクターセット(v2, v3)と同一構造であれば、デフォルトで補完する
                                        final CharacterDataPersistent persistent = CharacterDataPersistent.getInstance();