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

157 lines
4.2 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
*/
require_once 'XML/XRD/Loader/Exception.php';
/**
* File/string loading dispatcher.
* Loads the correct loader for the type of XRD file (XML or JSON).
* Also provides type auto-detection.
*
* @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
{
public function __construct(XML_XRD $xrd)
{
$this->xrd = $xrd;
}
/**
* Loads the contents of the given file.
*
* Note: Only use file type auto-detection for local files.
* Do not use it on remote files as the file gets requested several times.
*
* @param string $file Path to an XRD file
* @param string $type File type: xml or json, NULL for auto-detection
*
* @return void
*
* @throws XML_XRD_Loader_Exception When the file is invalid or cannot be
* loaded
*/
public function loadFile($file, $type = null)
{
if ($type === null) {
$type = $this->detectTypeFromFile($file);
}
$loader = $this->getLoader($type);
$loader->loadFile($file);
}
/**
* Loads the contents of the given string
*
* @param string $str XRD string
* @param string $type File type: xml or json, NULL for auto-detection
*
* @return void
*
* @throws XML_XRD_Loader_Exception When the string is invalid or cannot be
* loaded
*/
public function loadString($str, $type = null)
{
if ($type === null) {
$type = $this->detectTypeFromString($str);
}
$loader = $this->getLoader($type);
$loader->loadString($str);
}
/**
* Creates a XRD loader object for the given type
*
* @param string $type File type: xml or json
*
* @return XML_XRD_Loader
*/
protected function getLoader($type)
{
$class = 'XML_XRD_Loader_' . strtoupper($type);
$file = str_replace('_', '/', $class) . '.php';
include_once $file;
if (class_exists($class)) {
return new $class($this->xrd);
}
throw new XML_XRD_Loader_Exception(
'No loader for XRD type "' . $type . '"',
XML_XRD_Loader_Exception::NO_LOADER
);
}
/**
* Tries to detect the file type (xml or json) from the file content
*
* @param string $file File name to check
*
* @return string File type ('xml' or 'json')
*
* @throws XML_XRD_Loader_Exception When opening the file fails.
*/
public function detectTypeFromFile($file)
{
if (!file_exists($file)) {
throw new XML_XRD_Loader_Exception(
'Error loading XRD file: File does not exist',
XML_XRD_Loader_Exception::OPEN_FILE
);
}
$handle = fopen($file, 'r');
if (!$handle) {
throw new XML_XRD_Loader_Exception(
'Cannot open file to determine type',
XML_XRD_Loader_Exception::OPEN_FILE
);
}
$str = (string)fgets($handle, 10);
fclose($handle);
return $this->detectTypeFromString($str);
}
/**
* Tries to detect the file type from the content of the file
*
* @param string $str Content of XRD file
*
* @return string File type ('xml' or 'json')
*
* @throws XML_XRD_Loader_Exception When the type cannot be detected
*/
public function detectTypeFromString($str)
{
if (substr($str, 0, 1) == '{') {
return 'json';
} else if (substr($str, 0, 5) == '<?xml') {
return 'xml';
}
throw new XML_XRD_Loader_Exception(
'Detecting file type failed',
XML_XRD_Loader_Exception::DETECT_TYPE
);
}
}
?>