/*
* WPCleaner: A tool to help on Wikipedia maintenance tasks.
* Copyright (C) 2013 Nicolas Vervelle
*
* See README.txt file for licensing information.
*/
package org.wikipediacleaner.api.request.query.meta;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.commons.httpclient.HttpClient;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.filter.Filters;
import org.jdom2.xpath.XPathExpression;
import org.jdom2.xpath.XPathFactory;
import org.wikipediacleaner.api.APIException;
import org.wikipediacleaner.api.constants.EnumCaseSensitiveness;
import org.wikipediacleaner.api.constants.EnumWikipedia;
import org.wikipediacleaner.api.constants.WikiConfiguration;
import org.wikipediacleaner.api.data.Interwiki;
import org.wikipediacleaner.api.data.Language;
import org.wikipediacleaner.api.data.MagicWord;
import org.wikipediacleaner.api.data.Namespace;
import org.wikipediacleaner.api.data.SpecialPage;
import org.wikipediacleaner.api.request.ApiRequest;
import org.wikipediacleaner.api.request.ApiXmlResult;
/**
* MediaWiki API XML site information results.
*/
public class ApiXmlSiteInfoResult extends ApiXmlResult implements ApiSiteInfoResult {
/**
* @param wiki Wiki on which requests are made.
* @param httpClient HTTP client for making requests.
*/
public ApiXmlSiteInfoResult(
EnumWikipedia wiki,
HttpClient httpClient) {
super(wiki, httpClient);
}
/**
* Execute site information request.
*
* @param properties Properties defining request.
* @throws APIException
*/
@Override
public void executeSiteInformation(
Map<String, String> properties)
throws APIException {
try {
Element root = getRoot(properties, ApiRequest.MAX_ATTEMPTS);
WikiConfiguration wikiConfiguration = getWiki().getWikiConfiguration();
// Retrieve general information
XPathExpression<Element> xpa = XPathFactory.instance().compile(
"/api/query/general", Filters.element());
Element generalNode = xpa.evaluateFirst(root);
if (generalNode != null) {
wikiConfiguration.setArticlePath(generalNode.getAttributeValue("articlepath"));
wikiConfiguration.setMaxArticleSize(generalNode.getAttributeValue("maxarticlesize"));
wikiConfiguration.setScript(generalNode.getAttributeValue("script"));
wikiConfiguration.setServer(generalNode.getAttributeValue("server"));
}
// Retrieve name spaces
HashMap<Integer, Namespace> namespaces = null;
xpa = XPathFactory.instance().compile(
"/api/query/namespaces/ns", Filters.element());
List<Element> results = xpa.evaluate(root);
Iterator<Element> iter = results.iterator();
namespaces = new HashMap<>();
while (iter.hasNext()) {
Element currentNode = iter.next();
String title = currentNode.getText();
String canonical = currentNode.getAttributeValue("canonical");
String id = currentNode.getAttributeValue("id");
EnumCaseSensitiveness caseSensitiveness = EnumCaseSensitiveness.getCase(currentNode.getAttributeValue("case"));
boolean subPages = (currentNode.getAttribute("subpages") != null);
Namespace ns = new Namespace(id, title, canonical, caseSensitiveness, subPages);
namespaces.put(ns.getId(), ns);
}
// Retrieve name space aliases
xpa = XPathFactory.instance().compile(
"/api/query/namespacealiases/ns", Filters.element());
results = xpa.evaluate(root);
iter = results.iterator();
while (iter.hasNext()) {
Element currentNode = iter.next();
Integer nsId = null;
try {
nsId = Integer.parseInt(currentNode.getAttributeValue("id"));
Namespace namespace = namespaces.get(nsId);
if (namespace != null) {
namespace.addAlias(currentNode.getText());
}
} catch (NumberFormatException e) {
//
}
}
// Update name space list
LinkedList<Namespace> list = new LinkedList<>(namespaces.values());
wikiConfiguration.setNamespaces(list);
// Retrieve languages
List<Language> languages = new ArrayList<>();
xpa = XPathFactory.instance().compile(
"/api/query/languages/lang", Filters.element());
results = xpa.evaluate(root);
iter = results.iterator();
while (iter.hasNext()) {
Element currentNode = iter.next();
String code = currentNode.getAttributeValue("code");
String name = currentNode.getText();
languages.add(new Language(code, name));
}
wikiConfiguration.setLanguages(languages);
// Retrieve interwikis
List<Interwiki> interwikis = new ArrayList<>();
xpa = XPathFactory.instance().compile(
"/api/query/interwikimap/iw", Filters.element());
results = xpa.evaluate(root);
iter = results.iterator();
while (iter.hasNext()) {
Element currentNode = iter.next();
String prefix = currentNode.getAttributeValue("prefix");
boolean local = (currentNode.getAttribute("local") != null);
String language = currentNode.getAttributeValue("language");
String url = currentNode.getAttributeValue("url");
interwikis.add(new Interwiki( prefix, local, language, url));
}
wikiConfiguration.setInterwikis(interwikis);
// Retrieve magic words
Map<String, MagicWord> magicWords = new HashMap<>();
xpa = XPathFactory.instance().compile(
"/api/query/magicwords/magicword", Filters.element());
results = xpa.evaluate(root);
iter = results.iterator();
XPathExpression<Element> xpaAlias = XPathFactory.instance().compile(
"./aliases/alias", Filters.element());
while (iter.hasNext()) {
Element currentNode = iter.next();
String magicWord = currentNode.getAttributeValue("name");
List<String> aliases = new ArrayList<>();
List<Element> resultsAlias = xpaAlias.evaluate(currentNode);
Iterator<Element> iterAlias = resultsAlias.iterator();
while (iterAlias.hasNext()) {
Element currentAlias = iterAlias.next();
String alias = currentAlias.getText();
aliases.add(alias);
}
boolean caseSensitive = (currentNode.getAttribute("case-sensitive") != null);
magicWords.put(
magicWord,
new MagicWord(magicWord, aliases, caseSensitive));
}
wikiConfiguration.setMagicWords(magicWords);
// Retrieve special page aliases
Map<String, SpecialPage> specialPages = new HashMap<>();
xpa = XPathFactory.instance().compile(
"/api/query/specialpagealiases/specialpage", Filters.element());
results = xpa.evaluate(root);
iter = results.iterator();
while (iter.hasNext()) {
Element currentNode = iter.next();
String specialPage = currentNode.getAttributeValue("realname");
List<String> aliases = new ArrayList<String>();
List<Element> resultsAlias = xpaAlias.evaluate(currentNode);
Iterator<Element> iterAlias = resultsAlias.iterator();
while (iterAlias.hasNext()) {
Element currentAlias = iterAlias.next();
String alias = currentAlias.getText();
aliases.add(alias);
}
specialPages.put(
specialPage,
new SpecialPage(specialPage, aliases));
}
wikiConfiguration.setSpecialPages(specialPages);
} catch (JDOMException e) {
log.error("Error loading namespaces", e);
throw new APIException("Error parsing XML", e);
}
}
}