/*
 * $Id: Element.java,v 1.4 2006/01/31 17:10:01 rampil Exp $
 * Copyright (c) 2004 LOGICAL-PARADOX.ORG
 */
package org.logical_paradox.koike.core.search;

import java.util.ArrayList;
import java.util.List;

import org.logical_paradox.common.util.StringUtils;

/**
 * 検索条件要素
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.4 $
 */
public class Element {
	/** AND条件要素 */
	public static final int TYPE_AND = 1;
	/** OR条件要素 */
	public static final int TYPE_OR = 2;
	/** SEQ条件要素 */
	public static final int TYPE_SEQ = 56;
	/** 検索語要素 */
	public static final int TYPE_TERM = 64;

	/** 子要素 */
	private List<Element> childNodes = new ArrayList<Element>();
	/** 要素型 */
	private int type;

	/** 要素識別ID(hashCodeで使用する) */
	private final String elementId;
	/** 要素の値 */
	private final String value;

	/**
	 * コンストラクタ
	 * @param t 要素型
	 */
	public Element(int t) {
		type = t;
		value = null;
		// 要素識別子は128文字のランダムな文字列 */
		elementId = StringUtils.randomText(128, true);
	}
	/**
	 * コンストラクタ
	 * @param t 要素型
	 * @param term 値
	 */
	public Element(int t, String term) {
		type = t;
		elementId = StringUtils.randomText(128, true);
		value = term;
	}
	/**
	 * 子要素を追加する
	 * @param e 子要素
	 */
	public void addChildNode(Element e) {
		childNodes.add(e);
	}
	/**
	 * この要素の下位にぶら下がっている要素を返す
	 * @return 要素のリスト
	 */
	public List<Element> getChildNodes() {
		return childNodes;
	}
	/**
	 * 子要素を削除する
	 * @param e 削除対象の要素
	 */
	public void removeChildNode(Element e) {
		childNodes.remove(e);
	}
	/**
	 * 要素の型を返す
	 * @return 要素型
	 */
	public int getElementType() {
		return type;
	}
	/**
	 * この要素の属性値を返す
	 * @return 属性値
	 */
	public String getAttribute() {
		return value;
	}
	/**
	 * ハッシュコードを返す
	 * @return ハッシュコード
	 */
	public int hashCode() {
		return elementId.hashCode();
	}
	/**
	 * 要素同士を比較する
	 * @param o 比較対象
	 * @return true:同じ / false:違う
	 */
	public boolean equals(Object o) {
		if(o == null || o instanceof Element == false) {
			return false;
		}

		Element e = (Element)o;
		return elementId.equals(e.elementId);
	}
}
