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
							 | 
						||
| 
								 | 
							
								        );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								?>
							 |