Minor dependency updates
[yaffs-website] / vendor / easyrdf / easyrdf / lib / EasyRdf / Parser / Json.php
1 <?php
2
3 /**
4  * EasyRdf
5  *
6  * LICENSE
7  *
8  * Copyright (c) 2009-2013 Nicholas J Humfrey.  All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright notice,
15  *    this list of conditions and the following disclaimer in the documentation
16  *    and/or other materials provided with the distribution.
17  * 3. The name of the author 'Nicholas J Humfrey" may be used to endorse or
18  *    promote products derived from this software without specific prior
19  *    written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * @package    EasyRdf
34  * @copyright  Copyright (c) 2009-2013 Nicholas J Humfrey
35  * @license    http://www.opensource.org/licenses/bsd-license.php
36  */
37
38 /**
39  * A pure-php class to parse RDF/JSON with no dependancies.
40  *
41  * http://n2.talis.com/wiki/RDF_JSON_Specification
42  * docs/appendix-a-rdf-formats-json.md
43  *
44  * @package    EasyRdf
45  * @copyright  Copyright (c) 2009-2013 Nicholas J Humfrey
46  * @license    http://www.opensource.org/licenses/bsd-license.php
47  */
48 class EasyRdf_Parser_Json extends EasyRdf_Parser_RdfPhp
49 {
50     private $jsonLastErrorExists = false;
51
52     /**
53      * Constructor
54      *
55      * @return object EasyRdf_Parser_Json
56      */
57     public function __construct()
58     {
59         $this->jsonLastErrorExists = function_exists('json_last_error');
60     }
61
62     /** Return the last JSON parser error as a string
63      *
64      * If json_last_error() is not available a generic message will be returned.
65      *
66      * @ignore
67      */
68     protected function jsonLastErrorString()
69     {
70         if ($this->jsonLastErrorExists) {
71             switch (json_last_error()) {
72                 case JSON_ERROR_NONE:
73                     return null;
74                 case JSON_ERROR_DEPTH:
75                     return "JSON Parse error: the maximum stack depth has been exceeded";
76                 case JSON_ERROR_STATE_MISMATCH:
77                     return "JSON Parse error: invalid or malformed JSON";
78                 case JSON_ERROR_CTRL_CHAR:
79                     return "JSON Parse error: control character error, possibly incorrectly encoded";
80                 case JSON_ERROR_SYNTAX:
81                     return "JSON Parse syntax error";
82                 case JSON_ERROR_UTF8:
83                     return "JSON Parse error: malformed UTF-8 characters, possibly incorrectly encoded";
84                 default:
85                     return "JSON Parse error: unknown";
86             }
87         } else {
88             return "JSON Parse error";
89         }
90     }
91
92     /** Parse the triple-centric JSON format, as output by libraptor
93      *
94      * http://librdf.org/raptor/api/serializer-json.html
95      *
96      * @ignore
97      */
98     protected function parseJsonTriples($data, $baseUri)
99     {
100         foreach ($data['triples'] as $triple) {
101             if ($triple['subject']['type'] == 'bnode') {
102                 $subject = $this->remapBnode($triple['subject']['value']);
103             } else {
104                 $subject = $triple['subject']['value'];
105             }
106
107             $predicate = $triple['predicate']['value'];
108
109             if ($triple['object']['type'] == 'bnode') {
110                 $object = array(
111                     'type' => 'bnode',
112                     'value' => $this->remapBnode($triple['object']['value'])
113                 );
114             } else {
115                 $object = $triple['object'];
116             }
117
118             $this->addTriple($subject, $predicate, $object);
119         }
120
121         return $this->tripleCount;
122     }
123
124     /**
125       * Parse RDF/JSON into an EasyRdf_Graph
126       *
127       * @param object EasyRdf_Graph $graph   the graph to load the data into
128       * @param string               $data    the RDF document data
129       * @param string               $format  the format of the input data
130       * @param string               $baseUri the base URI of the data being parsed
131       * @return integer             The number of triples added to the graph
132       */
133     public function parse($graph, $data, $format, $baseUri)
134     {
135         $this->checkParseParams($graph, $data, $format, $baseUri);
136
137         if ($format != 'json') {
138             throw new EasyRdf_Exception(
139                 "EasyRdf_Parser_Json does not support: $format"
140             );
141         }
142
143         $decoded = @json_decode(strval($data), true);
144         if ($decoded === null) {
145             throw new EasyRdf_Parser_Exception(
146                 $this->jsonLastErrorString()
147             );
148         }
149
150         if (array_key_exists('triples', $decoded)) {
151             return $this->parseJsonTriples($decoded, $baseUri);
152         } else {
153             return parent::parse($graph, $decoded, 'php', $baseUri);
154         }
155     }
156 }