X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fxdcc%2Fui%2Fstdin%2FSearchCommand.java;h=3b3afe8f40cab24ae468edd2860ce96163f53128;hb=622f19bf29f11c2feaf1b86ae962be6498a6bde8;hp=9619f117d10e78dad81f57b399b8964ed79049d2;hpb=1ca482cdf4956eb7dcdcfd75c4d0412cf0261fdf;p=xudocci.git diff --git a/src/main/java/net/pterodactylus/xdcc/ui/stdin/SearchCommand.java b/src/main/java/net/pterodactylus/xdcc/ui/stdin/SearchCommand.java index 9619f11..3b3afe8 100644 --- a/src/main/java/net/pterodactylus/xdcc/ui/stdin/SearchCommand.java +++ b/src/main/java/net/pterodactylus/xdcc/ui/stdin/SearchCommand.java @@ -19,12 +19,17 @@ package net.pterodactylus.xdcc.ui.stdin; import static com.google.common.collect.Lists.newArrayList; import static java.util.Arrays.asList; +import static java.util.regex.Pattern.CASE_INSENSITIVE; +import static java.util.regex.Pattern.UNICODE_CASE; +import static java.util.regex.Pattern.compile; +import static java.util.stream.Collectors.toList; import java.io.IOException; import java.io.Writer; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.regex.Pattern; import net.pterodactylus.xdcc.core.Core; import net.pterodactylus.xdcc.data.Bot; @@ -68,21 +73,11 @@ public class SearchCommand implements Command { @Override public State execute(State state, List parameters, Writer outputWriter) throws IOException { List lastResult = newArrayList(); + List searchParameters = parameters.stream().map(SearchParameter::from).collect(toList()); for (Bot bot : newArrayList(core.bots())) { for (Pack pack : newArrayList(bot)) { - boolean found = true; - for (String parameter : parameters) { - if (parameter.startsWith("-") && pack.name().toLowerCase().contains(parameter.toLowerCase().substring(1))) { - found = false; - break; - } - if (!parameter.startsWith("-") && !pack.name().toLowerCase().contains(parameter.toLowerCase())) { - found = false; - break; - } - } - if (found) { - lastResult.add(new Result(bot, pack)); + if (searchParameters.stream().allMatch((parameter) -> parameter.matches(pack.name()))) { + lastResult.add(new Result(core, bot, pack)); } } } @@ -92,8 +87,29 @@ public class SearchCommand implements Command { outputWriter.write(String.format("[%d] %s (%s) from %s (#%s) on %s\n", counter++, result.pack().name(), result.pack().size(), result.bot().name(), result.pack().id(), result.bot().network().name())); } outputWriter.write("End of Search.\n"); - outputWriter.flush(); return state.setLastResults(lastResult); } + static class SearchParameter { + + private final boolean exclude; + private final Pattern pattern; + + SearchParameter(boolean exclude, Pattern pattern) { + this.exclude = exclude; + this.pattern = pattern; + } + + public boolean matches(String filename) { + return pattern.matcher(filename).find() == !exclude; + } + + public static SearchParameter from(String parameter) { + boolean exclude = parameter.startsWith("-"); + Pattern pattern = compile(exclude ? parameter.substring(1) : parameter, CASE_INSENSITIVE | UNICODE_CASE); + return new SearchParameter(exclude, pattern); + } + + } + }