/**
  * Unmarshall a QTI repeat operator element into a Repeat object.
  *
  * @param DOMElement The repeat element to unmarshall.
  * @param QtiComponentCollection A collection containing the child Expression objects composing the Operator.
  * @return QtiComponent A Repeat object.
  * @throws UnmarshallingException
  */
 protected function unmarshallChildrenKnown(DOMElement $element, QtiComponentCollection $children)
 {
     if (($numberRepeats = static::getDOMElementAttributeAs($element, 'numberRepeats')) !== null) {
         if (Format::isInteger($numberRepeats)) {
             $numberRepeats = intval($numberRepeats);
         }
         $object = new Repeat($children, $numberRepeats);
         return $object;
     } else {
         $msg = "The mandatory attribute 'numberRepeats' is missing from element '" . $element->localName . "'.";
         throw new UnmarshallingException($msg, $element);
     }
 }
Esempio n. 2
0
 /**
  * @see \qtism\data\storage\xml\marshalling\OperatorMarshaller::unmarshallChildrenKnown()
  */
 protected function unmarshallChildrenKnown(DOMElement $element, QtiComponentCollection $children)
 {
     if (($figures = static::getDOMElementAttributeAs($element, 'figures')) !== null) {
         if (Format::isInteger($figures)) {
             $figures = intval($figures);
         }
         $object = new EqualRounded($children, $figures);
         if (($roundingMode = static::getDOMElementAttributeAs($element, 'roundingMode')) !== null) {
             $object->setRoundingMode(RoundingMode::getConstantByName($roundingMode));
         }
         return $object;
     } else {
         $msg = "The mandatory attribute 'figures' is missing from element '" . $element->localName . "'.";
         throw new UnmarshallingException($msg, $element);
     }
 }
 /**
  * Unmarshall a QTI anyN operator element into an AnyN object.
  *
  * @param DOMElement The anyN element to unmarshall.
  * @param QtiComponentCollection A collection containing the child Expression objects composing the Operator.
  * @return QtiComponent An AnyN object.
  * @throws UnmarshallingException
  */
 protected function unmarshallChildrenKnown(DOMElement $element, QtiComponentCollection $children)
 {
     if (($min = static::getDOMElementAttributeAs($element, 'min')) !== null) {
         if (Format::isInteger($min)) {
             $min = intval($min);
         }
         if (($max = static::getDOMElementAttributeAs($element, 'max')) !== null) {
             if (Format::isInteger($max)) {
                 $max = intval($max);
             }
             $object = new AnyN($children, $min, $max);
             return $object;
         } else {
             $msg = "The mandatory attribute 'max' is missing from element '" . $element->localName . "'.";
             throw new UnmarshallingException($msg, $element);
         }
     } else {
         $msg = "The mandatory attribute 'min' is missing from element '" . $element->localName . "'.";
         throw new UnmarshallingException($msg, $element);
     }
 }
 /**
  * Unmarshall a DOMElement object corresponding to a printedVariable element.
  * 
  * @param DOMElement $element A DOMElement object.
  * @return QtiComponent A PrintedVariable object.
  * @throws UnmarshallingException
  */
 protected function unmarshall(DOMElement $element)
 {
     if (($identifier = self::getDOMElementAttributeAs($element, 'identifier')) !== null) {
         $component = new PrintedVariable($identifier);
         if (($format = self::getDOMElementAttributeAs($element, 'format')) !== null) {
             $component->setFormat($format);
         }
         if (($powerForm = self::getDOMElementAttributeAs($element, 'powerForm', 'boolean')) !== null) {
             $component->setPowerForm($powerForm);
         }
         if (($base = self::getDOMElementAttributeAs($element, 'base')) !== null) {
             $component->setBase(Format::isInteger($base) === true ? intval($base) : $base);
         }
         if (($index = self::getDOMElementAttributeAs($element, 'index')) !== null) {
             $component->setIndex(Format::isInteger($index) === true ? intval($index) : $base);
         }
         if (($delimiter = self::getDOMElementAttributeAs($element, 'delimiter')) !== null) {
             $component->setDelimiter($delimiter);
         }
         if (($field = self::getDOMElementAttributeAs($element, 'field')) !== null) {
             $component->setField($field);
         }
         if ($mappingIndicator = self::getDOMElementAttributeAs($element, 'mappingIndicator')) {
             $component->setMappingIndicator($mappingIndicator);
         }
         if (($xmlBase = self::getXmlBase($element)) !== false) {
             $component->setXmlBase($xmlBase);
         }
         self::fillBodyElement($component, $element);
         return $component;
     } else {
         $msg = "The mandatory 'identifier' attribute is missing from the 'printedVariable' element.";
         throw new UnmarshallingException($msg, $element);
     }
 }
 /**
  * Unmarshall a DOMElement object corresponding to an positionObjectInteraction element.
  * 
  * @param DOMElement $element A DOMElement object.
  * @return QtiComponent A PositionObjectInteraction object.
  * @throws UnmarshallingException
  */
 protected function unmarshall(DOMElement $element)
 {
     if (($responseIdentifier = self::getDOMElementAttributeAs($element, 'responseIdentifier')) !== null) {
         $objectElts = self::getChildElementsByTagName($element, 'object');
         if (count($objectElts) > 0) {
             $object = $this->getMarshallerFactory()->createMarshaller($objectElts[0])->unmarshall($objectElts[0]);
             $component = new PositionObjectInteraction($responseIdentifier, $object);
             if (($maxChoices = self::getDOMElementAttributeAs($element, 'maxChoices', 'integer')) !== null) {
                 $component->setMaxChoices($maxChoices);
             }
             if (($minChoices = self::getDOMElementAttributeAs($element, 'minChoices', 'integer')) !== null) {
                 $component->setMinChoices($minChoices);
             }
             if (($centerPoint = self::getDOMElementAttributeAs($element, 'centerPoint')) !== null) {
                 $points = explode(" ", $centerPoint);
                 $pointsCount = count($points);
                 if ($pointsCount === 2) {
                     if (Format::isInteger($points[0]) === true) {
                         if (Format::isInteger($points[1]) === true) {
                             $component->setCenterPoint(new Point(intval($points[0]), intval($points[1])));
                         } else {
                             $msg = "The 2nd integer of the 'centerPoint' attribute value is not a valid integer for element 'positionObjectInteraction'.";
                             throw new UnmarshallingException($msg, $element);
                         }
                     } else {
                         $msg = "The 1st value of the 'centerPoint' attribute value is not a valid integer for element 'positionObjectInteraction'.";
                         throw new UnmarshallingException($msg, $element);
                     }
                 } else {
                     $msg = "The value of the 'centePoint' attribute of a 'positionObjectInteraction' element must be composed of exactly 2 integer values, {$pointsCount} given.";
                     throw new UnmarshallingException($msg, $element);
                 }
             }
             self::fillBodyElement($component, $element);
             return $component;
         } else {
             $msg = "A 'positionObjectInteraction' element must contain exactly one 'object' element, none given.";
             throw new UnmarshallingException($msg, $element);
         }
     } else {
         $msg = "The mandatory 'responseIdentifier' attribute is missing from the 'positionObjectInteraction' object.";
         throw new UnmarshallingException($msg, $element);
     }
 }
Esempio n. 6
0
 /**
  * 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);
     }
 }