157 lines
4.2 KiB
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
|
||
|
);
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
?>
|