package org.ovirt.engine.core.vdsbroker;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.ovirt.engine.core.common.errors.VDSError;
import org.ovirt.engine.core.common.errors.VdcBllErrors;
import org.ovirt.engine.core.common.vdscommands.VDSParametersBase;
import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
import org.ovirt.engine.core.compat.LogCompat;
import org.ovirt.engine.core.compat.LogFactoryCompat;
import org.ovirt.engine.core.dal.VdcCommandBase;
import org.ovirt.engine.core.vdsbroker.irsbroker.IRSErrorException;
import org.ovirt.engine.core.vdsbroker.vdsbroker.VDSExceptionBase;
import org.ovirt.engine.core.vdsbroker.vdsbroker.VDSNetworkException;
import org.ovirt.engine.core.vdsbroker.vdsbroker.VDSRecoveringException;
public abstract class VDSCommandBase<P extends VDSParametersBase> extends VdcCommandBase {
private P _parameters;
public P getParameters() {
return _parameters;
}
protected VDSReturnValue _returnValue = null;
public VDSReturnValue getVDSReturnValue() {
return _returnValue;
}
public void setVDSReturnValue(VDSReturnValue value) {
_returnValue = value;
}
@Override
public Object getReturnValue() {
return getVDSReturnValue().getReturnValue();
}
@Override
public void setReturnValue(Object value) {
getVDSReturnValue().setReturnValue(value);
}
public VDSCommandBase(P parameters) {
_parameters = parameters;
}
@Override
public String toString() {
return String.format("%s(%s)", super.toString(),
(getParameters() != null ? getParameters().toString() : "null"));
}
@Override
protected void ExecuteCommand() {
try {
// creating ReturnValue object since execute can be called more than once (failover)
// and we want returnValue clean from last run.
_returnValue = new VDSReturnValue();
getVDSReturnValue().setSucceeded(true);
ExecuteVDSCommand();
} catch (VDSNetworkException ex) {
getVDSReturnValue().setSucceeded(false);
getVDSReturnValue().setExceptionString(ex.toString());
getVDSReturnValue().setExceptionObject(ex);
VDSError tempVar = ex.getVdsError();
VDSError tempVar2 = new VDSError();
tempVar2.setCode(VdcBllErrors.VDS_NETWORK_ERROR);
tempVar2.setMessage(ex.getMessage());
getVDSReturnValue().setVdsError((tempVar != null) ? tempVar : tempVar2);
} catch (IRSErrorException ex) {
getVDSReturnValue().setSucceeded(false);
getVDSReturnValue().setExceptionString(ex.toString());
getVDSReturnValue().setExceptionObject(ex);
getVDSReturnValue().setVdsError(ex.getVdsError());
logException(ex);
} catch (RuntimeException ex) {
getVDSReturnValue().setSucceeded(false);
getVDSReturnValue().setExceptionString(ex.toString());
getVDSReturnValue().setExceptionObject(ex);
VDSExceptionBase vdsExp = (VDSExceptionBase) ((ex instanceof VDSExceptionBase) ? ex : null);
// todo: consider adding unknown vds error in case of non
// VDSExceptionBase exception
if (vdsExp != null) {
if (vdsExp.getVdsError() != null) {
getVDSReturnValue().setVdsError(((VDSExceptionBase) ex).getVdsError());
} else if (vdsExp.getCause() instanceof VDSExceptionBase) {
getVDSReturnValue().setVdsError(((VDSExceptionBase) vdsExp.getCause()).getVdsError());
}
}
if (ex instanceof VDSRecoveringException) {
log.errorFormat("Command {0} execution failed. Error: {1}",
getCommandName(),
ExceptionUtils.getMessage(ex));
} else {
logException(ex);
}
}
}
private void logException(RuntimeException ex) {
log.errorFormat("Command {0} execution failed. Exception: {1}", getCommandName(), ExceptionUtils.getMessage(ex));
}
protected abstract void ExecuteVDSCommand();
private static LogCompat log = LogFactoryCompat.getLog(VDSCommandBase.class);
}