private function tryToMatchDataItemForWikiNamespaceUri($uri)
 {
     $dataItem = null;
     $localName = substr($uri, strlen($this->wikiNamespace));
     $dbKey = rawurldecode(Escaper::decodeUri($localName));
     $parts = explode('#', $dbKey, 2);
     if (count($parts) == 2) {
         $dbKey = $parts[0];
         $subobjectname = $parts[1];
     } else {
         $subobjectname = '';
     }
     $parts = explode(':', $dbKey, 2);
     // No extra NS
     if (count($parts) == 1) {
         return new DIWikiPage($dbKey, NS_MAIN, '', $subobjectname);
     }
     $namespaceId = $this->tryToMatchNamespaceName($parts[0]);
     if ($namespaceId != -1 && $namespaceId !== false) {
         $dataItem = new DIWikiPage($parts[1], $namespaceId, '', $subobjectname);
     } else {
         $title = Title::newFromDBkey($dbKey);
         if ($title !== null) {
             $dataItem = new DIWikiPage($title->getDBkey(), $title->getNamespace(), $title->getInterwiki(), $subobjectname);
         }
     }
     return $dataItem;
 }
 public function diWikiPageProvider()
 {
     // Constant
     $wiki = \SMWExporter::getInstance()->getNamespaceUri('wiki');
     $property = \SMWExporter::getInstance()->getNamespaceUri('property');
     #0
     $provider[] = array(new DIWikiPage('Foo', NS_MAIN, '', ''), '', array('type' => Element::TYPE_NSRESOURCE, 'uri' => "Foo|{$wiki}|wiki", 'dataitem' => array('type' => 9, 'item' => 'Foo#0#')));
     #1
     $provider[] = array(new DIWikiPage('Foo', NS_MAIN, 'bar', ''), '', array('type' => Element::TYPE_NSRESOURCE, 'uri' => "bar-3AFoo|{$wiki}|wiki", 'dataitem' => array('type' => 9, 'item' => 'Foo#0#bar')));
     #2
     $provider[] = array(new DIWikiPage('Foo', NS_MAIN, 'bar', '1234'), '', array('type' => Element::TYPE_NSRESOURCE, 'uri' => "bar-3AFoo-231234|{$wiki}|wiki", 'dataitem' => array('type' => 9, 'item' => 'Foo#0#bar#1234')));
     #3 Extra modififer doesn't not alter the object when a subobject is used
     $provider[] = array(new DIWikiPage('Foo', NS_MAIN, 'bar', '1234'), 'abc', array('type' => Element::TYPE_NSRESOURCE, 'uri' => "bar-3AFoo-231234|{$wiki}|wiki", 'dataitem' => array('type' => 9, 'item' => 'Foo#0#bar#1234')));
     #4
     $provider[] = array(new DIWikiPage('Foo', SMW_NS_PROPERTY, '', ''), '', array('type' => Element::TYPE_NSRESOURCE, 'uri' => "Foo|{$property}|property", 'dataitem' => array('type' => 9, 'item' => 'Foo#102#')));
     #5
     $provider[] = array(new DIWikiPage('Foo', SMW_NS_PROPERTY, '', ''), true, array('type' => Element::TYPE_NSRESOURCE, 'uri' => "Foo-23aux|{$property}|property", 'dataitem' => array('type' => 9, 'item' => 'Foo#102#')));
     #6
     $name = Escaper::encodePage(new DIWikiPage('-Foo', SMW_NS_PROPERTY, '', ''));
     $provider[] = array(new DIWikiPage('-Foo', SMW_NS_PROPERTY, '', ''), true, array('type' => Element::TYPE_NSRESOURCE, 'uri' => "{$name}-23aux|{$wiki}|wiki", 'dataitem' => array('type' => 9, 'item' => '-Foo#102#')));
     return $provider;
 }
 function execute($query)
 {
     global $wgOut;
     if (is_null($query) || trim($query) === '') {
         if (stristr($_SERVER['HTTP_ACCEPT'], 'RDF')) {
             $wgOut->redirect(SpecialPage::getTitleFor('ExportRDF')->getFullURL(array('stats' => '1')), '303');
         } else {
             $this->setHeaders();
             $wgOut->addHTML('<p>' . wfMessage('smw_uri_doc', 'http://www.w3.org/2001/tag/issues.html#httpRange-14')->parse() . '</p>');
         }
     } else {
         $query = Escaper::decodeUri($query);
         $query = str_replace('_', '%20', $query);
         $query = urldecode($query);
         $title = Title::newFromText($query);
         // In case the title doesn't exists throw an error page
         if ($title === null) {
             $wgOut->showErrorPage('badtitle', 'badtitletext');
         } else {
             $wgOut->redirect(stristr($_SERVER['HTTP_ACCEPT'], 'RDF') ? SpecialPage::getTitleFor('ExportRDF', $title->getPrefixedText())->getFullURL(array('xmlmime' => 'rdf')) : $title->getFullURL(), '303');
         }
     }
 }
 private function defineElementsForDiWikiPage(DIWikiPage $diWikiPage, $modifier)
 {
     $localName = '';
     if ($diWikiPage->getNamespace() === SMW_NS_PROPERTY) {
         $namespace = Exporter::getInstance()->getNamespaceUri('property');
         $namespaceId = 'property';
         $localName = Escaper::encodeUri(rawurlencode($diWikiPage->getDBkey()));
     }
     if ($localName === '' || in_array($localName[0], array('-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'))) {
         $namespace = Exporter::getInstance()->getNamespaceUri('wiki');
         $namespaceId = 'wiki';
         $localName = Escaper::encodePage($diWikiPage);
     }
     // "-23$modifier" where "-23" is the URI encoding of "#" (a symbol not
     // occuring in MW titles).
     if ($modifier !== '') {
         $localName .= '-23' . Escaper::encodeUri(rawurlencode($modifier));
     }
     return array($localName, $namespace, $namespaceId);
 }
 /**
  * @return string
  */
 public function decodeURI($uri)
 {
     return Escaper::decodeUri($uri);
 }
 /**
  * @dataProvider decodeUriProvider
  */
 public function testDecodeUri($uri, $expected)
 {
     $this->assertEquals($expected, Escaper::decodeUri($uri));
     $this->assertEquals($uri, Escaper::encodeUri(Escaper::decodeUri($uri)));
 }
 public function testExportSubobject()
 {
     $semanticData = $this->semanticDataFactory->newEmptySemanticData(__METHOD__);
     $subobject = new Subobject($semanticData->getSubject()->getTitle());
     $subobject->setEmptyContainerForId('Foo');
     $semanticData->addPropertyObjectValue($subobject->getProperty(), $subobject->getContainer());
     $exportData = Exporter::getInstance()->makeExportData($semanticData);
     $expectedProperty = new ExpNsResource($this->transformPropertyLabelToAuxiliary($subobject->getProperty()), Exporter::getInstance()->getNamespaceUri('property'), 'property', new DIWikiPage('Has_subobject', SMW_NS_PROPERTY));
     $this->assertTrue(Exporter::getInstance()->hasHelperExpElement($subobject->getProperty()));
     $this->assertCount(1, $exportData->getValues($expectedProperty));
     $this->exportDataValidator->assertThatExportDataContainsProperty($expectedProperty, $exportData);
     $expectedResource = new ExpNsResource(Escaper::encodePage($subobject->getSemanticData()->getSubject()) . '-23' . 'Foo', Exporter::getInstance()->getNamespaceUri('wiki'), 'wiki', $subobject->getSemanticData()->getSubject());
     $this->exportDataValidator->assertThatExportDataContainsResource($expectedResource, $expectedProperty, $exportData);
 }
 /**
  * Try to find an SMWDataItem that the given SMWExpElement might
  * represent. Returns null if this attempt failed.
  *
  * @param SMWExpElement $expElement
  * @return SMWDataItem or null
  */
 public static function findDataItemForExpElement(SMWExpElement $expElement)
 {
     global $wgContLang;
     $dataItem = null;
     if ($expElement instanceof SMWExpResource) {
         $uri = $expElement->getUri();
         $wikiNamespace = self::getNamespaceUri('wiki');
         if (strpos($uri, $wikiNamespace) === 0) {
             $localName = substr($uri, strlen($wikiNamespace));
             $dbKey = rawurldecode(Escaper::decodeUri($localName));
             $parts = explode('#', $dbKey, 2);
             if (count($parts) == 2) {
                 $dbKey = $parts[0];
                 $subobjectname = $parts[1];
             } else {
                 $subobjectname = '';
             }
             $parts = explode(':', $dbKey, 2);
             if (count($parts) == 1) {
                 $dataItem = new SMWDIWikiPage($dbKey, NS_MAIN, '', $subobjectname);
             } else {
                 // try the by far most common cases directly before using Title
                 $namespaceName = str_replace('_', ' ', $parts[0]);
                 $namespaceId = -1;
                 foreach (array(SMW_NS_PROPERTY, NS_CATEGORY, NS_USER, NS_HELP) as $nsId) {
                     if ($namespaceName == $wgContLang->getNsText($nsId)) {
                         $namespaceId = $nsId;
                         break;
                     }
                 }
                 if ($namespaceId != -1) {
                     $dataItem = new SMWDIWikiPage($parts[1], $namespaceId, '', $subobjectname);
                 } else {
                     $title = Title::newFromDBkey($dbKey);
                     if (!is_null($title)) {
                         $dataItem = new SMWDIWikiPage($title->getDBkey(), $title->getNamespace(), $title->getInterwiki(), $subobjectname);
                     }
                 }
             }
         }
         // else: not in wiki namespace -- TODO: this could be an imported URI
     } else {
         // TODO (currently not needed, but will be useful for displaying external SPARQL results)
     }
     return $dataItem;
 }
 public function testRedirectTragetForDBLookupWithMultipleEntriesForcesNewResource()
 {
     $propertyPage = new DIWikiPage('Foo', SMW_NS_PROPERTY);
     $resource = new ExpNsResource('Foo', Exporter::getInstance()->getNamespaceUri('property'), 'property', $propertyPage);
     $repositoryConnection = $this->createRepositoryConnectionMockToUse(array($resource, $resource));
     $instance = new RedirectLookup($repositoryConnection);
     $instance->reset();
     $dataItem = new DIWikiPage('Foo', 1, '', '');
     $expNsResource = new ExpNsResource('Foo', 'Bar', '', $dataItem);
     $exists = null;
     $targetResource = $instance->findRedirectTargetResource($expNsResource, $exists);
     $this->assertNotSame($expNsResource, $targetResource);
     $expectedResource = new ExpNsResource(Escaper::encodePage($propertyPage), Exporter::getInstance()->getNamespaceUri('wiki'), 'wiki');
     $this->assertEquals($expectedResource, $targetResource);
     $this->assertTrue($exists);
 }