001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019 020 package org.apache.geronimo.javamail.transport.nntp; 021 022 import java.io.BufferedReader; 023 import java.io.IOException; 024 import java.util.ArrayList; 025 import java.util.List; 026 027 import javax.mail.MessagingException; 028 029 /** 030 * Util class to represent a reply from a NNTP server 031 * 032 * @version $Rev: 673152 $ $Date: 2008-07-01 13:37:38 -0400 (Tue, 01 Jul 2008) $ 033 */ 034 public class NNTPReply { 035 // general server responses 036 public static final int CAPABILITY_LIST = 101; 037 038 public static final int POSTING_ALLOWED = 200; 039 040 public static final int NO_POSTING_ALLOWED = 201; 041 042 public static final int EXTENSIONS_SUPPORTED = 202; 043 044 public static final int SERVICE_DISCONTINUED = 400; 045 046 public static final int COMMAND_NOT_RECOGNIZED = 500; 047 048 public static final int COMMAND_SYNTAX_ERROR = 501; 049 050 public static final int PERMISSION_DENIED = 502; 051 052 public static final int PROGRAM_FAULT = 503; 053 054 // article responses 055 public static final int ARTICLE_FOLLOWS = 220; 056 057 public static final int HEAD_FOLLOWS = 221; 058 059 public static final int BODY_FOLLOWS = 222; 060 061 public static final int REQUEST_TEXT_SEPARATELY = 223; 062 063 public static final int OVERVIEW_FOLLOWS = 224; 064 065 public static final int NEW_ARTICLES_FOLLOWS = 230; 066 067 public static final int NEW_GROUPS_FOLLOWS = 231; 068 069 public static final int ARTICLE_TRANSFERRED = 235; 070 071 public static final int NO_NEWSGROUP_SELECTED = 412; 072 073 public static final int NO_ARTICLE_SELECTED = 420; 074 075 public static final int NO_ARTICLE_NUMBER = 423; 076 077 public static final int NO_ARTICLE_FOUND = 430; 078 079 // group responses 080 public static final int GROUP_SELECTED = 211; 081 082 public static final int NO_SUCH_NEWSGROUP = 411; 083 084 // post responses 085 public static final int POSTED_OK = 240; 086 087 public static final int SEND_ARTICLE = 340; 088 089 public static final int POSTING_NOT_ALLOWED = 440; 090 091 public static final int POSTING_FAILED = 441; 092 093 // quit responses 094 public static final int CLOSING_CONNECTION = 205; 095 096 // authentication responses 097 public static final int AUTHINFO_ACCEPTED = 250; 098 099 public static final int AUTHINFO_ACCEPTED_FINAL = 251; 100 101 public static final int AUTHINFO_CONTINUE = 350; 102 103 public static final int AUTHINFO_CHALLENGE = 350; 104 105 public static final int AUTHINFO_SIMPLE_REJECTED = 402; 106 107 public static final int AUTHENTICATION_ACCEPTED = 281; 108 109 public static final int MORE_AUTHENTICATION_REQUIRED = 381; 110 111 public static final int AUTHINFO_REQUIRED = 480; 112 113 public static final int AUTHINFO_SIMPLE_REQUIRED = 450; 114 115 public static final int AUTHENTICATION_REJECTED = 482; 116 117 // list active reponses 118 public static final int LIST_FOLLOWS = 215; 119 120 // The original reply string 121 private final String reply; 122 123 // returned message code 124 private final int code; 125 126 // the returned message text 127 private final String message; 128 129 // data associated with a long response command. 130 private ArrayList data; 131 132 NNTPReply(String s) throws MessagingException { 133 // save the reply 134 reply = s; 135 136 // In a normal response, the first 3 must be the return code. However, 137 // the response back from a QUIT command is frequently a null string. 138 // Therefore, if the result is 139 // too short, just default the code to -1 and use the entire text for 140 // the message. 141 if (s == null || s.length() < 3) { 142 code = -1; 143 message = s; 144 return; 145 } 146 147 try { 148 code = Integer.parseInt(s.substring(0, 3)); 149 150 // message should be separated by a space OR a continuation 151 // character if this is a 152 // multi-line response. 153 if (s.length() > 4) { 154 message = s.substring(4); 155 } else { 156 message = ""; 157 } 158 } catch (NumberFormatException e) { 159 throw new MessagingException("error in parsing reply code", e); 160 } 161 } 162 163 /** 164 * Retrieve data associated with a multi-line reponse from a server stream. 165 * 166 * @param in 167 * The reader that's the source of the additional lines. 168 * 169 * @exception IOException 170 */ 171 public void retrieveData(BufferedReader in) throws MessagingException { 172 try { 173 data = new ArrayList(); 174 175 String line = in.readLine(); 176 // read until the end of file or until we see the end of data 177 // marker. 178 while (line != null && !line.equals(".")) { 179 // this line is not the terminator, but it may have been byte 180 // stuffed. If it starts with 181 // '.', throw away the leading one. 182 if (line.startsWith(".")) { 183 line = line.substring(1); 184 } 185 186 // just add the line to the list 187 data.add(line); 188 line = in.readLine(); 189 } 190 } catch (IOException e) { 191 throw new MessagingException("Error reading message reply", e); 192 } 193 } 194 195 /** 196 * Retrieve the long-command data from this response. 197 * 198 * @return The data list. Returns null if there is no associated data. 199 */ 200 public List getData() { 201 return data; 202 } 203 204 /** 205 * Return the code value associated with the reply. 206 * 207 * @return The integer code associated with the reply. 208 */ 209 public int getCode() { 210 return this.code; 211 } 212 213 /** 214 * Get the message text associated with the reply. 215 * 216 * @return The string value of the message from the reply. 217 */ 218 public String getMessage() { 219 return this.message; 220 } 221 222 /** 223 * Retrieve the raw reply string for the reponse. 224 * 225 * @return The original reply string from the server. 226 */ 227 public String getReply() { 228 return reply; 229 } 230 231 /** 232 * Indicates if reply is an error condition 233 */ 234 boolean isError() { 235 // error codes are all above 400 236 return code >= 400; 237 } 238 239 public String toString() { 240 return "CODE = " + getCode() + " : MSG = " + getMessage(); 241 } 242 }