OSDN Git Service

7a9e95b640e49812bcae8b87d3c5e24a286817ca
[tainavi/TinyBannavi.git] / TinyBannavi / src / tainavi / ChannelCode.java
1 package tainavi;\r
2 \r
3 import java.io.File;\r
4 import java.util.ArrayList;\r
5 import java.util.HashMap;\r
6 import java.util.Map.Entry;\r
7 import java.util.regex.Matcher;\r
8 import java.util.regex.Pattern;\r
9 \r
10 /**\r
11  * <P>レコーダで利用するCHコード設定を保持するクラス。\r
12  * <P>NAME : Web番組表の放送局名\r
13  * <P>NO : レコーダの放送局名\r
14  * <P>CODE : 放送局コード\r
15  * @version 3.15.4β EDCBの旧型式→新形式自動変換追加、DIGAの旧型式→新形式自動変換廃止ほか\r
16  */\r
17 public class ChannelCode extends ArrayList<String> implements Cloneable {\r
18         \r
19         private static final long serialVersionUID = 1L;\r
20         \r
21         private final String datfile = "env"+File.separator+"RdChannelCode.dat";\r
22         private String recId = null;\r
23         \r
24         private static final String MSGID = "[CHコード設定] ";\r
25         private static final String ERRID = "[ERROR]"+MSGID;\r
26         private static final String DBGID = "[DEBUG]"+MSGID;\r
27 \r
28         private final HashMap<String,String> CH_REC2WEB = new HashMap<String,String>();\r
29         private final HashMap<String,String> CH_CODE2REC = new HashMap<String,String>();\r
30         private final HashMap<String,String> CH_WEB2CODE = new HashMap<String,String>();\r
31 \r
32         public void setCH_REC2WEB(String key, String val) { CH_REC2WEB.put(key, val); }\r
33         public void setCH_CODE2REC(String key, String val) { CH_CODE2REC.put(key, val); }\r
34         public void setCH_WEB2CODE(String key, String val) { CH_WEB2CODE.put(key, val); }\r
35         \r
36         /**\r
37          * レコーダの放送局名 を Web番組表の放送局名 に変換する。\r
38          */\r
39         public String getCH_REC2WEB(String recChName) { return (String)CH_REC2WEB.get(recChName); }\r
40         \r
41         /**\r
42          * Web番組表の放送局名 を レコーダの放送局名 に変換する。\r
43          */\r
44         public String getCH_WEB2REC(String webChName) {\r
45                 for ( Entry<String,String> e : CH_REC2WEB.entrySet() ) {\r
46                         if ( e.getValue().equals(webChName) ) {\r
47                                 return e.getKey();\r
48                         }\r
49                 }\r
50                 return null;\r
51         }\r
52         \r
53         /**\r
54          * 放送局コード を レコーダの放送局名 に変換する。\r
55          */\r
56         public String getCH_CODE2REC(String chCode) { return (String)CH_CODE2REC.get(chCode); }\r
57         \r
58         /**\r
59          * レコーダの放送局名 を 放送局コード に変換する。\r
60          */\r
61         public String getCH_REC2CODE(String recChName) {\r
62                 for ( Entry<String,String> e : CH_CODE2REC.entrySet() ) {\r
63                         if ( e.getValue().equals(recChName) ) {\r
64                                 return e.getKey();\r
65                         }\r
66                 }\r
67                 return null;\r
68         }\r
69         \r
70         /**\r
71          * Web番組表の放送局名 を  放送局コード に変換する。\r
72          */\r
73         public String getCH_WEB2CODE(String webChName) { return (String)CH_WEB2CODE.get(webChName); }\r
74         \r
75         /**\r
76          *  放送局コード を Web番組表の放送局名 に変換する。\r
77          */\r
78         public String getCH_CODE2WEB(String chCode) {\r
79                 for ( Entry<String,String> e : CH_WEB2CODE.entrySet() ) {\r
80                         if ( e.getValue().equals(chCode) ) {\r
81                                 return e.getKey();\r
82                         }\r
83                 }\r
84                 return null;\r
85         }\r
86         \r
87         // コンストラクタ\r
88         public ChannelCode(String recId) {\r
89                 this.recId = recId; \r
90         }\r
91         \r
92         /**\r
93          * Web番組表の放送局名のリストを返す \r
94          */\r
95         public ArrayList<String> getChNames() {\r
96                 return this;\r
97         }\r
98         \r
99         /**\r
100          * 読み出します。\r
101          */\r
102         public boolean load(boolean logging)\r
103         {\r
104                 // 領域初期化\r
105                 CH_REC2WEB.clear();\r
106                 CH_CODE2REC.clear();\r
107                 CH_WEB2CODE.clear();\r
108                 \r
109                 // 読み込み\r
110                 String ccFile = datfile+"."+recId;\r
111                 \r
112                 if ( ! new File(ccFile).exists() ) {\r
113                         System.err.println(ERRID+"設定ファイルがみつかりません: "+ccFile);\r
114                         return false;\r
115                 }\r
116                 \r
117                 this.clear();\r
118                 \r
119                 String buf = CommonUtils.read4file(ccFile, false);\r
120                 if ( buf == null ) {\r
121                         System.err.println(ERRID+"設定ファイルの取得に失敗しました: "+ccFile);\r
122                         return false;\r
123                 }\r
124                 \r
125                 String[] codes = buf.split("[\r\n]+");\r
126                 for ( String code : codes ) {\r
127                         Matcher ma = Pattern.compile("^\\s*\"(.+?)\",\"(.+?)\",\"(.+?)\"").matcher(code);\r
128                         if (ma.find()) {\r
129                                 if (getCH_WEB2CODE(ma.group(1)) == null) setCH_WEB2CODE(ma.group(1),ma.group(3));\r
130                                 if (getCH_REC2WEB(ma.group(2)) == null || ma.group(1).startsWith("外部入力")) setCH_REC2WEB(ma.group(2),ma.group(1));\r
131                                 if (getCH_CODE2REC(ma.group(3)) == null) setCH_CODE2REC(ma.group(3),ma.group(2));\r
132                                 \r
133                                 this.add(ma.group(1));\r
134                         }\r
135                 }\r
136                 \r
137                 boolean oldflag = false;\r
138                 /* - もういらない\r
139                 if ( recId.equals("EpgDataCap_Bon") ) { // 本当はプラグインからレコーダIDの文字列を取得したかったのだけど\r
140                         oldflag = ccModEDCB();\r
141                 }\r
142                 */\r
143                 if ( recId.equals("TVTest") ) {\r
144                         oldflag = ccModTVTest();\r
145                 }\r
146                 if ( oldflag ) {\r
147                         System.out.println(MSGID+"CHコード設定が自動修正されました: "+ccFile);\r
148                         this.save();\r
149                 }\r
150                 \r
151                 if (logging) {\r
152                         System.out.println(DBGID+"--- "+ccFile+" Start---");\r
153                         \r
154                         String[] keys = CH_REC2WEB.keySet().toArray(new String[0]);\r
155                         for ( String recChName : keys ) {\r
156                                 String webChName = CH_REC2WEB.get(recChName);\r
157                                 String chCode = CH_WEB2CODE.get(webChName);\r
158                                 if ( chCode.equals("error") ) {\r
159                                         System.out.printf("CH: %7s %-32s %-8s %s\n","<Error>",webChName,recChName,chCode);\r
160                                 }\r
161                                 else {\r
162                                         System.out.printf("CH: %7s %-32s %-8s %s\n","",webChName,recChName,chCode);\r
163                                 }\r
164                         }\r
165                         \r
166                         System.out.println(DBGID+"--- "+ccFile+" End ---");\r
167                 }\r
168                 \r
169                 return true;\r
170         }\r
171 \r
172         /**\r
173          * 古いEDCBの情報を新形式に更新する。\r
174          */\r
175         /*\r
176         private boolean ccModEDCB() {\r
177                 boolean oldflag = false;\r
178                 String[] keys = CH_REC2WEB.keySet().toArray(new String[0]);\r
179                 for ( String recChName : keys ) {\r
180                         if ( ! recChName.matches("^\\d+$") ) {\r
181                                 oldflag = true;\r
182                                 String webChName = CH_REC2WEB.get(recChName);\r
183                                 String chCode = CH_WEB2CODE.get(webChName);\r
184                                 CH_REC2WEB.remove(recChName);\r
185                                 CH_CODE2REC.remove(chCode);\r
186                                 CH_REC2WEB.put(chCode,webChName);\r
187                                 CH_CODE2REC.put(chCode,chCode);\r
188                         }\r
189                 }\r
190                 return oldflag;\r
191         }\r
192         */\r
193 \r
194         /**\r
195          * 古いEDCBの情報を新形式に更新する。\r
196          */\r
197         private boolean ccModTVTest() {\r
198                 boolean oldflag = false;\r
199                 if (CH_REC2WEB.remove("-") != null) {\r
200                         oldflag = true;\r
201                         String[] keys = CH_CODE2REC.keySet().toArray(new String[0]);\r
202                         for ( String chCode : keys ) {\r
203                                 String recChName = chCode;\r
204                                 CH_CODE2REC.remove(chCode);\r
205                                 CH_CODE2REC.put(chCode, recChName);\r
206                                 for ( Entry<String,String> ent : CH_WEB2CODE.entrySet() ) {     // NAME2CODEは変更の必要がない\r
207                                         if ( ent.getValue().equals(chCode) ) {\r
208                                                 String webChName = ent.getKey();\r
209                                                 CH_REC2WEB.put(recChName,webChName);\r
210                                                 break;\r
211                                         }\r
212                                 }\r
213                         }\r
214                 }\r
215                 return oldflag;\r
216         }\r
217         \r
218         /**\r
219          * 保存します。\r
220          */\r
221         public boolean save(ArrayList<String> webChNames, ArrayList<String> recChNames, ArrayList<String> chCodes) {\r
222                 \r
223                 String ccFile = datfile+"."+recId;\r
224                 \r
225                 System.err.println(MSGID+"設定ファイルを保存します: "+ccFile);\r
226                 StringBuilder sb = new StringBuilder();\r
227                 sb.append("# "+CommonUtils.getDateTime(0)+"\n");\r
228                 for ( int i=0; i<webChNames.size(); i++ ) {\r
229                         sb.append(String.format("\"%s\",\"%s\",\"%s\"\n", webChNames.get(i), recChNames.get(i), chCodes.get(i)));\r
230                 }\r
231                 if ( ! CommonUtils.write2file(ccFile, sb.toString()) ) {\r
232                         System.err.println(MSGID+"設定ファイルの保存に失敗しました: "+ccFile);\r
233                         return false;\r
234                 }\r
235                 return true;\r
236         }\r
237 \r
238         /**\r
239          * 自動修正時に利用するよ\r
240          */\r
241         private boolean save() {\r
242                 ArrayList<String> webChNames = new ArrayList<String>();\r
243                 ArrayList<String> recChNames = new ArrayList<String>();\r
244                 ArrayList<String> chCodes = new ArrayList<String>();\r
245                 for ( String webChName : this ) {\r
246                         String chCode = CH_WEB2CODE.get(webChName);\r
247                         String recChName = CH_CODE2REC.get(chCode);\r
248                         \r
249                         webChNames.add(webChName);\r
250                         recChNames.add(recChName);\r
251                         chCodes.add(chCode);\r
252                 }\r
253                 return this.save(webChNames, recChNames, chCodes);\r
254         }\r
255 \r
256         //\r
257         @Override\r
258         public ChannelCode clone() {\r
259                 ChannelCode cc = (ChannelCode) super.clone();\r
260                 CommonUtils.FieldCopy(cc, this); // ディープコピーするよ\r
261                 return cc;\r
262         }\r
263 }\r