src/org/sonews/daemon/command/NextPrevCommand.java
author František Kučera <franta-hg@frantovo.cz>
Thu, 05 Jul 2012 13:19:19 +0200
changeset 119 f5b57e221e38
parent 48 b78e77619152
permissions -rwxr-xr-x
mezery, tabulátory
     1 /*
     2  *   SONEWS News Server
     3  *   see AUTHORS for the list of contributors
     4  *
     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.
     9  *
    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.
    14  *
    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/>.
    17  */
    18 package org.sonews.daemon.command;
    19 
    20 import java.io.IOException;
    21 import org.sonews.daemon.NNTPConnection;
    22 import org.sonews.storage.Article;
    23 import org.sonews.storage.Group;
    24 import org.sonews.storage.StorageBackendException;
    25 
    26 /**
    27  * Class handling the NEXT and LAST command.
    28  * @author Christian Lins
    29  * @author Dennis Schwerdel
    30  * @since n3tpd/0.1
    31  */
    32 public class NextPrevCommand implements Command {
    33 
    34 	@Override
    35 	public String[] getSupportedCommandStrings() {
    36 		return new String[]{"NEXT", "PREV"};
    37 	}
    38 
    39 	@Override
    40 	public boolean hasFinished() {
    41 		return true;
    42 	}
    43 
    44 	@Override
    45 	public String impliedCapability() {
    46 		return null;
    47 	}
    48 
    49 	@Override
    50 	public boolean isStateful() {
    51 		return false;
    52 	}
    53 
    54 	@Override
    55 	public void processLine(NNTPConnection conn, final String line, byte[] raw)
    56 			throws IOException, StorageBackendException {
    57 		final Article currA = conn.getCurrentArticle();
    58 		final Group currG = conn.getCurrentChannel();
    59 
    60 		if (currA == null) {
    61 			conn.println("420 no current article has been selected");
    62 			return;
    63 		}
    64 
    65 		if (currG == null) {
    66 			conn.println("412 no newsgroup selected");
    67 			return;
    68 		}
    69 
    70 		final String[] command = line.split(" ");
    71 
    72 		if (command[0].equalsIgnoreCase("NEXT")) {
    73 			selectNewArticle(conn, currA, currG, 1);
    74 		} else if (command[0].equalsIgnoreCase("PREV")) {
    75 			selectNewArticle(conn, currA, currG, -1);
    76 		} else {
    77 			conn.println("500 internal server error");
    78 		}
    79 	}
    80 
    81 	private void selectNewArticle(NNTPConnection conn, Article article, Group grp,
    82 			final int delta)
    83 			throws IOException, StorageBackendException {
    84 		assert article != null;
    85 
    86 		article = grp.getArticle(grp.getIndexOf(article) + delta);
    87 
    88 		if (article == null) {
    89 			conn.println("421 no next article in this group");
    90 		} else {
    91 			conn.setCurrentArticle(article);
    92 			conn.println("223 " + conn.getCurrentChannel().getIndexOf(article)
    93 					+ " " + article.getMessageID()
    94 					+ " article retrieved - request text separately");
    95 		}
    96 	}
    97 }