/*
 * Copyright (C) 2005-2006 Kouji Sugisawa. All rights reserved.
 */

package jp.sourceforge.livez.imode;

import java.io.IOException;

import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jp.sourceforge.livez.IllegalRequestException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * マイメニュー登録/削除時の IP 側登録/削除処理の基底クラスを提供します。
 * 
 * @author 杉澤 浩二
 */
public abstract class AbstractMyMenuAction {

	/**
	 * 共通ログインスタンスです
	 */
	protected static final Log log = LogFactory.getLog(AbstractMyMenuAction.class);

	/**
	 * マイメニュー登録処理または削除処理を呼び出します。
	 * 
	 * @param request HTTP リクエスト情報
	 * @param response HTTP レスポンス情報
	 * @throws Exception
	 */
	public final void execute(
		final HttpServletRequest request,
		final HttpServletResponse response)
		throws Exception {

		// POST 以外での呼び出しはiモードGWからの呼出しではないと考えられる
		if (!"POST".equalsIgnoreCase(request.getMethod()))
			throw new IllegalRequestException(request.getMethod());

		final String action = request.getParameter("act");
		MyMenuRequest req = new MyMenuRequestImpl(request);

		boolean success = false;
		if ("reg".equals(action)) {
			try {
				success = register(req);
			} catch (Exception e) {
				if (log.isErrorEnabled())
					log.error(e.getMessage(), e);
			}
		} else if ("rel".equals(action)) {
			try {
				success = release(req);
			} catch (Exception e) {
				if (log.isErrorEnabled())
					log.error(e.getMessage(), e);
			}
		} else
			throw new IllegalRequestException(action);

		write(response, success);
	}

	private static void write(final ServletResponse response, final boolean success) throws IOException {
		response.setContentType("text/html");
		response.setContentLength(3);
		response.getWriter().print(success ? "OK\n" : "NG\n");
	}

	/**
	 * 登録処理を実行し、処理結果を返します。<p>
	 * 処理が成功した場合は <code>true</code> を返します。それ以外の場合は、<code>false</code> を返します。
	 * 
	 * @param request マイメニューリクエスト情報
	 * @return 処理成功時は、<code>true</code>。それ以外の場合は、<code>false</code>
	 * @throws Exception
	 */
	protected abstract boolean register(MyMenuRequest request) throws Exception;

	/**
	 * 削除処理を実行し、処理結果を返します。<p>
	 * 処理が成功した場合は <code>true</code> を返します。それ以外の場合は、<code>false</code> を返します。
	 * 
	 * @param request マイメニューリクエスト情報
	 * @return 処理成功時は、<code>true</code>。それ以外の場合は、<code>false</code>
	 * @throws Exception
	 */
	protected abstract boolean release(MyMenuRequest request) throws Exception;

}
