/*
 * Copyright (c) 2009 The openGion Project.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
package org.opengion.hayabusa.db;

import org.opengion.fukurou.util.Attributes;
import org.opengion.hayabusa.common.HybsSystem;
import org.opengion.hayabusa.resource.ColumnData;
import org.opengion.hayabusa.resource.LabelData;
import org.opengion.hayabusa.resource.CodeData;

/**
 * DBColumnオブジェクトを構築する為の 引数を持っているデータクラスです。
 * このクラス自身は、書き換え可能ですが、DBColumnオブジェクトは、読込み専用の
 * オブジェクトのため、別のオブジェクトを作成したい場合は,このクラスを
 * DBColumnオブジェクトより取得し、内容を書き換えて、再度 DBColumnオブジェクトを
 * 構築することになります。
 *
 * @og.rev 3.4.0.0 (2003/09/01) 表示パラメータ、編集パラメータ、文字パラメータの追加。
 * @og.group テーブル管理
 *
 * @version  4.0
 * @author	 Kazuhiko Hasegawa
 * @since    JDK5.0,
 */
public final class DBColumnConfig {
	private final String JSP = HybsSystem.sys( "JSP" ); // 4.3.6.0 (2009/04/01)
	
	private LabelData labelData	;	// ラベルデータ
	private CodeData  codeData	;	// コードデータ
	private String[]  clmData	;	// カラム配列データ

	private String		lang 					;		// 言語
	private String		writable	= "true"	;		// カラムが書き込み可能かどうか
	private Attributes	rendAttri	= null		;		// 表示用レンデラー追加用属性
	private Attributes	editAttri	= null		;		// 編集用エディター追加用属性
	private boolean		addNoValue	= false 	;		// メニューに空の選択リストを追加するかどうか	// 3.5.5.7 (2004/05/10)
	private String		dbid		= null		;		// データベース接続先ID
	private final boolean	official ;		// カラムリソースから作成されたかどうか		// 3.6.0.7 (2004/11/06)
	
	private String eventColumn		= null;	// 4.3.6.0 (2009/04/01) イベントカラム
	private String rawParameter		= null;	// 4.3.6.0 (2009/04/01) {@xxx}を変換していないパラメータ
	private String eventURL			= JSP + "/" + HybsSystem.sys( "EVENT_COLUMN_URL" );	// 4.3.6.0 (2009/04/01) eventColumnで利用するJPS

	/**
	 * コンストラクター
	 * 引数は、すべて文字列型で渡します。
	 *
	 * @og.rev 3.4.0.0 (2003/09/01) 表示パラメータ、編集パラメータ、文字パラメータの追加。
	 * @og.rev 3.5.5.7 (2004/05/10) CodeSelection を、codeName を元に構築できるように設定します。
	 * @og.rev 3.6.0.3 (2004/10/05) dbTypePrm は、editorPrm と無関係に設定します。
	 * @og.rev 3.6.0.7 (2004/11/06) カラムリソースから作成されたかどうか(official属性追加)
	 *
	 * @param	lang			String  言語
	 * @param	name			String  カラム名
	 * @param	labelData		LabelData  カラムのラベルデータオブジェクト
	 * @param	className		String  カラムのクラスを文字列にした名称
	 * @param	maxlength		String  カラムの文字桁数
	 * @param	writable		String  カラムが書き込み可能かどうか
	 * @param	renderer		String  データの表示用レンデラー
	 * @param	editor			String  データの編集用エディター
	 * @param	codeData 		CodeData  メニューの項目オブジェクト
	 * @param	dbType			String  データのタイプ
	 * @param	dataDef		String  データのデフォルト値
	 * @param	rendererPrm	String  表示用レンデラーのパラメータ
	 * @param	editorPrm	String  編集用エディターのパラメータ
	 * @param	dbTypePrm	String  データのタイプのパラメータ
	 * @param	roles		String  カラムロール
	 * @param	official	boolean 正規カラムかどうか
	 * @param	dbid		String  データベース接続先ID
	 */
	public DBColumnConfig(	final String	lang		,
							final String	name		,
							final LabelData	labelData	,		// 4.0.0 (2005/01/31)
							final String	className	,
							final String	maxlength	,		// 3.5.5.5 (2004/04/23)
							final String	writable	,
							final String	renderer	,
							final String	editor		,
							final CodeData	codeData	,		// 4.0.0 (2005/01/31)
							final String	dbType		,
							final String	dataDef		,
							final String	rendererPrm	,
							final String	editorPrm	,
							final String	dbTypePrm	,
							final String	roles		,		// 4.0.0 (2005/11/30)
							final boolean	official	,		// 3.6.0.7 (2004/11/06)
							final String	dbid ) {
		clmData = new String[ColumnData.DATA_SIZE];
		clmData[ColumnData.CLM   ] = name		;
		clmData[ColumnData.CLS_NAME      ] = className	;
		clmData[ColumnData.USE_LENGTH    ] = maxlength	;
		clmData[ColumnData.RENDERER      ] = renderer	;
		clmData[ColumnData.EDITOR        ] = editor		;
		clmData[ColumnData.DBTYPE        ] = dbType		;
		clmData[ColumnData.DATA_DEFAULT  ] = dataDef	;
		clmData[ColumnData.RENDERER_PARAM] = rendererPrm;
		clmData[ColumnData.TYPE_PARAM    ] = dbTypePrm	;
		clmData[ColumnData.ROLES         ] = roles		;		// 4.0.0 (2005/11/30)

		this.lang		= lang		;
		this.labelData	= labelData	;
		this.writable	= writable	;
		this.codeData	= codeData	;		// 4.0.0 (2005/01/31)
		this.dbid		= dbid		;		// 4.0.0 (2005/01/31)

		if( "=".equals(editorPrm) ) {
			clmData[ColumnData.EDITOR_PARAM  ] = rendererPrm	;
		}
		else {
			clmData[ColumnData.EDITOR_PARAM  ] = editorPrm	;
		}

		this.official = official;		// 3.6.0.7 (2004/11/06)
	}

