/**
 * This function is called, when a <ImportSettings>-tag for a Term Import
 * has been found in an article.
 *
 */
function termImportParserHook($input, $args, $parser)
{
    require_once "SMW_TermImportDefinitionValidator.php";
    $attr = "";
    foreach ($args as $k => $v) {
        $attr .= " " . $k . '="' . $v . '"';
    }
    $completeImportSettings = "<ImportSettings{$attr}>" . $input . "</ImportSettings>\n";
    $messages = "";
    $tiDV = new SMWTermImportDefinitionValidator($completeImportSettings);
    if (!$tiDV->isValidXML()) {
        $messages .= "\n* Invalid XML";
    } else {
        if (!$tiDV->isValidModuleConfiguration()) {
            $messages .= "\n* Invalid ModuleConfiguration.";
        }
        if (!$tiDV->isValidDataSource()) {
            $messages .= "\n* Invalid data source definition.";
        }
        if (!$tiDV->isValidConflictPolicy()) {
            $messages .= "\n* Invalid conflict policy.";
        }
        if (!$tiDV->isValidMappingPolicy()) {
            $messages .= "\n* Invalid mapping policy.";
        }
        if (!$tiDV->isValidImportSet()) {
            $messages .= "\n* Invalid import set.";
        }
        if (!$tiDV->isValidInputPolicy()) {
            $messages .= "\n* Invalid Input Policy.";
        }
        if (!$tiDV->isValidUpdatePolicy()) {
            $messages .= "\n* Invalid update policy.";
        }
    }
    if (strlen($messages) > 0) {
        $messages = '<h4><span class="mw-headline">The Term Import Definition is erronious</span></h4>' . $messages;
    } else {
        global $wgArticlePath;
        if (strpos($wgArticlePath, "?") > 0) {
            $url = Title::makeTitleSafe(NS_SPECIAL, "TermImport")->getFullURL() . "&tiname=" . $parser->getTitle()->getText();
        } else {
            $url = Title::makeTitleSafe(NS_SPECIAL, "TermImport")->getFullURL() . "?tiname=" . $parser->getTitle()->getText();
        }
        $messages = '<h4><a href="' . $url . '">Click here to edit the Term Import definition in the GUI</a></h4>';
    }
    $completeImportSettings = '<h4><span class="mw-headline">Term Import definition</span></h4>' . '<pre>' . trim(htmlspecialchars($completeImportSettings)) . '</pre>';
    return $completeImportSettings . $messages;
}
 private function getNecessaryTermImports()
 {
     require_once "SMW_TermImportDefinitionValidator.php";
     $log = SGAGardeningIssuesAccess::getGardeningIssuesAccess();
     SMWQueryProcessor::processFunctionParams(array("[[TermImport:+]] [[Category:TermImport]]"), $querystring, $params, $printouts);
     $queryResult = explode("|", SMWQueryProcessor::getResultFromQueryString($querystring, $params, $printouts, SMW_OUTPUT_WIKI));
     unset($queryResult[0]);
     $necessaryTermImports = array();
     foreach ($queryResult as $tiArticleName) {
         $tiArticleName = substr($tiArticleName, 0, strpos($tiArticleName, "]]"));
         $xmlString = smwf_om_GetWikiText('TermImport:' . $tiArticleName);
         $start = strpos($xmlString, "<ImportSettings>");
         $end = strpos($xmlString, "</ImportSettings>") + 17 - $start;
         $xmlString = substr($xmlString, $start, $end);
         SMWQueryProcessor::processFunctionParams(array("[[belongsToTermImport::TermImport:" . $tiArticleName . "]]", "?hasImportDate", "limit=1", "sort=hasImportDate", "order=descending", "format=list", "mainlabel=-", "searchlabel="), $querystring, $params, $printouts);
         $queryResult = SMWQueryProcessor::getResultFromQueryString($querystring, $params, $printouts, SMW_OUTPUT_WIKI);
         // timestamp creation depends on property type (page or date)
         $queryResult = trim(substr($queryResult, strpos($queryResult, "]]") + 2));
         if (strpos($queryResult, "[[:") === 0) {
             //type page
             $queryResult = trim(substr($queryResult, strpos($queryResult, "|") + 1));
             $queryResult = trim(substr($queryResult, 0, strpos($queryResult, "]")));
         } else {
             //type date
             $queryResult = trim(substr($queryResult, 0, strpos($queryResult, "[")));
         }
         $timestamp = strtotime($queryResult);
         $tiDV = new SMWTermImportDefinitionValidator($xmlString);
         if (!$tiDV->validate()) {
             echo "\nThe Term Import definition of " . $tiArticleName . " is invalid.\n";
             $title = Title::newFromText("TermImport:" . $tiArticleName);
             $log->addGardeningIssueAboutArticle($this->id, SMW_GARDISSUE_UPDATE_FAILURE, $title);
             continue;
         }
         $simpleXMLElement = new SimpleXMLElement($xmlString);
         $maxAge = $simpleXMLElement->xpath("//UpdatePolicy/maxAge/@value");
         //echo("\ntimestamp: ".$imestamp);
         if ($maxAge != "") {
             if ($timestamp == 0 || wfTime() - $timestamp - $maxAge[0]->value * 60 > 0) {
                 echo "\nRun this term import: " . $tiArticleName;
                 $necessaryTermImports[$tiArticleName] = $xmlString;
             }
         } else {
             $title = Title::newFromText("TermImport:" . $tiArticleName);
             $log->addGardeningIssueAboutArticle($this->id, SMW_GARDISSUE_UPDATE_NOT_NECESSARY, $title);
         }
     }
     return $necessaryTermImports;
 }