Author: sebb
Date: Sat Mar 12 01:55:20 2011
New Revision: 1080842

URL: http://svn.apache.org/viewvc?rev=1080842&view=rev
Log:
Better handling of unparseable articles

Modified:
    
commons/proper/net/trunk/src/main/java/org/apache/commons/net/nntp/Article.java
    
commons/proper/net/trunk/src/main/java/org/apache/commons/net/nntp/ArticleIterator.java
    
commons/proper/net/trunk/src/main/java/org/apache/commons/net/nntp/NNTPClient.java

Modified: 
commons/proper/net/trunk/src/main/java/org/apache/commons/net/nntp/Article.java
URL: 
http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/org/apache/commons/net/nntp/Article.java?rev=1080842&r1=1080841&r2=1080842&view=diff
==============================================================================
--- 
commons/proper/net/trunk/src/main/java/org/apache/commons/net/nntp/Article.java 
(original)
+++ 
commons/proper/net/trunk/src/main/java/org/apache/commons/net/nntp/Article.java 
Sat Mar 12 01:55:20 2011
@@ -39,6 +39,7 @@ public class Article implements Threadab
 
     public Article() {
         header = new StringBuffer();
+        articleNumber = -1; // isDummy
     }
 
     /**
@@ -200,7 +201,7 @@ public class Article implements Threadab
 
     
     public boolean isDummy() {
-        return (getSubject() == null);
+        return (articleNumber == -1);
     }
 
     public String messageThreadId() {

Modified: 
commons/proper/net/trunk/src/main/java/org/apache/commons/net/nntp/ArticleIterator.java
URL: 
http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/org/apache/commons/net/nntp/ArticleIterator.java?rev=1080842&r1=1080841&r2=1080842&view=diff
==============================================================================
--- 
commons/proper/net/trunk/src/main/java/org/apache/commons/net/nntp/ArticleIterator.java
 (original)
+++ 
commons/proper/net/trunk/src/main/java/org/apache/commons/net/nntp/ArticleIterator.java
 Sat Mar 12 01:55:20 2011
@@ -36,6 +36,11 @@ class ArticleIterator implements Iterato
         return stringIterator.hasNext();
     }
 
+    /**
+     * Get the next Article
+     * @return the next {@link Article}, never {@code null}, if unparseable 
then isDummy() 
+     * will be true, and the subject will contain the raw info.
+     */
     public Article next() {
         String line = stringIterator.next();
         return NNTPClient.__parseArticleEntry(line);

Modified: 
commons/proper/net/trunk/src/main/java/org/apache/commons/net/nntp/NNTPClient.java
URL: 
http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/org/apache/commons/net/nntp/NNTPClient.java?rev=1080842&r1=1080841&r2=1080842&view=diff
==============================================================================
--- 
commons/proper/net/trunk/src/main/java/org/apache/commons/net/nntp/NNTPClient.java
 (original)
+++ 
commons/proper/net/trunk/src/main/java/org/apache/commons/net/nntp/NNTPClient.java
 Sat Mar 12 01:55:20 2011
@@ -209,9 +209,11 @@ public class NNTPClient extends NNTP
     }
 
     /**
-     * Parse a response line from {@link #retrieveArticleInfo(long, long)}
+     * Parse a response line from {@link #retrieveArticleInfo(long, long)}.
+     *
      * @param line a response line 
-     * @return the parsed {@link Article} or {@code null} if it cannot be 
parsed
+     * @return the parsed {@link Article}, if unparseable then isDummy() 
+     * will be true, and the subject will contain the raw info.
      * @since 3.0
      */
     static Article __parseArticleEntry(String line) {
@@ -219,20 +221,23 @@ public class NNTPClient extends NNTP
         // Mandatory format (from NNTP RFC 2980) is :
         // articleNumber\tSubject\tAuthor\tDate\tID\tReference(s)\tByte 
Count\tLine Count
 
+        Article article = new Article();
+        article.setSubject(line); // in case parsing fails
         String parts[] = line.split("\t");
         if (parts.length > 6) {
             int i = 0;
-            Article article = new Article();
-            article.setArticleNumber(Integer.parseInt(parts[i++]));
-            article.setSubject(parts[i++]);
-            article.setFrom(parts[i++]);
-            article.setDate(parts[i++]);
-            article.setArticleId(parts[i++]);
-            article.addReference(parts[i++]);
-            return article;
-        } else {
-            return null;
+            try {
+                article.setArticleNumber(Integer.parseInt(parts[i++]));
+                article.setSubject(parts[i++]);
+                article.setFrom(parts[i++]);
+                article.setDate(parts[i++]);
+                article.setArticleId(parts[i++]);
+                article.addReference(parts[i++]);
+            } catch (NumberFormatException e) {
+                // ignored, already handled
+            }
         }
+        return article;
     }
 
     private NewsgroupInfo[] __readNewsgroupListing() throws IOException


Reply via email to