SetSimplifier.java

package edu.udel.cis.vsl.tass.dynamic.impl.simplify;

import edu.udel.cis.vsl.tass.dynamic.IF.DynamicException;
import edu.udel.cis.vsl.tass.dynamic.IF.simplify.DynamicSimplifierIF;
import edu.udel.cis.vsl.tass.dynamic.IF.simplify.MorphicSimplifierIF;
import edu.udel.cis.vsl.tass.morph.Morphic;
import edu.udel.cis.vsl.tass.morph.MorphicSet;
import edu.udel.cis.vsl.tass.morph.MorphicSetFactory;

public class SetSimplifier<T extends Morphic> extends
		MorphicSimplifier<MorphicSet<T>> {

	private MorphicSetFactory<T> setFactory;

	private MorphicSimplifierIF<? super T> elementSimplifier;

	public SetSimplifier(MorphicSetFactory<T> setFactory,
			MorphicSimplifierIF<? super T> elementSimplifier) {
		this.setFactory = setFactory;
		this.elementSimplifier = elementSimplifier;
	}

	@SuppressWarnings("unchecked")
	@Override
	public MorphicSet<T> simplify(DynamicSimplifierIF dynamicSimplifier,
			MorphicSet<T> set) throws DynamicException {
		MorphicSet<T> newSet;

		set = setFactory.canonic(set);
		newSet = (MorphicSet<T>) dynamicSimplifier.getCachedResult(set);
		if (newSet != null)
			return newSet;
		for (T oldElement : set) {
			T newElement = (T) elementSimplifier.simplify(dynamicSimplifier,
					oldElement);

			if (newElement != oldElement) {
				if (newSet == null) {
					newSet = setFactory.newSet();
					for (T x : set) {
						if (x == oldElement)
							break;
						newSet.add(x);
					}
				}
				newSet.add(newElement);
			} else if (newSet != null) {
				newSet.add(oldElement);
			}
		}
		if (newSet != null) {
			newSet = setFactory.canonic(newSet);
		} else {
			newSet = set;
		}
		dynamicSimplifier.cacheResult(set, newSet);
		return newSet;
	}

}