diff --git a/src/main/java/com/onarandombox/MultiverseCore/display/ContentDisplay.java b/src/main/java/com/onarandombox/MultiverseCore/display/ContentDisplay.java index b2303c54..01f43cf9 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/display/ContentDisplay.java +++ b/src/main/java/com/onarandombox/MultiverseCore/display/ContentDisplay.java @@ -1,15 +1,15 @@ package com.onarandombox.MultiverseCore.display; -import com.onarandombox.MultiverseCore.display.handlers.DefaultSendHandler; -import com.onarandombox.MultiverseCore.display.handlers.SendHandler; -import com.onarandombox.MultiverseCore.display.parsers.ContentParser; -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.NotNull; - import java.util.ArrayList; import java.util.List; import java.util.Objects; +import co.aikar.commands.BukkitCommandIssuer; +import com.onarandombox.MultiverseCore.display.handlers.DefaultSendHandler; +import com.onarandombox.MultiverseCore.display.handlers.SendHandler; +import com.onarandombox.MultiverseCore.display.parsers.ContentProvider; +import org.jetbrains.annotations.NotNull; + /** * Helps to display contents such as list and maps in a nicely formatted fashion. */ @@ -25,7 +25,7 @@ public class ContentDisplay { return new ContentDisplay(); } - private final List contentParsers = new ArrayList<>(); + private final List contentParsers = new ArrayList<>(); private SendHandler sendHandler = DefaultSendHandler.getInstance(); public ContentDisplay() { @@ -38,7 +38,7 @@ public class ContentDisplay { * @return Same {@link ContentDisplay} for method chaining. */ @NotNull - public ContentDisplay addContentParser(@NotNull ContentParser parser) { + public ContentDisplay addContent(@NotNull ContentProvider parser) { contentParsers.add(parser); return this; } @@ -58,12 +58,12 @@ public class ContentDisplay { /** * Format and display the message to command sender. * - * @param sender The target command sender to show the display to. + * @param issuer The target command sender to show the display to. */ - public void send(@NotNull CommandSender sender) { + public void send(@NotNull BukkitCommandIssuer issuer) { Objects.requireNonNull(sendHandler, "No send handler set for content display"); List parsedContent = new ArrayList<>(); - contentParsers.forEach(parser -> parser.parse(sender, parsedContent)); - sendHandler.send(sender, parsedContent); + contentParsers.forEach(parser -> parsedContent.addAll(parser.parse(issuer))); + sendHandler.send(issuer, parsedContent); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/display/filters/DefaultContentFilter.java b/src/main/java/com/onarandombox/MultiverseCore/display/filters/DefaultContentFilter.java index 5070d647..8edc0592 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/display/filters/DefaultContentFilter.java +++ b/src/main/java/com/onarandombox/MultiverseCore/display/filters/DefaultContentFilter.java @@ -32,4 +32,9 @@ public class DefaultContentFilter implements ContentFilter { public boolean needToFilter() { return false; } + + @Override + public String toString() { + return "N/A"; + } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/display/filters/RegexContentFilter.java b/src/main/java/com/onarandombox/MultiverseCore/display/filters/RegexContentFilter.java index e83611e9..819b6d86 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/display/filters/RegexContentFilter.java +++ b/src/main/java/com/onarandombox/MultiverseCore/display/filters/RegexContentFilter.java @@ -1,14 +1,14 @@ package com.onarandombox.MultiverseCore.display.filters; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; + import com.dumptruckman.minecraft.util.Logging; import com.google.common.base.Strings; import org.bukkit.ChatColor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.regex.Pattern; -import java.util.regex.PatternSyntaxException; - /** * Filter content and text based on regex matching. */ @@ -34,7 +34,7 @@ public class RegexContentFilter implements ContentFilter { return new RegexContentFilter(filterString.substring(2)); } String cleanedFilter = REGEX_SPECIAL_CHARS.matcher(filterString.toLowerCase()).replaceAll("\\\\$0"); - return new RegexContentFilter("(?i).*" + cleanedFilter + ".*"); + return new RegexContentFilter(cleanedFilter); } private final String regexString; diff --git a/src/main/java/com/onarandombox/MultiverseCore/display/handlers/BaseSendHandler.java b/src/main/java/com/onarandombox/MultiverseCore/display/handlers/BaseSendHandler.java index 46e11b29..ae339994 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/display/handlers/BaseSendHandler.java +++ b/src/main/java/com/onarandombox/MultiverseCore/display/handlers/BaseSendHandler.java @@ -1,14 +1,15 @@ package com.onarandombox.MultiverseCore.display.handlers; +import java.util.List; +import java.util.stream.Collectors; + +import co.aikar.commands.BukkitCommandIssuer; import com.google.common.base.Strings; import com.onarandombox.MultiverseCore.display.filters.ContentFilter; import com.onarandombox.MultiverseCore.display.filters.DefaultContentFilter; import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; - -import java.util.List; -import java.util.stream.Collectors; +import org.jetbrains.annotations.Nullable; /** * Base implementation of {@link SendHandler} with some common parameters. @@ -19,29 +20,30 @@ public abstract class BaseSendHandler> implements S protected String header = ""; protected ContentFilter filter = DefaultContentFilter.getInstance(); + protected String noContentMessage = String.format("%sThere is no content to display.", ChatColor.RED); /** * {@inheritDoc} */ @Override - public void send(@NotNull CommandSender sender, @NotNull List content) { - sendHeader(sender); + public void send(@NotNull BukkitCommandIssuer issuer, @NotNull List content) { + sendHeader(issuer); List filteredContent = filterContent(content); - if (filteredContent.isEmpty()) { - sender.sendMessage(String.format("%sThere is no content to display.", ChatColor.RED)); + if (filteredContent.isEmpty() && !Strings.isNullOrEmpty(noContentMessage)) { + issuer.sendMessage(noContentMessage); return; } - sendContent(sender, filteredContent); + sendContent(issuer, filteredContent); } /** * Sends the header if header is present. * - * @param sender The target which the header will be displayed to. + * @param issuer The target which the header will be displayed to. */ - protected void sendHeader(CommandSender sender) { + protected void sendHeader(BukkitCommandIssuer issuer) { if (!Strings.isNullOrEmpty(header)) { - sender.sendMessage(header); + issuer.sendMessage(header); } } @@ -61,10 +63,10 @@ public abstract class BaseSendHandler> implements S /** * Display the contents. * - * @param sender The target which the content will be displayed to. + * @param issuer The target which the content will be displayed to. * @param content The content to display. */ - protected abstract void sendContent(@NotNull CommandSender sender, @NotNull List content); + protected abstract void sendContent(@NotNull BukkitCommandIssuer issuer, @NotNull List content); /** * Sets header to be displayed. @@ -89,6 +91,17 @@ public abstract class BaseSendHandler> implements S return (T) this; } + /** + * Sets the message to be displayed when there is no content to display. + * + * @param message The message to display. Null to disable. + * @return Same {@link T} for method chaining. + */ + public T noContentMessage(@Nullable String message) { + this.noContentMessage = message; + return (T) this; + } + public String getHeader() { return header; } @@ -96,4 +109,8 @@ public abstract class BaseSendHandler> implements S public ContentFilter getFilter() { return filter; } + + public String getNoContentMessage() { + return noContentMessage; + } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/display/handlers/DefaultSendHandler.java b/src/main/java/com/onarandombox/MultiverseCore/display/handlers/DefaultSendHandler.java index e0299785..17977d46 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/display/handlers/DefaultSendHandler.java +++ b/src/main/java/com/onarandombox/MultiverseCore/display/handlers/DefaultSendHandler.java @@ -1,10 +1,10 @@ package com.onarandombox.MultiverseCore.display.handlers; -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.NotNull; - import java.util.List; +import co.aikar.commands.BukkitCommandIssuer; +import org.jetbrains.annotations.NotNull; + public class DefaultSendHandler implements SendHandler { private static DefaultSendHandler instance; @@ -23,7 +23,7 @@ public class DefaultSendHandler implements SendHandler { * {@inheritDoc} */ @Override - public void send(@NotNull CommandSender sender, @NotNull List content) { - sender.sendMessage(content.toArray(new String[0])); + public void send(@NotNull BukkitCommandIssuer issuer, @NotNull List content) { + content.forEach(issuer::sendMessage); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/display/handlers/InlineSendHandler.java b/src/main/java/com/onarandombox/MultiverseCore/display/handlers/InlineSendHandler.java index 5d8a1d10..48ca4761 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/display/handlers/InlineSendHandler.java +++ b/src/main/java/com/onarandombox/MultiverseCore/display/handlers/InlineSendHandler.java @@ -1,11 +1,11 @@ package com.onarandombox.MultiverseCore.display.handlers; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.NotNull; - import java.util.List; +import co.aikar.commands.BukkitCommandIssuer; +import org.bukkit.ChatColor; +import org.jetbrains.annotations.NotNull; + /** * Display the contents in a single line. */ @@ -21,6 +21,7 @@ public class InlineSendHandler extends BaseSendHandler { } private String delimiter = ChatColor.WHITE + ", "; + private String prefix = null; public InlineSendHandler() { } @@ -29,11 +30,15 @@ public class InlineSendHandler extends BaseSendHandler { * {@inheritDoc} */ @Override - public void sendContent(@NotNull CommandSender sender, @NotNull List content) { + public void sendContent(@NotNull BukkitCommandIssuer issuer, @NotNull List content) { if (filter.needToFilter()) { - sender.sendMessage(String.format("%s[Filter '%s']", ChatColor.GRAY, filter)); + issuer.sendMessage(String.format("%s[Filter '%s']", ChatColor.GRAY, filter)); } - sender.sendMessage(String.join(delimiter, content)); + String message = String.join(delimiter, content); + if (prefix != null) { + message = prefix + message; + } + issuer.sendMessage(message); } /** @@ -47,7 +52,16 @@ public class InlineSendHandler extends BaseSendHandler { return this; } + public InlineSendHandler withPrefix(String prefix) { + this.prefix = prefix; + return this; + } + public String getDelimiter() { return delimiter; } + + public String getPrefix() { + return prefix; + } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/display/handlers/PagedSendHandler.java b/src/main/java/com/onarandombox/MultiverseCore/display/handlers/PagedSendHandler.java index 62208b5c..00ad7405 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/display/handlers/PagedSendHandler.java +++ b/src/main/java/com/onarandombox/MultiverseCore/display/handlers/PagedSendHandler.java @@ -1,12 +1,12 @@ package com.onarandombox.MultiverseCore.display.handlers; +import java.util.List; + +import co.aikar.commands.BukkitCommandIssuer; import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.jetbrains.annotations.NotNull; -import java.util.List; - /** * Display content as a list with optional pagination. */ @@ -34,50 +34,44 @@ public class PagedSendHandler extends BaseSendHandler { * {@inheritDoc} */ @Override - public void sendContent(@NotNull CommandSender sender, - @NotNull List content) { - - if (!paginate || (sender instanceof ConsoleCommandSender && !paginateInConsole)) { - sendNormal(sender, content); + public void sendContent(@NotNull BukkitCommandIssuer issuer, @NotNull List content) { + if (!paginate || (issuer instanceof ConsoleCommandSender && !paginateInConsole)) { + sendNormal(issuer, content); return; } - sendPaged(sender, content); + sendPaged(issuer, content); } /** * Send content list without pagination. * - * @param sender The target which the content will be displayed to. + * @param issuer The target which the content will be displayed to. * @param content The content to display. */ - private void sendNormal(@NotNull CommandSender sender, - @NotNull List content) { - + private void sendNormal(@NotNull BukkitCommandIssuer issuer, @NotNull List content) { if (filter.needToFilter()) { - sender.sendMessage(String.format("%s[Filter '%s']", ChatColor.GRAY, filter)); + issuer.sendMessage(String.format("%s[Filter '%s']", ChatColor.GRAY, filter)); } - sender.sendMessage(content.toArray(new String[0])); + content.forEach(issuer::sendMessage); } /** * Send content list with pagination. * - * @param sender The target which the content will be displayed to. + * @param issuer The target which the content will be displayed to. * @param content The content to display. */ - private void sendPaged(@NotNull CommandSender sender, - @NotNull List content) { - + private void sendPaged(@NotNull BukkitCommandIssuer issuer, @NotNull List content) { int totalPages = (content.size() + linesPerPage - 1) / linesPerPage; // Basically just divide round up if (targetPage < 1 || targetPage > totalPages) { - sender.sendMessage(String.format("%sInvalid page number. Please enter a page number between 1 and %s", ChatColor.RED, totalPages)); + issuer.sendMessage(String.format("%sInvalid page number. Please enter a page number between 1 and %s", ChatColor.RED, totalPages)); return; } if (filter.needToFilter()) { - sender.sendMessage(String.format("%s[Page %s of %s] [Filter '%s']", ChatColor.GRAY, targetPage, totalPages, filter)); + issuer.sendMessage(String.format("%s[Page %s of %s] [Filter '%s']", ChatColor.GRAY, targetPage, totalPages, filter)); } else { - sender.sendMessage(String.format("%s[Page %s of %s]", ChatColor.GRAY, targetPage, totalPages)); + issuer.sendMessage(String.format("%s[Page %s of %s]", ChatColor.GRAY, targetPage, totalPages)); } int startIndex = (targetPage - 1) * linesPerPage; @@ -89,7 +83,7 @@ public class PagedSendHandler extends BaseSendHandler { pageContent.add(""); } } - sender.sendMessage(pageContent.toArray(new String[0])); + pageContent.forEach(issuer::sendMessage); } /** diff --git a/src/main/java/com/onarandombox/MultiverseCore/display/handlers/SendHandler.java b/src/main/java/com/onarandombox/MultiverseCore/display/handlers/SendHandler.java index 6c826aa6..9114a808 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/display/handlers/SendHandler.java +++ b/src/main/java/com/onarandombox/MultiverseCore/display/handlers/SendHandler.java @@ -1,10 +1,10 @@ package com.onarandombox.MultiverseCore.display.handlers; -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.NotNull; - import java.util.List; +import co.aikar.commands.BukkitCommandIssuer; +import org.jetbrains.annotations.NotNull; + /** * Handles the sending of all content to the command sender. */ @@ -16,5 +16,5 @@ public interface SendHandler { * @param sender The target which the content will be displayed to. * @param content The content to display. */ - void send(@NotNull CommandSender sender, @NotNull List content); + void send(@NotNull BukkitCommandIssuer issuer, @NotNull List content); } diff --git a/src/main/java/com/onarandombox/MultiverseCore/display/parsers/ContentParser.java b/src/main/java/com/onarandombox/MultiverseCore/display/parsers/ContentParser.java deleted file mode 100644 index b69f7a84..00000000 --- a/src/main/java/com/onarandombox/MultiverseCore/display/parsers/ContentParser.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.onarandombox.MultiverseCore.display.parsers; - -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.NotNull; - -import java.util.List; - -/** - * Parse objects into string or list of strings. - */ -@FunctionalInterface -public interface ContentParser { - /** - * Parse the object to string(s) and add it to the content. - * - * @param sender The target which the content will be displayed to. - * @param content The content to display. - */ - void parse(@NotNull CommandSender sender, @NotNull List content); -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/display/parsers/ContentProvider.java b/src/main/java/com/onarandombox/MultiverseCore/display/parsers/ContentProvider.java new file mode 100644 index 00000000..9b8ceb5e --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/display/parsers/ContentProvider.java @@ -0,0 +1,19 @@ +package com.onarandombox.MultiverseCore.display.parsers; + +import java.util.Collection; + +import co.aikar.commands.BukkitCommandIssuer; +import org.jetbrains.annotations.NotNull; + +/** + * Parse objects into string or list of strings. + */ +@FunctionalInterface +public interface ContentProvider { + /** + * Parse the object to string(s) and add it to the content. + * + * @param issuer The target which the content will be displayed to. + */ + Collection parse(@NotNull BukkitCommandIssuer issuer); +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/display/parsers/ListContentParser.java b/src/main/java/com/onarandombox/MultiverseCore/display/parsers/ListContentProvider.java similarity index 55% rename from src/main/java/com/onarandombox/MultiverseCore/display/parsers/ListContentParser.java rename to src/main/java/com/onarandombox/MultiverseCore/display/parsers/ListContentProvider.java index 00a89061..f55fd8b7 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/display/parsers/ListContentParser.java +++ b/src/main/java/com/onarandombox/MultiverseCore/display/parsers/ListContentProvider.java @@ -1,33 +1,35 @@ package com.onarandombox.MultiverseCore.display.parsers; -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.NotNull; - +import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; + +import co.aikar.commands.BukkitCommandIssuer; +import org.jetbrains.annotations.NotNull; /** * Simple parser for list object. * * @param List element type. */ -public class ListContentParser implements ContentParser { +public class ListContentProvider implements ContentProvider { /** * New list content parser for the given list. * * @param list The list object to parse. * @param List element type. - * @return New {@link MapContentParser} instance. + * @return New {@link MapContentProvider} instance. */ - public static ListContentParser forContent(List list) { - return new ListContentParser<>(list); + public static ListContentProvider forContent(List list) { + return new ListContentProvider<>(list); } private final List list; private String format = "%s"; - public ListContentParser(List list) { + public ListContentProvider(List list) { this.list = list; } @@ -35,17 +37,17 @@ public class ListContentParser implements ContentParser { * {@inheritDoc} */ @Override - public void parse(@NotNull CommandSender sender, @NotNull List content) { - list.forEach(element -> content.add(String.format(format, element))); + public Collection parse(@NotNull BukkitCommandIssuer issuer) { + return list.stream().map(element -> String.format(format, element)).collect(Collectors.toList()); } /** * Sets the format that will be used to parse each list entry. Uses java string format pattern. * * @param format The format to use. - * @return Same {@link ListContentParser} for method chaining. + * @return Same {@link ListContentProvider} for method chaining. */ - public ListContentParser withFormat(String format) { + public ListContentProvider withFormat(String format) { this.format = format; return this; } diff --git a/src/main/java/com/onarandombox/MultiverseCore/display/parsers/MapContentParser.java b/src/main/java/com/onarandombox/MultiverseCore/display/parsers/MapContentProvider.java similarity index 59% rename from src/main/java/com/onarandombox/MultiverseCore/display/parsers/MapContentParser.java rename to src/main/java/com/onarandombox/MultiverseCore/display/parsers/MapContentProvider.java index 4aad97bc..bf4af2e7 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/display/parsers/MapContentParser.java +++ b/src/main/java/com/onarandombox/MultiverseCore/display/parsers/MapContentProvider.java @@ -1,11 +1,12 @@ package com.onarandombox.MultiverseCore.display.parsers; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.NotNull; - -import java.util.List; +import java.util.Collection; import java.util.Map; +import java.util.stream.Collectors; + +import co.aikar.commands.BukkitCommandIssuer; +import org.bukkit.ChatColor; +import org.jetbrains.annotations.NotNull; /** * Simple parser for map object. @@ -13,7 +14,7 @@ import java.util.Map; * @param Key type. * @param Value type. */ -public class MapContentParser implements ContentParser { +public class MapContentProvider implements ContentProvider { /** * New map content parser for the given map. @@ -21,10 +22,10 @@ public class MapContentParser implements ContentParser { * @param map The map object to parse. * @param Key type. * @param Value type. - * @return New {@link MapContentParser} instance. + * @return New {@link MapContentProvider} instance. */ - public static MapContentParser forContent(Map map) { - return new MapContentParser<>(map); + public static MapContentProvider forContent(Map map) { + return new MapContentProvider<>(map); } private final Map map; @@ -34,7 +35,7 @@ public class MapContentParser implements ContentParser { private ChatColor valueColor = ChatColor.WHITE; private String separator = ": "; - public MapContentParser(Map map) { + public MapContentProvider(Map map) { this.map = map; } @@ -42,17 +43,19 @@ public class MapContentParser implements ContentParser { * {@inheritDoc} */ @Override - public void parse(@NotNull CommandSender sender, @NotNull List content) { - map.forEach((k, v) -> content.add(String.format(format, keyColor, k, separator, valueColor, v))); + public Collection parse(@NotNull BukkitCommandIssuer issuer) { + return map.entrySet().stream() + .map(e -> String.format(format, keyColor, e.getKey(), separator, valueColor, e.getValue())) + .collect(Collectors.toList()); } /** * Sets the format that will be used to parse each map entry. Uses java string format pattern. * * @param format The format to use. - * @return Same {@link MapContentParser} for method chaining. + * @return Same {@link MapContentProvider} for method chaining. */ - public MapContentParser withFormat(String format) { + public MapContentProvider withFormat(String format) { this.format = format; return this; } @@ -61,9 +64,9 @@ public class MapContentParser implements ContentParser { * Sets the color for the key text. * * @param keyColor The color to use. - * @return Same {@link MapContentParser} for method chaining. + * @return Same {@link MapContentProvider} for method chaining. */ - public MapContentParser withKeyColor(ChatColor keyColor) { + public MapContentProvider withKeyColor(ChatColor keyColor) { this.keyColor = keyColor; return this; } @@ -72,9 +75,9 @@ public class MapContentParser implements ContentParser { * Sets the color for the value text. * * @param valueColor The color to use. - * @return Same {@link MapContentParser} for method chaining. + * @return Same {@link MapContentProvider} for method chaining. */ - public MapContentParser withValueColor(ChatColor valueColor) { + public MapContentProvider withValueColor(ChatColor valueColor) { this.valueColor = valueColor; return this; } @@ -83,9 +86,9 @@ public class MapContentParser implements ContentParser { * Sets the separator between each key value pairing. * * @param separator The separator to use. - * @return Same {@link MapContentParser} for method chaining. + * @return Same {@link MapContentProvider} for method chaining. */ - public MapContentParser withSeparator(String separator) { + public MapContentProvider withSeparator(String separator) { this.separator = separator; return this; }