/*
* 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.login;
import java.util.Map;
import org.apache.commons.httpclient.HttpClient;
import org.jdom2.Element;
import org.jdom2.filter.Filters;
import org.jdom2.input.JDOMParseException;
import org.jdom2.xpath.XPathExpression;
import org.jdom2.xpath.XPathFactory;
import org.wikipediacleaner.api.APIException;
import org.wikipediacleaner.api.constants.EnumLoginResult;
import org.wikipediacleaner.api.constants.EnumWikipedia;
import org.wikipediacleaner.api.data.LoginResult;
import org.wikipediacleaner.api.request.ApiXmlResult;
/**
* MediaWiki API XML login results.
*/
public class ApiXmlLoginResult extends ApiXmlResult implements ApiLoginResult {
/**
* @param wiki Wiki on which requests are made.
* @param httpClient HTTP client for making requests.
*/
public ApiXmlLoginResult(
EnumWikipedia wiki,
HttpClient httpClient) {
super(wiki, httpClient);
}
/**
* Execute login request.
*
* @param properties Properties defining request.
* @return Login result.
* @throws APIException
*/
@Override
public LoginResult executeLogin(
Map<String, String> properties)
throws APIException {
try {
LoginResult result = constructLogin(getRoot(properties, 1));
if ((result != null) && (result.isTokenNeeded())) {
properties.put(ApiLoginRequest.PROPERTY_TOKEN, result.getDetails());
result = constructLogin(getRoot(properties, 1));
}
return result;
} catch (JDOMParseException e) {
log.error("Exception in MediaWikiAPI.login()", e);
throw new APIException("Couldn't login");
}
}
/**
* Analyze login answer.
*
* @param root Root element in MediaWiki answer.
* @return Result of the login.
* @throws APIException
*/
private LoginResult constructLogin(Element root)
throws APIException {
// try {
XPathExpression<Element> xpa = XPathFactory.instance().compile(
"/api/login", Filters.element());
Element node = xpa.evaluateFirst(root);
if (node != null) {
String result = node.getAttributeValue("result");
if ("Success".equalsIgnoreCase(result)) {
getWiki().getConnection().setLgInformation(
node.getAttributeValue("lgtoken"),
node.getAttributeValue("lgusername"),
node.getAttributeValue("lguserid"));
return LoginResult.createCorrectLogin();
} else if (EnumLoginResult.NEED_TOKEN.getCode().equalsIgnoreCase(result)) {
return LoginResult.createNeedTokenLogin(node.getAttributeValue("token"));
}
return LoginResult.createErrorLogin(
result, node.getAttributeValue("details"), node.getAttributeValue("wait"));
}
// } catch (JDOMException e) {
// log.error("Error login", e);
// throw new APIException("Error parsing XML result", e);
// }
return LoginResult.createErrorLogin(null, null, null);
}
/**
* @return True if identification parameters should be sent.
*/
@Override
protected boolean shouldSendIdentification() {
return true;
}
}