/* Simple argument-parsing class
 * Copyright (C) 2001 Patrick E. Pelletier <ppelleti@users.sourceforge.net>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

/**
 * Copyright (C) 2006-2007  NTT DATA CORPORATION
 * 
 * Version: 1.0.0 2007/04/01
 *  
 */
package net.cellcomputing.himawari.argparse;

import java.util.ArrayList;

/**
 * オプションの操作を行うクラス
 * @author NTT DATA Corporation
 */
strictfp abstract class OptionHandler {
	/**
	 * オプションの用法メッセージ
	 */
	public String usage;
	/**
	 * オプションの入力状態
	 */
	public int separator;
	/**
	 * オプションの詳細パラメータ
	 */
	public int count;
	/**
	 * リネームしたオプション名
	 */
	public ArrayList<String> aliases = new ArrayList<String>();

	/**
	 * 初期値が一つ与えられるコンストラクタ
	 * @param usage_in	用法メッセージ
	 */
	public OptionHandler(String usage_in)
	{
		this(usage_in, -1, -1);
	}
	
	/**
	 * 初期値が二つ与えられるコンストラクタ
	 * @param usage_in	用法メッセージ
	 * @param separator_in	オプション入力状態
	 */
	public OptionHandler(String usage_in,int separator_in)
	{
		this(usage_in, separator_in, -1);
	}
	
	/**
	 * 初期値が三つ与えられるコンストラクタ
	 * @param usage_in	用法メッセージ
	 * @param separator_in	オプション入力状態
	 * @param count_in	詳細パラメータの数
	 */
	public OptionHandler(String usage_in,int separator_in, int count_in)
	{
		usage = usage_in;
		separator = separator_in;
		count = count_in;
		return ;
	}
	
	/**
	 *　デストラクタ 
	 */
	public void destruct()
	{
//		デストラクタ
	}
	
	/**
	 * オプションのパラメータの有無の判定。<br>
	 * ただし、パラメータがboolean型の場合のみFlagHandlerクラスに<br>
	 * オーバーライドされる。
	 * @return　true
	 */
	public boolean takesarg()
	{
//		This is the　same thing as saying it returns false if the option is a flag.
//		(The implementation in the base class returns true, so we
//		only have to override it for FlagHandler.)
//		オプションがパラメータを伴う場合、trueを返す。
//		同様に、オプションのパラメータがboolean型の場合falseを返す。(FlagHandlerクラスでオーバーライド)
		
		return true;
	}

	/** 
	 * オプションの否定状態を判定。　(FlagHandlerクラスでオーバーライド)<br>
	 * (例：　-noFoo のように"no"がつく場合はtrue)
	 * @return　false
	 */
	public boolean allownegation() 
	{
//		 Returns true if we can stick "no" in front of the option.
//	     This will be false for everything except flag, and might be
//	     true or false for flag.
//	    (The implementation in the base class returns false, so we
//	     only have to override it for FlagHandler.)
//		 オプションの前に"no"がくっつけることができる場合、true
//		 つまり、オプションパラメータがboolean型以外は全てfalseを返す。
//		 オプションパラメータがboolean型の場合は、true / false　どちらもありうる。(FlagHandlerクラスを参照)
		return false;
	}
	
	/**
	 * 実装なし。<br>
	 * 派生クラスを参照。
	 */
	public void reset()
	{
	}
	
	/**
	 * オプションの入力形態、及びその有効性を判断する。
	 * @param	arg	オプションの詳細パラメータ
	 * @param	prefix	オプション名
	 * @return	""
	 * @return	prefix + ":" + ret
	 */
//	This is a wrapper for handlearg() which first splits up the
//	 argument according to "separator".  As an additional, unrelated
//	 function, it also will append "prefix" to any non-empty error message.
	
//	追加されている関係ない機能：エラーメッセージに（それが空でも）入力オプションを挿入。
	public String handleargsplit(String arg, String prefix)
	{
		//パラメータが一つの場合
		if (separator < 0) 
		{
			String ret = handlearg(arg);
			if( ret.length() == 0 )
				return "";
			return prefix + ": " + ret;
		}
		
		for (int i = 0; i < arg.length(); i++) 
		{
			int newi = arg.indexOf(separator, i);
			if (newi < 0)
				newi = arg.length();
			String ret = handlearg(arg.substring(i, newi - i));
			if (ret.length() != 0) 
				return prefix + ": " + ret;
			i = newi;
		}
		return "";
	}
//	Okay, this is the point in the file where it starts getting
//	pretty repetitive.  I'm sure there's a better way I could've
//	done this...   

	/**
	 * 入力されたオプションの有効性を判断する。
	 * オプションの詳細パラメータを取り出す。<br>
	 *　実装はなし。派生クラスを参照。
	 * @param arg	引数
	 * @return	引数に対するメッセージ
	 */
//	 Takes an argument and sticks it somewhere.  Returns the empty
//	 string on success, or an error message on failure.  If
//	 takesarg() is false, then arg is either "no" or the empty string.
	abstract protected String handlearg(String arg);
//	 parseInt()/parseFloat() に引数を渡し、返り値が空文字ならば有効、エラーメッセージならば無効。<br>
//	 ただし、takesarg()がfalseならば、引数は"の"no"か空文字かのどちらかである。<br>

}
