/*
 * ServiceLoggingAspect.java
 * Copyright (C) 2008 Cyber Beans Corporation. All rights reserved.
 */
package jp.co.cybec.cb3.aspect;

import jp.co.cybec.cb3.util.logging.LogMessageConstant;
import jp.co.cybec.cb3.util.logging.LogMessageFactory;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;

/**
 * サービスのトレースログを出力するクラス。<br>
 * @author Naoko Sugimoto
 */
public class ServiceLoggingAspect {

	/** ログ */
	private static final Log LOG = LogFactory.getLog(ServiceLoggingAspect.class);

	/** メッセージ */
	private static final LogMessageFactory MESSAGE = new LogMessageFactory(
			LogMessageConstant.CB3_MESSAGE_FILENAME);

	/**
	 * サービスの実行前後にメッセージを出力します。<br>
	 * サービス専用のトレース処理です。
	 * @param pjp サービスのジョイントポイント
	 * @return サービスの処理結果
	 * @throws Throwable サービスから投げられた例外
	 */
	public Object around(ProceedingJoinPoint pjp) throws Throwable {

		// 実行クラス名を取得。
		String className = pjp.getTarget().getClass().getName();
		// メソッド引数を取得。
		Object[] args = pjp.getArgs();
		// 開始ミリ秒を保存
		long beforeTime = System.currentTimeMillis();

		// 開始メッセージを出力。
		LOG.info(MESSAGE.getMessage(LogMessageConstant.CB3_ASPECT_003, className, args[1]));
		// デバッグログに引数の中身を表示する。
		if (LOG.isDebugEnabled()) {
			LOG.debug(MESSAGE.getMessage(LogMessageConstant.CB3_ASPECT_006, args[0]));
		}

		// サービスを実行。
		Integer returnCode = (Integer)pjp.proceed();

		// 終了ミリ秒を取得。
		long afterTime = System.currentTimeMillis();
		// 実行時間の取得
		long execTime = afterTime - beforeTime;

		// 終了メッセージを出力。
		LOG.info(MESSAGE.getMessage(LogMessageConstant.CB3_ASPECT_004, className, returnCode, execTime));

		return returnCode;
	}
}
