/*
* WPCleaner: A tool to help on Wikipedia maintenance tasks.
* Copyright (C) 2014 Nicolas Vervelle
*
* See README.txt file for licensing information.
*/
package org.wikipediacleaner.gui.swing.worker;
import java.awt.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.wikipediacleaner.api.API;
import org.wikipediacleaner.api.APIException;
import org.wikipediacleaner.api.APIFactory;
import org.wikipediacleaner.api.check.algorithm.CheckErrorAlgorithm;
import org.wikipediacleaner.api.check.algorithm.CheckErrorAlgorithm524;
import org.wikipediacleaner.api.check.algorithm.CheckErrorAlgorithm528;
import org.wikipediacleaner.api.check.algorithm.CheckErrorAlgorithm529;
import org.wikipediacleaner.api.check.algorithm.CheckErrorAlgorithm530;
import org.wikipediacleaner.api.check.algorithm.CheckErrorAlgorithms;
import org.wikipediacleaner.api.constants.EnumLanguage;
import org.wikipediacleaner.api.constants.EnumWikipedia;
import org.wikipediacleaner.api.constants.WPCConfiguration;
import org.wikipediacleaner.api.constants.WPCConfigurationBoolean;
import org.wikipediacleaner.api.constants.WikiConfiguration;
import org.wikipediacleaner.api.data.LoginResult;
import org.wikipediacleaner.api.data.User;
import org.wikipediacleaner.gui.swing.basic.BasicWindow;
import org.wikipediacleaner.gui.swing.basic.BasicWorker;
import org.wikipediacleaner.i18n.GT;
import org.wikipediacleaner.utils.Configuration;
import org.wikipediacleaner.utils.ConfigurationConstants;
import org.wikipediacleaner.utils.ConfigurationValueInteger;
import org.wikipediacleaner.utils.ConfigurationValueString;
/**
* SwingWorker for login.
*/
public class LoginWorker extends BasicWorker {
private final Component focusComponent;
private final EnumLanguage language;
private String username;
private final char[] password;
private final int saveUser;
private final boolean login;
private final boolean reloadOnly;
private boolean logged;
public LoginWorker(
EnumWikipedia wikipedia,
BasicWindow window, Component focusComponent,
EnumLanguage language,
String username,
char[] password,
int saveUser,
boolean login,
boolean reloadOnly) {
super(wikipedia, window);
this.focusComponent = focusComponent;
this.language = language;
this.username = username.trim();
this.password = password;
this.saveUser = saveUser;
this.login = login;
this.reloadOnly = reloadOnly;
this.logged = false;
}
/* (non-Javadoc)
* @see org.wikipediacleaner.gui.swing.utils.SwingWorker#finished()
*/
@Override
public void finished() {
super.finished();
if (password != null) {
for (int i = 0; i < password.length; i++) {
password[i] = '\0';
}
}
if (focusComponent != null) {
focusComponent.requestFocusInWindow();
}
}
/* (non-Javadoc)
* @see org.wikipediacleaner.gui.swing.utils.SwingWorker#construct()
*/
@Override
public Object construct() {
try {
setText(GT._("Retrieving MediaWiki API"));
API api = APIFactory.getAPI();
EnumWikipedia wiki = getWikipedia();
// Login
if (!reloadOnly) {
setText(GT._("Login"));
LoginResult result = api.login(wiki, username, new String(password), login);
if (login) {
if ((result == null) || (!result.isLoginSuccessful())) {
throw new APIException("Login unsuccessful: " + ((result != null) ? result.toString() : ""));
}
}
User user = api.retrieveUser(wiki, username);
username = (user != null) ? user.getName() : null;
wiki.getConnection().setUser(user);
api.retrieveTokens(wiki);
logged = true;
}
// Load configuration
setText(GT._("Loading configuration"));
api.loadConfiguration(wiki, username);
// Saving settings
Configuration configuration = Configuration.getConfiguration();
configuration.setWikipedia(wiki);
configuration.setLanguage(language);
if (login && !reloadOnly && (saveUser != ConfigurationConstants.VALUE_SAVE_USER_NO_CHANGE)) {
Properties props = configuration.getProperties(wiki, Configuration.PROPERTIES_USERS);
if (saveUser == ConfigurationConstants.VALUE_SAVE_USER_NONE) {
props.remove(username);
configuration.setString(wiki, ConfigurationValueString.LAST_USER, (String) null);
} else {
props.setProperty(
username,
(saveUser == ConfigurationConstants.VALUE_SAVE_USER_BOTH) ? new String(password) : "");
configuration.setString(wiki, ConfigurationValueString.LAST_USER, username);
}
configuration.setProperties(wiki, Configuration.PROPERTIES_USERS, props);
configuration.setInt(
null,
ConfigurationValueInteger.SAVE_USER,
saveUser);
}
Configuration.getConfiguration().save();
WPCConfiguration wpcConfig = wiki.getConfiguration();
// Retrieving disambiguation templates
boolean useDisambig = wpcConfig.getBoolean(WPCConfigurationBoolean.DAB_USE_DISAMBIG_MAGIC_WORD);
if (!useDisambig) {
setText(GT._("Retrieving disambiguation templates"));
wiki.initDisambiguationTemplates(api);
}
// Retrieving suggestions for text replacements
setText(GT._("Retrieving suggestions for text replacements"));
wpcConfig.initSuggestions(api, reloadOnly);
// Retrieving Check Wiki configuration
setText(GT._("Retrieving Check Wiki configuration"));
APIFactory.getCheckWiki().retrieveConfiguration(wiki, this);
// Retrieving special configuration
// TODO: Refactoring
List<String> messageNames = new ArrayList<>();
CheckErrorAlgorithm algo524 = CheckErrorAlgorithms.getAlgorithm(wiki, 524);
if ((algo524 != null) &&
algo524.isAvailable() &&
CheckErrorAlgorithms.isAlgorithmActive(wiki, 524)) {
messageNames.add("duplicate-args-category");
}
CheckErrorAlgorithm algo528 = CheckErrorAlgorithms.getAlgorithm(wiki, 528);
if ((algo528 != null) &&
algo528.isAvailable() &&
CheckErrorAlgorithms.isAlgorithmActive(wiki, 528)) {
messageNames.add("magiclink-tracking-pmid");
}
CheckErrorAlgorithm algo529 = CheckErrorAlgorithms.getAlgorithm(wiki, 529);
if ((algo529 != null) &&
algo529.isAvailable() &&
CheckErrorAlgorithms.isAlgorithmActive(wiki, 529)) {
messageNames.add("magiclink-tracking-isbn");
}
CheckErrorAlgorithm algo530 = CheckErrorAlgorithms.getAlgorithm(wiki, 530);
if ((algo530 != null) &&
algo530.isAvailable() &&
CheckErrorAlgorithms.isAlgorithmActive(wiki, 530)) {
messageNames.add("magiclink-tracking-rfc");
}
if (!messageNames.isEmpty()) {
Map<String, String> messages = api.loadMessages(wiki, messageNames);
WikiConfiguration wikiConfig = wiki.getWikiConfiguration();
wikiConfig.setMessages(messages);
if ((algo524 != null) &&
algo524.isAvailable() &&
CheckErrorAlgorithms.isAlgorithmActive(wiki, 524)) {
((CheckErrorAlgorithm524) algo524).setTrackingCategory(messages.get("duplicate-args-category"));
}
if ((algo528 != null) &&
algo528.isAvailable() &&
CheckErrorAlgorithms.isAlgorithmActive(wiki, 528)) {
((CheckErrorAlgorithm528) algo528).setTrackingCategory(messages.get("magiclink-tracking-pmid"));
}
if ((algo529 != null) &&
algo529.isAvailable() &&
CheckErrorAlgorithms.isAlgorithmActive(wiki, 529)) {
((CheckErrorAlgorithm529) algo529).setTrackingCategory(messages.get("magiclink-tracking-isbn"));
}
if ((algo530 != null) &&
algo530.isAvailable() &&
CheckErrorAlgorithms.isAlgorithmActive(wiki, 530)) {
((CheckErrorAlgorithm530) algo530).setTrackingCategory(messages.get("magiclink-tracking-rfc"));
}
}
} catch (APIException e) {
return e;
}
return null;
}
/**
* @return True if user is logged in.
*/
public boolean isLogged() {
return logged;
}
}