Sort results permanently.
[xudocci.git] / src / main / java / net / pterodactylus / xdcc / ui / stdin / CommandReader.java
1 /*
2  * XdccDownloader - CommandReader.java - Copyright © 2013 David Roden
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 package net.pterodactylus.xdcc.ui.stdin;
19
20 import java.io.BufferedReader;
21 import java.io.Reader;
22 import java.util.Collections;
23 import java.util.List;
24
25 import net.pterodactylus.xdcc.core.Core;
26 import net.pterodactylus.xdcc.data.Bot;
27 import net.pterodactylus.xdcc.data.Pack;
28
29 import com.google.common.collect.Lists;
30 import com.google.common.util.concurrent.AbstractExecutionThreadService;
31
32 /**
33  * Command interface for arbitrary {@link Reader}s.
34  *
35  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
36  */
37 public class CommandReader extends AbstractExecutionThreadService {
38
39         /** The core being controlled. */
40         private final Core core;
41
42         /** The reader to read commands from. */
43         private final BufferedReader reader;
44
45         /**
46          * Creates a new command reader.
47          *
48          * @param core
49          *              The core being controlled
50          * @param reader
51          *              The reader to read commands from
52          */
53         public CommandReader(Core core, Reader reader) {
54                 this.core = core;
55                 this.reader = new BufferedReader(reader);
56         }
57
58         //
59         // ABSTRACTEXECUTIONTHREADSERVICE METHODS
60         //
61
62         @Override
63         protected void run() throws Exception {
64                 String lastLine = "";
65                 String line;
66                 final List<Result> lastResult = Lists.newArrayList();
67                 while ((line = reader.readLine()) != null) {
68                         if (line.equals("")) {
69                                 line = lastLine;
70                         }
71                         String[] words = line.split(" +");
72                         if (words[0].equalsIgnoreCase("search")) {
73                                 lastResult.clear();
74                                 for (Bot bot : core.bots()) {
75                                         for (Pack pack : bot) {
76                                                 boolean found = true;
77                                                 for (int wordIndex = 1; wordIndex < words.length; ++wordIndex) {
78                                                         if (words[wordIndex].startsWith("-") && pack.name().toLowerCase().contains(words[wordIndex].toLowerCase().substring(1))) {
79                                                                 found = false;
80                                                                 break;
81                                                         }
82                                                         if (!words[wordIndex].startsWith("-") && !pack.name().toLowerCase().contains(words[wordIndex].toLowerCase())) {
83                                                                 found = false;
84                                                                 break;
85                                                         }
86                                                 }
87                                                 if (found) {
88                                                         lastResult.add(new Result(bot, pack));
89                                                 }
90                                         }
91                                 }
92                                 Collections.sort(lastResult);
93                                 int counter = 0;
94                                 for (Result result : lastResult) {
95                                         System.out.println(String.format("[%d] %s (%s) from %s (#%s) on %s", counter++, result.pack().name(), result.pack().size(), result.bot().name(), result.pack().id(), result.bot().network().name()));
96                                 }
97                                 System.out.println("End of Search.");
98                         }
99
100                         lastLine = line;
101                 }
102         }
103
104         /** Container for result information. */
105         private static class Result implements Comparable<Result> {
106
107                 /** The bot carrying the pack. */
108                 private final Bot bot;
109
110                 /** The pack. */
111                 private final Pack pack;
112
113                 /**
114                  * Creates a new result.
115                  *
116                  * @param bot
117                  *              The bot carrying the pack
118                  * @param pack
119                  *              The pack
120                  */
121                 private Result(Bot bot, Pack pack) {
122                         this.bot = bot;
123                         this.pack = pack;
124                 }
125
126                 //
127                 // ACCESSORS
128                 //
129
130                 /**
131                  * Returns the bot carrying the pack.
132                  *
133                  * @return The bot carrying the pack
134                  */
135                 public Bot bot() {
136                         return bot;
137                 }
138
139                 /**
140                  * Returns the pack.
141                  *
142                  * @return The pack
143                  */
144                 public Pack pack() {
145                         return pack;
146                 }
147
148                 //
149                 // COMPARABLE METHODS
150                 //
151
152                 @Override
153                 public int compareTo(Result result) {
154                         return pack().name().compareToIgnoreCase(result.pack().name());
155                 }
156
157         }
158
159 }