public function testGetDescription()
 {
     $this->markTestNeedsDatabase();
     $this->authenticateDbUser();
     $model = Erfurt_App::getInstance()->getSysOntModel();
     $resource = new Erfurt_Rdf_Resource('http://ns.ontowiki.net/SysOnt/Anonymous', $model);
     $description = $resource->getDescription();
     $this->assertTrue(isset($description['http://ns.ontowiki.net/SysOnt/Anonymous']));
     $anonymousDesc = $description['http://ns.ontowiki.net/SysOnt/Anonymous'];
     $this->assertTrue(isset($anonymousDesc['http://www.w3.org/1999/02/22-rdf-syntax-ns#type']));
     $this->assertTrue(isset($anonymousDesc['http://www.w3.org/2000/01/rdf-schema#label']));
     $this->assertTrue(isset($anonymousDesc['http://www.w3.org/2000/01/rdf-schema#comment']));
 }
 /**
  * forwards to the CKAN registration page with some prefilled values
  */
 public function registerAction()
 {
     // this action needs no view
     $this->_helper->viewRenderer->setNoRender();
     // disable layout
     $this->_helper->layout()->disableLayout();
     // m (model) is automatically used and selected
     if (!isset($this->request->m) && !$this->_owApp->selectedModel) {
         throw new OntoWiki_Exception('No model pre-selected model and missing parameter m (model)!');
     } else {
         $model = $this->_owApp->selectedModel;
     }
     // get model URI / resource and load description
     $resourceUri = (string) $model;
     $resource = new Erfurt_Rdf_Resource($resourceUri, $model);
     $description = $resource->getDescription();
     $description = $description[$resourceUri];
     // fill CKAN parameter
     $parameter = array();
     $parameter['title'] = $model->getTitle();
     $parameter['url'] = $resourceUri;
     // go through the model info properties and use the first value as
     // notes value for ckan
     $infoProperties = $this->_config->descriptionHelper->properties;
     foreach ($infoProperties as $infoProperty) {
         if (!isset($parameter['description'])) {
             if (isset($description[$infoProperty][0]['value'])) {
                 $parameter['notes'] = $description[$infoProperty][0]['value'];
             }
         }
     }
     // build GET URI from the parameter array to redirect
     $getparams = '?';
     foreach ($parameter as $key => $value) {
         $getparams .= '&' . $key . '=' . urlencode($value);
     }
     $redirectUrl = $this->registerBaseUrl . $getparams;
     // redirect to CKANs dataset registration page
     $this->_response->setRedirect($redirectUrl, $code = 302);
 }
