/*
* 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.parse;
import java.util.ArrayList;
import java.util.Iterator;
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.EnumQueryResult;
import org.wikipediacleaner.api.constants.EnumWikipedia;
import org.wikipediacleaner.api.data.Page;
import org.wikipediacleaner.api.data.Section;
import org.wikipediacleaner.api.request.ApiRequest;
import org.wikipediacleaner.api.request.ApiXmlResult;
/**
* MediaWiki API XML parse results.
*/
public class ApiXmlParseResult extends ApiXmlResult implements ApiParseResult {
/**
* @param wiki Wiki on which requests are made.
* @param httpClient HTTP client for making requests.
*/
public ApiXmlParseResult(
EnumWikipedia wiki,
HttpClient httpClient) {
super(wiki, httpClient);
}
/**
* Execute parse request.
*
* @param properties Properties defining request.
* @return Parsed text.
* @throws APIException
*/
@Override
public String executeParse(
Map<String, String> properties)
throws APIException {
try {
XPathExpression<Element> xpaText = XPathFactory.instance().compile(
"/api/parse/text", Filters.element());
Element root = getRoot(properties, ApiRequest.MAX_ATTEMPTS);
Element text = xpaText.evaluateFirst(root);
return (text != null) ? text.getText() : null;
} catch (JDOMException e) {
log.error("Error expanding templates", e);
throw new APIException("Error parsing XML", e);
}
}
/**
* Execute sections request.
*
* @param page Page.
* @param properties Properties defining request.
* @return List of sections.
* @throws APIException
*/
@Override
public List<Section> executeSections(
Page page, Map<String, String> properties)
throws APIException {
try {
Element root = null;
try {
root = getRoot(properties, ApiRequest.MAX_ATTEMPTS);
} catch (APIException e) {
if (EnumQueryResult.MISSING_TITLE.equals(EnumQueryResult.MISSING_TITLE)) {
return null;
}
throw e;
}
// Retrieve sections
XPathExpression<Element> xpaSections = XPathFactory.instance().compile(
"/api/parse/sections/s", Filters.element());
List<Element> listSections = xpaSections.evaluate(root);
List<Section> result = new ArrayList<Section>(listSections.size());
Iterator<Element> itSection = listSections.iterator();
while (itSection.hasNext()) {
Element sectionNode = itSection.next();
try {
Section section = new Section(
Integer.valueOf(sectionNode.getAttributeValue("toclevel")),
Integer.valueOf(sectionNode.getAttributeValue("level")),
sectionNode.getAttributeValue("line"),
sectionNode.getAttributeValue("number"),
Integer.valueOf(sectionNode.getAttributeValue("index")));
result.add(section);
} catch (NumberFormatException e) {
//
}
}
// Retrieve revision id
XPathExpression<Element> xpaPage = XPathFactory.instance().compile(
"/api/parse", Filters.element());
Element parseNode = xpaPage.evaluateFirst(root);
if ((parseNode != null) && (parseNode.getAttributeValue("revid") != null)) {
page.setRevisionId(parseNode.getAttributeValue("revid"));
}
return result;
} catch (JDOMException e) {
log.error("Error retrieving sections", e);
throw new APIException("Error parsing XML", e);
}
}
}