danielebarchiesi@4
|
1 <?php
|
danielebarchiesi@4
|
2
|
danielebarchiesi@4
|
3 /**
|
danielebarchiesi@4
|
4 * @file
|
danielebarchiesi@4
|
5 * Extends the RDF API of Drupal core to support more RDF seralizations formats
|
danielebarchiesi@4
|
6 * other RDF capabilities.
|
danielebarchiesi@4
|
7 */
|
danielebarchiesi@4
|
8
|
danielebarchiesi@4
|
9 /**
|
danielebarchiesi@4
|
10 * Path to the ARC2 PHP library.
|
danielebarchiesi@4
|
11 */
|
danielebarchiesi@4
|
12 if (module_exists('libraries')) {
|
danielebarchiesi@4
|
13 define('RDF_ARC2_PATH', libraries_get_path('ARC2') . '/arc');
|
danielebarchiesi@4
|
14 }
|
danielebarchiesi@4
|
15 else {
|
danielebarchiesi@4
|
16 define('RDF_ARC2_PATH', drupal_get_path('module', 'rdfx') . '/vendor/arc');
|
danielebarchiesi@4
|
17 }
|
danielebarchiesi@4
|
18
|
danielebarchiesi@4
|
19 /**
|
danielebarchiesi@4
|
20 * Implements hook_init().
|
danielebarchiesi@4
|
21 */
|
danielebarchiesi@4
|
22 function rdfx_init() {
|
danielebarchiesi@4
|
23 // Attempts to load the ARC2 library, if available.
|
danielebarchiesi@4
|
24 if (!class_exists('ARC2') && file_exists(RDF_ARC2_PATH . '/ARC2.php')) {
|
danielebarchiesi@4
|
25 @include_once RDF_ARC2_PATH . '/ARC2.php';
|
danielebarchiesi@4
|
26 }
|
danielebarchiesi@4
|
27 module_load_include('inc', 'rdfx', 'rdfx.terms');
|
danielebarchiesi@4
|
28 module_load_include('inc', 'rdfx', 'rdfx.import');
|
danielebarchiesi@4
|
29 module_load_include('inc', 'rdfx', 'rdfx.query');
|
danielebarchiesi@4
|
30 }
|
danielebarchiesi@4
|
31
|
danielebarchiesi@4
|
32 /*
|
danielebarchiesi@4
|
33 * Implements hook_permission().
|
danielebarchiesi@4
|
34 */
|
danielebarchiesi@4
|
35 function rdfx_permission() {
|
danielebarchiesi@4
|
36 return array(
|
danielebarchiesi@4
|
37 'administer rdf' => array(
|
danielebarchiesi@4
|
38 'title' => t('Administer RDF'),
|
danielebarchiesi@4
|
39 'description' => t('Configure and setup RDFx module.'),
|
danielebarchiesi@4
|
40 ),
|
danielebarchiesi@4
|
41 );
|
danielebarchiesi@4
|
42 }
|
danielebarchiesi@4
|
43
|
danielebarchiesi@4
|
44 /**
|
danielebarchiesi@4
|
45 * Implements hook_menu().
|
danielebarchiesi@4
|
46 */
|
danielebarchiesi@4
|
47 function rdfx_menu() {
|
danielebarchiesi@4
|
48 // @todo use access RDF data permission instead of access content.
|
danielebarchiesi@4
|
49 // $items['ns'] = array(
|
danielebarchiesi@4
|
50 // 'title' => 'Site vocabulary',
|
danielebarchiesi@4
|
51 // 'description' => 'RDF description of the site schema.',
|
danielebarchiesi@4
|
52 // 'page callback' => 'drupal_get_form',
|
danielebarchiesi@4
|
53 // 'access arguments' => array('access content'),
|
danielebarchiesi@4
|
54 // 'file' => 'rdfx.pages.inc',
|
danielebarchiesi@4
|
55 // );
|
danielebarchiesi@4
|
56 // Add config options to the Services block on the config page. RDF is not
|
danielebarchiesi@4
|
57 // technically a service, but neither is RSS. RDF and RSS are very closely
|
danielebarchiesi@4
|
58 // aligned.
|
danielebarchiesi@4
|
59 $config_base = array(
|
danielebarchiesi@4
|
60 'access arguments' => array('administer rdf'),
|
danielebarchiesi@4
|
61 'file' => 'rdfx.admin.inc',
|
danielebarchiesi@4
|
62 );
|
danielebarchiesi@4
|
63 $items['admin/config/services/rdf'] = array(
|
danielebarchiesi@4
|
64 'title' => 'RDF publishing settings',
|
danielebarchiesi@4
|
65 'description' => 'Configure how site content gets published in RDF.',
|
danielebarchiesi@4
|
66 'page callback' => 'rdfx_mapping_overview',
|
danielebarchiesi@4
|
67 ) + $config_base;
|
danielebarchiesi@4
|
68 $items['admin/config/services/rdf/mappings'] = array(
|
danielebarchiesi@4
|
69 'title' => 'RDF Mappings',
|
danielebarchiesi@4
|
70 'description' => 'Configure how site content gets published in RDF.',
|
danielebarchiesi@4
|
71 'page callback' => 'rdfx_mapping_overview',
|
danielebarchiesi@4
|
72 'type' => MENU_DEFAULT_LOCAL_TASK,
|
danielebarchiesi@4
|
73 ) + $config_base;
|
danielebarchiesi@4
|
74 $items['admin/config/services/rdf/namespaces'] = array(
|
danielebarchiesi@4
|
75 'title' => 'RDF namespaces',
|
danielebarchiesi@4
|
76 'description' => 'See all namespaces and their prefixes.',
|
danielebarchiesi@4
|
77 'page callback' => 'rdfx_admin_namespaces',
|
danielebarchiesi@4
|
78 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@4
|
79 ) + $config_base;
|
danielebarchiesi@4
|
80 return $items;
|
danielebarchiesi@4
|
81 }
|
danielebarchiesi@4
|
82
|
danielebarchiesi@4
|
83 /**
|
danielebarchiesi@4
|
84 * Implements hook_help().
|
danielebarchiesi@4
|
85 */
|
danielebarchiesi@4
|
86 function rdfx_help($path, $arg) {
|
danielebarchiesi@4
|
87 switch($path) {
|
danielebarchiesi@4
|
88 case 'admin/config/services/rdf/namespaces';
|
danielebarchiesi@4
|
89 return '<p>' . t('Manage the namespaces and associated prefixes used by the site. Prefixes allow URIs to be shortened in the form of <a href="http://en.wikipedia.org/wiki/CURIE">CURIEs</a> (Compact URIs). For example, the CURIE %curie represents the URI %uri.', array('%curie' => 'dc:title', '%uri' => 'http://purl.org/dc/terms/title')) . '</p>';
|
danielebarchiesi@4
|
90 case 'admin/config/services/rdf/mappings':
|
danielebarchiesi@4
|
91 if (module_exists('rdfui')) {
|
danielebarchiesi@4
|
92 $message = t('Manage RDF mappings for entity types and field bundles used throughout the site. Some mappings are not editable through the UI. See the core RDF mapping API !documentation to find out how to modify these mappings.', array('!documentation' => l('documentation', 'http://drupal.org/developing/api/rdf')));
|
danielebarchiesi@4
|
93 }
|
danielebarchiesi@4
|
94 else {
|
danielebarchiesi@4
|
95 $message = t('View RDF mappings for entity types and field bundles used throughout the site. Enabling the RDF UI module (bundled with RDFx) will allow you to configure many of these mappings.');
|
danielebarchiesi@4
|
96 }
|
danielebarchiesi@4
|
97 return '<p>' . $message . '</p>';
|
danielebarchiesi@4
|
98 }
|
danielebarchiesi@4
|
99 }
|
danielebarchiesi@4
|
100
|
danielebarchiesi@4
|
101 /**
|
danielebarchiesi@4
|
102 * Implements hook_theme().
|
danielebarchiesi@4
|
103 */
|
danielebarchiesi@4
|
104 function rdfx_theme() {
|
danielebarchiesi@4
|
105 return array(
|
danielebarchiesi@4
|
106 'rdfx_mapping_admin_overview' => array(
|
danielebarchiesi@4
|
107 'variables' => array('bundle' => array(), 'rdftype' => array(), 'real_fields' => array(), 'fake_fields' => array()),
|
danielebarchiesi@4
|
108 ),
|
danielebarchiesi@4
|
109 'rdfx_mapping_admin_overview_row' => array(
|
danielebarchiesi@4
|
110 'variables' => array('field' => array()),
|
danielebarchiesi@4
|
111 ),
|
danielebarchiesi@4
|
112 );
|
danielebarchiesi@4
|
113 }
|
danielebarchiesi@4
|
114
|
danielebarchiesi@4
|
115 function rdfx_get_rdf_model($type, $data) {
|
danielebarchiesi@4
|
116 // Loads entity and its metadata.
|
danielebarchiesi@4
|
117 $wrapper = entity_metadata_wrapper($type, $data);
|
danielebarchiesi@4
|
118 $entity = $wrapper->value();
|
danielebarchiesi@4
|
119
|
danielebarchiesi@4
|
120 $entity_uri = rdfx_resource_uri($type, $wrapper->getIdentifier());
|
danielebarchiesi@4
|
121 // Instantiates node resource as ARC2 class and set base and namespaces.
|
danielebarchiesi@4
|
122 $res = ARC2::getResource();
|
danielebarchiesi@4
|
123 $res->setUri($entity_uri);
|
danielebarchiesi@4
|
124 $res->base = url('', array('absolute' => TRUE));
|
danielebarchiesi@4
|
125 $res->ns = rdf_get_namespaces();
|
danielebarchiesi@4
|
126
|
danielebarchiesi@4
|
127 // Initializes ARC2 index.
|
danielebarchiesi@4
|
128 $index = array();
|
danielebarchiesi@4
|
129
|
danielebarchiesi@4
|
130 // Adds the RDF types of the resource if a mapping exists.
|
danielebarchiesi@4
|
131 if (!empty($entity->rdf_mapping['rdftype'])) {
|
danielebarchiesi@4
|
132 $index[$entity_uri]['rdf:type'] = $entity->rdf_mapping['rdftype'];
|
danielebarchiesi@4
|
133 }
|
danielebarchiesi@4
|
134
|
danielebarchiesi@4
|
135 foreach ($wrapper as $name => $property) {
|
danielebarchiesi@4
|
136 if ($property->access('view')) {
|
danielebarchiesi@4
|
137 try {
|
danielebarchiesi@4
|
138 if ($property instanceof EntityDrupalWrapper || $property instanceof EntityValueWrapper) {
|
danielebarchiesi@4
|
139 rdfx_add_statement($index, $entity_uri, $property, $wrapper, $name);
|
danielebarchiesi@4
|
140 }
|
danielebarchiesi@4
|
141 elseif ($property instanceof EntityListWrapper) {
|
danielebarchiesi@4
|
142 // Iterates through the list and add each of them as statement.
|
danielebarchiesi@4
|
143 $li_filtered = rdfx_property_access_filter($property);
|
danielebarchiesi@4
|
144 foreach ($li_filtered as $li_name => $li_property) {
|
danielebarchiesi@4
|
145 if ($li_property instanceof EntityDrupalWrapper || $li_property instanceof EntityValueWrapper) {
|
danielebarchiesi@4
|
146 rdfx_add_statement($index, $entity_uri, $li_property, $wrapper, $name);
|
danielebarchiesi@4
|
147 }
|
danielebarchiesi@4
|
148 }
|
danielebarchiesi@4
|
149 }
|
danielebarchiesi@4
|
150 elseif ($property instanceof EntityStructureWrapper) {
|
danielebarchiesi@4
|
151 // Entity Structure Wrapper exposes structural elements, such as
|
danielebarchiesi@4
|
152 // text format for fields. We are not interested in this, and adding
|
danielebarchiesi@4
|
153 // the additional information about values means you have to handle
|
danielebarchiesi@4
|
154 // values as blank nodes.
|
danielebarchiesi@4
|
155 $li_filtered = rdfx_property_access_filter($property);
|
danielebarchiesi@4
|
156 foreach ($li_filtered as $li_name => $li_property) {
|
danielebarchiesi@4
|
157 if ($li_property instanceof EntityDrupalWrapper || $li_property instanceof EntityValueWrapper) {
|
danielebarchiesi@4
|
158 // This assumes that all literals have a 'value' array element
|
danielebarchiesi@4
|
159 // and that all resources have a 'uri' array element.
|
danielebarchiesi@4
|
160 if ($li_name == 'value' || $li_name == 'uri'){
|
danielebarchiesi@4
|
161 rdfx_add_statement($index, $entity_uri, $li_property, $wrapper, $name);
|
danielebarchiesi@4
|
162 }
|
danielebarchiesi@4
|
163 }
|
danielebarchiesi@4
|
164 }
|
danielebarchiesi@4
|
165 }
|
danielebarchiesi@4
|
166 }
|
danielebarchiesi@4
|
167 catch (EntityMetadataWrapperException $e) {
|
danielebarchiesi@4
|
168 // Property not supported. Fail silently.
|
danielebarchiesi@4
|
169 }
|
danielebarchiesi@4
|
170 }
|
danielebarchiesi@4
|
171 }
|
danielebarchiesi@4
|
172
|
danielebarchiesi@4
|
173 // Expand all CURIEs and attach the index to the ARC2 resource.
|
danielebarchiesi@4
|
174 $res->index = $res->expandPNames($index);
|
danielebarchiesi@4
|
175 return $res;
|
danielebarchiesi@4
|
176 }
|
danielebarchiesi@4
|
177
|
danielebarchiesi@4
|
178 function rdfx_property_access_filter($wrapper) {
|
danielebarchiesi@4
|
179 $filtered = array();
|
danielebarchiesi@4
|
180 foreach ($wrapper as $name => $property) {
|
danielebarchiesi@4
|
181 if ($property->access('view')) {
|
danielebarchiesi@4
|
182 $filtered[$name] = $property;
|
danielebarchiesi@4
|
183 }
|
danielebarchiesi@4
|
184 }
|
danielebarchiesi@4
|
185 return $filtered;
|
danielebarchiesi@4
|
186 }
|
danielebarchiesi@4
|
187
|
danielebarchiesi@4
|
188 /**
|
danielebarchiesi@4
|
189 * Gets the predicates relating the property to the entity.
|
danielebarchiesi@4
|
190 */
|
danielebarchiesi@4
|
191 function rdfx_get_predicates(EntityMetadataWrapper $wrapper, $name) {
|
danielebarchiesi@4
|
192 $element = array();
|
danielebarchiesi@4
|
193 if ($wrapper instanceof EntityDrupalWrapper) {
|
danielebarchiesi@4
|
194 $entity = $wrapper->value();
|
danielebarchiesi@4
|
195 if (!empty($entity->rdf_mapping[$name])) {
|
danielebarchiesi@4
|
196 // Just make use of the first predicate for now.
|
danielebarchiesi@4
|
197 // @lin this support all predicates defined in the mapping.
|
danielebarchiesi@4
|
198 $predicates = $entity->rdf_mapping[$name]['predicates'];
|
danielebarchiesi@4
|
199 $element = $predicates;
|
danielebarchiesi@4
|
200 }
|
danielebarchiesi@4
|
201 }
|
danielebarchiesi@4
|
202 // For elements which don't have a mapping, expose them using a local
|
danielebarchiesi@4
|
203 // namespace. @todo site vocabulary.
|
danielebarchiesi@4
|
204 // This functionality is disabled by default as a lot of this data is
|
danielebarchiesi@4
|
205 // irrelevant for outsiders and might contains some data the site owner might
|
danielebarchiesi@4
|
206 // not want to expose.
|
danielebarchiesi@4
|
207 // @todo provide admin setting to enable this functionality.
|
danielebarchiesi@4
|
208 if (!isset($element) && variable_get('rdfx_include_unset_mappings', FALSE)) {
|
danielebarchiesi@4
|
209 $predicate = 'site:' . (is_numeric($name) ? 'item' : $name);
|
danielebarchiesi@4
|
210 $element = array($predicate);
|
danielebarchiesi@4
|
211 }
|
danielebarchiesi@4
|
212 return $element;
|
danielebarchiesi@4
|
213 }
|
danielebarchiesi@4
|
214
|
danielebarchiesi@4
|
215 /**
|
danielebarchiesi@4
|
216 * Adds an RDF statement between the entity and the property. These statements
|
danielebarchiesi@4
|
217 * can have either resource or literal objects.
|
danielebarchiesi@4
|
218 */
|
danielebarchiesi@4
|
219 function rdfx_add_statement(&$index, $uri, $property, EntityMetadataWrapper $wrapper, $name) {
|
danielebarchiesi@4
|
220 if ($property instanceof EntityDrupalWrapper) {
|
danielebarchiesi@4
|
221 // For referenced entities only add the resource's URI
|
danielebarchiesi@4
|
222 rdfx_add_resource($index, $uri, $property, $wrapper, $name);
|
danielebarchiesi@4
|
223 }
|
danielebarchiesi@4
|
224 elseif ($property instanceof EntityValueWrapper) {
|
danielebarchiesi@4
|
225 rdfx_add_literal($index, $uri, $property, $wrapper, $name);
|
danielebarchiesi@4
|
226 }
|
danielebarchiesi@4
|
227 }
|
danielebarchiesi@4
|
228
|
danielebarchiesi@4
|
229 /**
|
danielebarchiesi@4
|
230 * Adds a resource object.
|
danielebarchiesi@4
|
231 */
|
danielebarchiesi@4
|
232 function rdfx_add_resource(&$index, $uri, $property, EntityMetadataWrapper $wrapper, $name) {
|
danielebarchiesi@4
|
233 if ($id = $property->getIdentifier()) {
|
danielebarchiesi@4
|
234 $predicates = rdfx_get_predicates($wrapper, $name);
|
danielebarchiesi@4
|
235 $object_uri = rdfx_resource_uri($property->type(), $id);
|
danielebarchiesi@4
|
236 foreach ($predicates as $predicate) {
|
danielebarchiesi@4
|
237 $index[$uri][$predicate][] = $object_uri;
|
danielebarchiesi@4
|
238 }
|
danielebarchiesi@4
|
239 }
|
danielebarchiesi@4
|
240 }
|
danielebarchiesi@4
|
241
|
danielebarchiesi@4
|
242 /**
|
danielebarchiesi@4
|
243 * Adds a literal object.
|
danielebarchiesi@4
|
244 */
|
danielebarchiesi@4
|
245 function rdfx_add_literal(&$index, $uri, $property, EntityMetadataWrapper $wrapper, $name) {
|
danielebarchiesi@4
|
246 $predicates = rdfx_get_predicates($wrapper, $name);
|
danielebarchiesi@4
|
247 $object_value = $property->value();
|
danielebarchiesi@4
|
248
|
danielebarchiesi@4
|
249 // Extracts datatype and callback from the RDF mapping.
|
danielebarchiesi@4
|
250 $datatype = '';
|
danielebarchiesi@4
|
251 if ($wrapper instanceof EntityDrupalWrapper) {
|
danielebarchiesi@4
|
252 $entity = $wrapper->value();
|
danielebarchiesi@4
|
253 if (!empty($entity->rdf_mapping[$name]['datatype'])) {
|
danielebarchiesi@4
|
254 $datatype = $entity->rdf_mapping[$name]['datatype'];
|
danielebarchiesi@4
|
255 }
|
danielebarchiesi@4
|
256 if (!empty($entity->rdf_mapping[$name]['callback']) && function_exists($entity->rdf_mapping[$name]['callback'])) {
|
danielebarchiesi@4
|
257 $object_value = $entity->rdf_mapping[$name]['callback']($object_value);
|
danielebarchiesi@4
|
258 }
|
danielebarchiesi@4
|
259 }
|
danielebarchiesi@4
|
260
|
danielebarchiesi@4
|
261 foreach ($predicates as $predicate) {
|
danielebarchiesi@4
|
262 $index[$uri][$predicate][] = array(
|
danielebarchiesi@4
|
263 'value' => $object_value,
|
danielebarchiesi@4
|
264 'type' => 'literal',
|
danielebarchiesi@4
|
265 'datatype' => $datatype,
|
danielebarchiesi@4
|
266 );
|
danielebarchiesi@4
|
267 }
|
danielebarchiesi@4
|
268 }
|
danielebarchiesi@4
|
269
|
danielebarchiesi@4
|
270 /**
|
danielebarchiesi@4
|
271 * Returns the URI used for the given resource.
|
danielebarchiesi@4
|
272 */
|
danielebarchiesi@4
|
273 function rdfx_resource_uri($resource, $id) {
|
danielebarchiesi@4
|
274 return url($resource . '/' . $id, array('absolute' => TRUE));
|
danielebarchiesi@4
|
275 }
|
danielebarchiesi@4
|
276
|
danielebarchiesi@4
|
277 /**
|
danielebarchiesi@4
|
278 * Lists the RDF serializations format which will be integrated with RestWS.
|
danielebarchiesi@4
|
279 *
|
danielebarchiesi@4
|
280 * Does not implement hook_restws_format_info() because we need to override the
|
danielebarchiesi@4
|
281 * RDF serialization format to use our own ARC2 based serializer.
|
danielebarchiesi@4
|
282 */
|
danielebarchiesi@4
|
283 function _rdfx_serialization_formats() {
|
danielebarchiesi@4
|
284 $result['rdf'] = array(
|
danielebarchiesi@4
|
285 'label' => t('RDF/XML'),
|
danielebarchiesi@4
|
286 'class' => 'RDFxRestWSFormatRDFXML',
|
danielebarchiesi@4
|
287 'mime type' => 'application/rdf+xml',
|
danielebarchiesi@4
|
288 );
|
danielebarchiesi@4
|
289 $result['ttl'] = array(
|
danielebarchiesi@4
|
290 'label' => t('Turtle'),
|
danielebarchiesi@4
|
291 'class' => 'RDFxRestWSFormatTurtle',
|
danielebarchiesi@4
|
292 'mime type' => 'application/x-turtle',
|
danielebarchiesi@4
|
293 );
|
danielebarchiesi@4
|
294 $result['nt'] = array(
|
danielebarchiesi@4
|
295 'label' => t('NTriples'),
|
danielebarchiesi@4
|
296 'class' => 'RDFxRestWSFormatNTriples',
|
danielebarchiesi@4
|
297 'mime type' => 'text/plain',
|
danielebarchiesi@4
|
298 );
|
danielebarchiesi@4
|
299 $result['rdfjson'] = array(
|
danielebarchiesi@4
|
300 'label' => t('RDFJSON'),
|
danielebarchiesi@4
|
301 'class' => 'RDFxRestWSFormatRDFJSON',
|
danielebarchiesi@4
|
302 'mime type' => 'application/json',
|
danielebarchiesi@4
|
303 );
|
danielebarchiesi@4
|
304 return $result;
|
danielebarchiesi@4
|
305 }
|
danielebarchiesi@4
|
306
|
danielebarchiesi@4
|
307 /**
|
danielebarchiesi@4
|
308 * Implements hook_restws_format_info_alter().
|
danielebarchiesi@4
|
309 */
|
danielebarchiesi@4
|
310 function rdfx_restws_format_info_alter(&$info) {
|
danielebarchiesi@4
|
311 $info = _rdfx_serialization_formats() + $info;
|
danielebarchiesi@4
|
312 }
|
danielebarchiesi@4
|
313
|
danielebarchiesi@4
|
314 /**
|
danielebarchiesi@4
|
315 * Implements hook_requirements().
|
danielebarchiesi@4
|
316 */
|
danielebarchiesi@4
|
317 function rdfx_requirements($phase) {
|
danielebarchiesi@4
|
318 $requirements = array();
|
danielebarchiesi@4
|
319
|
danielebarchiesi@4
|
320 if ($phase == 'runtime') {
|
danielebarchiesi@4
|
321 if (class_exists('ARC2')) {
|
danielebarchiesi@4
|
322 $value = t('Installed (version @version)', array('@version' => ARC2::getVersion()));
|
danielebarchiesi@4
|
323 $severity = REQUIREMENT_OK;
|
danielebarchiesi@4
|
324 $description = '';
|
danielebarchiesi@4
|
325 }
|
danielebarchiesi@4
|
326 else {
|
danielebarchiesi@4
|
327 $value = t('Not installed');;
|
danielebarchiesi@4
|
328 $severity = REQUIREMENT_ERROR;
|
danielebarchiesi@4
|
329 $path = module_exists('libraries') ? libraries_get_path('ARC2') . '/arc/ARC2.php' : drupal_get_path('module', 'rdfx') . '/vendor/arc/ARC2.php';
|
danielebarchiesi@4
|
330 $description = t('The RDFx module requires the ARC2 library to function properly. The simplest way to install ARC2 is by using the Drush command "drush rdf-download". Alternatively, you can !download the latest package, unzip it, and move/rename the folder so that the path to ARC2.php is %path', array('!download' => l('download', 'http://github.com/semsol/arc2/tarball/master'), '%path' => $path));
|
danielebarchiesi@4
|
331 }
|
danielebarchiesi@4
|
332 $requirements['rdfx_arc'] = array(
|
danielebarchiesi@4
|
333 'title' => t('RDFx ARC2 Library'),
|
danielebarchiesi@4
|
334 'value' => $value,
|
danielebarchiesi@4
|
335 'severity' => $severity,
|
danielebarchiesi@4
|
336 'description' => $description,
|
danielebarchiesi@4
|
337 );
|
danielebarchiesi@4
|
338
|
danielebarchiesi@4
|
339 // If there were any conflicting namespaces...
|
danielebarchiesi@4
|
340 if (rdfx_get_conflicting_namespaces()) {
|
danielebarchiesi@4
|
341 // Add a requirement warning and break.
|
danielebarchiesi@4
|
342 $requirements['rdfx_ns_conflict'] = array(
|
danielebarchiesi@4
|
343 'title' => t('RDFx Namespace Conflict'),
|
danielebarchiesi@4
|
344 'severity' => REQUIREMENT_ERROR,
|
danielebarchiesi@4
|
345 'value' => '',
|
danielebarchiesi@4
|
346 'description' => t('One or more namespaces has conflicts. See this page for more information:') . ' ' . l(t('RDF publishing settings'), 'admin/config/services/rdf/namespaces')
|
danielebarchiesi@4
|
347 );
|
danielebarchiesi@4
|
348 }
|
danielebarchiesi@4
|
349 }
|
danielebarchiesi@4
|
350 return $requirements;
|
danielebarchiesi@4
|
351 }
|
danielebarchiesi@4
|
352
|
danielebarchiesi@4
|
353
|
danielebarchiesi@4
|
354 /**
|
danielebarchiesi@4
|
355 * Gets conflicting namespaces.
|
danielebarchiesi@4
|
356 * Returns an array of (prefix => array(uri1, uri2, ...)) items.
|
danielebarchiesi@4
|
357 */
|
danielebarchiesi@4
|
358 function rdfx_get_conflicting_namespaces() {
|
danielebarchiesi@4
|
359 $conflicting_namespaces = array();
|
danielebarchiesi@4
|
360
|
danielebarchiesi@4
|
361 $rdf_namespaces = module_invoke_all('rdf_namespaces');
|
danielebarchiesi@4
|
362
|
danielebarchiesi@4
|
363 foreach ($rdf_namespaces as $prefix => $uris) {
|
danielebarchiesi@4
|
364 if (is_array($uris)) {
|
danielebarchiesi@4
|
365 $consolidated_uris = array_unique($uris);
|
danielebarchiesi@4
|
366
|
danielebarchiesi@4
|
367 // A prefix has conflicting namespaces if it has multiple associated URIs.
|
danielebarchiesi@4
|
368 if (count($consolidated_uris) > 1) {
|
danielebarchiesi@4
|
369 $conflicting_namespaces[$prefix] = $consolidated_uris;
|
danielebarchiesi@4
|
370 }
|
danielebarchiesi@4
|
371 }
|
danielebarchiesi@4
|
372 }
|
danielebarchiesi@4
|
373 return $conflicting_namespaces;
|
danielebarchiesi@4
|
374 }
|
danielebarchiesi@4
|
375
|
danielebarchiesi@4
|
376 /**
|
danielebarchiesi@4
|
377 * Implementation of hook_features_api().
|
danielebarchiesi@4
|
378 */
|
danielebarchiesi@4
|
379 function rdfx_features_api() {
|
danielebarchiesi@4
|
380 return array(
|
danielebarchiesi@4
|
381 'rdf_mappings' => array(
|
danielebarchiesi@4
|
382 'name' => t('RDF mappings'),
|
danielebarchiesi@4
|
383 'default_hook' => 'rdf_default_mappings',
|
danielebarchiesi@4
|
384 'file' => drupal_get_path('module', 'rdfx') .'/rdfx.features.inc',
|
danielebarchiesi@4
|
385 ),
|
danielebarchiesi@4
|
386 );
|
danielebarchiesi@4
|
387 }
|