protected function mapPropertyFromElement(\DOMElement $propertyNode, \stdClass $data)
{
$name = $propertyNode->getAttribute('sv:name');
$values = array();
$type = PropertyType::valueFromName($propertyNode->getAttribute('sv:type'));
foreach ($propertyNode->childNodes as $valueNode) {
switch ($type) {
case PropertyType::NAME:
case PropertyType::URI:
case PropertyType::WEAKREFERENCE:
case PropertyType::REFERENCE:
case PropertyType::PATH:
case PropertyType::DECIMAL:
case PropertyType::STRING:
$values[] = $valueNode->nodeValue;
break;
case PropertyType::BOOLEAN:
$values[] = (bool) $valueNode->nodeValue;
break;
case PropertyType::LONG:
$values[] = (int) $valueNode->nodeValue;
break;
case PropertyType::BINARY:
$values[] = (int) $valueNode->nodeValue;
break;
case PropertyType::DATE:
$date = $valueNode->nodeValue;
if ($date) {
$date = new \DateTime($date);
$date->setTimezone(new \DateTimeZone(date_default_timezone_get()));
// Jackalope expects a string, might make sense to refactor to allow \DateTime instances too
$date = $this->valueConverter->convertType($date, PropertyType::STRING);
}
$values[] = $date;
break;
case PropertyType::DOUBLE:
$values[] = (double) $valueNode->nodeValue;
break;
default:
throw new \InvalidArgumentException("Type with constant {$type} not found.");
}
}
switch ($type) {
case PropertyType::BINARY:
$data->{':' . $name} = $propertyNode->getAttribute('sv:multi-valued') ? $values : $values[0];
break;
default:
$data->{$name} = $propertyNode->getAttribute('sv:multi-valued') ? $values : $values[0];
$data->{':' . $name} = $type;
break;
}
}