Ravi Nori has uploaded a new change for review. Change subject: engine : Validate parameter in canDoAction ......................................................................
engine : Validate parameter in canDoAction Validate parameter type and check for required parameters in canDoAction of CommandBase and QueriesCommandBase Throws InvalidParameterValueException if parameter is of right type and RequiredParametersMissingException if a required parameter is missing Change-Id: I15566c9177da28b2d47bbb6018fbfb61defcf3da Signed-off-by: Ravi Nori <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/QueriesCommandBase.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VdcParametersValidator.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/InvalidParameterValueException.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/RequiredParametersMissingException.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/VdcParameterHelper.java 6 files changed, 136 insertions(+), 6 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/85/21485/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java index 40ea1a3..27dc367 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java @@ -38,6 +38,7 @@ import org.ovirt.engine.core.bll.tasks.AsyncTaskUtils; import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler; import org.ovirt.engine.core.bll.utils.PermissionSubject; +import org.ovirt.engine.core.bll.utils.VdcParametersValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.VdcActionParametersBase; @@ -72,6 +73,7 @@ import org.ovirt.engine.core.common.utils.CoreVdcParameters; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.common.utils.ValidationUtils; +import org.ovirt.engine.core.common.utils.VdcParameter; import org.ovirt.engine.core.common.utils.VdcParameterHelper; import org.ovirt.engine.core.common.utils.VdcParametersMap; import org.ovirt.engine.core.common.vdscommands.SPMTaskGuidBaseVDSCommandParameters; @@ -143,6 +145,8 @@ private Map<Guid, CommandBase<?>> childCommandsMap = new HashMap<>(); private Map<Guid, Pair<VdcActionType, VdcActionParametersBase>> childCommandInfoMap = new HashMap<>(); + private List<VdcParameter> requiredParameters = new ArrayList<>(); + private List<VdcParameter> optionalParameters = new ArrayList<>(); public void addChildCommandInfo(Guid id, VdcActionType vdcActionType, VdcActionParametersBase parameters) { childCommandInfoMap.put(id, new Pair<VdcActionType, VdcActionParametersBase>(vdcActionType, parameters)); @@ -833,7 +837,7 @@ * validation */ protected boolean validateInputs() { - return validateObject(getParameters()); + return VdcParametersValidator.validateParameters(getParameters(), requiredParameters, optionalParameters) && validateObject(getParameters()); } protected boolean validateObject(Object value) { @@ -2158,4 +2162,13 @@ } super.setCorrelationId(correlationId); } + + protected void setRequiredParameters(VdcParameter[] params) { + this.requiredParameters = Arrays.asList(params); + } + + protected void setOptionalParameters(VdcParameter[] params) { + this.optionalParameters = Arrays.asList(params); + } + } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/QueriesCommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/QueriesCommandBase.java index bdf7334..59740ba 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/QueriesCommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/QueriesCommandBase.java @@ -1,5 +1,8 @@ package org.ovirt.engine.core.bll; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Set; import javax.validation.ConstraintViolation; @@ -8,11 +11,13 @@ import org.ovirt.engine.core.bll.interfaces.BackendInternal; import org.ovirt.engine.core.bll.session.SessionDataContainer; +import org.ovirt.engine.core.bll.utils.VdcParametersValidator; import org.ovirt.engine.core.common.businessentities.DbUser; import org.ovirt.engine.core.common.errors.VdcBLLException; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.common.utils.CoreVdcParameters; +import org.ovirt.engine.core.common.utils.VdcParameter; import org.ovirt.engine.core.common.utils.VdcParametersMap; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.VdcCommandBase; @@ -34,6 +39,8 @@ private final DbUser user; private final P parameters; private boolean isInternalExecution = false; + private List<VdcParameter> requiredParameters = new ArrayList<>(); + private List<VdcParameter> optionalParameters = new ArrayList<>(); public QueriesCommandBase(P parameters) { this.parameters = parameters; @@ -129,6 +136,7 @@ * validation */ protected boolean validateInputs() { + VdcParametersValidator.validateParameters(getParameters(), requiredParameters, optionalParameters); Set<ConstraintViolation<P>> violations = validator.validate(getParameters()); if (!violations.isEmpty()) { returnValue.setExceptionString(violations.toString()); @@ -193,4 +201,12 @@ return Backend.getInstance(); } + protected void setRequiredParameters(VdcParameter[] params) { + this.requiredParameters = Arrays.asList(params); + } + + protected void setOptionalParameters(VdcParameter[] params) { + this.optionalParameters = Arrays.asList(params); + } + } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VdcParametersValidator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VdcParametersValidator.java new file mode 100644 index 0000000..5932a32 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VdcParametersValidator.java @@ -0,0 +1,86 @@ +package org.ovirt.engine.core.bll.utils; + +import org.ovirt.engine.core.common.utils.CoreVdcParameters; +import org.ovirt.engine.core.common.utils.InvalidParameterValueException; +import org.ovirt.engine.core.common.utils.RequiredParametersMissingException; +import org.ovirt.engine.core.common.utils.VdcParameter; +import org.ovirt.engine.core.common.utils.VdcParametersMap; +import org.ovirt.engine.core.utils.log.Log; +import org.ovirt.engine.core.utils.log.LogFactory; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class VdcParametersValidator { + private static final Log log = LogFactory.getLog(VdcParametersValidator.class); + private static final VdcParameter[] commonParametersArray = { + CoreVdcParameters.GUID_ID, + CoreVdcParameters.SESSION_ID, + CoreVdcParameters.PARAMETERS_CURRENT_USER, + CoreVdcParameters.SHOULD_BE_LOGGED, + CoreVdcParameters.COMPENSATION_ENABLED, + CoreVdcParameters.TASK_GROUP_SUCCESS, + CoreVdcParameters.COMMAND_ID, + CoreVdcParameters.COMMAND_EXECUTION_REASON, + CoreVdcParameters.TRANSACTION_OPTION, + CoreVdcParameters.PARENT_COMMAND, + CoreVdcParameters.COMMAND_TYPE, + CoreVdcParameters.IMAGE_PARAMETERS, + CoreVdcParameters.CORRELATION_ID, + CoreVdcParameters.EXECUTION_INDEX, + CoreVdcParameters.MULTIPLE_ACTION, + CoreVdcParameters.JOB_ID, + CoreVdcParameters.STEP_ID, + CoreVdcParameters.PARENT_PARAMETERS, + CoreVdcParameters.VDSM_TASK_IDS, + CoreVdcParameters.ENTITY_INFO, + CoreVdcParameters.HTTP_SESSION_ID, + CoreVdcParameters.FILTERED, + CoreVdcParameters.REFRESH}; + private static final List<VdcParameter> commonParameters = Arrays.asList(commonParametersArray); + + public static <T extends VdcParametersMap> boolean validateParameters( + T parameters, + List<VdcParameter> requiredParameters, + List<VdcParameter> optionalParameters) { + Set<Map.Entry<VdcParameter, Serializable>> paramsSet = parameters.entrySet(); + List<VdcParameter> paramNames = new ArrayList<VdcParameter>(); + for (Map.Entry<VdcParameter, Serializable> param : paramsSet) { + paramNames.add(param.getKey()); + try { + if (!Class.forName(param.getKey().getJavaType()).isAssignableFrom(param.getValue().getClass())) { + throw new InvalidParameterValueException(param.getKey().getName(), param.getKey().getJavaType(), param.getValue().getClass().getName()); + } + } catch (ClassNotFoundException e) { + throw new InvalidParameterValueException(param.getKey().getName(), param.getKey().getJavaType()); + } + } + if (requiredParameters.isEmpty()) { + return true; + } + if (!paramNames.containsAll(requiredParameters)) { + List<VdcParameter> copy = new ArrayList(requiredParameters); + copy.removeAll(paramNames); + throw new RequiredParametersMissingException(copy); + } + paramNames.removeAll(requiredParameters); + paramNames.removeAll(commonParameters); + paramNames.removeAll(optionalParameters); + if (paramNames.size() > 0) { + StringBuilder buf = new StringBuilder(""); + for (VdcParameter param : paramNames) { + if (buf.length() > 0) { + buf.append(" ,"); + } + buf.append(param.getName()); + } + log.warnFormat("Unknown parameters {0} found in command.", buf.toString()); + } + return true; + } + +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/InvalidParameterValueException.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/InvalidParameterValueException.java index 0d916de..59d86b4 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/InvalidParameterValueException.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/InvalidParameterValueException.java @@ -2,11 +2,15 @@ public class InvalidParameterValueException extends IllegalArgumentException { - public InvalidParameterValueException(String expected, String actual) { - super("Invalid value for VdcQueryParametersBase.addParameter. Expected value of type " - + expected - + " but actual class was " - + actual); + public InvalidParameterValueException(String paramName, String expected, String actual) { + super("Invalid value for parameter "+ paramName + + ". Expected value of type " + expected + + " but actual class was " + actual); + } + + public InvalidParameterValueException(String paramName, String className) { + super("Invalid value for parameter "+ paramName + + ". Could not load class " + className); } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/RequiredParametersMissingException.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/RequiredParametersMissingException.java new file mode 100644 index 0000000..026c4a6 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/RequiredParametersMissingException.java @@ -0,0 +1,9 @@ +package org.ovirt.engine.core.common.utils; + +import java.util.List; + +public class RequiredParametersMissingException extends RuntimeException { + public RequiredParametersMissingException(List<VdcParameter> missingParams) { + super("Required parameters missing for command " + missingParams); + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/VdcParameterHelper.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/VdcParameterHelper.java index d4dac73..5235d0f 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/VdcParameterHelper.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/VdcParameterHelper.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.List; + import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.compat.TransactionScopeOption; @@ -44,4 +45,5 @@ put(CoreVdcParameters.REFRESH, true). put(CoreVdcParameters.REFRESH, false); } + } -- To view, visit http://gerrit.ovirt.org/21485 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I15566c9177da28b2d47bbb6018fbfb61defcf3da Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Ravi Nori <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
