import com.engineous.sdk.component.ComponentAPI;
import com.engineous.sdk.model.DtScalarVariable;

#############################################################################################
# Create some convenient abbreviations:
#############################################################################################
String type = EsiTypes.REAL;
int role = Variable.ROLE_PARAMETER;
int imode = Variable.MODE_INPUT;
int omode = Variable.MODE_OUTPUT;

#############################################################################################
# Build and configure the new root driver:
#############################################################################################
DtComponent loopComp = DtModelManager.createComponent("com.engineous.component.Loop","Gen X");
DtScalarVariable loopX = DtModelManager.createScalarVariable("X",type,role,imode,null,null);
DtScalarVariable loopY = DtModelManager.createScalarVariable("Y",type,role,omode,null,null);
loopComp.addParameter(loopX);
loopComp.addParameter(loopY);

# NOTE: Cannot cast directly to LoopAPI class - must use Java reflection:
ComponentAPI loopAPI = loopComp.getAPI();
loopAPI.call("setLoopType","For");    # ["For" == LoopAPI.TYPE_FOR]
loopAPI.call("setLoopParameter","X");
loopAPI.call("setFromValue","-10.0");
loopAPI.call("setToValue","10.0");
loopAPI.call("setIncrement","0.125","C");    # ["C" == LoopAPI.CONSTANT]
loopAPI.apply();

#############################################################################################
# Build and configure the driver's workflow component(s):
#############################################################################################
DtComponent calcComp = DtModelManager.createComponent("com.engineous.component.Calculator","Y = X Squared");
DtScalarVariable calcX = DtModelManager.createScalarVariable("X",type,role,imode,null,null);
DtScalarVariable calcY = DtModelManager.createScalarVariable("Y",type,role,omode,null,null);
calcComp.addParameter(calcX);
calcComp.addParameter(calcY);

# NOTE: Cannot cast directly to CalculatorAPI class - must use Java reflection:
ComponentAPI calcAPI = calcComp.getAPI();
calcAPI.call("setExpression","Y = X * X");
calcAPI.apply();

#############################################################################################
# Assemble the model : replace the old root, build the workflow, create the dataflow
#############################################################################################
DtUtils.changeComponent(model.getRootComponent(),loopComp,false,false);
loopComp.addComponent(calcComp);
loopComp.addControlFlow(DtModelManager.createControlFlow(null,calcComp));
loopComp.addControlFlow(DtModelManager.createControlFlow(calcComp,null));
loopComp.addDataFlow(DtModelManager.createDataFlow(loopX,calcX));
loopComp.addDataFlow(DtModelManager.createDataFlow(calcY,loopY));
