CommonCompositeEvent.java

package dev.civl.mc.model.common.contract;

import dev.civl.mc.model.IF.CIVLSource;
import dev.civl.mc.model.IF.contract.CompositeEvent;
import dev.civl.mc.model.IF.contract.DependsEvent;

public class CommonCompositeEvent extends CommonDependsEvent implements
		CompositeEvent {
	private CompositeEventOperator operator;
	private DependsEvent left;
	private DependsEvent right;

	public CommonCompositeEvent(CIVLSource source, CompositeEventOperator op,
			DependsEvent left, DependsEvent right) {
		super(source, DependsEventKind.COMPOSITE);
		this.left = left;
		this.right = right;
		this.operator = op;
	}

	@Override
	public DependsEvent left() {
		return left;
	}

	@Override
	public DependsEvent right() {
		return right;
	}

	@Override
	public CompositeEventOperator operator() {
		return this.operator;
	}

	@Override
	public boolean equalsWork(DependsEvent that) {
		if (that instanceof CompositeEvent) {
			CompositeEvent thatEvent = (CompositeEvent) that;

			if (this.operator != thatEvent.operator())
				return false;
			switch (operator) {
			case UNION:
			case INTERSECT:
				return this.left.equalsWork(thatEvent.left())
						&& this.right.equalsWork(thatEvent.right())
						|| this.left.equalsWork(thatEvent.right())
						&& this.right.equalsWork(thatEvent.left());
			default:// DIFERENCE
				return this.left.equalsWork(thatEvent.left())
						&& this.right.equalsWork(thatEvent.right());
			}
		}
		return false;
	}

	@Override
	public String toString() {
		StringBuffer result = new StringBuffer();

		switch (operator) {
		case UNION:
			result.append("union");
			break;
		case INTERSECT:
			result.append("inter");
			break;
		case DIFFERENCE:
			result.append("diff");
			break;
		default:
		}
		result.append("(");
		result.append(left);
		result.append(",");
		result.append(right);
		result.append(")");
		return result.toString();
	}
}