	/**
	 * 簡易コンストラクター
	 * キーのみを設定して作成する、簡易的な DBColumnConfig オブジェクトを
	 * 作成します。
	 *
	 * @og.rev 3.4.0.0 (2003/09/01) 表示パラメータ、編集パラメータ、文字パラメータの追加。
	 * @og.rev 3.6.0.7 (2004/11/06) カラムリソースから作成されたかどうか(official属性追加)
	 *
	 * @param	name		  String  カラム名
	 */
	public DBColumnConfig( final String name ) {
		this.lang		= "ja"		;
		this.labelData	= null		;		// 4.0.0 (2005/01/31)
		this.writable	= "true"	;
		this.codeData	= null		;		// 4.0.0 (2005/01/31)
		this.official	= false		;		// 3.6.0.7 (2004/11/06)

		clmData = new String[ColumnData.DATA_SIZE];
		clmData[ColumnData.CLM           ] = name		;
		clmData[ColumnData.CLS_NAME      ] = "VARCHAR2"	;
		clmData[ColumnData.USE_LENGTH    ] = "60"		;
		clmData[ColumnData.RENDERER      ] = null 		;
		clmData[ColumnData.EDITOR        ] = null		;
		clmData[ColumnData.DBTYPE        ] = null		;
		clmData[ColumnData.DATA_DEFAULT  ] = ""			;
		clmData[ColumnData.RENDERER_PARAM] = ""			;
		clmData[ColumnData.EDITOR_PARAM  ] = ""			;
		clmData[ColumnData.TYPE_PARAM    ] = ""			;
		clmData[ColumnData.ROLES         ] = null		;		// 4.0.0 (2005/11/30)
	}

	/**
	 * 言語を返します。
	 *
	 * @return	言語
	 */
	public String getLang() {
		return lang;
	}

	/**
	 * 言語を設定します。
	 *
	 * @param	lang String
	 */
	public void setLang( final String lang ) {
		this.lang = lang;
	}

	/**
	 * カラム名を返します。
	 *
	 * @return	カラム名
	 */
	public String getName() {
		return clmData[ColumnData.CLM];
	}

	/**
	 * カラム名を設定します。
	 *
	 * @param	name String
	 */
	public void setName( final String name ) {
		clmData[ColumnData.CLM] = name;
	}

	/**
	 * ラベル名を返します。
	 *
	 * @return	ラベル名
	 */
	public String getLabel() {
		return ( labelData == null ) ?
					clmData[ColumnData.CLM] : labelData.getLabel() ;
	}

