private function assertValidProperty(PropertyInterface $property)
{
$type = $property->getType();
switch ($type) {
case PropertyType::NAME:
$values = $property->getValue();
if (!$property->isMultiple()) {
$values = array($values);
}
foreach ($values as $value) {
$pos = strpos($value, ':');
if (false !== $pos) {
$prefix = substr($value, 0, $pos);
if (!isset($this->namespaces[$prefix])) {
throw new ValueFormatException(sprintf('Invalid value for NAME property type at "%s", the namespace prefix "%s" does not exist.");', $property->getPath(), $prefix));
}
}
}
break;
case PropertyType::PATH:
$values = $property->getValue();
if (!$property->isMultiple()) {
$values = array($values);
}
foreach ($values as $value) {
try {
// making the path absolute also validates the result to be a valid path
PathHelper::absolutizePath($value, $property->getPath());
} catch (RepositoryException $e) {
throw new ValueFormatException(sprintf('Value "%s" for PATH property at "%s" is invalid', $value, $property->getPath()), 0, $e);
}
}
break;
case PropertyType::URI:
$values = $property->getValue();
if (!$property->isMultiple()) {
$values = array($values);
}
foreach ($values as $value) {
if (!preg_match(self::VALIDATE_URI_RFC3986, $value)) {
throw new ValueFormatException(sprintf('Invalid value "%s" for URI property at "%s". Value has to comply with RFC 3986.', $value, $property->getPath()));
}
}
break;
case PropertyType::DECIMAL:
case PropertyType::STRING:
$values = (array) $property->getValue();
foreach ($values as $value) {
if (0 !== preg_match(self::VALIDATE_STRING, $value)) {
throw new ValueFormatException(sprintf('Invalid character detected in value %s for STRING property at "%s".', json_encode($value), $property->getPath()));
}
}
break;
}
}