gnu-social/plugins/LRDD/extlib/XML/XRD/Loader/JSON.php

188 lines
4.7 KiB
PHP

<?php
/**
* Part of XML_XRD
*
* PHP version 5
*
* @category XML
* @package XML_XRD
* @author Christian Weiske <cweiske@php.net>
* @license http://www.gnu.org/copyleft/lesser.html LGPL
* @link http://pear.php.net/package/XML_XRD
*/
/**
* Loads XRD data from a JSON file
*
* @category XML
* @package XML_XRD
* @author Christian Weiske <cweiske@php.net>
* @license http://www.gnu.org/copyleft/lesser.html LGPL
* @version Release: @package_version@
* @link http://pear.php.net/package/XML_XRD
*/
class XML_XRD_Loader_JSON
{
/**
* Data storage the XML data get loaded into
*
* @var XML_XRD
*/
protected $xrd;
/**
* Init object with xrd object
*
* @param XML_XRD $xrd Data storage the JSON data get loaded into
*/
public function __construct(XML_XRD $xrd)
{
$this->xrd = $xrd;
}
/**
* Loads the contents of the given file
*
* @param string $file Path to an JRD file
*
* @return void
*
* @throws XML_XRD_Loader_Exception When the JSON is invalid or cannot be
* loaded
*/
public function loadFile($file)
{
$json = file_get_contents($file);
if ($json === false) {
throw new XML_XRD_Loader_Exception(
'Error loading JRD file: ' . $file,
XML_XRD_Loader_Exception::LOAD
);
}
return $this->loadString($json);
}
/**
* Loads the contents of the given string
*
* @param string $json JSON string
*
* @return void
*
* @throws XML_XRD_Loader_Exception When the JSON is invalid or cannot be
* loaded
*/
public function loadString($json)
{
if ($json == '') {
throw new XML_XRD_Loader_Exception(
'Error loading JRD: string empty',
XML_XRD_Loader_Exception::LOAD
);
}
$obj = json_decode($json);
if ($obj !== null) {
return $this->load($obj);
}
$constants = get_defined_constants(true);
$json_errors = array();
foreach ($constants['json'] as $name => $value) {
if (!strncmp($name, 'JSON_ERROR_', 11)) {
$json_errors[$value] = $name;
}
}
throw new XML_XRD_Loader_Exception(
'Error loading JRD: ' . $json_errors[json_last_error()],
XML_XRD_Loader_Exception::LOAD
);
}
/**
* Loads the JSON object into the classes' data structures
*
* @param object $j JSON object containing the whole JSON document
*
* @return void
*/
public function load(stdClass $j)
{
if (isset($j->subject)) {
$this->xrd->subject = (string)$j->subject;
}
if (isset($j->aliases)) {
foreach ($j->aliases as $jAlias) {
$this->xrd->aliases[] = (string)$jAlias;
}
}
if (isset($j->links)) {
foreach ($j->links as $jLink) {
$this->xrd->links[] = $this->loadLink($jLink);
}
}
$this->loadProperties($this->xrd, $j);
if (isset($j->expires)) {
$this->xrd->expires = strtotime($j->expires);
}
}
/**
* Loads the Property elements from XML
*
* @param object $store Data store where the properties get stored
* @param object $j JSON element with "properties" variable
*
* @return boolean True when all went well
*/
protected function loadProperties(
XML_XRD_PropertyAccess $store, stdClass $j
) {
if (!isset($j->properties)) {
return true;
}
foreach ($j->properties as $type => $jProp) {
$store->properties[] = new XML_XRD_Element_Property(
$type, (string)$jProp
);
}
return true;
}
/**
* Create a link element object from XML element
*
* @param object $j JSON link object
*
* @return XML_XRD_Element_Link Created link object
*/
protected function loadLink(stdClass $j)
{
$link = new XML_XRD_Element_Link();
foreach (array('rel', 'type', 'href', 'template') as $var) {
if (isset($j->$var)) {
$link->$var = (string)$j->$var;
}
}
if (isset($j->titles)) {
foreach ($j->titles as $lang => $jTitle) {
if (!isset($link->titles[$lang])) {
$link->titles[$lang] = (string)$jTitle;
}
}
}
$this->loadProperties($link, $j);
return $link;
}
}
?>