package org.kevoree.core.deploy;
import org.kevoree.api.PrimitiveCommand;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.kevoree.log.Log;
import org.kevoree.core.KevoreeCoreBean;
import org.kevoree.api.telemetry.TelemetryEvent;
public class KevoreeSeqDeployPhase extends KevoreeDeployPhase {
public KevoreeSeqDeployPhase(KevoreeCoreBean core) {
super(core);
}
public boolean execute() {
if (primitives.isEmpty()) {
return true;
} else {
PrimitiveCommand lastCmd = null;
try {
boolean result = true;
for (PrimitiveCommand cmd : primitives) {
lastCmd = cmd;
result = cmd.execute();
if (!result) {
if (originCore.isAnyTelemetryListener()) {
originCore.broadcastTelemetry(TelemetryEvent.Type.LOG_ERROR, "Cmd:["+cmd.toString()+"]", null);
}
Log.error("Error while executing primitive command {}", cmd);
break;
}
}
return result;
} catch (Throwable e) {
if (originCore.isAnyTelemetryListener()) {
originCore.broadcastTelemetry(TelemetryEvent.Type.LOG_ERROR, "Cmd:["+lastCmd.toString()+"]", e);
}
Log.error("Exception while executing primitive command {} ", e, lastCmd);
e.printStackTrace();
return false;
}
}
}
public void rollback() {
Log.trace("Rollback phase");
if (successor != null) {
Log.trace("Rollback sucessor first");
successor.rollback();
}
if (!rollbackPerformed) {
List<PrimitiveCommand> clonedPrimitives = new ArrayList<PrimitiveCommand>(primitives);
Collections.reverse(clonedPrimitives);
for (PrimitiveCommand c : clonedPrimitives) {
try {
Log.trace("Undo adaptation command {} ", c.getClass().getName());
c.undo();
} catch (Exception e) {
if (originCore.isAnyTelemetryListener()) {
originCore.broadcastTelemetry(TelemetryEvent.Type.LOG_ERROR, "Error while executing primitive command {}", e);
}
Log.error("Error while executing primitive command {}", c);
}
}
rollbackPerformed = true;
}
}
}