package jp.ac.naka.ec.test;

import java.util.Set;

import jp.ac.naka.ec.Connector;
import jp.ac.naka.ec.TreeNode;
import jp.ac.naka.ec.entity.EntityContainer;
import jp.ac.naka.ec.entity.EntityEvent;
import jp.ac.naka.ec.entity.EntityException;
import jp.ac.naka.ec.entity.EntityListener;

public class DefaultConnector implements Connector {

	EntityContainer con;

	public DefaultConnector(EntityContainer con) {
		this.con = con;
	}

	public boolean send(EntityEvent evt) throws EntityException {
		EntityListener target = evt.getTarget();
		Set<TreeNode> set = con.getChildNodes();
		boolean flag = false;
		if (target == null) {
			throw new EntityException("Target is null");
		}

		// ターゲットがコンテナでかつ、自分がそこに含まれていれば自分の子ノードに配布
		if (target instanceof EntityContainer && ((TreeNode)target).include(con)) {
			for (TreeNode e : set) {
				// 一度きていないかのチェック
				boolean a = false;
				for (EntityListener via : evt.getVias()) {
					if (e.equals(via)) {
						a = true;
					}
				}
				if (a)
					continue;
				EntityListener listener = (EntityListener) e;
				evt.addVia(listener);
				listener.receiveMessage(evt);
				flag = true;
			}
		} else {
			// 自ノードへの配布
			for (TreeNode e : set) {
				if (e.equals(target) || e instanceof EntityContainer) {
					EntityListener listener = (EntityListener) e;
					evt.addVia(listener);
					listener.receiveMessage(evt);
					flag = true;
				}
			}
		}
		TreeNode parent = con.getParent();
		if (parent != null) {
			EntityContainer temp = (EntityContainer) parent;
			boolean a = false;
			// 一度きていないかのチェック
			for (EntityListener via : evt.getVias()) {
				if (temp.equals(via)) {
					a = true;
				}
			}
			if (!a) {
				// 親ノードへの配布
				if (target.equals(temp)) {
					// ブロードキャスト
					temp.receiveMessage(evt);
					/*
					 * for (TreeNode e : set) { EntityListener listener =
					 * (EntityListener) e; listener.receiveMessage(evt); }
					 */
					flag = true;
				}
			}
		}

		return flag;
	}
}
