/*
* 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.templatedata;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.httpclient.HttpClient;
import org.wikipediacleaner.api.APIException;
import org.wikipediacleaner.api.constants.EnumWikipedia;
import org.wikipediacleaner.api.data.TemplateData;
import org.wikipediacleaner.api.data.TemplateData.InterfaceText;
import org.wikipediacleaner.api.data.TemplateData.LanguageValue;
import org.wikipediacleaner.api.data.TemplateData.Parameter;
import org.wikipediacleaner.api.request.ApiJsonResult;
import org.wikipediacleaner.api.request.ApiRequest;
import com.fasterxml.jackson.databind.JsonNode;
/**
* MediaWiki API JSON TemplateData results.
*/
public class ApiJsonTemplateDataResult extends ApiJsonResult implements ApiTemplateDataResult {
/**
* @param wiki Wiki on which requests are made.
* @param httpClient HTTP client for making requests.
*/
public ApiJsonTemplateDataResult(
EnumWikipedia wiki,
HttpClient httpClient) {
super(wiki, httpClient);
}
/**
* Execute TemplateData request.
*
* @param properties Properties defining request.
* @return TemplateData for the page.
* @throws APIException
*/
@Override
public TemplateData executeTemplateData(Map<String, String> properties)
throws APIException {
JsonNode root = getRoot(properties, ApiRequest.MAX_ATTEMPTS);
TemplateData result = null;
if (root != null) {
Iterator<JsonNode> itPages = root.path("pages").iterator();
while (itPages.hasNext()) {
JsonNode page = itPages.next();
result = createTemplateData(page);
if (result != null) {
return result;
}
}
}
return result;
}
/**
* @param page JSON node for the page.
* @return TemplateData.
*/
private TemplateData createTemplateData(JsonNode page) {
if ((page == null) || page.isMissingNode()) {
return null;
}
TemplateData result = new TemplateData();
result.setTitle(page.path("title").asText());
result.setDescription(createInterfaceText(page.path("description")));
List<Parameter> parameters = new ArrayList<Parameter>();
Iterator<Entry<String, JsonNode>> itParams = page.path("params").fields();
while (itParams.hasNext()) {
Entry<String, JsonNode> jsonParam = itParams.next();
JsonNode paramNode = jsonParam.getValue();
Parameter param = new Parameter(jsonParam.getKey());
param.setLabel(createInterfaceText(paramNode.path("label")));
param.setDescription(createInterfaceText(paramNode.path("description")));
param.setType(paramNode.path("type").asText());
JsonNode aliasesNode = paramNode.path("aliases");
if (aliasesNode.isArray()) {
List<String> aliases = new ArrayList<String>();
Iterator<JsonNode> itAliases = aliasesNode.elements();
while (itAliases.hasNext()) {
aliases.add(itAliases.next().asText());
}
param.setAliases(aliases);
}
param.setRequired(paramNode.path("required").asBoolean(false));
param.setSuggested(paramNode.path("suggested").asBoolean(false));
JsonNode deprecatedNode = paramNode.path("deprecated");
if (deprecatedNode.isMissingNode()) {
param.setDeprecated(true);
} else if (deprecatedNode.isBoolean()) {
param.setDeprecated(deprecatedNode.asBoolean(false));
} else {
param.setDeprecated(deprecatedNode.asText());
}
param.setAutoValue(paramNode.path("autovalue").asText());
param.setDefaultValue(paramNode.path("default").asText());
parameters.add(param);
}
result.setParameters(parameters);
return result;
}
/**
* Create an InterfaceText from a JSON node.
*
* @param node JSON node.
* @return InterfaceText.
*/
private InterfaceText createInterfaceText(JsonNode node) {
if ((node == null) || (node.isMissingNode())) {
return null;
}
List<LanguageValue> languageValues = new ArrayList<LanguageValue>();
Iterator<Entry<String, JsonNode>> itValues = node.fields();
while (itValues.hasNext()) {
Entry<String, JsonNode> value = itValues.next();
LanguageValue language = new LanguageValue(value.getKey(), value.getValue().asText());
languageValues.add(language);
}
return new InterfaceText(languageValues);
}
}