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}