/*
* 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.check.algorithm;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.wikipediacleaner.api.constants.CWConfiguration;
import org.wikipediacleaner.api.constants.CWConfigurationError;
import org.wikipediacleaner.api.constants.EnumWikipedia;
/**
* Helper class for the algorithms.
*/
public final class CheckErrorAlgorithms {
private static Map<EnumWikipedia, List<CheckErrorAlgorithm>> algorithmsMap =
new HashMap<EnumWikipedia, List<CheckErrorAlgorithm>>();
/**
* Initializes algorithms for a Wikipedia.
*
* @param wikipedia Wikipedia.
*/
public static synchronized void initializeAlgorithms(EnumWikipedia wikipedia) {
List<CheckErrorAlgorithm> algorithms = new ArrayList<CheckErrorAlgorithm>(CWConfiguration.MAX_ERROR_NUMBER);
DecimalFormat errorNumberFormat = new DecimalFormat("000");
for (int i = 0; i < CWConfiguration.MAX_ERROR_NUMBER; i++) {
int errorNumber = i + 1;
CWConfigurationError error = wikipedia.getCWConfiguration().getErrorConfiguration(errorNumber);
if (error != null) {
String className = CheckErrorAlgorithm.class.getName() + errorNumberFormat.format(errorNumber);
CheckErrorAlgorithm algorithm = null;
try {
Class algorithmClass = Class.forName(className);
algorithm = (CheckErrorAlgorithm) algorithmClass.newInstance();
algorithm.setConfiguration(error);
} catch (ClassNotFoundException e) {
// Not found: error not yet available in WikiCleaner.
} catch (InstantiationException e) {
System.err.println("InstantiationException for " + className);
} catch (IllegalAccessException e) {
System.err.println("IllegalAccessException for " + className);
} catch (ClassCastException e) {
System.err.println(
"Class " + className +
" doesn't implement " + CheckErrorAlgorithm.class.getName());
}
if (algorithm != null) {
algorithms.add(algorithm);
}
}
}
algorithmsMap.put(wikipedia, algorithms);
}
/**
* Retrieve all algorithms for a wikipedia.
*
* @param wikipedia Wikipedia.
* @return All algorithms.
*/
public static List<CheckErrorAlgorithm> getAlgorithms(EnumWikipedia wikipedia) {
List<CheckErrorAlgorithm> algorithms = algorithmsMap.get(wikipedia);
if (algorithms == null) {
return null;
}
List<CheckErrorAlgorithm> tmpAlgorithms = new ArrayList<CheckErrorAlgorithm>();
for (CheckErrorAlgorithm algorithm : algorithms) {
if (algorithm != null) {
tmpAlgorithms.add(algorithm);
}
}
return tmpAlgorithms;
}
/**
* Retrieve an algorithm.
*
* @param wikipedia Wikipedia.
* @param errorNumber Error number.
* @return Algorithm requested.
*/
public static CheckErrorAlgorithm getAlgorithm(
EnumWikipedia wikipedia, int errorNumber) {
List<CheckErrorAlgorithm> algorithms = algorithmsMap.get(wikipedia);
if (algorithms == null) {
initializeAlgorithms(wikipedia);
algorithms = algorithmsMap.get(wikipedia);
}
if (algorithms == null) {
return null;
}
for (CheckErrorAlgorithm algorithm : algorithms) {
if (algorithm.getErrorNumber() == errorNumber) {
return algorithm;
}
}
return null;
}
/**
* @param wikipedia Wikipedia.
* @param errorNumber Error number.
* @return Algorithm active ?
*/
public static boolean isAlgorithmActive(
EnumWikipedia wikipedia, int errorNumber) {
CheckErrorAlgorithm algorithm = getAlgorithm(wikipedia, errorNumber);
if (algorithm == null) {
return false;
}
int priority = algorithm.getPriority();
return CWConfigurationError.isPriorityActive(priority);
}
}