/**
  * Serializes the tree structure (without root node)
  */
 public function serializeAsXML($type)
 {
     $id = uniqid(rand());
     $count = 0;
     $result = "";
     $gi_store = SGAGardeningIssuesAccess::getGardeningIssuesAccess();
     foreach ($this->children as $title => $treeObject) {
         $isExpanded = count($treeObject->children) == 0 ? "false" : "true";
         $title_esc = htmlspecialchars($treeObject->getTitle()->getDBkey());
         $titleURLEscaped = htmlspecialchars(SMWOntologyBrowserXMLGenerator::urlescape($treeObject->getTitle()->getDBkey()));
         $issues = $gi_store->getGardeningIssues('smw_consistencybot', NULL, NULL, $treeObject->getTitle());
         $gi_issues = SMWOntologyBrowserErrorHighlighting::getGardeningIssuesAsXML($issues);
         $result .= "<{$type} title_url=\"{$titleURLEscaped}\" title=\"" . $title_esc . "\" img=\"{$type}.gif\" id=\"ID_{$id}{$count}\" expanded=\"{$isExpanded}\">";
         $result .= $gi_issues;
         $result .= $treeObject->serializeAsXML($type);
         $result .= "</{$type}>";
         $count++;
     }
     return $result;
 }
 /**
  * Returns an XML represenatation of a schema property
  *
  * @param array & schemaData. Tuple of (title, minCard, maxCard, type, isSym, isTrans, range)
  * @param count continuous number for generating new IDs
  * @param array & issues Gardening issues for that property
  *
  * @return XML string (fragment)
  */
 private static function encapsulateAsProperty(array &$schemaData, $count, array &$issues)
 {
     $id = uniqid(rand());
     $content = "";
     // unpack schemaData array
     $title = $schemaData[0];
     $minCardinality = $schemaData[1];
     $maxCardinality = $schemaData[2];
     $type = $schemaData[3];
     $isMemberOfSymCat = $schemaData[4];
     $isMemberOfTransCat = $schemaData[5];
     $range = $schemaData[6];
     $inherited = $schemaData[7] == true ? "inherited=\"true\"" : "";
     if ($type == '_wpg') {
         // binary relation?
         if ($range == NULL) {
             $content .= "<rangeType>" . wfMsg('smw_ob_undefined_type') . "</rangeType>";
         } else {
             $content .= "<rangeType isLink=\"true\">" . $range . "</rangeType>";
         }
     } else {
         // it must be an attribute or n-ary relation otherwise.
         $v = SMWDataValueFactory::newPropertyObjectValue(SMWPropertyValue::makeProperty("_TYPE"));
         $v->setDBkeys(array($type));
         $typesOfAttributeAsString = $v->getTypeLabels();
         foreach ($typesOfAttributeAsString as $typeOfAttributeAsString) {
             $content .= "<rangeType>" . $typeOfAttributeAsString . "</rangeType>";
         }
     }
     // generate attribute strings
     $maxCardText = $maxCardinality != CARDINALITY_UNLIMITED ? "maxCard=\"" . $maxCardinality . "\"" : "maxCard=\"*\"";
     $minCardText = $minCardinality != CARDINALITY_MIN ? "minCard=\"" . $minCardinality . "\"" : "minCard=\"0\"";
     $isSymetricalText = $isMemberOfSymCat ? "isSymetrical=\"true\"" : "";
     $isTransitiveText = $isMemberOfTransCat ? "isTransitive=\"true\"" : "";
     $title_esc = htmlspecialchars($title->getDBkey());
     $titleURLEscaped = htmlspecialchars(self::urlescape($title->getDBkey()));
     $numberofUsage = smwfGetSemanticStore()->getNumberOfUsage($title);
     $numberOfUsageAtt = 'num="' . $numberofUsage . '"';
     $gi_issues = SMWOntologyBrowserErrorHighlighting::getGardeningIssuesAsXML($issues);
     return "<property title_url=\"{$titleURLEscaped}\" title=\"" . $title_esc . "\" id=\"ID_" . $id . $count . "\" " . "{$minCardText} {$maxCardText} {$isSymetricalText} {$isTransitiveText} {$numberOfUsageAtt} {$inherited}>" . $content . $gi_issues . "</property>";
 }