public function getNodesByPathAsArray($paths, $class = 'Node', $typeFilter = null)
{
if (is_string($typeFilter)) {
$typeFilter = array($typeFilter);
}
$nodes = $fetchPaths = array();
foreach ($paths as $absPath) {
if (!empty($this->objectsByPath[$class][$absPath])) {
// Return it from memory if we already have it and type is correct
if ($typeFilter && !$this->matchNodeType($this->objectsByPath[$class][$absPath], $typeFilter)) {
// skip this node if it did not match a type filter
continue;
}
$nodes[$absPath] = $this->objectsByPath[$class][$absPath];
} else {
$nodes[$absPath] = '';
$fetchPaths[$absPath] = $this->getFetchPath($absPath, $class);
}
}
$userlandTypeFilter = false;
if (!empty($fetchPaths)) {
if ($typeFilter) {
if ($this->transport instanceof NodeTypeFilterInterface) {
$data = $this->transport->getNodesFiltered($fetchPaths, $typeFilter);
} else {
$data = $this->transport->getNodes($fetchPaths);
$userlandTypeFilter = true;
}
} else {
$data = $this->transport->getNodes($fetchPaths);
}
$inversePaths = array_flip($fetchPaths);
foreach ($data as $fetchPath => $item) {
// only add this node to the list if it was actually requested.
if (isset($inversePaths[$fetchPath])) {
// transform back to session paths from the fetch paths, in case of
// a pending move operation
$absPath = $inversePaths[$fetchPath];
$node = $this->getNodeByPath($absPath, $class, $item);
if ($userlandTypeFilter) {
if (null !== $typeFilter && !$this->matchNodeType($node, $typeFilter)) {
continue;
}
}
$nodes[$absPath] = $node;
unset($inversePaths[$fetchPath]);
} else {
// this is either a prefetched node that was not requested
// or it falls through the type filter. cache it.
// first undo eventual move operation
$parent = $fetchPath;
$relPath = '';
while ($parent) {
if (isset($inversePaths[$parent])) {
break;
}
if ('/' === $parent) {
$parent = false;
} else {
$parent = PathHelper::getParentPath($parent);
$relPath = '/' . PathHelper::getNodeName($parent) . $relPath;
}
}
if ($parent) {
$this->getNodeByPath($parent . $relPath, $class, $item);
}
}
}
// clean away the not found paths from the final result
foreach ($inversePaths as $absPath) {
unset($nodes[$absPath]);
}
}
return $nodes;
}