/*
 * CopyRight(C) 2003, NTT All rights reserved
 *
 *	XMS2ユーザの作成と権限付与
 *		変更履歴
 *			2004.01.08 新規作成 haga
 *
 *	MS SQLServerにXMS2ユーザの作成と権限付与を行います。
*/

import java.sql.*;
import java.io.*;

public class DBSet_Cont{

	// ユーザ名を保持する
	private String USER_NAME;
	// パスワードを保持する
	private String USER_PASSWORD;
	// DB名を保持する
	private String DB_NAME;
	// DBポートを保持する
	private String DB_PORT;
	// サーバ名を保持する
	private String DB_SERVER;
	// XMS2インストールディレクトリを保持する
	private String XMS2_DIR;

	// ユーザオプション
	private static String USER_NAME_OPTION = "-U";
	// パスワードオプション
	private static String USER_PASSWORD_OPTION = "-P";
	// DB名オプション
	private static String DB_NAME_OPTION = "-D";
	// DBポートオプション
	private static String DB_PORT_OPTION = "-p";
	// サーバ名オプション
	private static String DB_SERVER_OPTION = "-S";
	// XMS2インストールディレクトリオプション
	private static String XMS2_DIR_OPTION = "-i";

	// ドライバ名
	private static final String DRIVER_NAME = "com.microsoft.jdbc.sqlserver.SQLServerDriver";

	// SQL区切り文字列
	private static final String SQL_TOKEN = "GO";

	// DBコネクション
	private Connection connection;

	// SQL定義ファイル名
	private String[] DBSET_FILE = {"CreateUser_Cont.sql"};

	/**
	 * メイン関数
	 * コマンドラインより以下の引数を取得します。
	 * -U ユーザ
	 * -P パスワード
	 * -D DB名
	 * -p DBポート
	 * -S DBサーバ名
	 * -i XMS2インストールディレクトリ
	 */
	public static void main(String[] args) {
		String userName = null;
		String password = null;
		String dbName = null;
		String dbPort = null;
		String dbServer = null;
		String xms2Dir = null;

		// 引数チェック
		for( int i = 0; i < args.length; i++ ) {
			if( args[i].charAt(0) == '-' ) {
				String option = args[i];
				String value = "";
				try {
					if( args[i+1].charAt(0) != '-' ) {
						value = args[i+1];
					}
				}
				catch( ArrayIndexOutOfBoundsException ae ) {
				}
				if( option.equals( USER_NAME_OPTION ) ) {
					userName = value;
				}
				else if( option.equals( USER_PASSWORD_OPTION ) ) {
					password = value;
				}
				else if( option.equals( DB_NAME_OPTION ) ) {
					dbName = value;
				}
				else if( option.equals( DB_PORT_OPTION ) ) {
					dbPort = value;
				}
				else if( option.equals( DB_SERVER_OPTION ) ) {
					dbServer = value;
				}
				else if( option.equals( XMS2_DIR_OPTION ) ) {
					xms2Dir = value;
				}
			}
		}

		// 1つでもnullがあったらエラー
		if( userName == null || password == null || dbName == null ||
			dbPort == null || dbServer == null || xms2Dir == null)
		{
			// 異常終了
			System.exit(1);
		}

		// インスタンス生成
		try {
			DBSet_Cont objDBSet_Cont = new DBSet_Cont(userName, password, dbName,
																	dbPort, dbServer, xms2Dir);
			objDBSet_Cont.setDB();
		}
		catch(ClassNotFoundException ce) {
			ce.printStackTrace();
			// JDBCドライバーが存在しない
			System.exit(1);
		}
		catch(FileNotFoundException fe) {
			fe.printStackTrace();
			// ファイルが存在しない場合
			System.exit(1);
		}
		catch(IOException ie) {
			ie.printStackTrace();
			// ファイル読み込み例外
			System.exit(1);
		}
		catch(SQLException se) {
			se.printStackTrace();
			// SQL例外
			System.exit(1);
		}

		// 正常終了
		System.exit(0);
	}

	/**
	 * コンストラクタ
	 * @param userName ユーザ名
	 * @param password パスワード
	 * @param dbName DB名
	 * @param dbServer DBサーバ
	 * @param xms2_dir XMS2インストールディレクトリ
	 */
	private DBSet_Cont(	String userName,
						String password,
						String dbName,
						String dbPort,
						String dbServer,
						String xms2_dir )
		throws SQLException, ClassNotFoundException
	{
		USER_NAME = userName;
		USER_PASSWORD = password;
		DB_NAME = dbName;
		DB_PORT = dbPort;
		DB_SERVER = dbServer;
		XMS2_DIR = xms2_dir + "/table/";

		connection = getConnection();
		connection.setAutoCommit( false );
	}

	/**
	 * DB設定を行います。
	 * @exception SQLException SQL例外
	 * @exception IOException ファイル読み込み例外
	 * @exception FileNotFoundException ファイルが存在しない場合
	 */
	private void setDB()
		throws SQLException, IOException, FileNotFoundException
	{
		// Statement取得
		Statement statement = connection.createStatement();

		String strFilePath = "";
		String strSQL = "";

		// SQLファイル定義ファイル分処理を繰り返す
		try {
			for( int i = 0; i < DBSET_FILE.length; i++ ) {
				strFilePath = XMS2_DIR + DBSET_FILE[i];
				strSQL = loadFile( strFilePath );
				statement.execute( strSQL );
			}

			connection.commit();
		}
		catch( FileNotFoundException fe ) {
			// ロールバック
			try { connection.rollback();
			} catch( Exception e) {}
			throw fe;
		}
		catch( IOException ie ) {
			// ロールバック
			try { connection.rollback();
			} catch( Exception e) {}
			throw ie;
		}
		catch( SQLException se ) {
			// ロールバック
			try { connection.rollback();
			} catch( Exception e) {}
			throw se;
		}
		finally {
			try {	statement.close();
					connection.close();
			} catch( Exception e) {}
		}

	}

	/**
	 * ファイルロード<BR>
	 * ファイル中の"GO"は読み飛ばします
	 * @param ファイルパス
	 * @return String ファイル内容
	 * @exception IOException ファイル読み込み例外
	 * @exception FileNotFoundException ファイルが存在しない場合
	 */
	private String loadFile( String strFilePath )
		throws IOException, FileNotFoundException
	{
		BufferedReader reader = new BufferedReader(new FileReader( strFilePath ));

		StringBuffer sbFile = new StringBuffer();
		String strLine = null;
		while( (strLine = reader.readLine()) != null ) {
			if(!strLine.trim().equals( SQL_TOKEN )) {
				sbFile.append( strLine + "\n");
			}
		}
		return new String(sbFile);
	}

	private Connection getConnection()
		throws SQLException, ClassNotFoundException
	{
		// ドライバの設定
		Class.forName(DRIVER_NAME);

		// 接続文字列生成
		String strCon = "jdbc:microsoft:sqlserver://" + DB_SERVER + ":" + DB_PORT;

		// コネクションを取得します
		Connection con = DriverManager.getConnection(strCon,USER_NAME,USER_PASSWORD);

		return con;
	}
}