/**
  * Check if this element encodes an RDF list, and if yes return an
  * array of SMWExpElements corresponding to the collection elements in
  * the specified order. Otherwise return false.
  * The method only returns lists that can be encoded using
  * parseType="Collection" in RDF/XML, i.e. only lists of non-literal
  * resources.
  *
  * @return mixed array of SMWExpElement (but not SMWExpLiteral) or false
  */
 public function getCollection()
 {
     $rdftypeUri = SMWExporter::getInstance()->getSpecialNsResource('rdf', 'type')->getUri();
     $rdffirstUri = SMWExporter::getInstance()->getSpecialNsResource('rdf', 'first')->getUri();
     $rdfrestUri = SMWExporter::getInstance()->getSpecialNsResource('rdf', 'rest')->getUri();
     $rdfnilUri = SMWExporter::getInstance()->getSpecialNsResource('rdf', 'nil')->getUri();
     // first check if we are basically an RDF List:
     if ($this->m_subject->isBlankNode() && count($this->m_children) == 3 && array_key_exists($rdftypeUri, $this->m_children) && count($this->m_children[$rdftypeUri]) == 1 && array_key_exists($rdffirstUri, $this->m_children) && count($this->m_children[$rdffirstUri]) == 1 && !end($this->m_children[$rdffirstUri]) instanceof SMWExpLiteral && array_key_exists($rdfrestUri, $this->m_children) && count($this->m_children[$rdfrestUri]) == 1) {
         $typedata = end($this->m_children[$rdftypeUri]);
         $rdflistUri = SMWExporter::getInstance()->getSpecialNsResource('rdf', 'List')->getUri();
         if ($typedata->getSubject()->getUri() == $rdflistUri) {
             $first = end($this->m_children[$rdffirstUri]);
             $rest = end($this->m_children[$rdfrestUri]);
             if ($rest instanceof SMWExpData) {
                 $restlist = $rest->getCollection();
                 if ($restlist === false) {
                     return false;
                 } else {
                     array_unshift($restlist, $first);
                     return $restlist;
                 }
             } elseif ($rest instanceof SMWExpResource && $rest->getUri() == $rdfnilUri) {
                 return array($first);
             } else {
                 return false;
             }
         } else {
             return false;
         }
     } elseif (count($this->m_children) == 0 && $this->m_subject->getUri() == $rdfnilUri) {
         return array();
     } else {
         return false;
     }
 }
 /**
  * Add to the output a serialization of a property assignment where an
  * SMWExpResource is the object. It is assumed that a suitable subject
  * block has already been openend.
  *
  * @param $expResourceProperty SMWExpNsResource the property to use
  * @param $expResource SMWExpResource the data value to use
  * @param $indent string specifying a prefix for indentation (usually a sequence of tabs)
  * @param $isClassTypeProp boolean whether the resource must be declared as a class
  */
 protected function serializeExpResource(SMWExpNsResource $expResourceProperty, SMWExpResource $expResource, $indent, $isClassTypeProp)
 {
     $this->post_ns_buffer .= $indent . '<' . $expResourceProperty->getQName();
     if (!$expResource->isBlankNode()) {
         if ($expResource instanceof SMWExpNsResource && $expResource->getNamespaceID() == 'wiki') {
             // very common case, reduce bandwidth
             $this->post_ns_buffer .= ' rdf:resource="&wiki;' . $expResource->getLocalName() . '"';
         } else {
             $uriValue = $this->makeAttributeValueString($expResource->getUri());
             $this->post_ns_buffer .= ' rdf:resource="' . $uriValue . '"';
         }
     }
     $this->post_ns_buffer .= "/>\n";
     if ($isClassTypeProp) {
         $this->requireDeclaration($expResource, SMW_SERIALIZER_DECL_CLASS);
     }
 }
Esempio n. 3
0
 /**
  * Update the declaration "todo" and "done" lists to reflect the fact that
  * the given element has been declared to has the given type.
  * 
  * @param $element SMWExpResource specifying the element to update 
  * @param $typeflag integer specifying the type (e.g. SMW_SERIALIZER_DECL_CLASS)
  */
 protected function declarationDone(SMWExpResource $element, $typeflag)
 {
     $name = $element->getUri();
     $curdone = array_key_exists($name, $this->decl_done) ? $this->decl_done[$name] : 0;
     $this->decl_done[$name] = $curdone | $typeflag;
     if (array_key_exists($name, $this->decl_todo)) {
         $this->decl_todo[$name] = $this->decl_todo[$name] & ~$typeflag;
         if ($this->decl_todo[$name] == 0) {
             unset($this->decl_todo[$name]);
         }
     }
 }