Example #3
0
 /**
  * Parses a String to an RDF node.
  *
  * @param  string $node
  * @return Erfurt_Rdf_Node The parsed RDF node
  * @throws Erfurt_Sparql_ParserException
  */
 protected function _parseNode($node = false)
 {
     if ($node) {
         $node = $node;
     } else {
         $node = current($this->_tokens);
     }
     if ($node[strlen($node) - 1] === '.') {
         $node = substr($node, 0, -1);
     }
     if ($this->_dtypeCheck($node)) {
         return $node;
     }
     if ($this->_bNodeCheck($node)) {
         $node = '?' . $node;
         if (isset($this->_usedBlankNodes[$node]) && $this->_usedBlankNodes[$node] === false) {
             require_once 'Erfurt/Sparql/ParserException.php';
             throw new Erfurt_Sparql_ParserException('Reuse of blank node id not allowed here.' - 1, key($this->_tokens));
         }
         $this->_query->addUsedVar($node);
         $this->_usedBlankNodes[$node] = true;
         return $node;
     }
     if ($node === '[') {
         $node = '?' . substr($this->_query->getBlanknodeLabel(), 1);
         $this->_query->addUsedVar($node);
         $this->_fastForward();
         if (current($this->_tokens) !== ']') {
             prev($this->_tokens);
         }
         return $node;
     }
     if ($this->_iriCheck($node)) {
         $base = $this->_query->getBase();
         if ($base != null) {
             require_once 'Erfurt/Rdf/Resource.php';
             $node = Erfurt_Rdf_Resource::initWithNamespaceAndLocalName(substr($base, 1, -1), substr($node, 1, -1));
         } else {
             require_once 'Erfurt/Rdf/Resource.php';
             $node = Erfurt_Rdf_Resource::initWithIri(substr($node, 1, -1));
         }
         return $node;
     } else {
         if ($this->_qnameCheck($node)) {
             $node = $this->_query->getFullUri($node);
             require_once 'Erfurt/Rdf/Resource.php';
             $node = Erfurt_Rdf_Resource::initWithIri($node);
             return $node;
         } else {
             if ($this->_literalCheck($node)) {
                 if (substr($node, 0, 1) === '"' || substr($node, 0, 1) === "'") {
                     $ch = substr($node, 0, 1);
                     $chLong = str_repeat($ch, 3);
                     if (substr($node, 0, 3) == $chLong) {
                         $ch = $chLong;
                     }
                     $this->_parseLiteral($node, $ch);
                 } else {
                     $this->_parseLiteral($node, null);
                 }
             } else {
                 if ($this->_varCheck($node)) {
                     $pos = is_string($node) ? strpos($node, '.') : false;
                     if ($pos) {
                         return substr($node, 0, $pos);
                     } else {
                         return $node;
                     }
                 } else {
                     if ($node[0] === '<') {
                         //partial IRI? loop tokens until we find a closing >
                         while (next($this->_tokens)) {
                             $node .= current($this->_tokens);
                             if (substr($node, -1) === '>') {
                                 break;
                             }
                         }
                         if (substr($node, -1) != '>') {
                             var_dump($this->_tokens);
                             exit;
                             require_once 'Erfurt/Sparql/ParserException.php';
                             throw new Erfurt_Sparql_ParserException('Unclosed IRI: ' . $node, -1, key($this->_tokens));
                         }
                         return $this->_parseNode($node);
                     } else {
                         require_once 'Erfurt/Sparql/ParserException.php';
                         throw new Erfurt_Sparql_ParserException('"' . $node . '" is neither a valid rdf- node nor a variable.', -1, key($this->_tokens));
                     }
                 }
             }
         }
     }
     return $node;
 }
 /**
  * Event handler method, which is called on menu creation. Adds some
  * datagathering relevant menu entries.
  *
  * @param Erfurt_Event $event
  *
  * @return bool
  */
 public function onCreateMenu($event)
 {
     $menu = $event->menu;
     $resource = $event->resource;
     $model = $event->model;
     $owApp = OntoWiki::getInstance();
     // We only add entries to the menu, if all params are given and the
     // model is editable.
     if (null === $resource || null === $model || !$model->isEditable() || !$owApp->erfurt->getAc()->isModelAllowed('edit', $owApp->selectedModel)) {
         return;
     }
     $owApp = OntoWiki::getInstance();
     $translate = $owApp->translate;
     $wrapperRegistry = Erfurt_Wrapper_Registry::getInstance();
     $activeWrapperList = $wrapperRegistry->listActiveWrapper();
     if ((bool) $this->_privateConfig->sync->enabled) {
         $syncConfigList = $this->_listSyncConfigs();
     } else {
         $syncConfigList = array();
     }
     $uri = (string) $resource;
     $modelUri = (string) $model;
     $menuArray = array();
     // Check all active wrapper extensions, whether URI is handled. Also
     // check, whether a sync config exists.
     foreach ($activeWrapperList as $wrapperName) {
         $hash = $this->_getHash($uri, $wrapperName, $modelUri);
         $r = new Erfurt_Rdf_Resource($uri);
         $r->setLocator($this->_getProxyUri($uri));
         $wrapperInstance = $wrapperRegistry->getWrapperInstance($wrapperName);
         if ($wrapperInstance->isHandled($r, $modelUri)) {
             $menuArray[$wrapperName] = array('instance' => $wrapperInstance);
             if (isset($syncConfigList[$hash])) {
                 $menuArray[$wrapperName]['sync'] = true;
             }
         }
     }
     // Only add a separator, if at least one active wrapper exists.
     if (count($menuArray) > 0) {
         $menu->appendEntry(OntoWiki_Menu::SEPARATOR);
     }
     foreach ($menuArray as $wrapperName => $wrapperArray) {
         $wrapperInstance = $wrapperArray['instance'];
         if (isset($wrapperArray['sync']) && $wrapperArray['sync'] === true) {
             $message = $translate->_('Sync Data with %1$s');
             $menu->appendEntry(sprintf($message, $wrapperInstance->getName()), array('about' => $uri, 'class' => 'sync_data_button wrapper_' . $wrapperName));
         } else {
             $message = $translate->_('Import Data with %1$s');
             $menu->appendEntry(sprintf($message, $wrapperInstance->getName()), array('about' => $uri, 'class' => 'fetch_data_button wrapper_' . $wrapperName));
         }
         // Configure for sync entry.
         if ((bool) $this->_privateConfig->sync->enabled) {
             $configUrl = $owApp->config->urlBase . 'datagathering/config?uri=' . urlencode($uri) . '&wrapper=' . urlencode($wrapperName);
             if ($event->isModel) {
                 $configUrl .= '&m=' . urlencode($uri);
             }
             $message = $translate->_('Configure Sync with %1$s');
             $menu->appendEntry(sprintf($message, $wrapperInstance->getName()), $configUrl);
         }
     }
     return true;
 }
