/**
 * @(#)ClmDefs.java
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 * RID-3 : Colum Defines
 * @author  Intelligent Technology Inc.
 * @version 1.00 2001/10/01-2002/01/08
 */
package	jp.co.nri.rid.table;

import	java.util.*;

/**
 * 複数のClmDefインスタンスを管理するためのクラス
 */
public class ClmDefs{
	private	HashMap		myTagEdge;
	private	HashMap		myNameEdge;
	private	Vector		myClmDefs;
	
//--------[[ constructor ]]----------------------------------------------------
	public ClmDefs(){
		myTagEdge	= new HashMap();
		myNameEdge	= new HashMap();
		myClmDefs	= new Vector();
	}
	
//--------[[ open method ]]----------------------------------------------------
	/**
	 * カラム定義を追加する。
	 * @param	clmdef	追加するカラム定義。
	 * @see		ClmDef
	 * @since	1.00
	 */
	public void add(ClmDef clmdef){
		myNameEdge.put(clmdef.name ,clmdef);
		myClmDefs.add(clmdef);
	}
	
	/**
	 * カラム定義を追加する。
	 * @param	tagname	タグ名
	 * @param	names	カラム名配列
	 * @since	1.00
	 */
	public void add(String tagname ,String[] names){
		Vector defs = (Vector)myTagEdge.get(tagname);
		if(null==defs){
			defs = new Vector();
			myTagEdge.put(tagname ,defs);
		}
		
		int mx = names.length;
		for(int i=0;i<mx;i++){
			ClmDef def = (ClmDef)myNameEdge.get(names[i]);
			if(null!=def)	defs.add(def);
		}
	}
	
	/**
	 * 該当タグに関係するカラム定義の配列を取得する。
	 * @param	name	タグ名。
	 * @return	カラム定義配列。
	 * @see		ClmDef
	 * @since	1.00
	 */
	public ClmDef[] tagEdge(String name){	return get(myTagEdge ,name); }
	
	/**
	 * 全てのカラム定義を取得する。
	 * @return	カラム定義配列。
	 * @see		ClmDefs
	 * @since	1.00
	 */
	public ClmDef[] ClmDefs(){	return (ClmDef[])myClmDefs.toArray(new ClmDef[0]); }
	
	/**
	 * 全てのタグ名を取得する。
	 * @return	タグ名配列
	 * @since	1.00
	 */
	public String[] tagnames(){	return keys(myTagEdge); }
	
	/**
	 * 該当タグに関係するカラムタイトルの配列を取得する。
	 * @param	tagname	タグ名。
	 * @return	カラムタイトル配列。
	 * @since	1.00
	 */
	public String[] titles(String tagname){
		Vector vec = (Vector)myTagEdge.get(tagname);
		if(null==vec)	return null;
		
		ClmDef[] defs	= (ClmDef[])vec.toArray(new ClmDef[0]);
		int mx = defs.length;
		if(0>=mx)	return null;
		String[] titles	= new String[mx];
		for(int i=0;i<mx;i++)	titles[i] = new String(defs[i].title);
		
		return titles;
	}
	
//--------[[ close method ]]----------------------------------------------------
	private ClmDef[] get(HashMap map ,String name){
		Vector clmdefs = (Vector)map.get(name);
		if(null==clmdefs)	return null;
		return (ClmDef[])clmdefs.toArray(new ClmDef[0]);
	}

	private String[] keys(HashMap map){
		Set keyset = map.keySet();
		if(null==keyset)	return null;
		return (String[])keyset.toArray(new String[0]);
	}
}
