Files
CloudObjects-PHP-SDK/CloudObjects/SDK/NodeReader.php

364 lines
12 KiB
PHP

<?php
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
namespace CloudObjects\SDK;
use ML\JsonLD\Node;
use ML\IRI\IRI;
/**
* The NodeReader provides some convenience methods for reading information
* from an object graph node.
*/
class NodeReader {
private $prefixes = [];
public function __construct(array $options = []) {
if (isset($options['prefixes']))
$this->prefixes = $options['prefixes'];
}
private function expand($uri) {
if (!is_string($uri)) $uri = (string)$uri;
$scheme = parse_url($uri, PHP_URL_SCHEME);
if (isset($scheme) && isset($this->prefixes[$scheme]))
return str_replace($scheme.':', $this->prefixes[$scheme], $uri);
else
return $uri;
}
/**
* Checks whether a node has a certain type.
*
* @param Node $node The node to work on.
* @param string|object $type The type to check for.
* @return boolean
*/
public function hasType(Node $node = null, $type) {
if (!isset($node))
return false;
$type = $this->expand($type);
$typesFromNode = $node->getType();
if (!isset($typesFromNode))
return false;
if (is_array($typesFromNode)) {
foreach ($typesFromNode as $t)
if (is_a($t, 'ML\JsonLD\Node')
&& $t->getId() == $type)
return true;
} else
if (is_a($typesFromNode, 'ML\JsonLD\Node')
&& $typesFromNode->getId() == $type)
return true;
else
return false;
return false;
}
private function getFirstValue(Node $node = null, $property, $default = null) {
if (!isset($node))
return $default;
$valueFromNode = $node->getProperty($this->expand($property));
if (!isset($valueFromNode))
return $default;
if (is_array($valueFromNode))
return $valueFromNode[0];
return $valueFromNode;
}
/**
* Reads a property from a node and converts it into a string.
* If the property has multiple values only the first is returned.
* If no value is found or the node is null, the default is returned.
*
* @param Node $node The node to work on.
* @param string|object $property The property to read.
* @param $default The default that is returned if no value for the property exists on the node.
* @return string|null
*/
public function getFirstValueString(Node $node = null, $property, $default = null) {
$valueFromNode = $this->getFirstValue($node, $property, $default);
if ($valueFromNode == $default)
return $default;
if (is_a($valueFromNode, 'ML\JsonLD\Node'))
return $valueFromNode->getId();
else
return $valueFromNode->getValue();
}
/**
* Reads a property from a node and converts it into a boolean.
* If the property has multiple values only the first is returned.
* If no value is found or the node is null, the default is returned.
*
* @param Node $node The node to work on.
* @param string|object $property The property to read.
* @param $default The default that is returned if no value for the property exists on the node.
* @return bool|null
*/
public function getFirstValueBool(Node $node = null, $property, $default = null) {
return (in_array(
$this->getFirstValueString($node, $property, $default),
[ '1', 'true' ]
));
}
/**
* Reads a property from a node and converts it into an integer.
* If the property has multiple values only the first is returned.
* If no value is found or the node is null, the default is returned.
*
* @param Node $node The node to work on.
* @param string|object $property The property to read.
* @param $default The default that is returned if no value for the property exists on the node.
* @return int|null
*/
public function getFirstValueInt(Node $node = null, $property, $default = null) {
$value = $this->getFirstValueString($node, $property);
if (is_numeric($value))
return (int)($value);
return $default;
}
/**
* Reads a property from a node and converts it into an float.
* If the property has multiple values only the first is returned.
* If no value is found or the node is null, the default is returned.
*
* @param Node $node The node to work on.
* @param string|object $property The property to read.
* @param $default The default that is returned if no value for the property exists on the node.
* @return float|null
*/
public function getFirstValueFloat(Node $node = null, $property, $default = null) {
$value = $this->getFirstValueString($node, $property);
if (is_numeric($value))
return (float)($value);
return $default;
}
/**
* Reads a property from a node and converts it into a IRI.
* If the property has multiple values only the first is returned.
* If no value is found, value is a literal or the node is null, the default is returned.
*
* @param Node $node The node to work on.
* @param string|object $property The property to read.
* @param $default The default that is returned if no value for the property exists on the node.
* @return string|null
*/
public function getFirstValueIRI(Node $node = null, $property, IRI $default = null) {
$valueFromNode = $this->getFirstValue($node, $property, $default);
if ($valueFromNode == $default)
return $default;
if (is_a($valueFromNode, 'ML\JsonLD\Node'))
return new IRI($valueFromNode->getId());
else
return $default;
}
/**
* Reads a property from a node and returns it as a Node.
* If the property has multiple values only the first is returned.
* If no value is found, value is a literal or the node is null, the default is returned.
*
* @param Node $node The node to work on.
* @param string|object $property The property to read.
* @param $default The default that is returned if no value for the property exists on the node.
* @return string|null
*/
public function getFirstValueNode(Node $node = null, $property, Node $default = null) {
$valueFromNode = $this->getFirstValue($node, $property, $default);
if ($valueFromNode == $default)
return $default;
if (is_a($valueFromNode, 'ML\JsonLD\Node'))
return $valueFromNode;
else
return $default;
}
/**
* Checks whether a node has a specific value for a property.
*
* @param Node $node The node to work on.
* @param string|object $property The property to read.
* @param string|object $value The expected value.
* @return boolean
*/
public function hasPropertyValue(Node $node = null, $property, $value) {
if (!isset($node))
return false;
$valuesFromNode = $node->getProperty($this->expand($property));
if (!isset($valuesFromNode))
return false;
if (!is_array($valuesFromNode))
$valuesFromNode = array($valuesFromNode);
foreach ($valuesFromNode as $v) {
if (is_a($v, 'ML\JsonLD\Node')) {
if ($v->getId() == $this->expand($value))
return true;
} else {
if ($v->getValue() == $value)
return true;
}
}
return false;
}
/**
* Checks whether the node has at least one value for a property.
*
* @param Node $node The node to work on.
* @param string|object $property The property to read.
* @return boolean
*/
public function hasProperty(Node $node = null, $property) {
if (!isset($node))
return false;
return ($node->getProperty($this->expand($property)) != null);
}
private function getAllValues(Node $node = null, $property) {
if (!isset($node))
return [];
$valueFromNode = $node->getProperty($this->expand($property));
if (!isset($valueFromNode))
return [];
if (!is_array($valueFromNode))
$valueFromNode = [$valueFromNode];
return $valueFromNode;
}
/**
* Get the language-tagged-string for the property in the specified language.
* If no value is found for the specified language, the default is returned.
*/
public function getLocalizedString(Node $node = null, $property, $language, $default = null) {
$values = $this->getAllValues($node, $property);
foreach ($values as $v) {
if (is_a($v, 'ML\JsonLD\LanguageTaggedString') && $v->getLanguage() == $language)
return $v->getValue();
}
return $default;
}
/**
* Reads all values from a node and returns them as a string array.
*
* @param Node $node The node to work on.
* @param string|object $property The property to read.
* @return array<string>
*/
public function getAllValuesString(Node $node = null, $property) {
$allValues = $this->getAllValues($node, $property);
$output = [];
foreach ($allValues as $a)
if (is_a($a, 'ML\JsonLD\Node'))
$output[] = $a->getId();
else
$output[] = $a->getValue();
return $output;
}
/**
* Reads all values from a node and returns them as a boolean array.
*
* @param Node $node The node to work on.
* @param string|object $property The property to read.
* @return array<bool>
*/
public function getAllValuesBool(Node $node = null, $property) {
$allValues = $this->getAllValuesString($node, $property);
$output = [];
foreach ($allValues as $a)
$output = in_array($a, [ '1', 'true' ]);
return $output;
}
/**
* Reads all values from a node and returns them as an integer array.
*
* @param Node $node The node to work on.
* @param string|object $property The property to read.
* @return array<bool>
*/
public function getAllValuesInt(Node $node = null, $property) {
$allValues = $this->getAllValuesString($node, $property);
$output = [];
foreach ($allValues as $a)
$output = (int)$a;
return $output;
}
/**
* Reads all values from a node and returns them as a float array.
*
* @param Node $node The node to work on.
* @param string|object $property The property to read.
* @return array<bool>
*/
public function getAllValuesFloat(Node $node = null, $property) {
$allValues = $this->getAllValuesString($node, $property);
$output = [];
foreach ($allValues as $a)
$output = (float)$a;
return $output;
}
/**
* Reads all values from a node and returns them as a IRI array.
* Only converts the Node IDs of nodes into IRI, literal values are skipped.
*
* @param Node $node The node to work on.
* @param string|object $property The property to read.
* @return array<IRI>
*/
public function getAllValuesIRI(Node $node = null, $property) {
$allValues = $this->getAllValues($node, $property);
$output = [];
foreach ($allValues as $a)
if (is_a($a, 'ML\JsonLD\Node'))
$output[] = new IRI($a->getId());
return $output;
}
/**
* Reads all values from a node and returns them as a Node array.
* Returns only nodes, literal values are skipped.
*
* @param Node $node The node to work on.
* @param string|object $property The property to read.
* @return array<Node>
*/
public function getAllValuesNode(Node $node = null, $property) {
$allValues = $this->getAllValues($node, $property);
$output = [];
foreach ($allValues as $a)
if (is_a($a, 'ML\JsonLD\Node'))
$output[] = $a;
return $output;
}
}