package com.generation.batch;

import java.util.Hashtable;
import java.util.ResourceBundle;

import javax.naming.Context;
import javax.naming.spi.NamingManager;

import org.apache.log4j.Logger;
import org.postgresql.jdbc2.optional.PoolingDataSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * バッチ基底クラス
 * @author 生地　真規
 *
 */
public abstract class BatchBase {

	/** log */
	private static Logger log = Logger.getLogger(BatchBase.class);

	/** コンテキスト */
	private Context ctx;
	/** アプリケーションコンテキスト */
	protected ApplicationContext context;
	/** バッチ引数 */
	protected String[] args;

	/**
	 * バッチ実行処理。
	 * @param args 引数からクラス名を除いた配列
	 */
	public void batchExecute(String[] args) throws Exception {

		log.info("---------- バッチ実行開始 ----------");

		log.info("コンテキストを初期化します");
		ResourceBundle rb = ResourceBundle.getBundle(BatchConstants.BATCH_PROPERTIES);

		PoolingDataSource ds = new PoolingDataSource();
		ds.setDatabaseName(rb.getString(BatchConstants.DB_NAME));
		ds.setServerName(rb.getString(BatchConstants.DB_HOST));
		ds.setPortNumber(Integer.parseInt(rb.getString(BatchConstants.DB_PORT)));
		ds.setUser(rb.getString(BatchConstants.DB_USER));
		ds.setPassword(rb.getString(BatchConstants.DB_PASS));
		ds.setMaxConnections(Integer.parseInt(rb.getString(BatchConstants.DB_MAX_CONNECT)));

		Hashtable<String, String> env = new Hashtable<String, String>();
		env.put(Context.INITIAL_CONTEXT_FACTORY, "com.generation.batch.BatchContextFactory");
		System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.generation.batch.BatchContextFactory");
		ctx = NamingManager.getInitialContext(env);
		ctx.bind(rb.getString(BatchConstants.JNDI_NAME), ds);

		if (args.length != 0) {
			String[] contextParam = {args[0]};
			context = new ClassPathXmlApplicationContext(contextParam);
		} else {
			log.info("コンテキストパスが指定されていないので[batchApplicationContext.xml]を読み込みます");
			context = new ClassPathXmlApplicationContext("batchApplicationContext.xml");
		}
		log.info("コンテキストを初期化しました");

		// バッチ引数
		this.args = args;

		execute();

		log.info("---------- バッチ実行完了 ----------");
	}

	/**
	 * バッチ主処理。
	 */
	abstract protected void execute() throws Exception;

}
