    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    }