package org.jboss.windup.config.parameters; import java.util.Map; import java.util.Map.Entry; import org.jboss.windup.config.DefaultEvaluationContext; import org.jboss.windup.config.GraphRewrite; import org.jboss.windup.config.operation.iteration.AbstractIterationOperation; import org.jboss.windup.graph.model.WindupVertexFrame; import org.ocpsoft.rewrite.config.Operation; import org.ocpsoft.rewrite.context.EvaluationContext; import org.ocpsoft.rewrite.context.RewriteState; import org.ocpsoft.rewrite.param.DefaultParameterStore; import org.ocpsoft.rewrite.param.DefaultParameterValueStore; import org.ocpsoft.rewrite.param.Parameter; import org.ocpsoft.rewrite.param.ParameterStore; import org.ocpsoft.rewrite.param.ParameterValueStore; import org.ocpsoft.rewrite.param.Parameterized; import org.ocpsoft.rewrite.util.ParameterUtils; public abstract class ParameterizedIterationOperation<T extends WindupVertexFrame> extends AbstractIterationOperation<T> implements Operation, Parameterized { private WindupVertexFrame originalPayload; public ParameterizedIterationOperation() { } public ParameterizedIterationOperation(String variableName) { super(variableName); } public abstract void performParameterized(GraphRewrite event, EvaluationContext context, T payload); @Override public final void perform(GraphRewrite event, EvaluationContext context) { checkVariableName(event, context); WindupVertexFrame payload = resolveVariable(event, getVariableName()); this.originalPayload = payload; try { super.perform(event, context); } finally { this.originalPayload = null; } } @Override public final void perform(GraphRewrite event, EvaluationContext context, T payload) { Map<WindupVertexFrame, ParameterValueStore> stores = ParameterizedGraphCondition .getResultValueStoreMap(context); ParameterValueStore originalValueStore = DefaultParameterValueStore.getInstance(context); ParameterStore parameterStore = DefaultParameterStore.getInstance(context); try { DefaultEvaluationContext tempEvaluationContext = new DefaultEvaluationContext(context); tempEvaluationContext.setState(RewriteState.PERFORMING); ParameterValueStore valueStore = stores.get(originalPayload); for (Entry<String, Parameter<?>> entry : parameterStore) { Parameter<?> parameter = entry.getValue(); String value = valueStore.retrieve(parameter); ParameterUtils.enqueueSubmission(event, tempEvaluationContext, parameter, value); } context.put(ParameterValueStore.class, valueStore); performParameterized(event, tempEvaluationContext, payload); } finally { context.put(ParameterValueStore.class, originalValueStore); } } }