	/**
	 * カラムのクラスを文字列にした名称を返します。
	 *
	 * @return	カラムのクラスを文字列にした名称
	 */
	public String getClassName() {
		return clmData[ColumnData.CLS_NAME];
	}

	/**
	 * カラムのクラスを文字列にした名称を設定します。
	 *
	 * @param	className String
	 */
	public void setClassName( final String className ) {
		clmData[ColumnData.CLS_NAME] = className;
	}

	/**
	 * カラムの表示桁数を返します。
	 * viewLength は、設定した場合のみ、使用できます。通常は、null が返ります。
	 *
	 * @og.rev 4.0.0 (2005/01/31) メソッド名変更 getSize() → getViewLength()
	 *
	 * @return	カラムの表示桁数
	 */
	public String getViewLength() {
		return clmData[ColumnData.VIEW_LENGTH];
	}

	/**
	 * カラムの表示桁数を設定します。
	 *
	 * @og.rev 4.0.0 (2005/01/31) メソッド名変更 setSize() → setViewLength()
	 *
	 * @param	viewLength String
	 */
	public void setViewLength( final String viewLength ) {
		clmData[ColumnData.VIEW_LENGTH] = viewLength;
	}

	/**
	 * カラムの文字桁数を返します。
	 *
	 * @og.rev 3.5.5.5 (2004/04/23) 新規追加
	 *
	 * @return	カラムの文字桁数
	 */
	public String getMaxlength() {
		return clmData[ColumnData.USE_LENGTH];
	}

	/**
	 * カラムの文字桁数を設定します。
	 *
	 * @og.rev 3.5.5.5 (2004/04/23) 新規追加
	 *
	 * @param	maxlength String
	 */
	public void setMaxlength( final String maxlength ) {
		clmData[ColumnData.USE_LENGTH] = maxlength;
	}

	/**
	 * カラムが書き込み可能かどうかを返します。
	 *
	 * @return	カラムが書き込み可能かどうか
	 */
	public boolean isWritable() {
		return "true".equalsIgnoreCase( writable ) ;
	}

	/**
	 * カラムが書き込み可能かどうかを設定します。
	 *
	 * @param	writable String
	 */
	public void setWritable( final String writable ) {
		this.writable = writable;
	}

	/**
	 * データの表示用レンデラーを返します。
	 *
	 * @og.rev 3.1.0.0 (2003/03/20) Renderer をキーのみ返すように変更
	 *
	 * @return	データの表示用レンデラー
	 */
	public String getRenderer() {
		return clmData[ColumnData.RENDERER];
	}

	/**
	 * データの表示用レンデラーを設定します。
	 *
	 * @param	renderer String
	 */
	public void setRenderer( final String renderer ) {
		clmData[ColumnData.RENDERER] = renderer;
	}

	/**
	 * データの編集用エディターを返します。
	 *
	 * @og.rev 3.1.0.0 (2003/03/20) Editor をキーのみ返すように変更
	 *
	 * @return	データの編集用エディター
	 */
	public String getEditor() {
		return clmData[ColumnData.EDITOR];
	}

	/**
	 * データの編集用エディターを設定します。
	 *
	 * @param	editor String
	 */
	public void setEditor( final String editor ) {
		clmData[ColumnData.EDITOR] = editor;
	}

	/**
	 * 文字種別名を返します。
	 *
	 * @return  データの文字種別
	 */
	public String getDbType() {
		return clmData[ColumnData.DBTYPE];
	}

	/**
	 * データのタイプを設定します。
	 *
	 * @param	dbType String
	 */
	public void setDbType( final String dbType ) {
		clmData[ColumnData.DBTYPE] = dbType;
	}

	/**
	 * カラムロールを返します。
	 *
	 * @return  カラムロール
	 */
	public String getRoles() {
		return clmData[ColumnData.ROLES];
	}

	/**
	 * カラムロールを設定します。
	 *
	 * @param	roles String
	 */
	public void setRoles( final String roles ) {
		clmData[ColumnData.ROLES] = roles;
	}

	/**
	 * データのデフォルト値を返します。
	 *
	 * @return	データのデフォルト値
	 */
	public String getDefValue() {
		return ( clmData[ColumnData.DATA_DEFAULT] != null ) ? clmData[ColumnData.DATA_DEFAULT] : "";
	}

