/** * Unmarshall a DOMElement object corresponding to a QTI weight element. * * @param DOMElement $element A DOMElement object. * @return QtiComponent A Weight object. * @throws UnmarshallingException If the mandatory attributes 'identifier' or 'value' are missing from $element but also if 'value' cannot be converted to a float value or 'identifier' is not a valid QTI Identifier. */ protected function unmarshall(DOMElement $element) { // identifier is a mandatory value. if (($identifier = static::getDOMElementAttributeAs($element, 'identifier', 'string')) !== null) { if (($value = static::getDOMElementAttributeAs($element, 'value', 'string')) !== null) { if (Format::isFloat($value)) { try { $object = new Weight($identifier, floatval($value)); return $object; } catch (InvalidArgumentException $e) { $msg = "The value of 'identifier' from element '" . $element->localName . "' is not a valid QTI Identifier."; throw new UnmarshallingException($msg, $element, $e); } } else { $msg = "The value of attribute 'value' from element '" . $element->localName . "' cannot be converted into a float."; throw new UnmarshallingException($msg, $element); } } else { $msg = "The mandatory attribute 'value' is missing from element '" . $element->localName . "'."; throw new UnmarshallingException($msg, $element); } } else { $msg = "The mandatory attribute 'identifier' is missing from element '" . $element->localName . "'."; throw new UnmarshallingException($msg, $element); } }
/** * @see \qtism\data\storage\xml\marshalling\OperatorMarshaller::unmarshallChildrenKnown() */ protected function unmarshallChildrenKnown(DOMElement $element, QtiComponentCollection $children) { $object = new Equal($children); if (($toleranceMode = static::getDOMElementAttributeAs($element, 'toleranceMode')) !== null) { $toleranceMode = ToleranceMode::getConstantByName($toleranceMode); $object->setToleranceMode($toleranceMode); } if (($tolerance = static::getDOMElementAttributeAs($element, 'tolerance')) !== null) { $tolerance = explode(" ", $tolerance); if (count($tolerance) < 1) { $msg = "No 'tolerance' could be extracted from element '" . $element->localName . "'."; throw new UnmarshallingException($msg, $element); } elseif (count($tolerance) > 2) { $msg = "'tolerance' attribute not correctly formatted in element '" . $element->localName . "'."; throw new UnmarshallingException($msg, $element); } else { $finalTolerance = array(); foreach ($tolerance as $t) { $finalTolerance[] = Format::isFloat($t) ? floatval($t) : $t; } $object->setTolerance($finalTolerance); } } if (($includeLowerBound = static::getDOMElementAttributeAs($element, 'includeLowerBound', 'boolean')) !== null) { $object->setIncludeLowerBound($includeLowerBound); } if (($includeUpperBound = static::getDOMElementAttributeAs($element, 'includeUpperBound', 'boolean')) !== null) { $object->setIncludeUpperBound($includeUpperBound); } return $object; }
/** * Transform a string representing a QTI valueType value in a * the correct datatype. * * @param string $string The QTI valueType value as a string. * @param integer $baseType The QTI baseType that defines the datatype of $string. * @return mixed A converted object/primitive type. * @throws \InvalidArgumentException If $baseType is not a value from the BaseType enumeration. * @throws \UnexpectedValueException If $string cannot be transformed in a Value expression with the given $baseType. */ public static function stringToDatatype($string, $baseType) { if (in_array($baseType, BaseType::asArray())) { $value = null; switch ($baseType) { case BaseType::BOOLEAN: if (Format::isBoolean($string)) { $value = Format::toLowerTrim($string) == 'true' ? true : false; return $value; } else { $msg = "'{$string}' cannot be transformed into boolean."; throw new UnexpectedValueException($msg); } break; case BaseType::INTEGER: if (Format::isInteger($string)) { $value = intval($string); return $value; } else { $msg = "'{$string}' cannot be transformed into integer."; throw new UnexpectedValueException($msg); } break; case BaseType::FLOAT: if (Format::isFloat($string)) { $value = floatval($string); return $value; } else { $msg = "'{$string}' cannot be transformed into float."; throw new UnexpectedValueException($msg); } break; case BaseType::URI: if (Format::isUri($string)) { return $string; } else { $msg = "'{$string}' is not a valid URI."; throw new UnexpectedValueException($msg); } break; case BaseType::IDENTIFIER: if (Format::isIdentifier($string)) { return $string; } else { $msg = "'{$string}' is not a valid QTI Identifier."; throw new UnexpectedValueException($msg); } break; case BaseType::INT_OR_IDENTIFIER: if (Format::isIdentifier($string)) { return $string; } elseif (Format::isInteger($string)) { return intval($string); } else { $msg = "'{$string}' is not a valid QTI Identifier nor a valid integer."; throw new UnexpectedValueException($msg); } break; case BaseType::PAIR: if (Format::isPair($string)) { $pair = explode(" ", $string); return new Pair($pair[0], $pair[1]); } else { $msg = "'{$string}' is not a valid pair."; throw new UnexpectedValueException($msg); } break; case BaseType::DIRECTED_PAIR: if (Format::isDirectedPair($string)) { $pair = explode(" ", $string); return new DirectedPair($pair[0], $pair[1]); } else { $msg = "'{$string}' is not a valid directed pair."; throw new UnexpectedValueException($msg); } break; case BaseType::DURATION: if (Format::isDuration($string)) { return new Duration($string); } else { $msg = "'{$string}' is not a valid duration."; throw new UnexpectedValueException($msg); } break; case BaseType::FILE: throw new \RuntimeException("Unsupported baseType: file."); break; case BaseType::STRING: return '' . $string; break; case BaseType::POINT: if (Format::isPoint($string)) { $parts = explode(" ", $string); return new Point(intval($parts[0]), intval($parts[1])); } else { $msg = "'{$string}' is not valid point."; throw new UnexpectedValueException($msg); } break; default: throw new \RuntimeException("Unknown baseType."); break; } } else { $msg = "BaseType must be a value from the BaseType enumeration."; throw new InvalidArgumentException($msg); } }