Example #5
0
 public function testGetLocator()
 {
     $uri = new Erfurt_Rdf_Resource('http://example.org/testResource1');
     $uri->setLocator('http://example.org/testLocator');
     $this->assertEquals('http://example.org/testLocator', $uri->getLocator());
 }
 public static function import($graphUri, $uri, $locator, $all = true, $presets = array(), $exceptedProperties = array(), $wrapperName = 'linkeddata', $fetchMode = 'none', $action = 'add', $versioning = true, $filterCallback = null)
 {
     // Check whether user is allowed to write the model.
     $erfurt = Erfurt_App::getInstance();
     $store = $erfurt->getStore();
     $storeGraph = $store->getModel($graphUri);
     if (!$storeGraph || !$storeGraph->isEditable()) {
         return self::IMPORT_NOT_EDITABLE;
     }
     $r = new Erfurt_Rdf_Resource($uri);
     $r->setLocator($locator);
     // Try to instanciate the requested wrapper
     $wrapper = null;
     try {
         $wrapper = Erfurt_Wrapper_Registry::getInstance()->getWrapperInstance($wrapperName);
     } catch (Erfurt_Wrapper_Exception $e) {
         return self::IMPORT_WRAPPER_INSTANCIATION_ERR;
     }
     if (null == $wrapper) {
         return self::IMPORT_WRAPPER_NOT_AVAILABLE;
     }
     $wrapperResult = null;
     try {
         $wrapperResult = $wrapper->run($r, $graphUri, $all);
     } catch (Erfurt_Wrapper_Exception $e) {
         return self::IMPORT_WRAPPER_ERR;
     }
     if ($wrapperResult === false) {
         return self::IMPORT_WRAPPER_RESULT_NOT_AVAILABLE;
     } else {
         if (is_array($wrapperResult)) {
             if (isset($wrapperResult['status_codes'])) {
                 if (in_array(Erfurt_Wrapper::RESULT_HAS_ADD, $wrapperResult['status_codes'])) {
                     $newStatements = $wrapperResult['add'];
                     //default filter
                     $newStatements = self::filterStatements($newStatements, $uri, $all, $presets, $exceptedProperties, $fetchMode);
                     //custom filter
                     if ($filterCallback != null && is_array($filterCallback)) {
                         try {
                             $newStatements = call_user_func($filterCallback, $newStatements);
                         } catch (Exception $e) {
                             return self::IMPORT_CUSTOMFILTER_EXCEPTION;
                         }
                     }
                     $stmtBeforeCount = $store->countWhereMatches($graphUri, '{ ?s ?p ?o }', '*');
                     if ($versioning) {
                         // Prepare versioning...
                         $versioning = $erfurt->getVersioning();
                         $actionSpec = array('type' => self::VERSIONING_IMPORT_ACTION_TYPE, 'modeluri' => $graphUri, 'resourceuri' => $uri);
                         // Start action
                         $versioning->startAction($actionSpec);
                     }
                     if ($action == 'add') {
                         try {
                             $store->addMultipleStatements($graphUri, $newStatements);
                         } catch (Exception $e) {
                             $versioning->abortAction();
                             if (defined('_EFDEBUG')) {
                                 throw $e;
                             }
                             return self::IMPORT_GENERAL_EXCEPTION;
                         }
                     } else {
                         if ($action == 'update') {
                             $queryoptions = array('use_ac' => false, 'result_format' => Erfurt_Store::RESULTFORMAT_EXTENDED, 'use_additional_imports' => false);
                             $oldStatements = $store->sparqlQuery('SELECT * FROM <' . $graphUri . '> WHERE { ?s ?p ?o }', $queryoptions);
                             //transform resultset to rdf/php statements
                             $modelOld = new Erfurt_Rdf_MemoryModel();
                             $modelOld->addStatementsFromSPOQuery($oldStatements);
                             $modelNew = new Erfurt_Rdf_MemoryModel($newStatements);
                             $storeGraph->updateWithMutualDifference($modelOld->getStatements(), $modelNew->getStatements());
                         }
                     }
                     if ($versioning) {
                         $versioning->endAction();
                     }
                     $stmtAfterCount = $store->countWhereMatches($graphUri, '{ ?s ?p ?o }', '*');
                     $stmtAddCount = $stmtAfterCount - $stmtBeforeCount;
                     if ($stmtAddCount > 0) {
                         // TODO test ns
                         // If we added some statements, we check for additional namespaces and add them.
                         if (in_array(Erfurt_Wrapper::RESULT_HAS_NS, $wrapperResult['status_codes'])) {
                             $namespaces = $wrapperResult['ns'];
                             $erfurtNamespaces = $erfurt->getNamespaces();
                             foreach ($namespaces as $ns => $prefix) {
                                 try {
                                     $erfurtNamespaces->addNamespacePrefix($graphUri, $prefix, $ns, false);
                                 } catch (Exception $e) {
                                     // Ignore...
                                 }
                             }
                         }
                         return self::IMPORT_OK;
                     } else {
                         if (count($newStatements) > 0) {
                             return self::IMPORT_NO_NEW_DATA;
                         } else {
                             return self::IMPORT_NO_DATA;
                         }
                     }
                 } else {
                     return self::IMPORT_NO_DATA;
                 }
             } else {
                 return self::IMPORT_WRAPPER_ERR;
             }
         } else {
             return self::IMPORT_WRAPPER_ERR;
         }
     }
 }
 public function testIsHandledFalseWithLocator()
 {
     $r = new Erfurt_Rdf_Resource('mailto:me@example.org');
     $r->setLocator('mailto:anotherMe@example.org');
     $this->assertFalse($this->_wrapper->isHandled($r, null));
 }
 public function __construct($resourceUri)
 {
     $owApp = OntoWiki::getInstance();
     $store = $owApp->erfurt->getStore();
     $model = $owApp->selectedModel;
     $resource = new Erfurt_Sparql_Query2_IriRef($resourceUri);
     $ontology = new Erfurt_Sparql_Query2_IriRef(EF_OWL_ONTOLOGY);
     $fetchFrom = new Erfurt_Sparql_Query2_IriRef(static::SITE_FETCH_OPTIONS_FROM);
     // fetch options from this resource
     $query = new Erfurt_Sparql_Query2();
     list($key, $value, $class, $dataset) = $this->_queryAddVars($query, array('key', 'value', 'class', 'dataset'));
     $union = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
     // resource options
     $group = new Erfurt_Sparql_Query2_GroupGraphPattern();
     $group->addTriple($resource, $key, $value);
     $union->addElement($group);
     // class options
     $group = new Erfurt_Sparql_Query2_GroupGraphPattern();
     $group->addTriple($resource, EF_RDF_TYPE, $class);
     $group->addTriple($class, $key, $value);
     $union->addElement($group);
     // dataset options
     $group = new Erfurt_Sparql_Query2_GroupGraphPattern();
     $group->addTriple($dataset, EF_RDF_TYPE, new Erfurt_Sparql_Query2_IriRef(EF_OWL_ONTOLOGY));
     $group->addTriple($dataset, $key, $value);
     $union->addElement($group);
     $query->addElement($union);
     $query->addTriple($key, EF_RDF_TYPE, new Erfurt_Sparql_Query2_IriRef(static::SITE_TEMPLATE_OPTION));
     $results = $model->sparqlQuery($query);
     foreach ($results as $result) {
         $arrayKey = $result[$key->getName()];
         $this->_options[$arrayKey][$this->_getPriority($result)][] = $result[$value->getName()];
         $templateOption = new Erfurt_Rdf_Resource($arrayKey, $model);
         $arrayKeyLocalName = $templateOption->getLocalName();
         $this->_optionLocalNames[$arrayKeyLocalName][] = $arrayKey;
     }
     // fetch options from linked resources
     $query = new Erfurt_Sparql_Query2();
     list($other, $class, $dataset) = $this->_queryAddVars($query, array('other', 'class', 'dataset'));
     $union = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
     // resource links
     $group = new Erfurt_Sparql_Query2_GroupGraphPattern();
     $group->addTriple($resource, $fetchFrom, $other);
     $union->addElement($group);
     // class links
     $group = new Erfurt_Sparql_Query2_GroupGraphPattern();
     $group->addTriple($resource, EF_RDF_TYPE, $class);
     $group->addTriple($class, $fetchFrom, $other);
     $union->addElement($group);
     // dataset links
     $group = new Erfurt_Sparql_Query2_GroupGraphPattern();
     $group->addTriple($dataset, EF_RDF_TYPE, $ontology);
     $group->addTriple($dataset, $fetchFrom, $other);
     $union->addElement($group);
     $query->addElement($union);
     $results = $model->sparqlQuery($query);
     foreach ($results as $result) {
         $options = new TemplateOptionsClass($result[$other->getName()]);
         foreach ($options->_options as $arrayKey => $priorities) {
             foreach ($priorities as $priority => $values) {
                 $floor = floor($priority);
                 $this->_options[$arrayKey][(string) ($floor + 0.1 * $this->_getPriority($result) + 0.1 * ($priority - $floor))] = $values;
             }
         }
         foreach ($options->_optionLocalNames as $arrayKeyLocalName => $keys) {
             foreach ($keys as $key) {
                 if (!isset($this->_optionLocalNames[$arrayKeyLocalName]) || !in_array($key, $this->_optionLocalNames[$arrayKeyLocalName])) {
                     $this->_optionLocalNames[$arrayKeyLocalName][] = $key;
                 }
             }
         }
     }
     foreach (array_keys($this->_options) as $key) {
         ksort($this->_options[$key]);
     }
 }
Example #9
0
 protected function _createBNode($id = null)
 {
     if (null === $id) {
         while (true) {
             $id = self::BNODE_PREFIX . ++$this->_bnodeCounter;
             if (!isset($this->_usedBnodeIds[$id])) {
                 break;
             }
         }
     }
     $this->_usedBnodeIds[$id] = true;
     require_once 'Erfurt/Rdf/Resource.php';
     return Erfurt_Rdf_Resource::initWithBlankNode($id);
 }