FrameSimplifier.java

package edu.udel.cis.vsl.tass.state.impl;

import edu.udel.cis.vsl.tass.dynamic.IF.DynamicException;
import edu.udel.cis.vsl.tass.dynamic.IF.DynamicFactoryIF;
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.MorphicVector;
import edu.udel.cis.vsl.tass.morph.MorphicVectorFactory;
import edu.udel.cis.vsl.tass.state.IF.FrameIF;
import edu.udel.cis.vsl.tass.state.IF.ScopeStateIF;

public class FrameSimplifier implements MorphicSimplifierIF<FrameIF> {

	private DynamicFactoryIF dynamicFactory;

	private FrameFactory frameFactory;

	private ScopeStateFactory scopeStateFactory;

	private ScopeStateSimplifier scopeStateSimplifier;

	private MorphicVectorFactory<ScopeStateIF> scopeStateVectorFactory;

	private MorphicSimplifierIF<MorphicVector<ScopeStateIF>> scopeStateVectorSimplifier;

	public FrameSimplifier(FrameFactory frameFactory) {
		this.frameFactory = frameFactory;
		this.dynamicFactory = frameFactory.dynamicFactory();
		this.scopeStateFactory = frameFactory.scopeStateFactory();
		this.scopeStateSimplifier = scopeStateFactory.simplifier();
		this.scopeStateVectorFactory = frameFactory.scopeStateVectorFactory();
		this.scopeStateVectorSimplifier = dynamicFactory.newVectorSimplifier(
				scopeStateVectorFactory, scopeStateSimplifier);
	}

	@Override
	public FrameIF simplify(DynamicSimplifierIF dynamicSimplifier, FrameIF frame)
			throws DynamicException {
		frame = frameFactory.canonic(frame);

		FrameIF result = (FrameIF) dynamicSimplifier.getCachedResult(frame);

		if (result != null)
			return result;

		MorphicVector<ScopeStateIF> oldScopeStates = frame.scopeStates();
		MorphicVector<ScopeStateIF> newScopeStates = scopeStateVectorSimplifier
				.simplify(dynamicSimplifier, oldScopeStates);

		if (newScopeStates == oldScopeStates) {
			result = frame;
		} else {
			result = frameFactory.frame(frame.location(), newScopeStates);
			result = frameFactory.canonic(result);
		}
		dynamicSimplifier.cacheResult(frame, result);
		return result;
	}
}