OSDN Git Service

dc27b4b91a5bdbbdea5f6aac8d7fa13efbbeae84
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / model / io / PartsSpecDecorateLoader.java
1 package charactermanaj.model.io;\r
2 \r
3 import java.util.Collection;\r
4 import java.util.Collections;\r
5 import java.util.Map;\r
6 import java.util.regex.Matcher;\r
7 import java.util.regex.Pattern;\r
8 \r
9 import charactermanaj.model.AppConfig;\r
10 import charactermanaj.model.ColorGroup;\r
11 import charactermanaj.model.PartsCategory;\r
12 import charactermanaj.model.PartsIdentifier;\r
13 import charactermanaj.model.PartsSpec;\r
14 \r
15 /**\r
16  * パーツ名の末尾が、カラーグループの表記を括弧でくくったものと同じであれば、\r
17  * そのパーツ固有のカラーグループとして設定するためのデコレータ.<br>\r
18  * このクラス自身はパーツのロードは行わず、コンストラクタで指定したローダーによりロードを行い、\r
19  * その結果に対してカラーグループの設定を行う.<br>\r
20  * \r
21  * @author seraphy\r
22  *\r
23  */\r
24 public class PartsSpecDecorateLoader implements PartsDataLoader {\r
25 \r
26         private PartsDataLoader parent;\r
27         \r
28         private Collection<ColorGroup> colorGroups;\r
29 \r
30         /**\r
31          * パーツローダとカラーグループを指定して構築する.\r
32          * @param parent 元パーツローダー\r
33          * @param colorGroups カラーグループのコレクション、nullの場合は空とみなす.\r
34          */\r
35         public PartsSpecDecorateLoader(PartsDataLoader parent, Collection<ColorGroup> colorGroups) {\r
36                 if (parent == null) {\r
37                         throw new IllegalArgumentException();\r
38                 }\r
39                 if (colorGroups == null) {\r
40                         colorGroups = Collections.emptyList();\r
41                 }\r
42                 this.parent = parent;\r
43                 this.colorGroups = colorGroups;\r
44         }\r
45         \r
46         public Map<PartsIdentifier, PartsSpec> load(PartsCategory category) {\r
47                 Map<PartsIdentifier, PartsSpec> partsSpecs = parent.load(category);\r
48                 decolatePartsSpec(partsSpecs);\r
49                 return partsSpecs;\r
50         }\r
51         \r
52         /**\r
53          * パーツ識別子の表示名に、カラーグループの表示名により判定されるパターンに合致する場合、\r
54          * パーツ設定のカラーグループを、そのカラーグループとして設定する.\r
55          * @param partsSpecs パーツマップ\r
56          */\r
57         protected void decolatePartsSpec(Map<PartsIdentifier, PartsSpec> partsSpecs) {\r
58                 String templ = AppConfig.getInstance().getPartsColorGroupPattern();\r
59                 if (templ == null || templ.trim().length() == 0) {\r
60                         // パターンが設定されていない場合は無視する.\r
61                         return;\r
62                 }\r
63                 // パーツ名にカラーグループが含まれる場合、それを登録する.\r
64                 for (ColorGroup colorGroup : colorGroups) {\r
65                         String pattern = templ.replace("@", colorGroup.getLocalizedName());\r
66                         Pattern pat = Pattern.compile(pattern);\r
67                         for (PartsSpec partsSpec : partsSpecs.values()) {\r
68                                 Matcher mat = pat.matcher(partsSpec.getPartsIdentifier()\r
69                                                 .getLocalizedPartsName());\r
70                                 if (mat.matches()) {\r
71                                         partsSpec.setColorGroup(colorGroup);\r
72                                 }\r
73                         }\r
74                 }\r
75         }\r
76         \r
77 }\r