/* * 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.constants; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Properties; import java.util.Set; import org.wikipediacleaner.api.constants.CWConfiguration.Origin; import org.wikipediacleaner.api.data.Page; import org.wikipediacleaner.i18n.GT; /** * Configuration for an error in Check Wiki project. */ public class CWConfigurationError { /** * Error number. */ private final int errorNumber; /** * @param errorNumber Error number. */ CWConfigurationError(int errorNumber) { this.errorNumber = errorNumber; this.generalConfiguration = new Properties(); this.userConfiguration = new Properties(); this.wikiConfiguration = new Properties(); } /** * @return Error number. */ public int getErrorNumber() { return errorNumber; } private final Properties generalConfiguration; private final Properties userConfiguration; private final Properties wikiConfiguration; /** * Clear general configuration. */ void clearGeneralConfiguration() { generalConfiguration.clear(); priorityGeneral = null; } /** * Clear user configuration. */ void clearUserConfiguration() { userConfiguration.clear(); priorityUser = null; } /** * Clear wiki configuration. */ void clearWikiConfiguration() { wikiConfiguration.clear(); priorityWiki = null; botWiki = false; } /** * @param name Property name. * @param value Property value. * @param origin Origin of the configuration. */ void addProperty( String name, String value, CWConfiguration.Origin origin) { if (name == null) { return; } if (value != null) { value = value.trim(); } if (name.equals("prio")) { setPriority(value, origin); } else if (name.equals("bot")) { setBot(value, origin); } else if (name.equals("head")) { setShortDescription(value, origin); } else if (name.equals("desc")) { setLongDescription(value, origin); } else if (name.equals("link")) { setLink(value, origin); } else if (name.equals("noauto")) { setNoAuto(value, origin); } else if (name.equals("whitelist")) { setWhiteList(value, origin); } else if (name.equals("whitelistpage")) { setWhiteListPageName(value, origin); } else { switch (origin) { case GENERAL_CONFIGURATION: if (value == null) { generalConfiguration.remove(name); } else { generalConfiguration.setProperty(name, value); } break; case USER_CONFIGURATION: if (value == null) { userConfiguration.remove(name); } else { userConfiguration.setProperty(name, value); } break; case WIKI_CONFIGURATION: if (value == null) { wikiConfiguration.remove(name); } else { wikiConfiguration.setProperty(name, value); } break; } } } /** * @param name Property name. * @param useWiki Flag indicating if wiki configuration can be used. * @param useGeneral Flag indicating if general configuration can be used. * @param useUser Flag indicating if user configuration can be used. * @param acceptEmpty Flag indicating if empty strings are accepted. * @return Property value. */ public String getSpecificProperty( String name, boolean useWiki, boolean useGeneral, boolean useUser, boolean acceptEmpty) { String result = null; if (useUser) { result = userConfiguration.getProperty(name); if ((result != null) && (acceptEmpty || (result.length() > 0))) { return result; } } if (useWiki) { result = wikiConfiguration.getProperty(name); if ((result != null) && (acceptEmpty || (result.length() > 0))) { return result; } } if (useGeneral) { result = generalConfiguration.getProperty(name); } return result; } // ================================================================================= // Priority // ================================================================================= public final static int PRIORITY_UNKOWN = -1; public final static int PRIORITY_DEACTIVATED = 0; public final static int PRIORITY_TOP = 1; public final static int PRIORITY_MIDDLE = 2; public final static int PRIORITY_LOWEST = 3; public final static int PRIORITY_BOT_ONLY = 4; /** * Priority (general configuration). */ private Integer priorityGeneral = null; /** * Priority (wiki configuration). */ private Integer priorityWiki = null; /** * Priority (user configuration). */ private Integer priorityUser = null; /** * Flag indicating if error should be considered by bots even if deactivated. */ private boolean botWiki = false; /** * @param value Priority value. * @param origin Origin of the configuration. */ private void setPriority(String value, Origin origin) { Integer intValue = null; if (value != null) { try { intValue = Integer.valueOf(Integer.parseInt(value)); } catch (NumberFormatException e) { // } } switch (origin) { case GENERAL_CONFIGURATION: priorityGeneral = intValue; break; case WIKI_CONFIGURATION: priorityWiki = intValue; break; case USER_CONFIGURATION: priorityUser = intValue; break; } } /** * @param value Value. * @param origin Origin of the configuration. */ private void setBot(String value, Origin origin) { if (origin == Origin.GENERAL_CONFIGURATION) { return; } if (value == null) { botWiki = false; } else { botWiki = Boolean.valueOf(value); } } /** * @return Error priority. */ public int getPriority() { int priority = PRIORITY_UNKOWN; if ((priority == PRIORITY_UNKOWN) && (priorityUser != null)) { priority = priorityUser.intValue(); } if ((priority == PRIORITY_UNKOWN) && (priorityWiki != null)) { priority = priorityWiki.intValue(); } if ((priority == PRIORITY_UNKOWN) && (priorityGeneral != null)) { priority = priorityGeneral.intValue(); } if ((priority == PRIORITY_DEACTIVATED) && botWiki) { priority = PRIORITY_BOT_ONLY; } return priority; } /** * @param priority Priority. * @return Flag indicating if the priority is active. */ public static boolean isPriorityActive(int priority) { if ((priority == PRIORITY_TOP) || (priority == PRIORITY_MIDDLE) || (priority == PRIORITY_LOWEST) || (priority == PRIORITY_BOT_ONLY)) { return true; } return false; } /** * @param priority Priority. * @return Flag indicating if the priority is fully active. */ public static boolean isPriorityFullyActive(int priority) { if ((priority == PRIORITY_TOP) || (priority == PRIORITY_MIDDLE) || (priority == PRIORITY_LOWEST)) { return true; } return false; } /** * Compare 2 priorities. * * @param p1 Priority 1. * @param p2 Priority 2. * @return 0 if priorities are equal, -1 if p1 < p2, 1 if p1 > p2. */ public static int comparePriority(int p1, int p2) { if (p1 == p2) { return 0; } if (p1 == PRIORITY_UNKOWN) { return -1; } if (p2 == PRIORITY_UNKOWN) { return 1; } if (p1 == PRIORITY_DEACTIVATED) { return -1; } if (p2 == PRIORITY_DEACTIVATED) { return 1; } return (p1 < p2) ? -1 : 1; } /** * @param priority Priority. * @return Textual description of the priority. */ public static String getPriorityString(int priority) { switch (priority) { case PRIORITY_DEACTIVATED: return GT._("Deactivated"); case PRIORITY_LOWEST: return GT._("Low priority"); case PRIORITY_MIDDLE: return GT._("Middle priority"); case PRIORITY_TOP: return GT._("Top priority"); case PRIORITY_BOT_ONLY: return GT._("For Bot"); default: return GT._("Priority unknown"); } } // ================================================================================= // Short description // ================================================================================= /** * Short description of the error (general configuration). */ private String shortDescriptionGeneral = null; private String shortDescriptionReplacedGeneral = null; /** * Short description of the error (wiki configuration). */ private String shortDescriptionWiki = null; private String shortDescriptionReplacedWiki = null; /** * Short description of the error (user configuration). */ private String shortDescriptionUser = null; private String shortDescriptionReplacedUser = null; /** * @param value Short description value. * @param origin Origin of the configuration. */ private void setShortDescription(String value, Origin origin) { String replaced = value; if (replaced != null) { replaced = replaced.replaceAll("<", "<"); replaced = replaced.replaceAll(">", ">"); } switch (origin) { case GENERAL_CONFIGURATION: shortDescriptionGeneral = value; shortDescriptionReplacedGeneral = replaced; break; case WIKI_CONFIGURATION: shortDescriptionWiki = value; shortDescriptionReplacedWiki = replaced; break; case USER_CONFIGURATION: shortDescriptionUser = value; shortDescriptionReplacedUser = replaced; break; } } /** * @return Short description. */ public String getShortDescription() { if ((shortDescriptionUser != null) && (shortDescriptionUser.length() > 0)) { return shortDescriptionUser; } if ((shortDescriptionWiki != null) && (shortDescriptionWiki.length() > 0)) { return shortDescriptionWiki; } return shortDescriptionGeneral; } /** * @return Short description. */ public String getShortDescriptionReplaced() { if ((shortDescriptionReplacedUser != null) && (shortDescriptionReplacedUser.length() > 0)) { return shortDescriptionReplacedUser; } if ((shortDescriptionReplacedWiki != null) && (shortDescriptionReplacedWiki.length() > 0)) { return shortDescriptionReplacedWiki; } return shortDescriptionReplacedGeneral; } // ================================================================================= // Long description // ================================================================================= /** * Long description of the error (general configuration). */ private String longDescriptionGeneral = null; /** * Long description of the error (wiki configuration). */ private String longDescriptionWiki = null; /** * Long description of the error (user configuration). */ private String longDescriptionUser = null; /** * @param value Long description value. * @param origin Origin of the configuration. */ private void setLongDescription(String value, Origin origin) { switch (origin) { case GENERAL_CONFIGURATION: longDescriptionGeneral = value; break; case WIKI_CONFIGURATION: longDescriptionWiki = value; break; case USER_CONFIGURATION: longDescriptionUser = value; break; } } /** * @return Long description. */ public String getLongDescription() { if ((longDescriptionUser != null) && (longDescriptionUser.length() > 0)) { return longDescriptionUser; } if ((longDescriptionWiki != null) && (longDescriptionWiki.length() > 0)) { return longDescriptionWiki; } return longDescriptionGeneral; } // ================================================================================= // No automatic fixing // ================================================================================= /** * True if automatic modifications should be prevented (general configuration). */ private Boolean noAutoGeneral = null; /** * True if automatic modifications should be prevented (wiki configuration). */ private Boolean noAutoWiki = null; /** * True if automatic modifications should be prevented (user configuration). */ private Boolean noAutoUser = null; /** * @param value No automatic modifications value. * @param origin Origin of the configuration. */ private void setNoAuto(String value, Origin origin) { Boolean booleanValue = Boolean.valueOf(value); switch (origin) { case GENERAL_CONFIGURATION: noAutoGeneral = booleanValue; break; case WIKI_CONFIGURATION: noAutoWiki = booleanValue; break; case USER_CONFIGURATION: noAutoUser = booleanValue; break; } } /** * @return True if automatic modifications should be prevented. */ public boolean getNoAuto() { if (noAutoUser != null) { return noAutoUser.booleanValue(); } if (noAutoWiki != null) { return noAutoWiki.booleanValue(); } if (noAutoGeneral != null) { return noAutoGeneral.booleanValue(); } return false; } /* ================================================================================= */ /* Link */ /* ================================================================================= */ /** * Link to page describing the error. */ private String linkWiki = null; /** * @param value Link value. * @param origin Origin of the configuration. */ private void setLink(String value, Origin origin) { if (origin == Origin.GENERAL_CONFIGURATION) { return; } linkWiki = value; } /** * @return Link to page describing the error. */ public String getLink() { return linkWiki; } /* ================================================================================= */ /* White List */ /* ================================================================================= */ /** * Page containing the white list. */ private String whiteListPageName = null; /** * @param value Page containing the white list. * @param origin Origin of the configuration. */ private void setWhiteListPageName(String value, Origin origin) { if (origin == Origin.GENERAL_CONFIGURATION) { return; } whiteListPageName = value; } /** * @return Page containing the white list. */ public String getWhiteListPageName() { return whiteListPageName; } /** * White list. */ private Set<String> whiteListPages = null; /** * @param whiteListPage Page containing the white list. */ public void setWhiteList(Page whiteListPage) { List<Page> pages = whiteListPage.getLinks(); whiteListPages = null; if ((pages != null) && (pages.size() > 0)) { whiteListPages = new HashSet<String>(); for (Page page : pages) { whiteListPages.add(page.getTitle()); } } } /** * White list. */ private Set<String> whiteListWiki = null; /** * @param value White list value. * @param origin Origin of the configuration. */ private void setWhiteList(String value, Origin origin) { if (origin == Origin.GENERAL_CONFIGURATION) { return; } whiteListWiki = null; if (value != null) { List<String> tmp = WPCConfiguration.convertPropertyToStringList(value); if (tmp != null) { whiteListWiki = new HashSet<String>(); whiteListWiki.addAll(tmp); } } } /** * @return White list. */ public Set<String> getWhiteList() { if (whiteListPages != null) { return Collections.unmodifiableSet(whiteListPages); } if (whiteListWiki != null) { return Collections.unmodifiableSet(whiteListWiki); } return null; } /** * Tell if a page is among the white list. * * @param title Page title. * @return Page among the white list ? */ public boolean isInWhiteList(String title) { Set<String> whiteList = getWhiteList(); if ((whiteList == null) || (title == null)) { return false; } return whiteList.contains(title); } }