diff --git a/src/main/java/net/thauvin/erik/mobibot/entries/EntriesMgr.java b/src/main/java/net/thauvin/erik/mobibot/entries/EntriesMgr.java index 38b9e6d..3c450b3 100644 --- a/src/main/java/net/thauvin/erik/mobibot/entries/EntriesMgr.java +++ b/src/main/java/net/thauvin/erik/mobibot/entries/EntriesMgr.java @@ -44,6 +44,7 @@ import com.rometools.rome.io.SyndFeedOutput; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import net.thauvin.erik.mobibot.Mobibot; import net.thauvin.erik.mobibot.Utils; +import org.apache.commons.lang3.StringUtils; import java.io.IOException; import java.io.InputStreamReader; @@ -200,7 +201,7 @@ public final class EntriesMgr { bot.getLogger().debug("Saving the feeds..."); } - if (Utils.isValidString(bot.getLogsDir()) && Utils.isValidString(bot.getWeblogUrl())) { + if (StringUtils.isNotBlank(bot.getLogsDir()) && StringUtils.isNotBlank(bot.getWeblogUrl())) { try { final SyndFeedOutput output = new SyndFeedOutput(); SyndFeed rss = new SyndFeedImpl(); @@ -279,8 +280,8 @@ public final class EntriesMgr { } if (isDayBackup) { - if (Utils.isValidString(bot.getBacklogsUrl())) { - if (history.indexOf(bot.getToday()) == -1) { + if (StringUtils.isNotBlank(bot.getBacklogsUrl())) { + if (!history.contains(bot.getToday())) { history.add(bot.getToday()); while (history.size() > MAX_BACKLOGS) { diff --git a/src/main/java/net/thauvin/erik/mobibot/modules/AbstractModule.java b/src/main/java/net/thauvin/erik/mobibot/modules/AbstractModule.java index a704eca..61e0871 100644 --- a/src/main/java/net/thauvin/erik/mobibot/modules/AbstractModule.java +++ b/src/main/java/net/thauvin/erik/mobibot/modules/AbstractModule.java @@ -33,7 +33,7 @@ package net.thauvin.erik.mobibot.modules; import net.thauvin.erik.mobibot.Mobibot; -import net.thauvin.erik.mobibot.Utils; +import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.List; @@ -103,7 +103,7 @@ public abstract class AbstractModule { public abstract void helpResponse(final Mobibot bot, final String sender, final String args, - final boolean isPrivate); + @SuppressWarnings("unused") final boolean isPrivate); /** * Returns true if the module is enabled. @@ -134,7 +134,7 @@ public abstract class AbstractModule { */ boolean isValidProperties() { for (final String s : getPropertyKeys()) { - if (!Utils.isValidString(properties.get(s))) { + if (StringUtils.isBlank(properties.get(s))) { return false; } } @@ -149,7 +149,7 @@ public abstract class AbstractModule { * @param value The value. */ public void setProperty(final String key, final String value) { - if (Utils.isValidString(key)) { + if (StringUtils.isNotBlank(key)) { properties.put(key, value); } } diff --git a/src/main/java/net/thauvin/erik/mobibot/modules/Calc.java b/src/main/java/net/thauvin/erik/mobibot/modules/Calc.java index 77dafa1..b852614 100644 --- a/src/main/java/net/thauvin/erik/mobibot/modules/Calc.java +++ b/src/main/java/net/thauvin/erik/mobibot/modules/Calc.java @@ -35,7 +35,7 @@ package net.thauvin.erik.mobibot.modules; import net.objecthunter.exp4j.Expression; import net.objecthunter.exp4j.ExpressionBuilder; import net.thauvin.erik.mobibot.Mobibot; -import net.thauvin.erik.mobibot.Utils; +import org.apache.commons.lang3.StringUtils; import java.text.DecimalFormat; @@ -82,7 +82,7 @@ public class Calc extends AbstractModule { */ @Override public void commandResponse(final Mobibot bot, final String sender, final String args, final boolean isPrivate) { - if (Utils.isValidString(args)) { + if (StringUtils.isNotBlank(args)) { bot.send(calc(args)); } else { diff --git a/src/main/java/net/thauvin/erik/mobibot/modules/CurrencyConverter.java b/src/main/java/net/thauvin/erik/mobibot/modules/CurrencyConverter.java index 3baa613..cb8ed9c 100644 --- a/src/main/java/net/thauvin/erik/mobibot/modules/CurrencyConverter.java +++ b/src/main/java/net/thauvin/erik/mobibot/modules/CurrencyConverter.java @@ -40,6 +40,7 @@ import net.thauvin.erik.mobibot.msg.ErrorMessage; import net.thauvin.erik.mobibot.msg.Message; import net.thauvin.erik.mobibot.msg.NoticeMessage; import net.thauvin.erik.mobibot.msg.PublicMessage; +import org.apache.commons.lang3.StringUtils; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; @@ -105,7 +106,7 @@ public final class CurrencyConverter extends ThreadedModule { @SuppressFBWarnings("REDOS") @Override void run(final Mobibot bot, final String sender, final String query) { - if (Utils.isValidString(sender) && Utils.isValidString(query)) { + if (StringUtils.isNotBlank(sender) && StringUtils.isNotBlank(query)) { if (query.matches("\\d+([,\\d]+)?(\\.\\d+)? [a-zA-Z]{3}+ to [a-zA-Z]{3}+")) { try { final Message msg = convertCurrency(query); @@ -146,7 +147,7 @@ public final class CurrencyConverter extends ThreadedModule { pubDate = cubeTime.getAttribute("time").getValue(); - final List cubes = cubeTime.getChildren(); + final List cubes = cubeTime.getChildren(); Element cube; for (final Object rawCube : cubes) { diff --git a/src/main/java/net/thauvin/erik/mobibot/modules/GoogleSearch.java b/src/main/java/net/thauvin/erik/mobibot/modules/GoogleSearch.java index ed26c4a..32b685b 100644 --- a/src/main/java/net/thauvin/erik/mobibot/modules/GoogleSearch.java +++ b/src/main/java/net/thauvin/erik/mobibot/modules/GoogleSearch.java @@ -37,6 +37,7 @@ import net.thauvin.erik.mobibot.Mobibot; import net.thauvin.erik.mobibot.Utils; import net.thauvin.erik.mobibot.msg.Message; import net.thauvin.erik.mobibot.msg.NoticeMessage; +import org.apache.commons.lang3.StringUtils; import org.jibble.pircbot.Colors; import org.json.JSONArray; import org.json.JSONObject; @@ -96,7 +97,7 @@ public final class GoogleSearch extends ThreadedModule { */ @Override void run(final Mobibot bot, final String sender, final String query) { - if (Utils.isValidString(query)) { + if (StringUtils.isNotBlank(query)) { try { final List results = searchGoogle(query, properties.get(GOOGLE_API_KEY_PROP), properties.get(GOOGLE_CSE_KEY_PROP)); @@ -125,11 +126,11 @@ public final class GoogleSearch extends ThreadedModule { @SuppressWarnings(("PMD.AvoidInstantiatingObjectsInLoops")) static List searchGoogle(final String query, final String apiKey, final String cseKey) throws ModuleException { - if (!Utils.isValidString(apiKey) || !Utils.isValidString(cseKey)) { - throw new ModuleException(Utils.capitalize(GOOGLE_CMD) + " is disabled. The API keys are missing."); + if (StringUtils.isBlank(apiKey) || StringUtils.isBlank(cseKey)) { + throw new ModuleException(StringUtils.capitalize(GOOGLE_CMD) + " is disabled. The API keys are missing."); } - if (Utils.isValidString(query)) { + if (StringUtils.isNotBlank(query)) { final ArrayList results = new ArrayList<>(); try { final String q = URLEncoder.encode(query, StandardCharsets.UTF_8.toString()); diff --git a/src/main/java/net/thauvin/erik/mobibot/modules/ModuleException.java b/src/main/java/net/thauvin/erik/mobibot/modules/ModuleException.java index 5c516ea..13ab2fa 100644 --- a/src/main/java/net/thauvin/erik/mobibot/modules/ModuleException.java +++ b/src/main/java/net/thauvin/erik/mobibot/modules/ModuleException.java @@ -32,11 +32,8 @@ package net.thauvin.erik.mobibot.modules; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import okhttp3.HttpUrl; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import net.thauvin.erik.mobibot.Utils; +import org.apache.commons.lang3.StringUtils; /** * The ModuleException class. @@ -49,7 +46,6 @@ public class ModuleException extends Exception { private static final long serialVersionUID = 1L; private final String debugMessage; - private final Pattern urlPattern = Pattern.compile("(https?://\\S+)(\\?\\S+)"); /** * Creates a new exception. @@ -94,33 +90,19 @@ public class ModuleException extends Exception { } /** - * Return the sanitized (URL query parameters are replaced by char count) message. + * Return the sanitized message (e.g. remove API keys, etc.) * + * @param sanitize The words to sanitize. * @return The sanitized message. */ - @SuppressFBWarnings(value = "NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE", justification = "false positive?") - String getSanitizedMessage() { - if (hasCause()) { - final String causeMessage = getCause().getMessage(); - final Matcher matcher = urlPattern.matcher(causeMessage); - if (matcher.find()) { - final HttpUrl url = HttpUrl.parse(matcher.group(1) + matcher.group(2)); - if (url != null) { - final StringBuilder query = new StringBuilder("?"); - final int size = url.querySize(); - for (int i = 0; i < size; i++) { - if (i > 0) { - query.append('&'); - } - query.append(url.queryParameterName(i)).append("=[") - .append(url.queryParameterValue(i).length()).append(']'); - } - return getDebugMessage() + "\nCaused by: " + getCause().getClass().getName() + ": " - + causeMessage.replace(matcher.group(2), query); - } - } + String getSanitizedMessage(final String... sanitize) { + final String[] obfuscate = new String[sanitize.length]; + for (int i = 0; i < sanitize.length; i++) { + obfuscate[i] = Utils.obfuscate(sanitize[i]); } - return getDebugMessage() + "\nCaused by: " + getCause().getClass().getName() + ": " + getCause().getMessage(); + return getCause().getClass().getName() + ": " + StringUtils.replaceEach(getCause().getMessage(), + sanitize, + obfuscate); } /** @@ -128,6 +110,7 @@ public class ModuleException extends Exception { * * @return true or false */ + @SuppressWarnings("unused") boolean hasCause() { return getCause() != null; } diff --git a/src/main/java/net/thauvin/erik/mobibot/modules/StockQuote.java b/src/main/java/net/thauvin/erik/mobibot/modules/StockQuote.java index 912f287..0b0fc79 100644 --- a/src/main/java/net/thauvin/erik/mobibot/modules/StockQuote.java +++ b/src/main/java/net/thauvin/erik/mobibot/modules/StockQuote.java @@ -42,6 +42,7 @@ import net.thauvin.erik.mobibot.msg.PublicMessage; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; +import org.apache.commons.lang3.StringUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -68,7 +69,7 @@ public final class StockQuote extends ThreadedModule { */ static final String INVALID_SYMBOL = "Invalid symbol."; // The Alpha Advantage URL. - private static final String ALAPHADVANTAGE_URL = "https://www.alphavantage.co/query?function="; + private static final String ALAPHAVANTAGE_URL = "https://www.alphavantage.co/query?function="; // The quote command. private static final String STOCK_CMD = "stock"; @@ -132,11 +133,11 @@ public final class StockQuote extends ThreadedModule { * @throws ModuleException If an errors occurs. */ static List getQuote(final String symbol, final String apiKey) throws ModuleException { - if (!Utils.isValidString(apiKey)) { - throw new ModuleException(Utils.capitalize(STOCK_CMD) + " is disabled. The API key is missing."); + if (StringUtils.isBlank(apiKey)) { + throw new ModuleException(StringUtils.capitalize(STOCK_CMD) + " is disabled. The API key is missing."); } - if (Utils.isValidString(symbol)) { + if (StringUtils.isNotBlank(symbol)) { final String debugMessage = "getQuote(" + symbol + ')'; final ArrayList messages = new ArrayList<>(); final OkHttpClient client = new OkHttpClient(); @@ -144,7 +145,7 @@ public final class StockQuote extends ThreadedModule { try { // Search for symbol/keywords Request request = new Request.Builder().url( - ALAPHADVANTAGE_URL + "SYMBOL_SEARCH&keywords=" + symbol + "&apikey=" + apiKey).build(); + ALAPHAVANTAGE_URL + "SYMBOL_SEARCH&keywords=" + symbol + "&apikey=" + apiKey).build(); Response response = client.newCall(request).execute(); JSONObject json = getJsonResponse(response, debugMessage); @@ -159,7 +160,7 @@ public final class StockQuote extends ThreadedModule { // Get quote for symbol request = new Request.Builder().url( - ALAPHADVANTAGE_URL + "GLOBAL_QUOTE&symbol=" + symbolInfo.getString("1. symbol") + "&apikey=" + ALAPHAVANTAGE_URL + "GLOBAL_QUOTE&symbol=" + symbolInfo.getString("1. symbol") + "&apikey=" + apiKey).build(); response = client.newCall(request).execute(); @@ -210,7 +211,7 @@ public final class StockQuote extends ThreadedModule { */ @Override void run(final Mobibot bot, final String sender, final String symbol) { - if (Utils.isValidString(symbol)) { + if (StringUtils.isNotBlank(symbol)) { try { final List messages = getQuote(symbol, properties.get(ALPHAVANTAGE_API_KEY_PROP)); for (final Message msg : messages) { diff --git a/src/main/java/net/thauvin/erik/mobibot/modules/Weather2.java b/src/main/java/net/thauvin/erik/mobibot/modules/Weather2.java index a166eba..aad3e42 100644 --- a/src/main/java/net/thauvin/erik/mobibot/modules/Weather2.java +++ b/src/main/java/net/thauvin/erik/mobibot/modules/Weather2.java @@ -45,10 +45,12 @@ import net.thauvin.erik.mobibot.msg.Message; import net.thauvin.erik.mobibot.msg.NoticeMessage; import net.thauvin.erik.mobibot.msg.PublicMessage; import okhttp3.HttpUrl; +import org.apache.commons.lang3.StringUtils; import org.jibble.pircbot.Colors; import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * The Weather2 module. @@ -105,8 +107,8 @@ public class Weather2 extends ThreadedModule { * @throws ModuleException If an error occurs while retrieving the weather data. */ static List getWeather(final String query, final String apiKey) throws ModuleException { - if (!Utils.isValidString(apiKey)) { - throw new ModuleException(Utils.capitalize(WEATHER_CMD) + " is disabled. The API key is missing."); + if (StringUtils.isBlank(apiKey)) { + throw new ModuleException(StringUtils.capitalize(WEATHER_CMD) + " is disabled. The API key is missing."); } final OWM owm = new OWM(apiKey); @@ -114,13 +116,13 @@ public class Weather2 extends ThreadedModule { owm.setUnit(OWM.Unit.IMPERIAL); - if (Utils.isValidString(query)) { + if (StringUtils.isNotBlank(query)) { final String[] argv = query.split(","); if (argv.length >= 1 && argv.length <= 2) { final String country; final String city = argv[0].trim(); - if (argv.length > 1 && Utils.isValidString(argv[1])) { + if (argv.length > 1 && StringUtils.isNotBlank(argv[1])) { country = argv[1].trim(); } else { country = "US"; @@ -160,7 +162,7 @@ public class Weather2 extends ThreadedModule { if (list != null) { for (final Weather w : list) { if (condition.indexOf(",") == -1) { - condition.append(Utils.capitalize(w.getDescription())); + condition.append(StringUtils.capitalize(w.getDescription())); } else { condition.append(", ").append(w.getDescription()); } @@ -174,11 +176,13 @@ public class Weather2 extends ThreadedModule { messages.add(new NoticeMessage("https://openweathermap.org/city/" + cwd.getCityId(), Colors.GREEN)); } else { - final HttpUrl url = - HttpUrl.parse("https://openweathermap.org/find").newBuilder().addQueryParameter( - "q", city + ',' + country).build(); - messages.add( - new NoticeMessage(url.toString(), Colors.GREEN)); + final HttpUrl url = Objects.requireNonNull(HttpUrl.parse( + "https://openweathermap.org/find")) + .newBuilder() + .addQueryParameter("q", + city + ',' + country) + .build(); + messages.add(new NoticeMessage(url.toString(), Colors.GREEN)); } } } @@ -204,8 +208,9 @@ public class Weather2 extends ThreadedModule { bot.send(sender, bot.helpIndent(bot.getNick() + ": " + WEATHER_CMD + " [, ]")); bot.send(sender, "For example:"); bot.send(sender, bot.helpIndent(bot.getNick() + ": " + WEATHER_CMD + " paris, fr")); - bot.send(sender, "The default ISO 3166 country code is " + Utils.bold("US") - + ". Zip codes are supported in most countries."); + bot.send(sender, + "The default ISO 3166 country code is " + Utils.bold("US") + + ". Zip codes are supported in most countries."); } /** @@ -213,7 +218,7 @@ public class Weather2 extends ThreadedModule { */ @Override void run(final Mobibot bot, final String sender, final String args) { - if (Utils.isValidString(args)) { + if (StringUtils.isNotBlank(args)) { try { final List messages = getWeather(args, properties.get(OWM_API_KEY_PROP)); if (messages.get(0).isError()) { diff --git a/src/main/java/net/thauvin/erik/mobibot/tell/Tell.java b/src/main/java/net/thauvin/erik/mobibot/tell/Tell.java index dec97fa..17f70d2 100644 --- a/src/main/java/net/thauvin/erik/mobibot/tell/Tell.java +++ b/src/main/java/net/thauvin/erik/mobibot/tell/Tell.java @@ -36,6 +36,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import net.thauvin.erik.mobibot.Commands; import net.thauvin.erik.mobibot.Mobibot; import net.thauvin.erik.mobibot.Utils; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -143,7 +144,7 @@ public class Tell { @SuppressFBWarnings(value = "CC_CYCLOMATIC_COMPLEXITY", justification = "Working on it.") public void response(final String sender, final String cmds) { final String arrow = " --> "; - if (!Utils.isValidString(cmds)) { + if (StringUtils.isBlank(cmds)) { helpResponse(sender); } else if (cmds.startsWith(Commands.VIEW_CMD)) { if (bot.isOp(sender) && (Commands.VIEW_CMD + ' ' + TELL_ALL_KEYWORD).equals(cmds)) { @@ -249,7 +250,7 @@ public class Tell { } else { final String[] split = cmds.split(" ", 2); - if (split.length == 2 && (Utils.isValidString(split[1]) && split[1].contains(" "))) { + if (split.length == 2 && (StringUtils.isNotBlank(split[1]) && split[1].contains(" "))) { if (messages.size() < maxSize) { final TellMessage message = new TellMessage(sender, split[0], split[1].trim());