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

Reply via email to