|
@@ -1,26 +1,16 @@
|
|
|
<?php
|
|
|
|
|
|
-/**
|
|
|
- *_a
|
|
|
- */
|
|
|
-function tripal_ws_rest() {
|
|
|
|
|
|
- global $base_url;
|
|
|
- $ws_path = func_get_args();
|
|
|
- $params = $_GET;
|
|
|
- unset($params['q']);
|
|
|
|
|
|
- // The web services should never be cached.
|
|
|
- drupal_page_is_cacheable(FALSE);
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+function tripal_ws_services_v0_1($api_url, $ws_path, $params) {
|
|
|
|
|
|
// Set some initial variables.
|
|
|
$response = array();
|
|
|
- $status = 'success';
|
|
|
$version = 'v0.1';
|
|
|
- $message = '';
|
|
|
- $api_url = $base_url . '/ws/' . $version;
|
|
|
- $page_limit = 25;
|
|
|
- $pager_id = 0;
|
|
|
+
|
|
|
|
|
|
// Set some defaults for the response.
|
|
|
$response['@context'] = array();
|
|
@@ -34,40 +24,26 @@ function tripal_ws_rest() {
|
|
|
|
|
|
switch ($service) {
|
|
|
case 'doc':
|
|
|
- tripal_ws_handle_doc_service($api_url, $response);
|
|
|
+ tripal_ws_services_v0_1_handle_doc_service($api_url, $response);
|
|
|
break;
|
|
|
case 'content':
|
|
|
- tripal_ws_handle_content_service($api_url, $response, $ws_path, $params);
|
|
|
+ tripal_ws_services_v0_1_handle_content_service($api_url, $response, $ws_path, $params);
|
|
|
break;
|
|
|
case 'vocab':
|
|
|
- tripal_ws_handle_vocab_service($api_url, $response, $ws_path);
|
|
|
+ tripal_ws_services_v0_1_handle_vocab_service($api_url, $response, $ws_path);
|
|
|
break;
|
|
|
default:
|
|
|
- tripal_ws_handle_no_service($api_url, $response);
|
|
|
+ tripal_ws_services_v0_1_handle_no_service($api_url, $response);
|
|
|
}
|
|
|
}
|
|
|
catch (Exception $e) {
|
|
|
watchdog('tripal_ws', $e->getMessage(), array(), WATCHDOG_ERROR);
|
|
|
$message = $e->getMessage();
|
|
|
- $status = 'error';
|
|
|
+ drupal_add_http_header('Status', '400 Bad Request');
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- // The responses follow a similar format as the AGAVE API with a
|
|
|
- // status, message, version and all data in the 'result' object.
|
|
|
-/* $response['status'] = $status;
|
|
|
- $response['message'] = $message;
|
|
|
- $response['api_version'] = $version;
|
|
|
- $response['source'] = array(
|
|
|
- 'site_name' => variable_get('site_name', 'Unspecified'),
|
|
|
- 'site_url' => $base_url,
|
|
|
- 'site_slogan' => variable_get('site_slogan', 'Unspecified'),
|
|
|
- 'site_email' => variable_get('site_mail', 'Unspecified'),
|
|
|
- ); */
|
|
|
-
|
|
|
- // Rather than use the drupal_json_output() funciton we manually specify
|
|
|
- // content type because we want it to be 'ld+json'.
|
|
|
- drupal_add_http_header('Content-Type', 'application/ld+json');
|
|
|
- print drupal_json_encode($response);
|
|
|
+ return $response;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -77,7 +53,7 @@ function tripal_ws_rest() {
|
|
|
* @param $response
|
|
|
* @param $ws_path
|
|
|
*/
|
|
|
-function tripal_ws_handle_content_service($api_url, &$response, $ws_path, $params) {
|
|
|
+function tripal_ws_services_v0_1_handle_content_service($api_url, &$response, $ws_path, $params) {
|
|
|
|
|
|
// Get the content type.
|
|
|
$ctype = (count($ws_path) > 1) ? $ws_path[1] : '';
|
|
@@ -85,25 +61,25 @@ function tripal_ws_handle_content_service($api_url, &$response, $ws_path, $param
|
|
|
|
|
|
// If we have no content type then list all of the available content types.
|
|
|
if (!$ctype) {
|
|
|
- tripal_ws_get_content_types($api_url, $response);
|
|
|
+ tripal_ws_services_v0_1_get_content_types($api_url, $response);
|
|
|
}
|
|
|
// If we don't have an entity ID then show a paged list of entities with
|
|
|
// the given type.
|
|
|
else if ($ctype and !$entity_id) {
|
|
|
- tripal_ws_get_content_type($api_url, $response, $ws_path, $ctype, $params);
|
|
|
+ tripal_ws_services_v0_1_get_content_type($api_url, $response, $ws_path, $ctype, $params);
|
|
|
}
|
|
|
// If we have a content type and an entity ID then show the entity
|
|
|
else {
|
|
|
- tripal_ws_get_content($api_url, $response, $ws_path, $ctype, $entity_id, $params);
|
|
|
+ tripal_ws_services_v0_1_get_content($api_url, $response, $ws_path, $ctype, $entity_id, $params);
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
- *
|
|
|
- * @param $api_url
|
|
|
- * @param $response
|
|
|
- * @param $ws_path
|
|
|
- */
|
|
|
-function tripal_ws_handle_vocab_service($api_url, &$response, $ws_path) {
|
|
|
+*
|
|
|
+* @param $api_url
|
|
|
+* @param $response
|
|
|
+* @param $ws_path
|
|
|
+*/
|
|
|
+function tripal_ws_services_v0_1_handle_vocab_service($api_url, &$response, $ws_path) {
|
|
|
|
|
|
// Get the vocab name.
|
|
|
$vocabulary = (count($ws_path) > 1) ? $ws_path[1] : '';
|
|
@@ -111,15 +87,15 @@ function tripal_ws_handle_vocab_service($api_url, &$response, $ws_path) {
|
|
|
|
|
|
// If we have no $vocabulary type then list all of the available vocabs.
|
|
|
if (!$vocabulary) {
|
|
|
- tripal_ws_get_vocabs($api_url, $response);
|
|
|
+ tripal_ws_services_v0_1_get_vocabs($api_url, $response);
|
|
|
}
|
|
|
// If we don't have a $vocabulary then show a paged list of terms.
|
|
|
else if ($vocabulary and !$accession) {
|
|
|
- tripal_ws_get_vocab($api_url, $response, $ws_path, $vocabulary);
|
|
|
+ tripal_ws_services_v0_1_get_vocab($api_url, $response, $ws_path, $vocabulary);
|
|
|
}
|
|
|
// If we have a content type and an entity ID then show the entity
|
|
|
else if ($vocabulary and $accession) {
|
|
|
- tripal_ws_get_term($api_url, $response, $ws_path, $vocabulary, $accession);
|
|
|
+ tripal_ws_services_v0_1_get_term($api_url, $response, $ws_path, $vocabulary, $accession);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -128,13 +104,13 @@ function tripal_ws_handle_vocab_service($api_url, &$response, $ws_path) {
|
|
|
* @param $api_url
|
|
|
* @param $response
|
|
|
*/
|
|
|
-function tripal_ws_get_vocabs($api_url, &$response) {
|
|
|
+function tripal_ws_services_v0_1_get_vocabs($api_url, &$response) {
|
|
|
// First, add the vocabularies used into the @context section.
|
|
|
$response['@context']['rdfs'] = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
|
$response['@context']['hydra'] = 'http://www.w3.org/ns/hydra/core#';
|
|
|
|
|
|
// Next add in the ID for tihs resource.
|
|
|
- $response['@id'] = $api_url . '/vocab';
|
|
|
+ $response['@id'] = url($api_url . '/vocab', array('absolute' => TRUE));
|
|
|
|
|
|
// Start the list.
|
|
|
$response['@type'] = 'Collection';
|
|
@@ -148,10 +124,9 @@ function tripal_ws_get_vocabs($api_url, &$response) {
|
|
|
// Iterate through the vocabularies and add an entry in the collection.
|
|
|
$i = 0;
|
|
|
while ($vocab = $vocabs->fetchObject()) {
|
|
|
- $term =
|
|
|
// Add the bundle as a content type.
|
|
|
$response['member'][] = array(
|
|
|
- '@id' => $api_url . '/vocab/' . urlencode($vocab->vocabulary),
|
|
|
+ '@id' => url($api_url . '/vocab/' . urlencode($vocab->vocabulary), array('absolute' => TRUE)),
|
|
|
'@type' => 'vocabulary',
|
|
|
'vocabulary' => $vocab->vocabulary,
|
|
|
);
|
|
@@ -159,8 +134,6 @@ function tripal_ws_get_vocabs($api_url, &$response) {
|
|
|
}
|
|
|
$response['totalItems'] = $i;
|
|
|
|
|
|
- //$response['totalItems'] = $i;
|
|
|
-
|
|
|
// Lastly, add in the terms used into the @context section.
|
|
|
$response['@context']['Collection'] = 'hydra:Collection';
|
|
|
$response['@context']['totalItems'] = 'hydra:totalItems';
|
|
@@ -175,7 +148,7 @@ function tripal_ws_get_vocabs($api_url, &$response) {
|
|
|
* @param $response
|
|
|
* @param $ws_path
|
|
|
*/
|
|
|
-function tripal_ws_get_vocab($api_url, &$response, $ws_path, $vocabulary) {
|
|
|
+function tripal_ws_services_v0_1_get_vocab($api_url, &$response, $ws_path, $vocabulary) {
|
|
|
|
|
|
// First, add the vocabularies used into the @context section.
|
|
|
$response['@context']['rdfs'] = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
@@ -183,7 +156,7 @@ function tripal_ws_get_vocab($api_url, &$response, $ws_path, $vocabulary) {
|
|
|
$response['@context']['schema'] = 'https://schema.org/';
|
|
|
|
|
|
// Next add in the ID for tihs resource.
|
|
|
- $response['@id'] = $api_url . '/vocab/' . $vocabulary;
|
|
|
+ $response['@id'] = url($api_url . '/vocab/' . $vocabulary, array('absolute' => TRUE));
|
|
|
|
|
|
// Get the vocabulary
|
|
|
$vocab = tripal_load_vocab_entity(array('vocabulary' => $vocabulary));
|
|
@@ -193,8 +166,8 @@ function tripal_ws_get_vocab($api_url, &$response, $ws_path, $vocabulary) {
|
|
|
$response['totalItems'] = 0;
|
|
|
$response['label'] = vocabulary . " vocabulary collection";
|
|
|
$response['comment'] = 'The following list of terms may not be the full ' .
|
|
|
- 'list for the vocabulary. The terms listed here are only those ' .
|
|
|
- 'that have associated content on this site.';
|
|
|
+ 'list for the vocabulary. The terms listed here are only those ' .
|
|
|
+ 'that have associated content on this site.';
|
|
|
|
|
|
// Get the list of terms for this vocab.
|
|
|
$query = db_select('tripal_term', 'tt')
|
|
@@ -208,7 +181,7 @@ function tripal_ws_get_vocab($api_url, &$response, $ws_path, $vocabulary) {
|
|
|
while($term = $terms->fetchObject()) {
|
|
|
$term = tripal_load_term_entity(array('term_id' => $term->id));
|
|
|
$response['member'][] = array(
|
|
|
- '@id' => $api_url . '/vocab/' . urlencode($vocabulary) . '/' . urlencode($term->accession),
|
|
|
+ '@id' => url($api_url . '/vocab/' . urlencode($vocabulary) . '/' . urlencode($term->accession), array('absolute' => TRUE)),
|
|
|
'@type' => 'vocabulary_term',
|
|
|
'vocabulary' => $vocab->vocabulary,
|
|
|
'accession' => $term->accession,
|
|
@@ -235,7 +208,7 @@ function tripal_ws_get_vocab($api_url, &$response, $ws_path, $vocabulary) {
|
|
|
* @param $response
|
|
|
* @param $ws_path
|
|
|
*/
|
|
|
-function tripal_ws_get_term($api_url, &$response, $ws_path, $vocabulary, $accession) {
|
|
|
+function tripal_ws_services_v0_1_get_term($api_url, &$response, $ws_path, $vocabulary, $accession) {
|
|
|
|
|
|
// First, add the vocabularies used into the @context section.
|
|
|
$response['@context']['rdfs'] = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
@@ -246,7 +219,7 @@ function tripal_ws_get_term($api_url, &$response, $ws_path, $vocabulary, $access
|
|
|
$term = tripal_load_term_entity(array('vocabulary' => $vocabulary, 'accession' => $accession));
|
|
|
|
|
|
// Next add in the ID and Type for this resources.
|
|
|
- $response['@id'] = $api_url . '/vocab/' . urlencode($vocabulary) . '/' . urlencode($accession);
|
|
|
+ $response['@id'] = url($api_url . '/vocab/' . urlencode($vocabulary) . '/' . urlencode($accession), array('absolute' => TRUE));
|
|
|
$response['@type'] = 'vocabulary_term';
|
|
|
$response['label'] = $term->name;
|
|
|
$response['vocabulary'] = $vocabulary;
|
|
@@ -268,14 +241,14 @@ function tripal_ws_get_term($api_url, &$response, $ws_path, $vocabulary, $access
|
|
|
* @param $api_url
|
|
|
* @param $response
|
|
|
*/
|
|
|
-function tripal_ws_get_content_types($api_url, &$response) {
|
|
|
+function tripal_ws_services_v0_1_get_content_types($api_url, &$response) {
|
|
|
|
|
|
// First, add the vocabularies used into the @context section.
|
|
|
$response['@context']['rdfs'] = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
|
$response['@context']['hydra'] = 'http://www.w3.org/ns/hydra/core#';
|
|
|
|
|
|
// Next add in the ID for tihs resource.
|
|
|
- $response['@id'] = $api_url . '/content';
|
|
|
+ $response['@id'] = url($api_url . '/content', array('absolute' => TRUE));
|
|
|
|
|
|
// Start the list.
|
|
|
$response['@type'] = 'Collection';
|
|
@@ -288,7 +261,6 @@ function tripal_ws_get_content_types($api_url, &$response) {
|
|
|
->fields('tb')
|
|
|
->orderBy('tb.label', 'ASC')
|
|
|
->execute();
|
|
|
- $terms = array();
|
|
|
|
|
|
// Iterate through the terms and add an entry in the collection.
|
|
|
$i = 0;
|
|
@@ -297,15 +269,8 @@ function tripal_ws_get_content_types($api_url, &$response) {
|
|
|
$term = reset($entity);
|
|
|
$vocab = $term->vocab;
|
|
|
|
|
|
- if (!array_key_exists($vocab->vocabulary, $response['@context'])) {
|
|
|
- // If there is no URL prefix then use this API's vocabulary API
|
|
|
- if ($term->urlprefix) {
|
|
|
- $response['@context'][$vocab->vocabulary] = $term->urlprefix;
|
|
|
- }
|
|
|
- else {
|
|
|
- $response['@context'][$vocab->vocabulary] = $api_url . '/vocab/' . $vocab->vocabulary . '/';
|
|
|
- }
|
|
|
- }
|
|
|
+ $response['@context'][$term->name] = $term->url;
|
|
|
+
|
|
|
// Get the bundle description. If no description is provided then
|
|
|
// use the term definition
|
|
|
$description = tripal_get_bundle_variable('description', $bundle->id);
|
|
@@ -314,8 +279,8 @@ function tripal_ws_get_content_types($api_url, &$response) {
|
|
|
}
|
|
|
// Add the bundle as a content type.
|
|
|
$response['member'][] = array(
|
|
|
- '@id' => $api_url . '/content/' . urlencode($bundle->label),
|
|
|
- '@type' => $vocab->vocabulary . ':' . $term->accession,
|
|
|
+ '@id' => url($api_url . '/content/' . urlencode($bundle->label), array('absolute' => TRUE)),
|
|
|
+ '@type' => $term->name,
|
|
|
'label' => $bundle->label,
|
|
|
'description' => $description,
|
|
|
);
|
|
@@ -337,71 +302,135 @@ function tripal_ws_get_content_types($api_url, &$response) {
|
|
|
* @param $response
|
|
|
* @param $ws_path
|
|
|
*/
|
|
|
-function tripal_ws_get_content_type($api_url, &$response, $ws_path, $ctype, $params) {
|
|
|
+function tripal_ws_services_v0_1_get_content_type($api_url, &$response, $ws_path, $ctype, $params) {
|
|
|
|
|
|
// First, add the vocabularies used into the @context section.
|
|
|
$response['@context']['rdfs'] = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
|
$response['@context']['hydra'] = 'http://www.w3.org/ns/hydra/core#';
|
|
|
- $response['@context']['schema'] = 'https://schema.org/';
|
|
|
|
|
|
// Next add in the ID for tihs resource.
|
|
|
- $response['@id'] = $api_url . '/content/' . $ctype;
|
|
|
+ $response['@id'] = url($api_url . '/content/' . $ctype, array('absolute' => TRUE));
|
|
|
|
|
|
// Get the TripalBundle, TripalTerm and TripalVocab type for this type.
|
|
|
$bundle = tripal_load_bundle_entity(array('label' => $ctype));
|
|
|
$term = entity_load('TripalTerm', array('id' => $bundle->term_id));
|
|
|
$term = reset($term);
|
|
|
- $vocab = $term->vocab;
|
|
|
-
|
|
|
- if (!array_key_exists($vocab->vocabulary, $response['@context'])) {
|
|
|
- // If there is no URL prefix then use this API's vocabulary API
|
|
|
- if ($term->urlprefix) {
|
|
|
- $response['@context'][$vocab->vocabulary] = $term->urlprefix;
|
|
|
- }
|
|
|
- else {
|
|
|
- $response['@context'][$vocab->vocabulary] = $api_url . '/vocab/' . $vocab->vocabulary . '/';
|
|
|
- }
|
|
|
- }
|
|
|
+ $response['@context'][$term->name] = $term->url;
|
|
|
|
|
|
// Start the list.
|
|
|
$response['@type'] = 'Collection';
|
|
|
$response['totalItems'] = 0;
|
|
|
$response['label'] = $bundle->label . " collection";
|
|
|
|
|
|
- // Organize the fields by their web service names.
|
|
|
+ // Iterate through the fields and create a $field_mapping array that makes
|
|
|
+ // it easier to determine which filter criteria belongs to which field.
|
|
|
+ $field_mapping = array();
|
|
|
$fields = field_info_fields();
|
|
|
- $field_ws_names = array();
|
|
|
- foreach ($fields as $field_name => $details) {
|
|
|
- if (array_key_exists('settings', $details) and
|
|
|
- array_key_exists('semantic_web', $details['settings'])) {
|
|
|
- $sw_name = $details['settings']['semantic_web']['name'];
|
|
|
- $field_ws_names[$sw_name][] = $field_name;
|
|
|
+ foreach ($fields as $field) {
|
|
|
+ if (array_key_exists('TripalEntity', $field['bundles'])) {
|
|
|
+ foreach ($field['bundles']['TripalEntity'] as $bundle_name) {
|
|
|
+ if ($bundle_name == $bundle->name) {
|
|
|
+ if (array_key_exists('semantic_web', $field['settings'])) {
|
|
|
+ list($vocabulary, $accession) = explode(':', $field['settings']['semantic_web']);
|
|
|
+ $term = tripal_get_term_details($vocabulary, $accession);
|
|
|
+ $key = $term['name'];
|
|
|
+ $key = strtolower(preg_replace('/ /', '_', $key));
|
|
|
+ $field_mapping[$key] = $field['field_name'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Convert the filters to their field names
|
|
|
+ $new_params = array();
|
|
|
+ foreach ($params as $param => $value) {
|
|
|
+
|
|
|
+ // Break apart any operators
|
|
|
+ $key = $param;
|
|
|
+ $op = '=';
|
|
|
+ $matches = array();
|
|
|
+ if (preg_match('/^(.+);(.+)$/', $key, $matches)) {
|
|
|
+ $key = $matches[1];
|
|
|
+ $op = $matches[2];
|
|
|
+ }
|
|
|
+
|
|
|
+ // Break apart any subkeys and pull the first one out for the term name key.
|
|
|
+ $subkeys = explode(',', $key);
|
|
|
+ if (count($subkeys) > 0) {
|
|
|
+ $key = array_shift($subkeys);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Map the values in the filters to their appropriate field names.
|
|
|
+ if (array_key_exists($key, $field_mapping)) {
|
|
|
+ $field_name = $field_mapping[$key];
|
|
|
+ if (count($subkeys) > 0) {
|
|
|
+ $field_name .= '.' . implode('.', $subkeys);
|
|
|
+ }
|
|
|
+ $new_params[$field_name]['value'] = $value;
|
|
|
+ $new_params[$field_name]['op'] = $op;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ throw new Exception("The filter term, '$key', is not available for use.");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Get the list of entities for this bundle.
|
|
|
$query = new TripalFieldQuery();
|
|
|
- $query->fieldCondition('content_type', $term->id);
|
|
|
- foreach($params as $key => $value) {
|
|
|
- foreach ($field_ws_names[$key] as $field_name) {
|
|
|
- $query->fieldCondition($field_name, $value);
|
|
|
+ $query->fieldCondition('content_type', $bundle->id);
|
|
|
+ foreach($new_params as $field_name => $details) {
|
|
|
+ $value = $details['value'];
|
|
|
+ switch ($details['op']) {
|
|
|
+ case 'eq':
|
|
|
+ $op = '=';
|
|
|
+ break;
|
|
|
+ case 'gt':
|
|
|
+ $op = '>';
|
|
|
+ break;
|
|
|
+ case 'gte':
|
|
|
+ $op = '>=';
|
|
|
+ break;
|
|
|
+ case 'lt':
|
|
|
+ $op = '<';
|
|
|
+ break;
|
|
|
+ case 'lte':
|
|
|
+ $op = '<=';
|
|
|
+ break;
|
|
|
+ case 'ne':
|
|
|
+ $op = '<>';
|
|
|
+ break;
|
|
|
+ case 'contains':
|
|
|
+ $op = 'CONTAINS';
|
|
|
+ break;
|
|
|
+ case 'starts':
|
|
|
+ $op = 'STARTS WITH';
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ $op = '=';
|
|
|
}
|
|
|
+ $query->fieldCondition($field_name, $value, $op);
|
|
|
}
|
|
|
$results = $query->execute();
|
|
|
|
|
|
- // Get the entities from the above search. We do a direct query of the
|
|
|
- // table because the load_entity() function is too slow.
|
|
|
- $query = db_select('tripal_entity', 'TE');
|
|
|
- $query->fields('TE');
|
|
|
- $query->condition('id', array_keys($results['TripalEntity']));
|
|
|
- $results = $query->execute();
|
|
|
-
|
|
|
// Iterate through the entities and add them to the list.
|
|
|
$i = 0;
|
|
|
- while($entity = $results->fetchObject()) {
|
|
|
+ foreach ($results['TripalEntity'] as $entity_id => $stub) {
|
|
|
+ $vocabulary = '';
|
|
|
+ $term_name = '';
|
|
|
+
|
|
|
+ // We don't need all of the attached fields for an entity so, we'll
|
|
|
+ // not use the entity_load() function. Instead just pull it from the
|
|
|
+ // database table.
|
|
|
+ $entity = db_select('tripal_entity', 'TE')
|
|
|
+ ->fields('TE')
|
|
|
+ ->condition('TE.id', $entity_id)
|
|
|
+ ->execute()
|
|
|
+ ->fetchObject();
|
|
|
+
|
|
|
+ //$entity = tripal_load_entity('TripalEntity', array($entity->id));
|
|
|
$response['member'][] = array(
|
|
|
- '@id' => $api_url . '/content/' . urlencode($ctype) . '/' . $entity->id,
|
|
|
- '@type' => $vocab->vocabulary . ':' . $term->accession,
|
|
|
+ '@id' => url($api_url . '/content/' . urlencode($ctype) . '/' . $entity->id, array('absolute' => TRUE)),
|
|
|
+ '@type' => $ctype,
|
|
|
'label' => $entity->title,
|
|
|
'itemPage' => url('/bio_data/' . $entity->id, array('absolute' => TRUE)),
|
|
|
);
|
|
@@ -416,22 +445,22 @@ function tripal_ws_get_content_type($api_url, &$response, $ws_path, $ctype, $par
|
|
|
$response['@context']['label'] = 'rdfs:label';
|
|
|
$response['@context']['itemPage'] = 'schema:itemPage';
|
|
|
|
|
|
- $response['operation'][] = array(
|
|
|
- '@type' => 'hydra:CreateResourceOperation',
|
|
|
- 'hydra:method' => 'PUT'
|
|
|
- );
|
|
|
-
|
|
|
- $response['query'] = array(
|
|
|
- '@id' => $response['@id'],
|
|
|
- '@type' => 'IriTemplate',
|
|
|
- "template" => $response['@id'] . "{?name,}",
|
|
|
- "mapping" => array(
|
|
|
- array(
|
|
|
- "hydra:variable" => 'name',
|
|
|
- "hydra:property" => 'name',
|
|
|
- )
|
|
|
- )
|
|
|
- );
|
|
|
+// $response['operation'][] = array(
|
|
|
+// '@type' => 'hydra:CreateResourceOperation',
|
|
|
+// 'hydra:method' => 'PUT'
|
|
|
+// );
|
|
|
+
|
|
|
+// $response['query'] = array(
|
|
|
+// '@id' => $response['@id'],
|
|
|
+// '@type' => 'IriTemplate',
|
|
|
+// "template" => $response['@id'] . "{?name,}",
|
|
|
+// "mapping" => array(
|
|
|
+// array(
|
|
|
+// "hydra:variable" => 'name',
|
|
|
+// "hydra:property" => 'name',
|
|
|
+// )
|
|
|
+// )
|
|
|
+// );
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -442,7 +471,7 @@ function tripal_ws_get_content_type($api_url, &$response, $ws_path, $ctype, $par
|
|
|
* @param unknown $entity_id
|
|
|
* @param unknown $params
|
|
|
*/
|
|
|
-function tripal_ws_get_content_add_fields($entity, $bundle, $api_url, &$response, $ws_path, $ctype, $entity_id, $params) {
|
|
|
+function tripal_ws_services_v0_1_get_content_add_fields($entity, $bundle, $api_url, &$response, $ws_path, $ctype, $entity_id, $params) {
|
|
|
|
|
|
|
|
|
// Get information about the fields attached to this bundle and sort them
|
|
@@ -485,13 +514,14 @@ function tripal_ws_get_content_add_fields($entity, $bundle, $api_url, &$response
|
|
|
$field_name = $instance['field_name'];
|
|
|
$field_settings = $field['settings'];
|
|
|
$key = $field_name;
|
|
|
- //$key = strtolower(preg_replace('/ /', '_', $key));
|
|
|
+ $key_adj = strtolower(preg_replace('/ /', '_', $key));
|
|
|
if (array_key_exists('semantic_web', $field_settings) and $field_settings['semantic_web']) {
|
|
|
list($vocabulary, $accession) = explode(':', $field_settings['semantic_web']);
|
|
|
$term = tripal_get_term_details($vocabulary, $accession);
|
|
|
if ($term) {
|
|
|
$key = $term['name'];
|
|
|
- $response['@context'][$key] = array(
|
|
|
+ $key_adj = strtolower(preg_replace('/ /', '_', $key));
|
|
|
+ $response['@context'][$key_adj] = array(
|
|
|
'@id' => $term['url'],
|
|
|
);
|
|
|
}
|
|
@@ -502,14 +532,13 @@ function tripal_ws_get_content_add_fields($entity, $bundle, $api_url, &$response
|
|
|
$instance_settings = $instance['settings'];
|
|
|
if (array_key_exists('auto_attach', $instance_settings) and
|
|
|
$instance_settings['auto_attach'] != TRUE) {
|
|
|
- $response['@context'][$key]['@type'] = '@id';
|
|
|
- $response[$key] = $api_url . '/content/' . $ctype . '/' . $entity->id . '/' . urlencode($key);
|
|
|
+ $response['@context'][$key_adj]['@type'] = '@id';
|
|
|
+ $response[$key_adj] = url($api_url . '/content/' . $ctype . '/' . $entity->id . '/' . urlencode($key), array('absolute' => TRUE));
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
// Get the details for this field for the JSON-LD response.
|
|
|
- tripal_ws_get_content_add_field($key, $entity, $field, $instance, $api_url, $response);
|
|
|
-
|
|
|
+ tripal_ws_services_v0_1_get_content_add_field($key_adj, $entity, $field, $instance, $api_url, $response);
|
|
|
}
|
|
|
|
|
|
// Lastly, add in the terms used into the @context section.
|
|
@@ -535,7 +564,7 @@ function tripal_ws_get_content_add_fields($entity, $bundle, $api_url, &$response
|
|
|
* @param unknown $entity_id
|
|
|
* @param unknown $params
|
|
|
*/
|
|
|
-function tripal_ws_get_content_find_field($field_arg, $ctype, $entity_id) {
|
|
|
+function tripal_ws_services_v0_1_get_content_find_field($field_arg, $ctype, $entity_id) {
|
|
|
|
|
|
$bundle = tripal_load_bundle_entity(array('label' => $ctype));
|
|
|
$entity = tripal_load_entity('TripalEntity', array('id' => $entity_id));
|
|
@@ -551,12 +580,12 @@ function tripal_ws_get_content_find_field($field_arg, $ctype, $entity_id) {
|
|
|
$field_settings = $field['settings'];
|
|
|
if (array_key_exists('semantic_web', $field_settings) and
|
|
|
$field_settings['semantic_web']) {
|
|
|
- list($vocabulary, $accession) = explode(':', $field_settings['semantic_web']);
|
|
|
- $temp_term = tripal_get_term_details($vocabulary, $accession);
|
|
|
- if ($temp_term['name'] == $field_arg) {
|
|
|
- return array($entity, $bundle, $field, $instance, $temp_term);
|
|
|
- }
|
|
|
- }
|
|
|
+ list($vocabulary, $accession) = explode(':', $field_settings['semantic_web']);
|
|
|
+ $temp_term = tripal_get_term_details($vocabulary, $accession);
|
|
|
+ if ($temp_term['name'] == $field_arg) {
|
|
|
+ return array($entity, $bundle, $field, $instance, $temp_term);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
@@ -569,7 +598,7 @@ function tripal_ws_get_content_find_field($field_arg, $ctype, $entity_id) {
|
|
|
* @param unknown $params
|
|
|
* @return number
|
|
|
*/
|
|
|
-function tripal_ws_get_content($api_url, &$response, $ws_path, $ctype, $entity_id, $params) {
|
|
|
+function tripal_ws_services_v0_1_get_content($api_url, &$response, $ws_path, $ctype, $entity_id, $params) {
|
|
|
// First, add the vocabularies used into the @context section.
|
|
|
$response['@context']['rdfs'] = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
|
$response['@context']['hydra'] = 'http://www.w3.org/ns/hydra/core#';
|
|
@@ -581,7 +610,7 @@ function tripal_ws_get_content($api_url, &$response, $ws_path, $ctype, $entity_i
|
|
|
if (array_key_exists(3, $ws_path)) {
|
|
|
|
|
|
$field_arg = $ws_path[3];
|
|
|
- list($entity, $bundle, $field, $instance, $term) = tripal_ws_get_content_find_field($field_arg, $ctype, $entity_id);
|
|
|
+ list($entity, $bundle, $field, $instance, $term) = tripal_ws_services_v0_1_get_content_find_field($field_arg, $ctype, $entity_id);
|
|
|
|
|
|
// Next add in the ID and Type for this resources.
|
|
|
$key = $term['name'];
|
|
@@ -592,7 +621,7 @@ function tripal_ws_get_content($api_url, &$response, $ws_path, $ctype, $entity_i
|
|
|
field_attach_load($entity->type, array($entity->id => $entity), FIELD_LOAD_CURRENT,
|
|
|
array('field_id' => $field['id']));
|
|
|
|
|
|
- tripal_ws_get_content_add_field($key, $entity, $field, $instance, $api_url, $response, TRUE);
|
|
|
+ tripal_ws_services_v0_1_get_content_add_field($key, $entity, $field, $instance, $api_url, $response, TRUE);
|
|
|
|
|
|
return;
|
|
|
}
|
|
@@ -611,7 +640,7 @@ function tripal_ws_get_content($api_url, &$response, $ws_path, $ctype, $entity_i
|
|
|
$response['@context'][$vocab->vocabulary] = $term->urlprefix;
|
|
|
}
|
|
|
else {
|
|
|
- $response['@context'][$vocab->vocabulary] = $api_url . '/vocab/' . $vocab->vocabulary . '/';
|
|
|
+ $response['@context'][$vocab->vocabulary] = url($api_url . '/vocab/' . $vocab->vocabulary . '/', array('absolute' => TRUE));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -620,20 +649,50 @@ function tripal_ws_get_content($api_url, &$response, $ws_path, $ctype, $entity_i
|
|
|
$entity = reset($entity);
|
|
|
|
|
|
// Next add in the ID and Type for this resources.
|
|
|
- $response['@id'] = $api_url . '/content/' . $ctype . '/' . $entity_id;
|
|
|
+ $response['@id'] = url($api_url . '/content/' . $ctype . '/' . $entity_id, array('absolute' => TRUE));
|
|
|
$response['@type'] = $term->name;
|
|
|
$response['@context'][$term->name] = $term->url;
|
|
|
$response['label'] = $entity->title;
|
|
|
$response['itemPage'] = url('/bio_data/' . $entity->id, array('absolute' => TRUE));
|
|
|
|
|
|
- tripal_ws_get_content_add_fields($entity, $bundle, $api_url, $response, $ws_path, $ctype, $entity_id, $params);
|
|
|
+ tripal_ws_services_v0_1_get_content_add_fields($entity, $bundle, $api_url, $response, $ws_path, $ctype, $entity_id, $params);
|
|
|
|
|
|
+ //tripal_ws_services_v0_1_write_context($response, $ctype);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
*
|
|
|
+ * @param $response
|
|
|
+ * @param $ctype
|
|
|
*/
|
|
|
-function tripal_ws_get_content_add_field($key, $entity, $field, $instance, $api_url, &$response, $is_field_page = NULL) {
|
|
|
+function tripal_ws_services_v0_1_write_context(&$response, $ctype) {
|
|
|
+ // We want to write the context to a file. Try to open the lock file. if we
|
|
|
+ // can't then just leave the context in the response.
|
|
|
+ $context_uri = file_build_uri("ws.v0_1.$ctype.context.jsonld");
|
|
|
+ $context_file = drupal_realpath($context_uri);
|
|
|
+ $context_URL = file_create_url($context_uri);
|
|
|
+ $lock_fp = fopen("$context_file.lock", "w");
|
|
|
+ if (flock($lock_fp, LOCK_EX|LOCK_NB)) {
|
|
|
+ $fp = fopen("$context_file", "w");
|
|
|
+ if ($fp) {
|
|
|
+ $context = array('@context' => $response['@context']);
|
|
|
+ fwrite($fp, json_encode($context));
|
|
|
+ fflush($fp);
|
|
|
+ // Release the lock.
|
|
|
+ flock($lock_fp, LOCK_UN);
|
|
|
+ // Close the files.
|
|
|
+ fclose($lock_fp);
|
|
|
+ fclose($fp);
|
|
|
+ // Change the context to point to the file
|
|
|
+ $response['@context'] = $context_URL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+*
|
|
|
+*/
|
|
|
+function tripal_ws_services_v0_1_get_content_add_field($key, $entity, $field, $instance, $api_url, &$response, $is_field_page = NULL) {
|
|
|
// Get the field settings.
|
|
|
$field_name = $field['field_name'];
|
|
|
$field_settings = $field['settings'];
|
|
@@ -662,11 +721,10 @@ function tripal_ws_get_content_add_field($key, $entity, $field, $instance, $api_
|
|
|
|
|
|
// Recurse through the values array and set the entity elemtns
|
|
|
// and add the fields to the context.
|
|
|
- tripal_ws_get_content_add_field_context($items[$i], $response, $api_url);
|
|
|
+ tripal_ws_services_v0_1_get_content_add_field_context($items[$i], $response, $api_url);
|
|
|
|
|
|
// Add the remaining values to the $values array.
|
|
|
$values[] = $items[$i]['value'];
|
|
|
-
|
|
|
}
|
|
|
|
|
|
// If we only have one value then set the response with just the value.
|
|
@@ -693,13 +751,13 @@ function tripal_ws_get_content_add_field($key, $entity, $field, $instance, $api_
|
|
|
// If we have more than one value then set the response to be a collection.
|
|
|
if (count($values) > 1) {
|
|
|
|
|
|
- // If this is the field page then the Collection is added directly to the
|
|
|
+ // If this is the field page then the Collection is added directly to the
|
|
|
// response, otherwise, it's added under the field $key.
|
|
|
if ($is_field_page) {
|
|
|
- $response['@type'] = 'Collection';
|
|
|
- $response['totalItems'] = count($values);
|
|
|
- $response['label'] = $instance['label'];
|
|
|
- $response['member'] = $values;
|
|
|
+ $response['@type'] = 'Collection';
|
|
|
+ $response['totalItems'] = count($values);
|
|
|
+ $response['label'] = $instance['label'];
|
|
|
+ $response['member'] = $values;
|
|
|
}
|
|
|
else {
|
|
|
$response[$key] = array(
|
|
@@ -715,11 +773,11 @@ function tripal_ws_get_content_add_field($key, $entity, $field, $instance, $api_
|
|
|
/**
|
|
|
*
|
|
|
*/
|
|
|
-function tripal_ws_get_content_add_field_context(&$items, &$response, $api_url) {
|
|
|
+function tripal_ws_services_v0_1_get_content_add_field_context(&$items, &$response, $api_url) {
|
|
|
|
|
|
foreach ($items as $key => $value) {
|
|
|
if (is_array($value)) {
|
|
|
- tripal_ws_get_content_add_field_context($items[$key], $response, $api_url);
|
|
|
+ tripal_ws_services_v0_1_get_content_add_field_context($items[$key], $response, $api_url);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
@@ -729,7 +787,7 @@ function tripal_ws_get_content_add_field_context(&$items, &$response, $api_url)
|
|
|
$item_entity = tripal_load_entity($item_etype, array($item_eid));
|
|
|
$item_entity = reset($item_entity);
|
|
|
$item_term = tripal_load_term_entity(array('term_id' => $item_entity->term_id));
|
|
|
- $items['@id'] = $api_url . '/content/' . $item_term->name . '/' . $item_eid;
|
|
|
+ $items['@id'] = url($api_url . '/content/' . $item_term->name . '/' . $item_eid, array('absolute' => TRUE));
|
|
|
}
|
|
|
unset($items['entity']);
|
|
|
}
|
|
@@ -742,16 +800,16 @@ function tripal_ws_get_content_add_field_context(&$items, &$response, $api_url)
|
|
|
* @param $api_url
|
|
|
* @param $response
|
|
|
*/
|
|
|
-function tripal_ws_handle_doc_service($api_url, &$response) {
|
|
|
+function tripal_ws_services_v0_1_handle_doc_service($api_url, &$response) {
|
|
|
// First, add the vocabularies used into the @context section.
|
|
|
$response['@context']['rdfs'] = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
|
$response['@context']['hydra'] = 'http://www.w3.org/ns/hydra/core#';
|
|
|
|
|
|
// Next add in the ID for tihs resource.
|
|
|
$site_name = variable_get('site_name', '');
|
|
|
- $response['@id'] = $api_url . '/doc/';
|
|
|
+ $response['@id'] = url($api_url . '/doc/', array('absolute' => TRUE));
|
|
|
$response['title'] = $site_name . ": RESTful Web Services API";
|
|
|
- $response['entrypoint'] = $api_url;
|
|
|
+ $response['entrypoint'] = url($api_url, array('absolute' => TRUE));
|
|
|
$response['description'] = "A fully queryable REST API using JSON-LD and " .
|
|
|
"discoverable using the WC3 Hydra specification.";
|
|
|
|
|
@@ -771,7 +829,7 @@ function tripal_ws_handle_doc_service($api_url, &$response) {
|
|
|
* @param $response
|
|
|
* @param $ws_path
|
|
|
*/
|
|
|
-function tripal_ws_handle_no_service($api_url, &$response) {
|
|
|
+function tripal_ws_services_v0_1_handle_no_service($api_url, &$response) {
|
|
|
|
|
|
// First, add the vocabularies used into the @context section.
|
|
|
$response['@context']['rdfs'] = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
@@ -780,8 +838,7 @@ function tripal_ws_handle_no_service($api_url, &$response) {
|
|
|
$response['@context']['schema'] = 'https://schema.org/';
|
|
|
|
|
|
// Next add in the ID for tihs resource.
|
|
|
- $response['@id'] = $api_url;
|
|
|
-
|
|
|
+ $response['@id'] = url($api_url, array('absolute' => TRUE));
|
|
|
|
|
|
// Start the list.
|
|
|
$response['@type'] = 'Collection';
|
|
@@ -791,28 +848,28 @@ function tripal_ws_handle_no_service($api_url, &$response) {
|
|
|
|
|
|
// Start the list.
|
|
|
$response['member'][] = array(
|
|
|
- '@id' => $api_url . '/content/',
|
|
|
+ '@id' => url($api_url . '/content/', array('absolute' => TRUE)),
|
|
|
'@type' => 'Service',
|
|
|
'label' => 'Content Types',
|
|
|
'description' => 'Provides acesss to the biological and ' .
|
|
|
- 'ancilliary data available on this site. Each content type ' .
|
|
|
- 'represents biological data that is defined in a controlled vocabulary '.
|
|
|
- '(e.g. Sequence Ontology term: gene (SO:0000704)).',
|
|
|
+ 'ancilliary data available on this site. Each content type ' .
|
|
|
+ 'represents biological data that is defined in a controlled vocabulary '.
|
|
|
+ '(e.g. Sequence Ontology term: gene (SO:0000704)).',
|
|
|
);
|
|
|
$response['member'][] = array(
|
|
|
- '@id' => $api_url . '/doc/',
|
|
|
+ '@id' => url($api_url . '/doc/', array('absolute' => TRUE)),
|
|
|
'@type' => 'Service',
|
|
|
'label' => 'API Documentation',
|
|
|
'description' => 'The WC3 Hydra compatible documentation for this API.',
|
|
|
);
|
|
|
$response['member'][] = array(
|
|
|
- '@id' => $api_url . '/vocab/',
|
|
|
+ '@id' => url($api_url . '/vocab/', array('absolute' => TRUE)),
|
|
|
'@type' => 'Service',
|
|
|
'label' => 'Vocabulary',
|
|
|
'description' => 'Defines in-house locally defined vocabulary terms that ' .
|
|
|
- 'have been added specifically for this site. These terms are typically ' .
|
|
|
- 'added because no other appropriate term exists in another community-vetted '.
|
|
|
- 'controlled vocabulary.',
|
|
|
+ 'have been added specifically for this site. These terms are typically ' .
|
|
|
+ 'added because no other appropriate term exists in another community-vetted '.
|
|
|
+ 'controlled vocabulary.',
|
|
|
);
|
|
|
|
|
|
$response['totalItems'] = count($response['member']);
|