/* * 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.list; 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.User; import org.wikipediacleaner.api.request.ApiRequest; import org.wikipediacleaner.api.request.ApiXmlResult; /** * MediaWiki API XML users results. */ public class ApiXmlUsersResult extends ApiXmlResult implements ApiUsersResult { /** * @param wiki Wiki on which requests are made. * @param httpClient HTTP client for making requests. */ public ApiXmlUsersResult( EnumWikipedia wiki, HttpClient httpClient) { super(wiki, httpClient); } /** * Execute user request. * * @param properties Properties defining request. * @throws APIException */ @Override public User executeUser( Map<String, String> properties) throws APIException { try { Element root = getRoot(properties, ApiRequest.MAX_ATTEMPTS); // Get recent changes list XPathExpression<Element> xpa = XPathFactory.instance().compile( "/api/query/users/user", Filters.element()); List<Element> results = xpa.evaluate(root); Iterator<Element> iter = results.iterator(); while (iter.hasNext()) { Element currentNode = iter.next(); User user = new User(currentNode.getAttributeValue("name")); List<String> groups = new ArrayList<String>(); XPathExpression<Element> xpaGroups = XPathFactory.instance().compile( "./groups/g", Filters.element()); List<Element> resultGroups = xpaGroups.evaluate(currentNode); Iterator<Element> itGroups = resultGroups.iterator(); while (itGroups.hasNext()) { groups.add(itGroups.next().getValue()); } user.setGroups(groups); List<String> rights = new ArrayList<String>(); XPathExpression<Element> xpaRights = XPathFactory.instance().compile( "./rights/r", Filters.element()); List<Element> resultRights = xpaRights.evaluate(currentNode); Iterator<Element> itRights = resultRights.iterator(); while (itRights.hasNext()) { rights.add(itRights.next().getValue()); } user.setRights(rights); return user; } } catch (JDOMException e) { log.error("Error retrieving user information", e); throw new APIException("Error parsing XML", e); } return null; } }