/* * WPCleaner: A tool to help on Wikipedia maintenance tasks. * Copyright (C) 2016 Nicolas Vervelle * * See README.txt file for licensing information. */ package org.wikipediacleaner.api.data; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.MessageFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.wikipediacleaner.api.constants.EnumWikipedia; import org.wikipediacleaner.api.constants.WPCConfiguration; import org.wikipediacleaner.api.constants.WPCConfigurationStringList; /** * Utility class for managing search engines. */ public class SearchEngine { /** Search engine name */ private final String name; /** URL for searching */ private final String url; /** * @param name Search engine name. * @param url URL for searching. */ private SearchEngine(String name, String url) { this.name = name; this.url = url; } /** * @return Search engine name. */ public String getName() { return name; } /** * @return URL for searching. */ public String getUrl() { return url; } /** * @param wiki Wiki. * @param template Template. * @param property Specific property (if null, only general property will be used). * @return Map of search engines (parameter name => search engines) */ public static Map<String, List<SearchEngine>> getSearchEngines( EnumWikipedia wiki, PageElementTemplate template, WPCConfigurationStringList property) { if ((wiki == null) || (template == null)) { return null; } Map<String, List<SearchEngine>> result = new HashMap<>(); WPCConfiguration config = wiki.getConfiguration(); List<String[]> searchEngines = null; // Retrieve search engines for specific property if (property != null) { searchEngines = config.getStringArrayList(property); populateSearchEnginesMap(result, searchEngines, template); } // Retrieve search engines for general property searchEngines = config.getStringArrayList( WPCConfigurationStringList.SEARCH_ENGINES_TEMPLATES); populateSearchEnginesMap(result, searchEngines, template); return result; } /** * @param map Map of search engines (parameter name => search engines) * @param searchEngines Search engines configuration * @param template */ private static void populateSearchEnginesMap( Map<String, List<SearchEngine>> map, List<String[]> searchEngines, PageElementTemplate template) { if ((map == null) || (searchEngines == null) || (template == null)) { return; } try { for (String[] searchEngine : searchEngines) { if ((searchEngine.length >= 4) && (Page.areSameTitle(template.getTemplateName(), searchEngine[2]))) { String[] parameterNames = searchEngine[3].split("\\,"); for (String parameterName : parameterNames) { String value = template.getParameterValue(parameterName); if ((value != null) && (value.trim().length() > 0)) { List<SearchEngine> result = map.get(parameterName); if (result == null) { result = new ArrayList<>(); map.put(parameterName, result); } String engineName = searchEngine[0].trim(); String url = MessageFormat.format( searchEngine[1].trim(), URLEncoder.encode(value, "UTF8")); result.add(new SearchEngine(engineName, url)); } } } } } catch (UnsupportedEncodingException e) { // Nothing to do } } }