	/**
	 * データのデフォルト値を設定します。
	 *
	 * @param	dataDef String
	 */
	public void setDefValue( final String dataDef ) {
		clmData[ColumnData.DATA_DEFAULT] = dataDef;
	}

	/**
	 * 表示用レンデラーの追加属性を返します。
	 *
	 * @return	 attri Attributes
	 */
	public Attributes getRendererAttributes() {
		return rendAttri ;
	}

	/**
	 * 表示用レンデラーの追加属性を設定します。
	 *
	 * @param	attri Attributes
	 */
	public void setRendererAttributes( final Attributes attri ) {
		rendAttri = attri;
	}

	/**
	 * 編集用エディター用の追加属性を返します。
	 *
	 * @return	 attri Attributes
	 */
	public Attributes getEditorAttributes() {
		return editAttri;
	}

	/**
	 * 編集用エディター用の追加属性を設定します。
	 *
	 * @param	attri Attributes
	 */
	public void setEditorAttributes( final Attributes attri ) {
		editAttri = attri;
	}

	/**
	 * パラメータを設定します。
	 * ここで設定された値は、すべて（表示、編集、文字）のパラメータにセットされます。
	 *
	 * @og.rev 3.4.0.0 (2003/09/01) 表示パラメータ、編集パラメータ、文字パラメータの追加。
	 *
	 * @param	inParam String
	 */
	public void setParameter( final String inParam ) {
		clmData[ColumnData.RENDERER_PARAM]	= inParam ;
		clmData[ColumnData.EDITOR_PARAM]	= inParam ;
		clmData[ColumnData.TYPE_PARAM]		= inParam ;
	}

	/**
	 * 表示用レンデラーのパラメータを取得します。
	 *
	 * @og.rev 3.4.0.0 (2003/09/01) 新規追加
	 *
	 * @return	表示用レンデラーのパラメータ
	 */
	public String getRendererParam() {
		return clmData[ColumnData.RENDERER_PARAM];
	}

	/**
	 * 表示用レンデラーのパラメータを設定します。
	 *
	 * @og.rev 3.4.0.0 (2003/09/01) 新規追加
	 *
	 * @param	inParam String 表示用レンデラーのパラメータ
	 */
	public void setRendererParam( final String inParam ) {
		clmData[ColumnData.RENDERER_PARAM] = inParam;
	}

	/**
	 * 編集用エディターのパラメータを取得します。
	 *
	 * @og.rev 3.4.0.0 (2003/09/01) 新規追加
	 *
	 * @return	編集用エディターのパラメータ
	 */
	public String getEditorParam() {
		return clmData[ColumnData.EDITOR_PARAM];
	}

	/**
	 * 編集用エディターのパラメータを設定します。
	 *
	 * @og.rev 3.4.0.0 (2003/09/01) 新規追加
	 *
	 * @param	inParam String 編集用エディターのパラメータ
	 */
	public void setEditorParam( final String inParam ) {
		clmData[ColumnData.EDITOR_PARAM] = inParam	;
	}

	/**
	 * データタイプのパラメータを取得します。
	 *
	 * @og.rev 3.4.0.0 (2003/09/01) 新規追加
	 *
	 * @return	データタイプのパラメータ
	 */
	public String getDbTypeParam() {
		return clmData[ColumnData.TYPE_PARAM];
	}

	/**
	 * データタイプのパラメータをします。
	 *
	 * @og.rev 3.4.0.0 (2003/09/01) 新規追加
	 *
	 * @param	inParam String
	 */
	public void setDbTypeParam( final String inParam ) {
		clmData[ColumnData.TYPE_PARAM] = inParam ;
	}

	/**
	 * メニューに空の選択リストを追加するかどうかを取得します。
	 *
	 * @og.rev 3.5.5.7 (2004/05/10) 新規追加
	 *
	 * @return	addNoValue (true:追加する/false:追加しない)
	 */
	public boolean isAddNoValue() {
		return addNoValue ;
	}

	/**
	 * メニューに空の選択リストを追加するかどうかを設定します。
	 *
	 * @og.rev 3.5.5.7 (2004/05/10) 新規追加
	 *
	 * @param	add boolean (true:追加する/false:追加しない)
	 */
	public void setAddNoValue( final boolean add ) {
		this.addNoValue	= add	;
	}

