HSQLDB backend support completed, but untested.
3 * see AUTHORS for the list of contributors
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 package org.sonews.daemon.command;
21 import java.io.IOException;
22 import java.util.List;
23 import java.util.regex.Matcher;
24 import java.util.regex.Pattern;
25 import java.util.regex.PatternSyntaxException;
26 import org.sonews.daemon.NNTPConnection;
27 import org.sonews.storage.Channel;
28 import org.sonews.storage.StorageBackendException;
29 import org.sonews.util.Log;
32 * Class handling the LIST command.
33 * @author Christian Lins
34 * @author Dennis Schwerdel
37 public class ListCommand implements Command
41 public String[] getSupportedCommandStrings()
43 return new String[] {"LIST"};
47 public boolean hasFinished()
53 public String impliedCapability()
59 public boolean isStateful()
65 public void processLine(NNTPConnection conn, final String line, byte[] raw)
66 throws IOException, StorageBackendException
68 final String[] command = line.split(" ");
70 if (command.length >= 2) {
71 if (command[1].equalsIgnoreCase("OVERVIEW.FMT")) {
72 conn.println("215 information follows");
73 conn.println("Subject:\nFrom:\nDate:\nMessage-ID:\nReferences:\nBytes:\nLines:\nXref");
75 } else if (command[1].equalsIgnoreCase("NEWSGROUPS")) {
76 conn.println("215 information follows");
77 final List<Channel> list = Channel.getAll();
78 for (Channel g : list) {
79 conn.println(g.getName() + "\t" + "-");
82 } else if (command[1].equalsIgnoreCase("SUBSCRIPTIONS")) {
83 conn.println("215 information follows");
85 } else if (command[1].equalsIgnoreCase("EXTENSIONS")) {
86 conn.println("202 Supported NNTP extensions.");
87 conn.println("LISTGROUP");
88 conn.println("XDAEMON");
91 } else if (command[1].equalsIgnoreCase("ACTIVE")) {
92 String pattern = command.length == 2
93 ? null : command[2].replace("*", "\\w*");
94 printGroupInfo(conn, pattern);
96 conn.println("500 unknown argument to LIST command");
99 printGroupInfo(conn, null);
103 private void printGroupInfo(NNTPConnection conn, String pattern)
104 throws IOException, StorageBackendException
106 final List<Channel> groups = Channel.getAll();
107 if (groups != null) {
108 conn.println("215 list of newsgroups follows");
109 for (Channel g : groups) {
111 Matcher matcher = pattern == null
112 ? null : Pattern.compile(pattern).matcher(g.getName());
114 && (matcher == null || matcher.find())) {
115 String writeable = g.isWriteable() ? " y" : " n";
116 // Indeed first the higher article number then the lower
117 conn.println(g.getName() + " " + g.getLastArticleNumber() + " "
118 + g.getFirstArticleNumber() + writeable);
120 } catch (PatternSyntaxException ex) {
121 Log.get().info(ex.toString());
126 conn.println("500 server backend malfunction");