View Javadoc
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    *      https://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;
47      private final String from;
48      private final StringBuilder newsgroups;
49      private final StringBuilder headerFields;
50      private int newsgroupCount;
51  
52      /**
53       * Creates a new SimpleNNTPHeader instance initialized with the given from and subject header field values.
54       *
55       * @param from    The value of the {@code From:} header field. This should be the article poster's email address.
56       * @param subject The value of the {@code Subject:} header field. This should be the subject of the article.
57       */
58      public SimpleNNTPHeader(final String from, final String subject) {
59          this.from = from;
60          this.subject = subject;
61          this.newsgroups = new StringBuilder();
62          this.headerFields = new StringBuilder();
63          this.newsgroupCount = 0;
64      }
65  
66      /**
67       * Adds an arbitrary header field with the given value to the article header.
68       * These headers will be written after the {@code From}, Newsgroups, and Subject fields
69       * when the SimpleNNTPHeader is converted to a string. An example use would be:
70       *
71       * <pre>
72       * header.addHeaderField("Organization", "Foobar, Inc.");
73       * </pre>
74       *
75       * @param headerField The header field to add, not including the colon.
76       * @param value       The value of the added header field.
77       */
78      public void addHeaderField(final String headerField, final String value) {
79          headerFields.append(headerField);
80          headerFields.append(": ");
81          headerFields.append(value);
82          headerFields.append('\n');
83      }
84  
85      /**
86       * Adds a newsgroup to the article {@code Newsgroups:} field.
87       *
88       * @param newsgroup The newsgroup to add to the article's newsgroup distribution list.
89       */
90      public void addNewsgroup(final String newsgroup) {
91          if (newsgroupCount++ > 0) {
92              newsgroups.append(',');
93          }
94          newsgroups.append(newsgroup);
95      }
96  
97      /**
98       * Gets the address used in the {@code From:} header field.
99       *
100      * @return The from address.
101      */
102     public String getFromAddress() {
103         return from;
104     }
105 
106     /**
107      * Gets the contents of the {@code Newsgroups:} header field.
108      *
109      * @return The comma-separated list of newsgroups to which the article is being posted.
110      */
111     public String getNewsgroups() {
112         return newsgroups.toString();
113     }
114 
115     /**
116      * Gets the subject used in the {@code Subject:} header field.
117      *
118      * @return The subject.
119      */
120     public String getSubject() {
121         return subject;
122     }
123 
124     /**
125      * 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
126      * article body.
127      *
128      * @return The article header in the form of a String.
129      */
130     @Override
131     public String toString() {
132         final StringBuilder header = new StringBuilder();
133 
134         header.append("From: ");
135         header.append(from);
136         header.append("\nNewsgroups: ");
137         header.append(newsgroups.toString());
138         header.append("\nSubject: ");
139         header.append(subject);
140         header.append('\n');
141         if (headerFields.length() > 0) {
142             header.append(headerFields.toString());
143         }
144         header.append('\n');
145 
146         return header.toString();
147     }
148 }