/* * 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.prop; 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.EnumWikipedia; import org.wikipediacleaner.api.data.DataManager; import org.wikipediacleaner.api.data.Page; import org.wikipediacleaner.api.request.ApiRequest; /** * MediaWiki API XML links results. */ public class ApiXmlLinksResult extends ApiXmlPropertiesResult implements ApiLinksResult { /** * @param wiki Wiki on which requests are made. * @param httpClient HTTP client for making requests. */ public ApiXmlLinksResult( EnumWikipedia wiki, HttpClient httpClient) { super(wiki, httpClient); } /** * Execute links request. * * @param properties Properties defining request. * @param lists Map of lists to be filled with links. * @param normalization Map containing information about title normalization (From => To). * @return True if request should be continued. * @throws APIException */ @Override public boolean executeLinks( Map<String, String> properties, Map<String, List<Page>> lists, Map<String, String> normalization) throws APIException { try { Element root = getRoot(properties, ApiRequest.MAX_ATTEMPTS); // Retrieve normalization information retrieveNormalization(root, normalization); // Retrieve back links XPathExpression<Element> xpaPages = XPathFactory.instance().compile( "/api/query/pages/page", Filters.element()); List<Element> listPages = xpaPages.evaluate(root); Iterator<Element> itPage = listPages.iterator(); XPathExpression<Element> xpaLinks = XPathFactory.instance().compile( "links/pl", Filters.element()); while (itPage.hasNext()) { Element pageNode = itPage.next(); String pageTitle = pageNode.getAttributeValue("title"); List<Page> links = lists.get(pageTitle); if (links == null) { links = new ArrayList<Page>(); lists.put(pageTitle, links); } List<Element> listLinks = xpaLinks.evaluate(pageNode); Iterator<Element> itLinks = listLinks.iterator(); while (itLinks.hasNext()) { Element linkNode = itLinks.next(); Page link = DataManager.getPage( getWiki(), linkNode.getAttributeValue("title"), null, null, null); link.setNamespace(linkNode.getAttributeValue("ns")); links.add(link); } } // Retrieve continue return shouldContinue( root, "/api/query-continue/links", properties); } catch (JDOMException e) { log.error("Error loading links", e); throw new APIException("Error parsing XML", e); } } /** * Execute links request. * * @param properties Properties defining request. * @param links List to be filled with links. * @param knownPages Already known pages. * @param normalization Map containing information about title normalization (From => To). * @param redirects List of redirects filled by the method. * @param useDisambig Flag indicating if disambiguation property should be used. * @return True if request should be continued. * @throws APIException */ @Override public boolean executeLinks( Map<String, String> properties, List<Page> links, List<Page> knownPages, Map<String, String> normalization, List<Page> redirects, boolean useDisambig) throws APIException { try { Element root = getRoot(properties, ApiRequest.MAX_ATTEMPTS); // Retrieve normalization information retrieveNormalization(root, normalization); // Retrieve back links XPathExpression<Element> xpaPages = XPathFactory.instance().compile( "/api/query/pages/page", Filters.element()); List<Element> listLinks = xpaPages.evaluate(root); Iterator<Element> itLinks = listLinks.iterator(); while (itLinks.hasNext()) { Element linkNode = itLinks.next(); Page link = getPage(getWiki(), linkNode, knownPages, useDisambig); if ((redirects != null) && (link.isRedirect())) { redirects.add(link); } links.add(link); } // Retrieve continue return shouldContinue( root, "/api/query-continue/links", properties); } catch (JDOMException e) { log.error("Error loading links", e); throw new APIException("Error parsing XML", e); } } }