	/**
	 * このカラムオブジェクトがカラムリソースより正式に作られたかどうかを取得します。
	 * カラムリソースが無い場合は、仮オブジェクトかデータベースメタデータより作成されます。
	 * その場合は、チェック機能が緩くなるため、正式なカラムオブジェクトと区別する為に
	 * この属性を持ちます。
	 *
	 * @og.rev 3.6.0.7 (2004/11/06) 新規追加
	 *
	 * @return	official (true:正式/false:暫定)
	 */
	public boolean isOfficial() {
		return official;
	}

	/**
	 * 接続先IDを設定します。
	 *
	 * @param dbid String  接続先ID
	 */
	public void setDbid( final String dbid ) {
		this.dbid = dbid;
	}

	/**
	 * 接続先IDを返します。
	 *
	 * @return  接続先ID
	 */
	public String getDbid() {
		return dbid;
	}

	/**
	 * カラムデータオブジェクトを取得します。
	 *
	 * @return	ColumnData
	 */
	public ColumnData getColumnData() {
		return new ColumnData( clmData );
	}

	/**
	 * カラムデータオブジェクトを設定します。
	 * ここでは、オブジェクトその物を持つのではなく、設定された値のみ持ちます。
	 *
	 * @param	clmDt ColumnData
	 */
	public void setColumnData( final ColumnData clmDt ) {
		clmData = clmDt.getColumnData();
	}

	/**
	 * コードデータオブジェクトを取得します。
	 *
	 * @og.rev 4.0.0 (2005/01/31)  新規作成
	 *
	 * @return	CodeData
	 */
	public CodeData getCodeData() {
		return codeData;
	}

	/**
	 * コードデータオブジェクトを設定します。
	 *
	 * @og.rev 4.0.0 (2005/01/31)  新規作成
	 *
	 * @param	codeData ColumnData
	 */
	public void setCodeData( final CodeData codeData ) {
		this.codeData = codeData;
	}

	/**
	 * ラベルデータオブジェクトを取得します。
	 *
	 * @return	LabelData
	 */
	public LabelData getLabelData() {
		return labelData;
	}

	/**
	 * ラベルデータオブジェクトを設定します。
	 *
	 * @param	labelData LabelData
	 */
	public void setLabelData( final LabelData labelData ) {
		this.labelData = labelData;
	}
	
	/**
	 * イベントカラム（親カラム）のセット
	 * 
	 * イベントカラムをセットします。
	 * 
	 * @og.rev 4.3.6.0 (2009/04/01)
	 * @param col 
	 */
	public void setEventColumn( final String col ) {
		this.eventColumn = col;
	}
	
	/**
	 * イベントカラム（親カラム）の取得
	 * 
	 * イベントカラムを取得します。
	 * 
	 * @og.rev 4.3.6.0 (2009/04/01)
	 * @return  イベントカラム
	 */
	public String getEventColumn() {
		return eventColumn;
	}
	
	/**
	 * {&#064;xxx}を変換していない状態のparameter
	 * 
	 * 生のパラメータを取得します。
	 * 
	 * @og.rev 4.3.6.0 (2009/04/01)
	 * @return  生パラメータ
	 */
	public String getRawParameter() {
		return rawParameter;
	}
	
	/**
	 * {&#064;xxx}を変換していない状態のparameterセット用
	 * 
	 * 生のパラメータを取得します。
	 * @param param 
	 * 
	 * @og.rev 4.3.6.0 (2009/04/01)
	 */
	public void setRawParameter( final String param ) {
		rawParameter = param;
	}

	/**
	 * イベントURLのセット
	 * 
	 * イベントカラム利用時にコールされるURLのセット
	 * 
	 * @og.rev 4.3.6.0 (2009/04/01)
	 * @param url 
	 */
	public void setEventURL( final String url ) {
		this.eventURL = url;
	}

	/**
	 * イベントURLの取得
	 * 
	 * eventColumn利用時のJSから呼び出すためのURL取得
	 * 
	 * @og.rev 4.3.6.0 (2009/04/01)
	 * @return  イベントURL
	 */
	public String getEventURL() {
		return eventURL;
	}
}
