/**
  * Validates the given data value using the given data type.
  *
  * @param DataValue $dataValue
  * @param string    $dataTypeId
  *
  * @return Result
  */
 public function validateDataValue(DataValue $dataValue, $dataTypeId)
 {
     try {
         $dataValueType = $this->dataTypeFactory->getType($dataTypeId)->getDataValueType();
     } catch (OutOfBoundsException $ex) {
         return Result::newError(array(Error::newError('Bad data type: ' . $dataTypeId, null, 'bad-data-type', array($dataTypeId))));
     }
     if ($dataValue instanceof UnDeserializableValue) {
         return Result::newError(array(Error::newError('Bad snak value: ' . $dataValue->getReason(), null, 'bad-value', array($dataValue->getReason()))));
     } elseif ($dataValueType != $dataValue->getType()) {
         return Result::newError(array(Error::newError('Bad value type: ' . $dataValue->getType() . ', expected ' . $dataValueType, null, 'bad-value-type', array($dataValue->getType(), $dataValueType))));
     }
     $result = Result::newSuccess();
     //XXX: DataTypeValidatorFactory should expose only one validator, which would be a CompositeValidator
     foreach ($this->validatorFactory->getValidators($dataTypeId) as $validator) {
         $subResult = $validator->validate($dataValue);
         //XXX: Some validators should be fatal and cause us to abort the loop.
         //     Others shouldn't.
         if (!$subResult->isValid()) {
             //TODO: Don't bail out immediately. Accumulate errors from all validators.
             //      We need Result::merge() for this.
             return $subResult;
         }
     }
     return $result;
 }
 /**
  * @return ValueValidator
  */
 private function getValidator()
 {
     $params = $this->extractRequestParams();
     $name = $params['datatype'];
     if (empty($name)) {
         // 'datatype' parameter is required for validation.
         $this->errorReporter->dieError('No datatype given', 'param-illegal');
     }
     // Note: For unknown datatype, we'll get an empty list.
     $validators = $this->dataTypeValidatorFactory->getValidators($name);
     return $this->wrapValidators($validators);
 }