1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package examples.nntp;
18
19 import java.io.BufferedReader;
20 import java.io.IOException;
21 import java.io.Reader;
22 import java.util.StringTokenizer;
23
24 import org.apache.commons.net.io.DotTerminatedMessageReader;
25 import org.apache.commons.net.nntp.Article;
26 import org.apache.commons.net.nntp.NNTPClient;
27
28 /**
29 *
30 * Some convenience methods for NNTP example classes.
31 *
32 * @author Rory Winston <rwinston@checkfree.com>
33 */
34 public class NNTPUtils {
35
36 /**
37 * Given an {@link NNTPClient} instance, and an integer range of messages, return
38 * an array of {@link Article} instances.
39 * @param client
40 * @param lowArticleNumber
41 * @param highArticleNumber
42 * @return Article[] An array of Article
43 * @throws IOException
44 */
45 public static Article[] getArticleInfo(NNTPClient client, int lowArticleNumber, int highArticleNumber)
46 throws IOException {
47 Reader reader = null;
48 Article[] articles = null;
49 reader =
50 (DotTerminatedMessageReader) client.retrieveArticleInfo(
51 lowArticleNumber,
52 highArticleNumber);
53
54 if (reader != null) {
55 String theInfo = readerToString(reader);
56 StringTokenizer st = new StringTokenizer(theInfo, "\n");
57
58 // Extract the article information
59 // Mandatory format (from NNTP RFC 2980) is :
60 // Subject\tAuthor\tDate\tID\tReference(s)\tByte Count\tLine Count
61
62 int count = st.countTokens();
63 articles = new Article[count];
64 int index = 0;
65
66 while (st.hasMoreTokens()) {
67 StringTokenizer stt = new StringTokenizer(st.nextToken(), "\t");
68 Article article = new Article();
69 article.setArticleNumber(Integer.parseInt(stt.nextToken()));
70 article.setSubject(stt.nextToken());
71 article.setFrom(stt.nextToken());
72 article.setDate(stt.nextToken());
73 article.setArticleId(stt.nextToken());
74 article.addHeaderField("References", stt.nextToken());
75 articles[index++] = article;
76 }
77 } else {
78 return null;
79 }
80
81 return articles;
82 }
83
84
85 /**
86 * Convert a {@link Reader} instance to a String
87 * @param reader The Reader instance
88 * @return String
89 */
90 public static String readerToString(Reader reader) {
91 String temp = null;
92 StringBuffer sb = null;
93 BufferedReader bufReader = new BufferedReader(reader);
94
95 sb = new StringBuffer();
96 try {
97 temp = bufReader.readLine();
98 while (temp != null) {
99 sb.append(temp);
100 sb.append("\n");
101 temp = bufReader.readLine();
102 }
103 } catch (IOException e) {
104 e.printStackTrace();
105 }
106
107 return sb.toString();
108 }
109 }