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 18 package org.apache.commons.net.nntp; 19 20 /** 21 * This class is used to construct the bare minimum acceptable header for most newsreaders. To construct more complicated headers you should refer to RFC 822. 22 * When the Java Mail API is finalized, you will be able to use it to compose fully compliant Internet text messages. 23 * <p> 24 * The main purpose of the class is to faciliatate the article posting process, by relieving the programmer from having to explicitly format an article header. 25 * For example: 26 * </p> 27 * 28 * <pre> 29 * writer = client.postArticle(); 30 * if (writer == null) // failure 31 * return false; 32 * header = new SimpleNNTPHeader("foobar@foo.com", "Just testing"); 33 * header.addNewsgroup("alt.test"); 34 * header.addHeaderField("Organization", "Foobar, Inc."); 35 * writer.write(header.toString()); 36 * writer.write("This is just a test"); 37 * writer.close(); 38 * if (!client.completePendingCommand()) // failure 39 * return false; 40 * </pre> 41 * 42 * @see NNTPClient 43 */ 44 45 public class SimpleNNTPHeader { 46 private final String subject, from; 47 private final StringBuilder newsgroups; 48 private final StringBuilder headerFields; 49 private int newsgroupCount; 50 51 /** 52 * Creates a new SimpleNNTPHeader instance initialized with the given from and subject header field values. 53 * 54 * @param from The value of the <code>From:</code> header field. This should be the article poster's email address. 55 * @param subject The value of the <code>Subject:</code> header field. This should be the subject of the article. 56 */ 57 public SimpleNNTPHeader(final String from, final String subject) { 58 this.from = from; 59 this.subject = subject; 60 this.newsgroups = new StringBuilder(); 61 this.headerFields = new StringBuilder(); 62 this.newsgroupCount = 0; 63 } 64 65 /** 66 * Adds an arbitrary header field with the given value to the article header. 67 * These headers will be written after the {@code From}, Newsgroups, and Subject fields 68 * when the SimpleNNTPHeader is converted to a string. An example use would be: 69 * 70 * <pre> 71 * header.addHeaderField("Organization", "Foobar, Inc."); 72 * </pre> 73 * 74 * @param headerField The header field to add, not including the colon. 75 * @param value The value of the added header field. 76 */ 77 public void addHeaderField(final String headerField, final String value) { 78 headerFields.append(headerField); 79 headerFields.append(": "); 80 headerFields.append(value); 81 headerFields.append('\n'); 82 } 83 84 /** 85 * Adds a newsgroup to the article <code>Newsgroups:</code> field. 86 * 87 * @param newsgroup The newsgroup to add to the article's newsgroup distribution list. 88 */ 89 public void addNewsgroup(final String newsgroup) { 90 if (newsgroupCount++ > 0) { 91 newsgroups.append(','); 92 } 93 newsgroups.append(newsgroup); 94 } 95 96 /** 97 * Returns the address used in the <code>From:</code> header field. 98 * 99 * @return The from address. 100 */ 101 public String getFromAddress() { 102 return from; 103 } 104 105 /** 106 * Returns the contents of the <code>Newsgroups:</code> header field. 107 * 108 * @return The comma-separated list of newsgroups to which the article is being posted. 109 */ 110 public String getNewsgroups() { 111 return newsgroups.toString(); 112 } 113 114 /** 115 * Returns the subject used in the <code>Subject:</code> header field. 116 * 117 * @return The subject. 118 */ 119 public String getSubject() { 120 return subject; 121 } 122 123 /** 124 * Converts the SimpleNNTPHeader to a properly formatted header in the form of a String, including the blank line used to separate the header from the 125 * article body. 126 * 127 * @return The article header in the form of a String. 128 */ 129 @Override 130 public String toString() { 131 final StringBuilder header = new StringBuilder(); 132 133 header.append("From: "); 134 header.append(from); 135 header.append("\nNewsgroups: "); 136 header.append(newsgroups.toString()); 137 header.append("\nSubject: "); 138 header.append(subject); 139 header.append('\n'); 140 if (headerFields.length() > 0) { 141 header.append(headerFields.toString()); 142 } 143 header.append('\n'); 144 145 return header.toString(); 146 } 147 }