You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by rw...@apache.org on 2004/09/23 14:14:47 UTC

cvs commit: jakarta-commons/net/src/java/examples/nntp ExtendedNNTPOps.java MessageThreading.java NNTPUtils.java newsgroups.java post.java

rwinston    2004/09/23 05:14:47

  Added:       net/src/java/examples/nntp ExtendedNNTPOps.java
                        MessageThreading.java NNTPUtils.java
                        newsgroups.java post.java
  Log:
  Add a message threading example,  and refactor the NNTP examples into their own package. Also
   added an NNTPUtils class.
  
  Revision  Changes    Path
  1.1                  jakarta-commons/net/src/java/examples/nntp/ExtendedNNTPOps.java
  
  Index: ExtendedNNTPOps.java
  ===================================================================
  /*
   * Copyright 2001-2004 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package examples.nntp;
  
  import java.io.IOException;
  import java.io.PrintWriter;
  
  import org.apache.commons.net.nntp.Article;
  import org.apache.commons.net.nntp.NNTPClient;
  import org.apache.commons.net.nntp.NewsgroupInfo;
  
  import examples.PrintCommandListener;
  
  /**
   * Simple class showing some of the extended commands (AUTH, XOVER, LIST ACTIVE)
   * 
   * @author Rory Winston <rw...@checkfree.com>
   */
  public class ExtendedNNTPOps {
  
  	
  	NNTPClient client;
  
  	public ExtendedNNTPOps() {
  		client = new NNTPClient();
  		client.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
  	}
  
  
  	public void demo(String host, String user, String password) {
  		try {
  			client.connect(host);
  
  			// AUTHINFO USER/AUTHINFO PASS
  			boolean success = client.authenticate(user, password);
  			if (success) {
  				System.out.println("Authentication succeeded");
  			} else {
  				System.out.println("Authentication failed, error =" + client.getReplyString());
  			}
  
  			// XOVER
  			NewsgroupInfo testGroup = new NewsgroupInfo();
  			client.selectNewsgroup("alt.test", testGroup);
  			int lowArticleNumber = testGroup.getFirstArticle();
  			int highArticleNumber = lowArticleNumber + 100;
  			Article[] articles = NNTPUtils.getArticleInfo(client, lowArticleNumber, highArticleNumber);
  
  			for (int i = 0; i < articles.length; ++i) {
  				System.out.println(articles[i].getSubject());
  			}
  
  			// LIST ACTIVE
  			NewsgroupInfo[] fanGroups = client.listNewsgroups("alt.fan.*");
  			for (int i = 0; i < fanGroups.length; ++i) {
  				System.out.println(fanGroups[i].getNewsgroup());
  			}
  
  		} catch (IOException e) {
  			e.printStackTrace();
  		}
  	}
  
  	public static void main(String[] args) {
  		ExtendedNNTPOps ops;
  
  		if (args.length != 3) {
  			System.err.println("usage: ExtendedNNTPOps nntpserver username password");
  			System.exit(1);
  		}
  
  		ops = new ExtendedNNTPOps();
  		ops.demo(args[0], args[1], args[2]);
  	}
  
  }
  
  /* Emacs configuration
   * Local variables:        **
   * mode:             java  **
   * c-basic-offset:   4     **
   * indent-tabs-mode: nil   **
   * End:                    **
   */
  
  
  
  1.1                  jakarta-commons/net/src/java/examples/nntp/MessageThreading.java
  
  Index: MessageThreading.java
  ===================================================================
  package examples.nntp;
  
  import java.io.IOException;
  import java.io.PrintWriter;
  import java.net.SocketException;
  
  import org.apache.commons.net.nntp.Article;
  import org.apache.commons.net.nntp.NNTPClient;
  import org.apache.commons.net.nntp.NewsgroupInfo;
  import org.apache.commons.net.nntp.Threader;
  
  import examples.PrintCommandListener;
  
  public class MessageThreading {
  	public MessageThreading() {
  	}
  	
  	public static void main(String[] args) throws SocketException, IOException {
  		
  		if (args.length != 3)
  			usage();
  		
  		String hostname = args[0];
  		String user = args[1];
  		String password = args[2];
  		
  		NNTPClient client = new NNTPClient();
  		client.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
  		client.connect(hostname);
  		
  		if(!client.authenticate(user, password)) {
  			System.out.println("Authentication failed for user " + user + "!");
  			System.exit(1);
  		}
  		
  		NewsgroupInfo group = new NewsgroupInfo();
  		client.selectNewsgroup("comp.lang.lisp", group);
  		
  		int lowArticleNumber = group.getFirstArticle();
  		int highArticleNumber = lowArticleNumber + 100;
  		
  		System.out.println("Retrieving articles between [" + lowArticleNumber + "] and [" + highArticleNumber + "]");
  		Article[] articles = NNTPUtils.getArticleInfo(client, lowArticleNumber, highArticleNumber);
  		
  		System.out.println("Building message thread tree...");
  		Threader threader = new Threader();
  		Article root = (Article)threader.thread(articles);
  		
  		Article.printThread(root, 0);	
  		
  	}
  	
  	
  	public static void usage() {
  		System.out.println("Usage: MessageThreading <hostname> <user> <password>");
  		System.exit(0);
  	}
  }
  
  
  
  1.1                  jakarta-commons/net/src/java/examples/nntp/NNTPUtils.java
  
  Index: NNTPUtils.java
  ===================================================================
  package examples.nntp;
  
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.Reader;
  import java.util.StringTokenizer;
  
  import org.apache.commons.net.io.DotTerminatedMessageReader;
  import org.apache.commons.net.nntp.Article;
  import org.apache.commons.net.nntp.NNTPClient;
  
  /**
   * 
   * Some convenience methods for NNTP example classes.
   * 
   * @author Rory Winston <rw...@checkfree.com>
   */
  public class NNTPUtils {
  
  	/**
  	 * Given an {@link NNTPClient} instance, and an integer range of messages, return 
  	 * an array of {@link Article} instances.
  	 * @param client 
  	 * @param lowArticleNumber
  	 * @param highArticleNumber
  	 * @return Article[] An array of Article
  	 * @throws IOException
  	 */
  	public  static Article[] getArticleInfo(NNTPClient client, int lowArticleNumber, int highArticleNumber)
  			throws IOException {
  			Reader reader = null;
  			Article[] articles = null;
  			reader =
  				(DotTerminatedMessageReader) client.retrieveArticleInfo(
  					lowArticleNumber,
  					highArticleNumber);
  
  			if (reader != null) {
  				String theInfo = readerToString(reader);
  				StringTokenizer st = new StringTokenizer(theInfo, "\n");
  
  				// Extract the article information
  				// Mandatory format (from NNTP RFC 2980) is :
  				// Subject\tAuthor\tDate\tID\tReference(s)\tByte Count\tLine Count
  
  				int count = st.countTokens();
  				articles = new Article[count];
  				int index = 0;
  
  				while (st.hasMoreTokens()) {
  					StringTokenizer stt = new StringTokenizer(st.nextToken(), "\t");
  					Article article = new Article();
  					article.setArticleNumber(Integer.parseInt(stt.nextToken()));
  					article.setSubject(stt.nextToken());
  					article.setFrom(stt.nextToken());
  					article.setDate(stt.nextToken());
  					article.setArticleId(stt.nextToken());
  					article.addHeaderField("References", stt.nextToken());
  					articles[index++] = article;
  				}
  			} else {
  				return null;
  			}
  
  			return articles;
  		}
  		
  	
  	/**
  	 * Convert a {@link Reader} instance to a String
  	 * @param reader The Reader instance
  	 * @return String
  	 */		
  	public static String readerToString(Reader reader) {
  		String temp = null;
  		StringBuffer sb = null;
  		BufferedReader bufReader = new BufferedReader(reader);
  
  		sb = new StringBuffer();
  		try {
  			temp = bufReader.readLine();
  			while (temp != null) {
  				sb.append(temp);
  				sb.append("\n");
  				temp = bufReader.readLine();
  			}
  		} catch (IOException e) {
  			e.printStackTrace();
  		}
  
  		return sb.toString();
  	}
  }
  
  
  
  1.1                  jakarta-commons/net/src/java/examples/nntp/newsgroups.java
  
  Index: newsgroups.java
  ===================================================================
  /*
   * Copyright 2001-2004 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package examples.nntp;
  
  import java.io.IOException;
  import org.apache.commons.net.nntp.NNTPClient;
  import org.apache.commons.net.nntp.NewsgroupInfo;
  
  /***
   * This is a trivial example using the NNTP package to approximate the
   * Unix newsgroups command.  It merely connects to the specified news
   * server and issues fetches the list of newsgroups stored by the server.
   * On servers that store a lot of newsgroups, this command can take a very
   * long time (listing upwards of 30,000 groups).
   * <p>
   ***/
  
  public final class newsgroups
  {
  
      public final static void main(String[] args)
      {
          NNTPClient client;
          NewsgroupInfo[] list;
  
          if (args.length < 1)
          {
              System.err.println("Usage: newsgroups newsserver");
              System.exit(1);
          }
  
          client = new NNTPClient();
  
          try
          {
              client.connect(args[0]);
  
              list = client.listNewsgroups();
  
              if (list != null)
              {
                  for (int i = 0; i < list.length; i++)
                      System.out.println(list[i].getNewsgroup());
              }
              else
              {
                  System.err.println("LIST command failed.");
                  System.err.println("Server reply: " + client.getReplyString());
              }
          }
          catch (IOException e)
          {
              e.printStackTrace();
          }
          finally
          {
              try
              {
                  if (client.isConnected())
                      client.disconnect();
              }
              catch (IOException e)
              {
                  System.err.println("Error disconnecting from server.");
                  e.printStackTrace();
                  System.exit(1);
              }
          }
  
      }
  
  }
  
  
  
  
  
  1.1                  jakarta-commons/net/src/java/examples/nntp/post.java
  
  Index: post.java
  ===================================================================
  /*
   * Copyright 2001-2004 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package examples.nntp;
  
  import java.io.BufferedReader;
  import java.io.FileNotFoundException;
  import java.io.FileReader;
  import java.io.IOException;
  import java.io.InputStreamReader;
  import java.io.PrintWriter;
  import java.io.Writer;
  import org.apache.commons.net.io.Util;
  import org.apache.commons.net.nntp.NNTPClient;
  import org.apache.commons.net.nntp.NNTPReply;
  import org.apache.commons.net.nntp.SimpleNNTPHeader;
  
  import examples.PrintCommandListener;
  
  /***
   * This is an example program using the NNTP package to post an article
   * to the specified newsgroup(s).  It prompts you for header information and
   * a filename to post.
   * <p>
   ***/
  
  public final class post
  {
  
      public final static void main(String[] args)
      {
          String from, subject, newsgroup, filename, server, organization;
          String references;
          BufferedReader stdin;
          FileReader fileReader = null;
          SimpleNNTPHeader header;
          NNTPClient client;
  
          if (args.length < 1)
          {
              System.err.println("Usage: post newsserver");
              System.exit(1);
          }
  
          server = args[0];
  
          stdin = new BufferedReader(new InputStreamReader(System.in));
  
          try
          {
              System.out.print("From: ");
              System.out.flush();
  
              from = stdin.readLine();
  
              System.out.print("Subject: ");
              System.out.flush();
  
              subject = stdin.readLine();
  
              header = new SimpleNNTPHeader(from, subject);
  
              System.out.print("Newsgroup: ");
              System.out.flush();
  
              newsgroup = stdin.readLine();
              header.addNewsgroup(newsgroup);
  
              while (true)
              {
                  System.out.print("Additional Newsgroup <Hit enter to end>: ");
                  System.out.flush();
  
                  // Of course you don't want to do this because readLine() may be null
                  newsgroup = stdin.readLine().trim();
  
                  if (newsgroup.length() == 0)
                      break;
  
                  header.addNewsgroup(newsgroup);
              }
  
              System.out.print("Organization: ");
              System.out.flush();
  
              organization = stdin.readLine();
  
              System.out.print("References: ");
              System.out.flush();
  
              references = stdin.readLine();
  
              if (organization != null && organization.length() > 0)
                  header.addHeaderField("Organization", organization);
  
              if (references != null && organization.length() > 0)
                  header.addHeaderField("References", references);
  
              header.addHeaderField("X-Newsreader", "NetComponents");
  
              System.out.print("Filename: ");
              System.out.flush();
  
              filename = stdin.readLine();
  
              try
              {
                  fileReader = new FileReader(filename);
              }
              catch (FileNotFoundException e)
              {
                  System.err.println("File not found. " + e.getMessage());
                  System.exit(1);
              }
  
              client = new NNTPClient();
              client.addProtocolCommandListener(new PrintCommandListener(
                                                    new PrintWriter(System.out)));
  
              client.connect(server);
  
              if (!NNTPReply.isPositiveCompletion(client.getReplyCode()))
              {
                  client.disconnect();
                  System.err.println("NNTP server refused connection.");
                  System.exit(1);
              }
  
              if (client.isAllowedToPost())
              {
                  Writer writer = client.postArticle();
  
                  if (writer != null)
                  {
                      writer.write(header.toString());
                      Util.copyReader(fileReader, writer);
                      writer.close();
                      client.completePendingCommand();
                  }
              }
  
              fileReader.close();
  
              client.logout();
  
              client.disconnect();
          }
          catch (IOException e)
          {
              e.printStackTrace();
              System.exit(1);
          }
      }
  }
  
  
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org