/*
* 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.ArrayList;
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.WPCConfiguration;
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 disambiguation warning.
*/
public class UpdateDabWarningWorker extends UpdateWarningWorker {
private final boolean linksAvailable;
private final boolean dabInformationAvailable;
/**
* @param wikipedia Wikipedia.
* @param window Window.
* @param start Start at this page.
*/
public UpdateDabWarningWorker(EnumWikipedia wikipedia, BasicWindow window, String start) {
super(wikipedia, window, start, false);
this.linksAvailable = false;
this.dabInformationAvailable = false;
}
/**
* @param wikipedia Wikipedia.
* @param window Window.
* @param pages Pages to analyze.
* @param automaticEdit True if the edit should be considered automatic.
*/
public UpdateDabWarningWorker(
EnumWikipedia wikipedia, BasicWindow window,
List<Page> pages, boolean automaticEdit) {
this(wikipedia, window, pages, false, false, false, automaticEdit);
}
/**
* @param wikipedia Wikipedia.
* @param window Window.
* @param pages Pages to analyze.
* @param contentsAvailable True if contents is already available in pages.
* @param linksAvailable True if links are already available in pages.
* @param dabInformationAvailable True if disambiguation information is already available in pages.
* @param automaticEdit True if the edit should be considered automatic.
*/
public UpdateDabWarningWorker(
EnumWikipedia wikipedia, BasicWindow window, List<Page> pages,
boolean contentsAvailable, boolean linksAvailable,
boolean dabInformationAvailable, boolean automaticEdit) {
super(wikipedia, window, pages, contentsAvailable, automaticEdit);
this.linksAvailable = linksAvailable;
this.dabInformationAvailable = dabInformationAvailable;
}
/* (non-Javadoc)
* @see org.wikipediacleaner.gui.swing.basic.BasicWorker#construct()
*/
@Override
public Object construct() {
long startTime = System.currentTimeMillis();
EnumWikipedia wikipedia = getWikipedia();
WPCConfiguration configuration = wikipedia.getConfiguration();
setText(GT._("Retrieving MediaWiki API"));
int lastCount = 0;
Stats stats = new Stats();
UpdateDabWarningTools tools = new UpdateDabWarningTools(wikipedia, this, true, automaticEdit);
try {
if (!useList) {
listWarningPages(tools);
// Ask for confirmation
if (getWindow() != null) {
int answer = getWindow().displayYesNoWarning(GT._(
"Analysis found {0} articles with disambiguation warning {1}.\n" +
"Do you want to update the disambiguation warnings ?",
new Object[] {
Integer.valueOf(warningPages.size()),
"{{" + configuration.getString(WPCConfigurationString.DAB_WARNING_TEMPLATE) + "}}" }));
if (answer != JOptionPane.YES_OPTION) {
return Integer.valueOf(0);
}
}
// Sort the list of articles (trying a temporary ArrayList for performance)
if (warningPages.isEmpty()) {
return Integer.valueOf(0);
}
List<Page> tmpWarningPages = new ArrayList<Page>(warningPages);
Collections.sort(tmpWarningPages, PageComparator.getTitleFirstComparator());
warningPages.clear();
warningPages.addAll(tmpWarningPages);
}
// Working with sublists
tools.setContentsAvailable(contentsAvailable);
tools.setLinksAvailable(linksAvailable);
tools.setDabInformationAvailable(dabInformationAvailable);
if (!useList) {
setText(GT._("Retrieving disambiguation pages"));
tools.preloadDabPages();
}
String lastTitle = null;
int countUnsaved = 0;
while (!warningPages.isEmpty()) {
// Creating sublist
List<Page> sublist = tools.extractSublist(warningPages, 10, false);
if (sublist.isEmpty()) {
displayStats(stats, startTime);
return Integer.valueOf(stats.getUpdatedPagesCount());
}
countUnsaved += sublist.size();
// 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 disambiguation warnings. Do you want to continue ?\n\n" +
"Error: {0}", e.getMessage()));
if (answer != JOptionPane.YES_OPTION) {
return e;
}
finish = false;
}
}
if (shouldStop() || (countUnsaved > 1000)) {
Configuration config = Configuration.getConfiguration();
config.setString(null, ConfigurationValueString.LAST_DAB_WARNING, lastTitle);
countUnsaved = 0;
}
if (shouldStop()) {
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_DAB_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.DAB_WARNING_TEMPLATE,
tmpWarningPages);
// Fill up the list
warningPages.clear();
warningPages.addAll(tmpWarningPages.values());
tmpWarningPages.clear();
}
}