package org.kevoree.core.deploy;
import org.kevoree.ContainerNode;
import org.kevoree.api.NodeType;
import org.kevoree.api.PrimitiveCommand;
import org.kevoree.log.Log;
import org.kevoree.api.adaptation.AdaptationModel;
import org.kevoree.api.adaptation.AdaptationPrimitive;
import org.kevoree.api.adaptation.Step;
import org.kevoree.api.telemetry.TelemetryEvent;
import org.kevoree.core.KevoreeCoreBean;
public class PrimitiveCommandExecutionHelper {
public static boolean execute(KevoreeCoreBean core, ContainerNode rootNode, AdaptationModel adaptionModel, NodeType nodeInstance, PrimitiveExecute afterUpdateFunc, PrimitiveExecute preRollBack, PrimitiveExecute postRollback) {
Step orderedPrimitiveSet = adaptionModel.getOrderedPrimitiveSet();
if (orderedPrimitiveSet != null) {
KevoreeDeployPhase phase = new KevoreeSeqDeployPhase(core);
boolean result = PrimitiveCommandExecutionHelper.executeStep(core, rootNode, orderedPrimitiveSet, nodeInstance, phase, preRollBack);
if (result) {
if (!afterUpdateFunc.exec()) {
preRollBack.exec();
phase.rollback();
postRollback.exec();
}
} else {
postRollback.exec();
}
return result;
} else {
return afterUpdateFunc.exec();
}
}
private static boolean executeStep(KevoreeCoreBean core, ContainerNode rootNode, Step step, NodeType nodeInstance, KevoreeDeployPhase phase, PrimitiveExecute preRollBack) {
if (step == null) {
return true;
} else {
if (core.isAnyTelemetryListener()) {
core.broadcastTelemetry(TelemetryEvent.Type.DEPLOYMENT_STEP, step.getAdaptationType().name(), null);
}
boolean populateResult = PrimitiveCommandExecutionHelper.populate(step, nodeInstance, phase);
if (populateResult) {
boolean phaseResult = phase.execute();
if (phaseResult) {
Step nextStep = step.getNextStep();
boolean subResult;
if (nextStep != null) {
KevoreeDeployPhase nextPhase = new KevoreeSeqDeployPhase(core);
phase.successor = nextPhase;
subResult = executeStep(core, rootNode, nextStep, nodeInstance, nextPhase, preRollBack);
} else {
subResult = true;
}
if (!subResult) {
preRollBack.exec();
phase.rollback();
return false;
} else {
return true;
}
} else {
preRollBack.exec();
phase.rollback();
return false;
}
} else {
Log.error("Adaptation primitives must all be mapped by a primitive command");
return false;
}
}
}
private static boolean populate(Step step, NodeType nodeInstance, KevoreeDeployPhase phase) {
for (AdaptationPrimitive adapt : step.getAdaptations()) {
PrimitiveCommand cmd = nodeInstance.getPrimitive(adapt);
if (cmd != null) {
Log.trace("Populate primitive command = {}", cmd);
phase.populate(cmd);
} else {
Log.warn("Unable to find a primitive command for primitive adaptation {}", adapt);
return false;
}
}
return true;
}
}