package org.ovirt.engine.core.vdsbroker.vdsbroker;
import org.ovirt.engine.core.compat.*;
import org.ovirt.engine.core.common.businessentities.*;
import org.ovirt.engine.core.common.vdscommands.*;
import org.ovirt.engine.core.utils.log.Logged;
import org.ovirt.engine.core.utils.log.Logged.LogLevel;
import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcStruct;
@Logged(executionLevel = LogLevel.DEBUG)
public class HSMGetAllTasksStatusesVDSCommand<P extends VdsIdVDSCommandParametersBase> extends VdsBrokerCommand<P> {
private TaskStatusListReturnForXmlRpc _result;
public HSMGetAllTasksStatusesVDSCommand(P parameters) {
super(parameters);
}
@Override
protected void ExecuteVdsBrokerCommand() {
_result = getBroker().getAllTasksStatuses();
ProceedProxyReturnValue();
setReturnValue(ParseTaskStatusList(_result.TaskStatusList));
}
protected AsyncTaskStatus ParseTaskStatus(TaskStatusForXmlRpc taskStatus) {
AsyncTaskStatus task = new AsyncTaskStatus();
task.setStatus((taskStatus != null && taskStatus.mTaskState != null) ? (AsyncTaskStatusEnum
.valueOf(taskStatus.mTaskState)) : AsyncTaskStatusEnum.unknown);
if (task.getStatus() == AsyncTaskStatusEnum.finished) {
UpdateReturnStatus(taskStatus);
try {
ProceedProxyReturnValue();
}
catch (RuntimeException ex) {
task.setException(ex);
}
task.setResult((AsyncTaskResultEnum.valueOf(taskStatus.mTaskResult)));
// Normally, when the result is not 'success', there is an
// exception.
// Just in case, we check the result here and if there is no
// exception,
// we throw a special one here:
if (task.getResult() != AsyncTaskResultEnum.success && task.getException() == null) {
task.setException(new VDSTaskResultNotSuccessException(String.format(
"TaskState contained successful return code, but a non-success result ('%1$s').",
taskStatus.mTaskResult)));
}
}
return task;
}
protected java.util.HashMap<Guid, AsyncTaskStatus> ParseTaskStatusList(XmlRpcStruct taskStatusList) {
java.util.HashMap<Guid, AsyncTaskStatus> result = new java.util.HashMap<Guid, AsyncTaskStatus>(
taskStatusList.getCount());
for (java.util.Map.Entry<String, ?> entry : taskStatusList.getEntries()) {
try {
Guid taskGuid = new Guid(entry.getKey().toString());
java.util.Map xrsTaskStatusAsMAp = (java.util.Map) entry.getValue();
XmlRpcStruct xrsTaskStatus = (xrsTaskStatusAsMAp != null) ? new XmlRpcStruct(xrsTaskStatusAsMAp) : null;
TaskStatusForXmlRpc tempVar = new TaskStatusForXmlRpc();
tempVar.mCode = Integer.parseInt(xrsTaskStatus.getItem("code").toString());
tempVar.mMessage = xrsTaskStatus.getItem("message").toString();
tempVar.mTaskResult = xrsTaskStatus.getItem("taskResult").toString();
tempVar.mTaskState = xrsTaskStatus.getItem("taskState").toString();
TaskStatusForXmlRpc taskStatus = tempVar;
AsyncTaskStatus task = ParseTaskStatus(taskStatus);
result.put(taskGuid, task);
} catch (RuntimeException exp) {
log.error(
String.format(
"HSMGetAllTasksStatusesVDSCommand: Error while parsing task status from list. key: %1$s, value: %2$s - ignoring.",
entry.getKey().toString(),
entry.getValue().toString()),
exp);
}
}
return result;
}
@Override
protected StatusForXmlRpc getReturnStatus() {
return _result.mStatus;
}
// overrides the value of the status that is being checked in the
// ProceedProxyReturnValue method.
// Used when multiple calls to ProceedProxyReturnValue are needed within
// the same VDSCommand on different status values, for example, a regular
// verb
// execution status and an asynchronous task status.
protected void UpdateReturnStatus(StatusForXmlRpc newReturnStatus) {
_result.mStatus = newReturnStatus;
}
@Override
protected Object getReturnValueFromBroker() {
return _result;
}
private static LogCompat log = LogFactoryCompat.getLog(HSMGetAllTasksStatusesVDSCommand.class);
}