/*
* WPCleaner: A tool to help on Wikipedia maintenance tasks.
* Copyright (C) 2013 Nicolas Vervelle
*
* See README.txt file for licensing information.
*/
package org.wikipediacleaner.gui.swing.worker;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JOptionPane;
import org.wikipediacleaner.api.APIException;
import org.wikipediacleaner.api.constants.EnumWikipedia;
import org.wikipediacleaner.api.constants.WPCConfigurationString;
import org.wikipediacleaner.api.data.Page;
import org.wikipediacleaner.api.data.PageComparator;
import org.wikipediacleaner.gui.swing.basic.BasicWindow;
import org.wikipediacleaner.gui.swing.worker.UpdateWarningTools.Stats;
import org.wikipediacleaner.i18n.GT;
import org.wikipediacleaner.utils.Configuration;
import org.wikipediacleaner.utils.ConfigurationValueString;
/**
* SwingWorker for updating duplicate arguments warning.
*/
public class UpdateDuplicateArgsWarningWorker extends UpdateWarningWorker {
/**
* @param wiki Wiki.
* @param window Window.
* @param simulation True if this is a simulation.
*/
public UpdateDuplicateArgsWarningWorker(
EnumWikipedia wiki, BasicWindow window,
boolean simulation) {
super(wiki, window, null, simulation);
}
/**
* @param wiki Wiki.
* @param window Window.
* @param pages Pages to analyze.
* @param contentsAvailable True if contents is already available in pages.
* @param automaticEdit True if the edit should be considered automatic.
*/
public UpdateDuplicateArgsWarningWorker(
EnumWikipedia wiki, BasicWindow window, List<Page> pages,
boolean contentsAvailable, boolean automaticEdit) {
super(wiki, window, pages, contentsAvailable, automaticEdit);
}
/* (non-Javadoc)
* @see org.wikipediacleaner.gui.swing.basic.BasicWorker#construct()
*/
@Override
public Object construct() {
long startTime = System.currentTimeMillis();
EnumWikipedia wiki = getWikipedia();
int lastCount = 0;
Stats stats = new Stats();
UpdateDuplicateArgsWarningTools tools = new UpdateDuplicateArgsWarningTools(
wiki, this, true, automaticEdit);
tools.setUsePurge(false);
try {
if (!useList) {
listWarningPages(tools);
// Ask for confirmation
if (getWindow() != null) {
int answer = getWindow().displayYesNoWarning(GT._(
"Analysis found {0} articles to check for duplicate arguments errors.\n" +
"Do you want to update the warnings ?",
Integer.valueOf(warningPages.size()).toString() ));
if (answer != JOptionPane.YES_OPTION) {
return Integer.valueOf(0);
}
}
// Sort the list of articles
Collections.sort(warningPages, PageComparator.getTitleFirstComparator());
if (warningPages.isEmpty()) {
return Integer.valueOf(0);
}
}
// Working with sublists
tools.setContentsAvailable(contentsAvailable);
tools.prepareErrorsMap();
if (simulation) {
tools.setSimulation(true);
}
String lastTitle = null;
while (!warningPages.isEmpty()) {
// Creating sublist
List<Page> sublist = tools.extractSublist(warningPages, 10, false);
if (sublist.isEmpty()) {
displayStats(stats, startTime);
return Integer.valueOf(stats.getUpdatedPagesCount());
}
// Update warning
boolean finish = false;
while (!finish) {
finish = true;
try {
lastTitle = sublist.get(sublist.size() - 1).getTitle();
tools.updateWarning(sublist, null, null, stats);
} catch (APIException e) {
if (getWindow() != null) {
int answer = getWindow().displayYesNoWarning(GT._(
"An error occurred when updating duplicate arguments warnings. Do you want to continue ?\n\n" +
"Error: {0}", e.getMessage()));
if (answer != JOptionPane.YES_OPTION) {
return e;
}
finish = false;
}
}
if (shouldStop()) {
Configuration config = Configuration.getConfiguration();
config.setString(null, ConfigurationValueString.LAST_DUPLICATE_ARGS_WARNING, lastTitle);
displayStats(stats, startTime);
return Integer.valueOf(stats.getUpdatedPagesCount());
}
}
if (stats.getUpdatedPagesCount() > lastCount) {
lastCount = stats.getUpdatedPagesCount();
/*if (getWindow() != null) {
int answer = getWindow().displayYesNoWarning(
"This feature is currently under development, please check the modification.\n" +
"Do you want to continue ?");
if (answer != JOptionPane.YES_OPTION) {
return Integer.valueOf(lastCount);
}
} else {
return Integer.valueOf(lastCount);
}*/
}
}
if (warningPages.isEmpty()) {
Configuration config = Configuration.getConfiguration();
config.setString(null, ConfigurationValueString.LAST_DUPLICATE_ARGS_WARNING, (String) null);
}
} catch (APIException e) {
return e;
}
displayStats(stats, startTime);
return Integer.valueOf(stats.getUpdatedPagesCount());
}
/**
* Generate the list of warning pages.
*
* @param tools Update warning tools.
* @throws APIException
*/
@Override
protected void listWarningPages(UpdateWarningTools tools) throws APIException {
Map<String, Page> tmpWarningPages = new HashMap<String, Page>();
// Retrieve talk pages including a warning
retrieveArticlesWithWarning(
WPCConfigurationString.DUPLICATE_ARGS_WARNING_TEMPLATE,
tmpWarningPages);
// Retrieve articles listed for duplicate arguments errors in Check Wiki
retrieveCheckWikiPages(524, tmpWarningPages, tools); // Duplicate template arguments
// Fill up the list
warningPages.clear();
warningPages.addAll(tmpWarningPages.values());
tmpWarningPages.clear();
}
}