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 * https://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 018package org.apache.commons.net.nntp; 019 020/** 021 * 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. 022 * When the Java Mail API is finalized, you will be able to use it to compose fully compliant Internet text messages. 023 * <p> 024 * 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. 025 * For example: 026 * </p> 027 * 028 * <pre> 029 * writer = client.postArticle(); 030 * if (writer == null) // failure 031 * return false; 032 * header = new SimpleNNTPHeader("foobar@foo.com", "Just testing"); 033 * header.addNewsgroup("alt.test"); 034 * header.addHeaderField("Organization", "Foobar, Inc."); 035 * writer.write(header.toString()); 036 * writer.write("This is just a test"); 037 * writer.close(); 038 * if (!client.completePendingCommand()) // failure 039 * return false; 040 * </pre> 041 * 042 * @see NNTPClient 043 */ 044 045public class SimpleNNTPHeader { 046 private final String subject; 047 private final String from; 048 private final StringBuilder newsgroups; 049 private final StringBuilder headerFields; 050 private int newsgroupCount; 051 052 /** 053 * Creates a new SimpleNNTPHeader instance initialized with the given from and subject header field values. 054 * 055 * @param from The value of the {@code From:} header field. This should be the article poster's email address. 056 * @param subject The value of the {@code Subject:} header field. This should be the subject of the article. 057 */ 058 public SimpleNNTPHeader(final String from, final String subject) { 059 this.from = from; 060 this.subject = subject; 061 this.newsgroups = new StringBuilder(); 062 this.headerFields = new StringBuilder(); 063 this.newsgroupCount = 0; 064 } 065 066 /** 067 * Adds an arbitrary header field with the given value to the article header. 068 * These headers will be written after the {@code From}, Newsgroups, and Subject fields 069 * when the SimpleNNTPHeader is converted to a string. An example use would be: 070 * 071 * <pre> 072 * header.addHeaderField("Organization", "Foobar, Inc."); 073 * </pre> 074 * 075 * @param headerField The header field to add, not including the colon. 076 * @param value The value of the added header field. 077 */ 078 public void addHeaderField(final String headerField, final String value) { 079 headerFields.append(headerField); 080 headerFields.append(": "); 081 headerFields.append(value); 082 headerFields.append('\n'); 083 } 084 085 /** 086 * Adds a newsgroup to the article {@code Newsgroups:} field. 087 * 088 * @param newsgroup The newsgroup to add to the article's newsgroup distribution list. 089 */ 090 public void addNewsgroup(final String newsgroup) { 091 if (newsgroupCount++ > 0) { 092 newsgroups.append(','); 093 } 094 newsgroups.append(newsgroup); 095 } 096 097 /** 098 * Gets the address used in the {@code From:} header field. 099 * 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}