• R/O
  • HTTP
  • SSH
  • HTTPS

CharacterManaJ: Commit

キャラクターなんとかJの本体


Commit MetaInfo

Revisionf82e10e8dcf6c98e95d4d9a563405a660c04f10e (tree)
Time2019-02-17 23:15:51
Authorseraphy <seraphy@user...>
Commiterseraphy

Log Message

お薦めURLの補完クラスの分離、デフォルト定義のキャッシュ化

Change Summary

Incremental Difference

--- a/src/main/java/charactermanaj/model/io/CharacterDataDefaultProvider.java
+++ b/src/main/java/charactermanaj/model/io/CharacterDataDefaultProvider.java
@@ -8,6 +8,7 @@ import java.io.FileNotFoundException;
88 import java.io.FileOutputStream;
99 import java.io.IOException;
1010 import java.io.InputStream;
11+import java.lang.ref.SoftReference;
1112 import java.net.URI;
1213 import java.net.URL;
1314 import java.sql.Timestamp;
@@ -83,6 +84,8 @@ public class CharacterDataDefaultProvider {
8384
8485 private final String reskey;
8586
87+ private transient SoftReference<CharacterData> cache;
88+
8689 public String getResourceName() {
8790 return reskey;
8891 }
@@ -92,7 +95,12 @@ public class CharacterDataDefaultProvider {
9295 throw new IllegalArgumentException();
9396 }
9497 try {
95- return prov.loadPredefinedCharacterData(reskey);
98+ CharacterData cd = (cache != null) ? cache.get() : null;
99+ if (cd == null) {
100+ cd = prov.loadPredefinedCharacterData(reskey);
101+ cache = new SoftReference<CharacterData>(cd);
102+ }
103+ return cd;
96104
97105 } catch (IOException ex) {
98106 throw new RuntimeException(
--- a/src/main/java/charactermanaj/model/io/CharacterDataPersistent.java
+++ b/src/main/java/charactermanaj/model/io/CharacterDataPersistent.java
@@ -37,7 +37,6 @@ import charactermanaj.model.CustomLayerOrder;
3737 import charactermanaj.model.CustomLayerOrderKey;
3838 import charactermanaj.model.Layer;
3939 import charactermanaj.model.PartsCategory;
40-import charactermanaj.model.RecommendationURL;
4140 import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion;
4241 import charactermanaj.util.DirectoryConfig;
4342 import charactermanaj.util.FileNameNormalizer;
@@ -995,75 +994,4 @@ public class CharacterDataPersistent {
995994 }
996995 }
997996 }
998-
999- /**
1000- * お勧めリンクリストが設定されていない場合(nullの場合)、デフォルトのお勧めリストを設定する.<br>
1001- * すでに設定されている場合(空を含む)は何もしない.<br>
1002- * <br>
1003- * おすすめリンクがサポートされてなかったころのデータは、おすすめリンク用のタグそのものが存在せずnullとなる.<br>
1004- * サポート後のデータでリンクを未設定にしている場合は、空のリストとなる.<br>
1005- * したがって、nullの場合のみ、おすすめリンクを補完する.<br>
1006- *
1007- * @param characterData
1008- * キャラクターデータ
1009- */
1010- public void compensateRecommendationList(CharacterData characterData) {
1011- if (characterData == null) {
1012- throw new IllegalArgumentException();
1013- }
1014-
1015- // キャラクターデータの構造がデフォルトのv2, v3と同一であれば、対応するリンクを設定する
1016- List<RecommendationURL> recommendations = getCompensateRecommendationList(characterData);
1017- if (recommendations != null) {
1018- characterData.setRecommendationURLList(recommendations);
1019- }
1020- }
1021-
1022- /**
1023- * キャラクターデータに対するお勧めリストの補完が必要であれば、そのリストを返す。
1024- * すでに設定済みであるか、対応する補完リストがない場合はnullを返す。
1025- * @param characterData
1026- * @return お勧めリスト、もしくはnull
1027- */
1028- public List<RecommendationURL> getCompensateRecommendationList(CharacterData characterData) {
1029- if (characterData.getRecommendationURLList() == null) {
1030- // 補填の必要ある場合のみ
1031- CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();
1032- for (DefaultCharacterDataVersion dataVersion : DefaultCharacterDataVersion.values()) {
1033- CharacterData defaultCd = defProv.createDefaultCharacterData(dataVersion);
1034- if (defaultCd.toSignatureString().equals(characterData.toSignatureString())) {
1035- return defaultCd.getRecommendationURLList();
1036- }
1037- }
1038- }
1039- return null;
1040- }
1041-
1042- /**
1043- * 補完されたものを除いたお勧めリストを取得する。
1044- * デフォルト構造でデフォルトと同一のお勧めリストの場合、補完されたものとしてnullを返す。
1045- * それ以外はお勧めリストをそのまま返す。
1046- * @param cd
1047- */
1048- public List<RecommendationURL> getUncompensateRecommendationList(CharacterData cd) {
1049- // デフォルトのキャラクターデータ構造で、
1050- // お勧めリストと内容が同じの場合は、明示的にリストを設定しない.
1051- String cdSig = cd.toStructureString();
1052- List<RecommendationURL> recommendations = cd.getRecommendationURLList();
1053- if (recommendations != null) {
1054- CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();
1055- for (DefaultCharacterDataVersion dataVersion : DefaultCharacterDataVersion.values()) {
1056- CharacterData defaultCd = defProv.createDefaultCharacterData(dataVersion);
1057- String defSig = defaultCd.toStructureString();
1058- if (cdSig.equals(defSig)) {
1059- List<RecommendationURL> defaultRecommendationURLList = defaultCd.getRecommendationURLList();
1060- if (defaultRecommendationURLList != null && defaultRecommendationURLList.equals(recommendations)) {
1061- recommendations = null;
1062- break;
1063- }
1064- }
1065- }
1066- }
1067- return recommendations;
1068- }
1069997 }
--- a/src/main/java/charactermanaj/model/io/CharacterDataXMLWriter.java
+++ b/src/main/java/charactermanaj/model/io/CharacterDataXMLWriter.java
@@ -277,7 +277,7 @@ public class CharacterDataXMLWriter {
277277 }
278278
279279 // Recommendations
280- List<RecommendationURL> recommendations = CharacterDataPersistent.getInstance()
280+ List<RecommendationURL> recommendations = RecommendationURLCompensator.getInstance()
281281 .getUncompensateRecommendationList(characterData); // 補完解除されたお勧めリストを取得する。
282282 if (recommendations != null) {
283283 Element nodeRecommendations = doc.createElementNS(NS,
--- /dev/null
+++ b/src/main/java/charactermanaj/model/io/RecommendationURLCompensator.java
@@ -0,0 +1,115 @@
1+package charactermanaj.model.io;
2+
3+import java.util.List;
4+
5+import charactermanaj.model.CharacterData;
6+import charactermanaj.model.RecommendationURL;
7+import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion;
8+
9+/**
10+ * デフォルトキャラクターセット用のお薦めURLを補完・補完解除します。<br>
11+ * <br>
12+ * ※ これは黒魔術的に置き換えるためのものなので、XMLの書き込み時には
13+ * デフォルトキャラクターセットv2, v3に該当するもので、同一のお勧めリストであれば
14+ * それをnullに変える。<br>
15+ * ただし、デフォルトキャラクターセットv2, v3の定義もXMLであるため、
16+ * XML読み込み中のタイミングでnullを既定のお勧めリストとして補完しようとすると
17+ * 循環してしまうため、XML読み込み後に補間する必要があることに注意。<br>
18+ */
19+public final class RecommendationURLCompensator {
20+
21+ /**
22+ * シングルトン
23+ */
24+ private static final RecommendationURLCompensator INST = new RecommendationURLCompensator();
25+
26+ /**
27+ * プライ弁ーとコンストラクタ
28+ */
29+ private RecommendationURLCompensator() {
30+ super();
31+ }
32+
33+ /**
34+ * シングルトンインスタンすを取得する
35+ * @return
36+ */
37+ public static RecommendationURLCompensator getInstance() {
38+ return INST;
39+ }
40+
41+ /**
42+ * お勧めリンクリストが設定されていない場合(nullの場合)、デフォルトのお勧めリストを設定する.<br>
43+ * すでに設定されている場合(空を含む)は何もしない.<br>
44+ * <br>
45+ * おすすめリンクがサポートされてなかったころのデータは、おすすめリンク用のタグそのものが存在せずnullとなる.<br>
46+ * サポート後のデータでリンクを未設定にしている場合は、空のリストとなる.<br>
47+ * したがって、nullの場合のみ、おすすめリンクを補完する.<br>
48+ *
49+ * @param characterData
50+ * キャラクターデータ
51+ */
52+ public void compensateRecommendationList(CharacterData characterData) {
53+ if (characterData == null) {
54+ throw new IllegalArgumentException();
55+ }
56+
57+ // キャラクターデータの構造がデフォルトのv2, v3と同一であれば、対応するリンクを設定する
58+ List<RecommendationURL> recommendations = getCompensateRecommendationList(characterData);
59+ if (recommendations != null) {
60+ characterData.setRecommendationURLList(recommendations);
61+ }
62+ }
63+
64+ /**
65+ * キャラクターデータに対するお勧めリストの補完が必要であれば、そのリストを返す。
66+ * すでに設定済みであるか、対応する補完リストがない場合はnullを返す。
67+ * @param characterData
68+ * @return お勧めリスト、もしくはnull
69+ */
70+ public List<RecommendationURL> getCompensateRecommendationList(CharacterData characterData) {
71+ if (characterData != null && characterData.getRecommendationURLList() == null) {
72+ // 補填の必要ある場合のみ
73+ CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();
74+ for (DefaultCharacterDataVersion dataVersion : DefaultCharacterDataVersion.values()) {
75+ CharacterData defaultCd = defProv.createDefaultCharacterData(dataVersion);
76+ if (defaultCd.toSignatureString().equals(characterData.toSignatureString())) {
77+ return defaultCd.getRecommendationURLList();
78+ }
79+ }
80+ }
81+ return null;
82+ }
83+
84+ /**
85+ * 補完されたものを除いたお勧めリストを取得する。
86+ * デフォルト構造でデフォルトと同一のお勧めリストの場合、補完されたものとしてnullを返す。
87+ * それ以外はお勧めリストをそのまま返す。
88+ * @param cd
89+ */
90+ public List<RecommendationURL> getUncompensateRecommendationList(CharacterData cd) {
91+ if (cd == null) {
92+ return null;
93+ }
94+
95+ // デフォルトのキャラクターデータ構造で、
96+ // お勧めリストと内容が同じの場合は、明示的にリストを設定しない.
97+ String cdSig = cd.toStructureString();
98+ List<RecommendationURL> recommendations = cd.getRecommendationURLList();
99+ if (recommendations != null) {
100+ CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();
101+ for (DefaultCharacterDataVersion dataVersion : DefaultCharacterDataVersion.values()) {
102+ CharacterData defaultCd = defProv.createDefaultCharacterData(dataVersion);
103+ String defSig = defaultCd.toStructureString();
104+ if (cdSig.equals(defSig)) {
105+ List<RecommendationURL> defaultRecommendationURLList = defaultCd.getRecommendationURLList();
106+ if (defaultRecommendationURLList != null && defaultRecommendationURLList.equals(recommendations)) {
107+ recommendations = null;
108+ break;
109+ }
110+ }
111+ }
112+ }
113+ return recommendations;
114+ }
115+}
--- a/src/main/java/charactermanaj/ui/ProfileEditDialog.java
+++ b/src/main/java/charactermanaj/ui/ProfileEditDialog.java
@@ -73,6 +73,7 @@ import charactermanaj.model.PartsIdentifier;
7373 import charactermanaj.model.PartsSet;
7474 import charactermanaj.model.RecommendationURL;
7575 import charactermanaj.model.io.CharacterDataPersistent;
76+import charactermanaj.model.io.RecommendationURLCompensator;
7677 import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel;
7778 import charactermanaj.ui.util.ScaleSupport;
7879 import charactermanaj.util.DesktopUtilities;
@@ -1217,12 +1218,12 @@ public class ProfileEditDialog extends JDialog {
12171218 partssetsTableModel.setDefaultPartsSetId(original.getDefaultPartsSetId());
12181219
12191220 // お勧めリンク
1220- CharacterDataPersistent persist = CharacterDataPersistent.getInstance();
12211221 List<RecommendationURL> recommendationURLList = original.getRecommendationURLList();
12221222 if (recommendationURLList == null) {
12231223 // お勧めリンクが設定されていない場合は、キャラクターデータに対応する
12241224 // 既定のお勧めリストがあれば取得する (なければnull)
1225- recommendationURLList = persist.getCompensateRecommendationList(original);
1225+ RecommendationURLCompensator compensator = RecommendationURLCompensator.getInstance();
1226+ recommendationURLList = compensator.getCompensateRecommendationList(original);
12261227 }
12271228 if (recommendationURLList != null) {
12281229 for (RecommendationURL recommendationURL : recommendationURLList) {
--- a/src/main/java/charactermanaj/ui/ProfileListManager.java
+++ b/src/main/java/charactermanaj/ui/ProfileListManager.java
@@ -32,6 +32,7 @@ import charactermanaj.model.io.PartsInfoXMLReader;
3232 import charactermanaj.model.io.PartsManageDataDecorateLoader;
3333 import charactermanaj.model.io.PartsSpecDecorateLoader;
3434 import charactermanaj.model.io.RecentDataPersistent;
35+import charactermanaj.model.io.RecommendationURLCompensator;
3536 import charactermanaj.util.ErrorMessageHelper;
3637
3738 /**
@@ -444,8 +445,8 @@ public final class ProfileListManager {
444445 CharacterData v2 = defProv.createDefaultCharacterData(DefaultCharacterDataVersion.V2);
445446 if (v2.toStructureString().equals(structureSig) || v3.toStructureString().equals(structureSig)) {
446447 // デフォルトのキャラクターセット(v2, v3)と同一構造であれば、デフォルトで補完する
447- final CharacterDataPersistent persistent = CharacterDataPersistent.getInstance();
448- persistent.compensateRecommendationList(characterData);
448+ RecommendationURLCompensator compensator = RecommendationURLCompensator.getInstance();
449+ compensator.compensateRecommendationList(characterData);
449450 }
450451 }
451452 }
--- a/src/main/resources/languages/mainframe.xml
+++ b/src/main/resources/languages/mainframe.xml
@@ -16,7 +16,7 @@
1616 <entry key="help.forum.description">Forum</entry>
1717 <entry key="help.forum.url">http://osdn.net/projects/charactermanaj/forums/</entry>
1818
19- <entry key="defaultdatadownload.confirm.message">There is default character data. Do you want to download it?</entry>
19+ <entry key="defaultdatadownload.confirm.message">You can download the default parts set. Do you want to download it?</entry>
2020 <entry key="defaultdatadownload.confirm.title">Default character data download</entry>
2121 <entry key="noDownloadAndDoNotAskAgain">I do not want to download, and do not ask me again.</entry>
2222 </properties>
Show on old repository browser