import java.io.*;
import java.util.*;

public class CreateBean {
	// 入力ファイルの拡張子
	private static final String IN_FILE_EXT = ".txt";
	// 出力ファイルの拡張子
	private static final String OUT_FILE_EXT = ".java";

	public static void main(String[] args) throws Exception {
		// ファイルリストの取得
		File[] files = getFiles();
		
		// ファイルがなければエラー
		if (files.length < 1) {
			System.out.println(IN_FILE_EXT + " file is not found.");
			System.exit(1);
		}

		// カレントディレクトリにある各ファイルから内容を入力し、
		// 出力データを作成してファイルを出力する
		for (int i = 0; i < files.length; i++) {
			// ファイルからプロパティを全て読み込む
			String[] sa = inputFile(files[i]);

			// 出力データ(Bean)の作成
			String s = makeData(files[i], sa);

			// 作成したデータをファイルに出力
			outputFile(files[i], s);
		}
	}

	// カレントディレクトリにある特定の拡張子のファイルリストを取得
	private static File[] getFiles() throws Exception {
		// カレントディレクトリをサーチしてファイルリストを取得
		File dir = new File(".");
		File[] files = dir.listFiles(
			// ファイルフィルターを定義
			new FileFilter() {
				public boolean accept(File path) {
					// ファイルであり(ディレクトリでなく)、
					// かつ特定の拡張子のものだけを対象とする
					return (
						path.isFile() &&
						path.getName().toLowerCase().endsWith(IN_FILE_EXT)
					);
				}
			}
		);

		return files;
	}

	// ファイルからプロパティ(フィールド)を全部読込んで、それを返す
	private static String[] inputFile(File f) throws Exception {
		// ファイルへの入力ストリームを開く
		BufferedReader br = new BufferedReader(new FileReader(f));

		// ファイルからプロパティを読み込む
		ArrayList al = new ArrayList();
		String temp = null;
		while ((temp = br.readLine()) != null) {
			al.add(temp);
		}

		// ストリームを閉じる
		br.close();

		return (String[])al.toArray(new String[al.size()]);
	}

	// 出力データ(Beans)の作成
	private static String makeData(File f, String[] sa) throws Exception {
		// ファイル名からクラス名を取得
		String fn = f.getName();
		String cn = fn.substring(0, fn.lastIndexOf("."));

		// 型名配列・変数名配列を作成
		String[] type = new String[sa.length];
		String[] var = new String[sa.length];
		for (int i = 0; i < sa.length; i++) {
			StringTokenizer st = new StringTokenizer(sa[i]);
			type[i] = st.nextToken();
			var[i] = st.nextToken();
		}

		// 出力文字列の作成
		StringBuffer sb = new StringBuffer();

		// パッケージ
		sb.append("package // 自分で書いて\r\n\r\n");

		// インポート
		sb.append("import // 自分で書いて\r\n\r\n");

		// クラス名
		sb.append("public class " + cn + " implements Serializable {\r\n");

		// プロパティ(フィールド)
		for (int i = 0; i < sa.length; i++) {
			sb.append("\tprivate " + type[i] + " " + var[i] + ";\r\n");
		}
		sb.append("\r\n");

		// コンストラクタ
		sb.append("\tpublic " + cn + "() {\r\n");
		sb.append("\t}\r\n");
		sb.append("\r\n");

		// ゲッター・セッター
		for (int i = 0; i < sa.length; i++) {
			// ゲッター
			sb.append(
				"\tpublic " + type[i] + " get" +
				var[i].substring(0, 1).toUpperCase() + var[i].substring(1) +
				"() {\r\n"
			);
			sb.append("\t\treturn " + var[i] + ";\r\n");
			sb.append("\t}\r\n");
			// セッター
			sb.append(
				"\tpublic void set" +
				var[i].substring(0, 1).toUpperCase() + var[i].substring(1) +
				"(" + type[i] + " " + var[i] + ") {\r\n"
			);
			sb.append("\t\tthis." + var[i] + " = " + var[i] + ";\r\n");
			sb.append("\t}\r\n");
		}
		
		sb.append("}\r\n");

		return sb.toString();
	}

	// ファイルへ出力
	private static void outputFile(File f, String s) throws Exception {
		// 入力ファイル名から出力ファイル名を取得
		String in = f.getName();
		String out = in.substring(0, in.lastIndexOf(".")) + OUT_FILE_EXT;

		// ファイルへの出力ストリームを開く
		BufferedWriter bw = new BufferedWriter(new FileWriter(out));

		// 出力データをすべてファイルに書き出す
		bw.write(s);
		bw.flush();

		// ストリームを閉じる
		bw.close();

		// 処理結果を表示
		System.out.println(in + " → " + out);
	}
}

