001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package examples.nntp;
018    
019    import java.io.BufferedReader;
020    import java.io.IOException;
021    import java.io.Reader;
022    import java.util.ArrayList;
023    import java.util.List;
024    import java.util.NoSuchElementException;
025    import java.util.StringTokenizer;
026    
027    import org.apache.commons.net.io.DotTerminatedMessageReader;
028    import org.apache.commons.net.nntp.Article;
029    import org.apache.commons.net.nntp.NNTPClient;
030    
031    /**
032     *
033     * Some convenience methods for NNTP example classes.
034     *
035     * @author Rory Winston <rwinston@checkfree.com>
036     */
037    public class NNTPUtils {
038    
039        /**
040         * Given an {@link NNTPClient} instance, and an integer range of messages, return
041         * an array of {@link Article} instances.
042         * @param client
043         * @param lowArticleNumber
044         * @param highArticleNumber
045         * @return Article[] An array of Article
046         * @throws IOException
047         */
048        public  static List<Article> getArticleInfo(NNTPClient client, long lowArticleNumber, long highArticleNumber)
049        throws IOException {
050            Reader reader = null;
051            List<Article> articles = new ArrayList<Article>();
052            reader =
053                (DotTerminatedMessageReader) client.retrieveArticleInfo(
054                        lowArticleNumber,
055                        highArticleNumber);
056    
057            if (reader != null) {
058                String theInfo = readerToString(reader);
059                StringTokenizer st = new StringTokenizer(theInfo, "\n");
060    
061                // Extract the article information
062                // Mandatory format (from NNTP RFC 2980) is :
063                // Subject\tAuthor\tDate\tID\tReference(s)\tByte Count\tLine Count
064    
065                int count = st.countTokens();
066                int index = 0;
067    
068                while (st.hasMoreTokens()) {
069                    String msg = st.nextToken();
070                    System.out.println("Message:" + msg);
071                    StringTokenizer stt = new StringTokenizer(msg, "\t");
072    
073                    try {
074                        Article article = new Article();
075                        article.setArticleNumber(Integer.parseInt(stt.nextToken()));
076                        article.setSubject(stt.nextToken());
077                        article.setFrom(stt.nextToken());
078                        article.setDate(stt.nextToken());
079                        article.setArticleId(stt.nextToken());
080                        article.addHeaderField("References", stt.nextToken());
081                        articles.add(article);
082                    }
083                    catch (NoSuchElementException nse) {
084                        // ignore this message
085                    }
086                }
087            } else {
088                return null;
089            }
090    
091            return articles;
092        }
093    
094    
095        /**
096         * Convert a {@link Reader} instance to a String
097         * @param reader The Reader instance
098         * @return String
099         */
100        public static String readerToString(Reader reader) {
101            String temp = null;
102            BufferedReader bufReader = new BufferedReader(reader);
103            StringBuilder sb = new StringBuilder();
104            try {
105                temp = bufReader.readLine();
106                while (temp != null) {
107                    sb.append(temp);
108                    sb.append("\n");
109                    temp = bufReader.readLine();
110                }
111            } catch (IOException e) {
112                e.printStackTrace();
113            }
114    
115            return sb.toString();
116        }
117    }