001package csv2html; 002 003import java.io.File; 004import java.text.SimpleDateFormat; 005import java.util.ArrayList; 006import java.util.Date; 007import java.util.List; 008 009/** 010 * 属性リスト:情報テーブルを入出力する際の属性情報を記憶。 011 */ 012abstract class Attributes extends Object 013{ 014 /** 015 * ベースとなるディレクトリを記憶する(クラス変数)フィールド。 016 */ 017 private static String baseDirectory = null; 018 019 /** 020 * 属性リストのキー群を記憶する(インスタンス変数)フィールド。 021 */ 022 private List<String> keys; 023 024 /** 025 * 属性リストの名前群を記憶する(インスタンス変数)フィールド。 026 */ 027 private List<String> names; 028 029 /** 030 * 属性リストを作成するコンストラクタ。 031 */ 032 public Attributes() 033 { 034 super(); 035 036 this.keys = new ArrayList<String>(); 037 this.names = new ArrayList<String>(); 038 039 return; 040 } 041 042 /** 043 * 指定されたインデックスに対応する名前を応答する。名前が無いときはキーを応答する。 044 * @param index インデックス 045 * @return 名前(キー) 046 */ 047 protected String at(int index) 048 { 049 String aString = this.nameAt(index); 050 if (aString.length() < 1) { aString = this.keyAt(index); } 051 052 return aString; 053 } 054 055 /** 056 * 標題文字列を応答する。 057 * @return 標題文字列 058 */ 059 abstract String captionString(); 060 061 /** 062 * ページのためのディレクトリを応答する。 063 * @return ページのためのディレクトリ 064 */ 065 abstract String baseDirectory(); 066 067 /** 068 * ページのためのディレクトリ(存在しなければ作成して)を応答する。 069 * @param kindString 種別を表す文字列 070 * @return ページのためのディレクトリ 071 */ 072 public String baseDirectory(String kindString) 073 { 074 // ベースとなるディレクトリ(ページを生成するためのフォルダ)の記憶が水に流されるまで 075 // シングルトン(1回だけ)であることを保証する。 076 if (Attributes.baseDirectory != null) { return Attributes.baseDirectory; } 077 078 Date aDate = new Date(); 079 // SimpleDateFormat aFormat = new SimpleDateFormat("yyyyMMddHHmmss"); 080 SimpleDateFormat aFormat = new SimpleDateFormat("yyyyMMdd"); 081 String dateString = aFormat.format(aDate); 082 083 String aString = System.getProperty("user.home"); 084 aString = aString + File.separator + "Desktop"; 085 aString = aString + File.separator + "CSV2HTML_" + kindString + "_" + dateString; 086 File aDirectory = new File(aString); 087 // ページのためのディレクトリが存在するならば消去しておく。 088 if (aDirectory.exists()) { IO.deleteFileOrDirectory(aDirectory); } 089 aDirectory.mkdirs(); 090 091 Attributes.baseDirectory = aDirectory.getPath() + File.separator; 092 093 return Attributes.baseDirectory; 094 } 095 096 /** 097 * 情報の在処(URL)を文字列で応答する。 098 * @return 情報の在処の文字列 099 */ 100 abstract String baseUrl(); 101 102 /** 103 * 情報を記したCSVファイルの在処(URL)を文字列で応答する。 104 * @return 情報を記したCSVファイル文字列 105 */ 106 abstract String csvUrl(); 107 108 /** 109 * ページのためのローカルなHTMLのインデックスファイル(index.html)を文字列で応答する。 110 * @return ページのためのローカルなHTMLのインデックスファイル文字列 111 */ 112 public String indexHTML() 113 { 114 return "index.html"; 115 } 116 117 /** 118 * ベースとなるディレクトリの記憶を水に流す。 119 */ 120 public static void flushBaseDirectory() 121 { 122 Attributes.baseDirectory = null; 123 124 return; 125 } 126 127 /** 128 * 指定されたキー文字列のインデックスを応答する。 129 * @param aString キー 130 * @return インデックス 131 */ 132 protected int indexOf(String aString) 133 { 134 int index = 0; 135 for (String aKey : this.keys) 136 { 137 if (aString.compareTo(aKey) == 0) { return index; } 138 index++; 139 } 140 141 return -1; 142 } 143 144 /** 145 * 在位日数のインデックスを応答する。 146 * @return インデックス 147 */ 148 public int indexOfDays() 149 { 150 return this.indexOf("days"); 151 } 152 153 /** 154 * 画像のインデックスを応答する。 155 * @return インデックス 156 */ 157 public int indexOfImage() 158 { 159 return this.indexOf("image"); 160 } 161 162 /** 163 * ふりがなのインデックスを応答する。 164 * @return インデックス 165 */ 166 public int indexOfKana() 167 { 168 return this.indexOf("kana"); 169 } 170 171 /** 172 * 氏名のインデックスを応答する。 173 * @return インデックス 174 */ 175 public int indexOfName() 176 { 177 return this.indexOf("name"); 178 } 179 180 /** 181 * 番号のインデックスを応答する。 182 * @return インデックス 183 */ 184 public int indexOfNo() 185 { 186 return this.indexOf("no"); 187 } 188 189 /** 190 * 在位期間のインデックスを応答する。 191 * @return インデックス 192 */ 193 public int indexOfPeriod() 194 { 195 return this.indexOf("period"); 196 } 197 198 /** 199 * 縮小画像のインデックスを応答する。 200 * @return インデックス 201 */ 202 public int indexOfThumbnail() 203 { 204 return this.indexOf("thumbnail"); 205 } 206 207 /** 208 * 指定されたインデックスに対応するキーを応答する。 209 * @param index インデックス 210 * @return キー 211 */ 212 protected String keyAt(int index) 213 { 214 return this.keys().get(index); 215 } 216 217 /** 218 * キー群を応答する。 219 * @return キー群 220 */ 221 public List<String> keys() 222 { 223 return this.keys; 224 } 225 226 /** 227 * 指定されたインデックスに対応する名前を応答する。 228 * @param index インデックス 229 * @return 名前 230 */ 231 protected String nameAt(int index) 232 { 233 return this.names().get(index); 234 } 235 236 /** 237 * 名前群を応答する。 238 * @return 名前群 239 */ 240 public List<String> names() 241 { 242 return this.names; 243 } 244 245 /** 246 * 名前群を設定する。 247 * @param aCollection 名前群 248 */ 249 public void names(List<String> aCollection) 250 { 251 List<String> aList = new ArrayList<String>(); 252 for (String aString : aCollection) 253 { 254 aList.add(aString); 255 } 256 this.names = aList; 257 258 return; 259 } 260 261 /** 262 * 属性リストの長さを応答する。 263 * @return 属性リストの長さ 264 */ 265 public int size() 266 { 267 return this.keys().size(); 268 } 269 270 /** 271 * タイトル文字列を応答する。 272 * @return タイトル文字列 273 */ 274 abstract String titleString(); 275 276 /** 277 * 自分自身を文字列にして、それを応答する。 278 * @return 自分自身の文字列 279 */ 280 public String toString() 281 { 282 StringBuffer aBuffer = new StringBuffer(); 283 Class aClass = this.getClass(); 284 aBuffer.append(aClass.getName()); 285 aBuffer.append("["); 286 for (int index = 0; index < this.size(); index++) 287 { 288 if (index != 0) { aBuffer.append(","); } 289 aBuffer.append(this.at(index)); 290 } 291 aBuffer.append("]"); 292 293 return aBuffer.toString(); 294 } 295}