pgoldstein 2002/08/08 23:44:31
Modified: src/java/org/apache/james/nntpserver NNTPHandler.java
Log:
String=>StringBuffer changes.
Revision Changes Path
1.14 +166 -74
jakarta-james/src/java/org/apache/james/nntpserver/NNTPHandler.java
Index: NNTPHandler.java
===================================================================
RCS file:
/home/cvs/jakarta-james/src/java/org/apache/james/nntpserver/NNTPHandler.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- NNTPHandler.java 28 Jul 2002 11:46:41 -0000 1.13
+++ NNTPHandler.java 9 Aug 2002 06:44:31 -0000 1.14
@@ -36,7 +36,7 @@
/**
* The NNTP protocol is defined by RFC 977.
- * This implementation is based on IETF draft 15, posted on 15th July '2002
+ * This implementation is based on IETF draft 15, posted on 15th July '2002.
* URL: http://www.ietf.org/internet-drafts/draft-ietf-nntpext-base-15.txt
*
* Common NNTP extensions are in RFC 2980.
@@ -68,7 +68,7 @@
public void compose( final ComponentManager componentManager )
throws ComponentException
{
- //System.out.println(getClass().getName()+": compose - "+authRequired);
+ //System.out.println(getClass().getName()+ ": compose - " + authRequired);
auth = (AuthService)componentManager.
lookup( "org.apache.james.nntpserver.AuthService" );
scheduler = (TimeScheduler)componentManager.
@@ -85,7 +85,7 @@
public String readLine() throws IOException {
String s = super.readLine();
if ( DEBUG_PROTOCOL )
- logger.debug("C: "+s);
+ logger.debug("C: " + s);
return s;
}
};
@@ -98,7 +98,7 @@
public void println(String s) {
super.println(s);
if ( DEBUG_PROTOCOL )
- logger.debug("S: "+s);
+ logger.debug("S: " + s);
}
};
logger.info( "Connection from " + socket.getInetAddress());
@@ -111,17 +111,27 @@
scheduler.addTrigger( this.toString(), trigger, this );
// section 7.1
- if ( repo.isReadOnly() )
- writer.println("201 "+helloName+" NNTP Service Ready, posting
prohibited");
- else
- writer.println("200 "+helloName+" NNTP Service Ready, posting
permitted");
+ if ( repo.isReadOnly() ) {
+ StringBuffer respBuffer =
+ new StringBuffer(128)
+ .append("201 ")
+ .append(helloName)
+ .append(" NNTP Service Ready, posting prohibited");
+ writer.println(respBuffer.toString());
+ }
+ else {
+ StringBuffer respBuffer =
+ new StringBuffer(128)
+ .append("200 ")
+ .append(helloName)
+ .append(" NNTP Service Ready, posting permitted");
+ writer.println(respBuffer.toString());
+ }
- while (parseCommand(reader.readLine()))
+ while (parseCommand(reader.readLine())) {
scheduler.resetTrigger(this.toString());
+ }
- reader.close();
- writer.close();
- socket.close();
scheduler.removeTrigger(this.toString());
logger.info("Connection closed");
} catch (Exception e) {
@@ -129,7 +139,26 @@
//writer.println("502 Error closing connection.");
//writer.flush();
logger.error( "Exception during connection:" + e.getMessage(), e );
- try { socket.close(); } catch (IOException ioe) { }
+ } finally {
+ try {
+ if (reader != null) {
+ reader.close();
+ }
+ } catch (IOException ioe) {
+ logger.warn("NNTPHandler: Unexpected exception occurred while
closing reader: " + ioe);
+ }
+
+ if (writer != null) {
+ writer.close();
+ }
+
+ try {
+ if (socket != null) {
+ socket.close();
+ }
+ } catch (IOException ioe) {
+ logger.warn("NNTPHandler: Unexpected exception occurred while
closing socket: " + ioe);
+ }
}
}
@@ -142,86 +171,88 @@
}
private boolean parseCommand(String commandRaw) {
- if (commandRaw == null)
+ if (commandRaw == null) {
return false;
- getLogger().info("Command received: " + commandRaw);
- //System.out.println("NNTPHandler> "+commandRaw);
+ }
+ if (getLogger().isInfoEnabled()) {
+ getLogger().info("Command received: " + commandRaw);
+ }
StringTokenizer tokens = new StringTokenizer(commandRaw);
if (!tokens.hasMoreTokens())
return false;
- final String command = tokens.nextToken();
+ final String command = tokens.nextToken().toUpperCase(Locale.US);
if (!auth.isAuthorized(command) ) {
writer.println("502 User is not authenticated");
getLogger().debug("Command not allowed.");
return true;
}
- if ( command.equalsIgnoreCase("MODE") && tokens.hasMoreTokens() &&
- tokens.nextToken().equalsIgnoreCase("READER") )
+ if ( command.equals("MODE") && tokens.hasMoreTokens() &&
+ tokens.nextToken().toUpperCase(Locale.US).equals("READER") )
doMODEREADER();
- else if ( command.equalsIgnoreCase("LIST") && tokens.hasMoreTokens() &&
- tokens.nextToken().equalsIgnoreCase("EXTENSIONS") )
+ else if ( command.equals("LIST") && tokens.hasMoreTokens() &&
+ tokens.nextToken().toUpperCase(Locale.US).equals("EXTENSIONS") )
doLISTEXTENSIONS();
- else if ( command.equalsIgnoreCase("LIST") && tokens.hasMoreTokens() &&
- tokens.nextToken().equalsIgnoreCase("OVERVIEW.FMT") )
+ else if ( command.equals("LIST") && tokens.hasMoreTokens() &&
+ tokens.nextToken().toUpperCase(Locale.US).equals("OVERVIEW.FMT") )
doLISTOVERVIEWFMT();
- else if ( command.equalsIgnoreCase("GROUP") )
+ else if ( command.equals("GROUP") )
doGROUP(tokens.hasMoreTokens()?tokens.nextToken():null);
- else if ( command.equalsIgnoreCase("LAST") )
+ else if ( command.equals("LAST") )
doLAST();
- else if ( command.equalsIgnoreCase("ARTICLE") )
+ else if ( command.equals("ARTICLE") )
doARTICLE(tokens.hasMoreTokens()?tokens.nextToken():null);
- else if ( command.equalsIgnoreCase("HEAD") )
+ else if ( command.equals("HEAD") )
doHEAD(tokens.hasMoreTokens()?tokens.nextToken():null);
- else if ( command.equalsIgnoreCase("BODY") )
+ else if ( command.equals("BODY") )
doBODY(tokens.hasMoreTokens()?tokens.nextToken():null);
- else if ( command.equalsIgnoreCase("STAT") )
+ else if ( command.equals("STAT") )
doSTAT(tokens.hasMoreTokens()?tokens.nextToken():null);
- else if ( command.equalsIgnoreCase("POST") )
+ else if ( command.equals("POST") )
doPOST();
- else if ( command.equalsIgnoreCase("IHAVE") )
+ else if ( command.equals("IHAVE") )
doIHAVE(tokens.hasMoreTokens()?tokens.nextToken():null);
- else if ( command.equalsIgnoreCase("LIST") )
+ else if ( command.equals("LIST") )
doLIST(tokens);
- else if ( command.equalsIgnoreCase("QUIT") )
+ else if ( command.equals("QUIT") )
doQUIT();
- else if ( command.equalsIgnoreCase("DATE") )
+ else if ( command.equals("DATE") )
doDATE();
- else if ( command.equalsIgnoreCase("HELP") )
+ else if ( command.equals("HELP") )
doHELP();
- else if ( command.equalsIgnoreCase("NEWGROUPS") )
+ else if ( command.equals("NEWGROUPS") )
doNEWGROUPS(tokens);
- else if ( command.equalsIgnoreCase("NEWNEWS") )
+ else if ( command.equals("NEWNEWS") )
doNEWNEWS(tokens);
- else if ( command.equalsIgnoreCase("LISTGROUP") )
+ else if ( command.equals("LISTGROUP") )
doLISTGROUP(tokens.hasMoreTokens()?tokens.nextToken():null);
- else if ( command.equalsIgnoreCase("OVER") )
+ else if ( command.equals("OVER") )
doOVER(tokens.hasMoreTokens()?tokens.nextToken():null);
- else if ( command.equalsIgnoreCase("XOVER") )
+ else if ( command.equals("XOVER") )
doXOVER(tokens.hasMoreTokens()?tokens.nextToken():null);
- else if ( command.equalsIgnoreCase("PAT") )
+ else if ( command.equals("PAT") )
doPAT();
- else if ( command.equalsIgnoreCase("HDR") )
+ else if ( command.equals("HDR") )
doHDR(tokens);
- else if ( command.equalsIgnoreCase("XHDR") )
+ else if ( command.equals("XHDR") )
doXHDR(tokens);
- else if ( command.equalsIgnoreCase("AUTHINFO") )
+ else if ( command.equals("AUTHINFO") )
doAUTHINFO(tokens);
else
writer.println("501 Syntax error");
- return (command.equalsIgnoreCase("QUIT") == false);
+ return (command.equals("QUIT") == false);
}
// implements only the originnal AUTHINFO
// for simple and generic AUTHINFO, 501 is sent back. This is as
// per article 3.1.3 of RFC 2980
private void doAUTHINFO(StringTokenizer tok) {
- String command = tok.nextToken();
- if ( command.equalsIgnoreCase("USER") ) {
+ String command = tok.nextToken().toUpperCase(Locale.US);
+ if ( command.equals("USER") ) {
auth.setUser(tok.nextToken());
writer.println("381 More authentication information required");
- } else if ( command.equalsIgnoreCase("PASS") ) {
+ } else if ( command.equals("PASS") ) {
auth.setPassword(tok.nextToken());
if ( auth.isAuthenticated() )
writer.println("281 Authentication accepted");
@@ -234,8 +265,14 @@
// see section 11.4
writer.println("230 list of new articles by message-id follows");
Iterator iter = repo.getArticlesSince(getDateFrom(tok));
- while ( iter.hasNext() )
- writer.println("<"+((NNTPArticle)iter.next()).getUniqueID()+">");
+ while ( iter.hasNext() ) {
+ StringBuffer iterBuffer =
+ new StringBuffer(64)
+ .append("<")
+ .append(((NNTPArticle)iter.next()).getUniqueID())
+ .append(">");
+ writer.println(iterBuffer.toString());
+ }
writer.println(".");
}
private void doNEWGROUPS(StringTokenizer tok) {
@@ -251,10 +288,16 @@
Iterator iter = repo.getGroupsSince(getDateFrom(tok));
while ( iter.hasNext() ) {
NNTPGroup group = (NNTPGroup)iter.next();
- writer.println(group.getName()+" "+
- group.getLastArticleNumber()+" "+
- group.getFirstArticleNumber()+" " +
- (group.isPostAllowed()?"y":"n"));
+ StringBuffer iterBuffer =
+ new StringBuffer(128)
+ .append(group.getName())
+ .append(" ")
+ .append(group.getLastArticleNumber())
+ .append(" ")
+ .append(group.getFirstArticleNumber())
+ .append(" ")
+ .append((group.isPostAllowed()?"y":"n"));
+ writer.println(iterBuffer.toString());
}
writer.println(".");
}
@@ -268,15 +311,25 @@
boolean utc = ( tok.hasMoreTokens() );
Date d = new Date();
try {
- StringBuffer dateStringBuffer = new StringBuffer(date);
- dateStringBuffer.append(" ");
- dateStringBuffer.append(time);
+ StringBuffer dateStringBuffer =
+ new StringBuffer(64)
+ .append(date)
+ .append(" ")
+ .append(time);
Date dt = DF_RFC977.parse(dateStringBuffer.toString());
if ( utc )
dt = new Date(dt.getTime()+UTC_OFFSET);
return dt;
} catch ( ParseException pe ) {
- throw new NNTPException("date extraction failed:
"+date+","+time+","+utc);
+ StringBuffer exceptionBuffer =
+ new StringBuffer(128)
+ .append("date extraction failed: ")
+ .append(date)
+ .append(",")
+ .append(time)
+ .append(",")
+ .append(utc);
+ throw new NNTPException(exceptionBuffer.toString());
}
}
@@ -290,6 +343,7 @@
// Date format for the DATE keyword - see 11.1.1
public static final SimplifiedDateFormat DF_RFC2980 = new RFC2980DateFormat();
+
public static final long UTC_OFFSET =
Calendar.getInstance().get(Calendar.ZONE_OFFSET);
private void doDATE() {
//Calendar c = Calendar.getInstance();
@@ -306,19 +360,19 @@
String wildmat = "*";
LISTGroup output = LISTGroup.Factory.ACTIVE(writer);
if ( tok.hasMoreTokens() ) {
- String param = tok.nextToken();
+ String param = tok.nextToken().toUpperCase(Locale.US);
// list of variations not supported - 9.4.2.1, 9.4.3.1, 9.4.4.1
String[] notSupported = { "ACTIVE.TIMES", "DISTRIBUTIONS",
"DISTRIB.PATS" };
for ( int i = 0 ; i < notSupported.length ; i++ ) {
- if ( param.equalsIgnoreCase("ACTIVE.TIMES") ) {
+ if ( param.equals("ACTIVE.TIMES") ) {
writer.println("503 program error, function not performed");
return;
}
}
- if ( param.equalsIgnoreCase("NEWSGROUPS") )
+ if ( param.equals("NEWSGROUPS") )
output = LISTGroup.Factory.NEWSGROUPS(writer);
else
- check(param,param.equalsIgnoreCase("ACTIVE"));
+ check(param,param.equals("ACTIVE"));
if ( tok.hasMoreTokens() )
wildmat = tok.nextToken();
}
@@ -372,8 +426,14 @@
article = repo.getArticleFromID(param);
if ( article == null )
writer.println("430 no such article");
- else
- writer.println("220 0 "+param+" article retrieved and follows");
+ else {
+ StringBuffer respBuffer =
+ new StringBuffer(64)
+ .append("220 0 ")
+ .append(param)
+ .append(" article retrieved and follows");
+ writer.println(respBuffer.toString());
+ }
}
else {
if ( group == null )
@@ -389,9 +449,16 @@
article = group.getArticle(Integer.parseInt(param));
if ( article == null )
writer.println("423 no such article number in this group");
- else
- writer.println("220 "+article.getArticleNumber()+" "+
- article.getUniqueID()+" article retrieved and
follows");
+ else {
+ StringBuffer respBuffer =
+ new StringBuffer(128)
+ .append("220 ")
+ .append(article.getArticleNumber())
+ .append(" ")
+ .append(article.getUniqueID())
+ .append(" article retrieved and follows");
+ writer.println(respBuffer.toString());
+ }
}
}
if ( article != null )
@@ -408,7 +475,13 @@
else {
NNTPArticle article = group.getCurrentArticle();
group.setCurrentArticleNumber(group.getCurrentArticleNumber()+1);
- writer.println("223 "+article.getArticleNumber()+"
"+article.getUniqueID());
+ StringBuffer respBuffer =
+ new StringBuffer(64)
+ .append("223 ")
+ .append(article.getArticleNumber())
+ .append(" ")
+ .append(article.getUniqueID());
+ writer.println(respBuffer.toString());
}
}
private void doLAST() {
@@ -422,7 +495,13 @@
else {
NNTPArticle article = group.getCurrentArticle();
group.setCurrentArticleNumber(group.getCurrentArticleNumber()-1);
- writer.println("223 "+article.getArticleNumber()+"
"+article.getUniqueID());
+ StringBuffer respBuffer =
+ new StringBuffer(64)
+ .append("223 ")
+ .append(article.getArticleNumber())
+ .append(" ")
+ .append(article.getUniqueID());
+ writer.println(respBuffer.toString());
}
}
private void doGROUP(String groupName) {
@@ -439,10 +518,18 @@
int articleCount = group.getNumberOfArticles();
int lowWaterMark = group.getFirstArticleNumber();
int highWaterMark = group.getLastArticleNumber();
- writer.println("211 "+articleCount+" "+
- lowWaterMark+" "+
- highWaterMark+" "+
- group.getName()+" group selected");
+ StringBuffer respBuffer =
+ new StringBuffer(128)
+ .append("211 ")
+ .append(articleCount)
+ .append(" ")
+ .append(lowWaterMark)
+ .append(" ")
+ .append(highWaterMark)
+ .append(" ")
+ .append(group.getName())
+ .append(" group selected");
+ writer.println(respBuffer.toString());
}
}
private void doLISTEXTENSIONS() {
@@ -515,7 +602,12 @@
String val = article[i].getHeader(hdr);
if ( val == null )
val = "";
- writer.println(article[i].getArticleNumber()+" "+val);
+ StringBuffer hdrBuffer =
+ new StringBuffer(128)
+ .append(article[i].getArticleNumber())
+ .append(" ")
+ .append(val);
+ writer.println(hdrBuffer.toString());
}
writer.println(".");
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>