001    /*
002     * Copyright 2010 the original author or authors.
003     * 
004     *  Licensed under the Apache License, Version 2.0 (the "License");
005     *  you may not use this file except in compliance with the License.
006     *  You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     *  Unless required by applicable law or agreed to in writing, software
011     *  distributed under the License is distributed on an "AS IS" BASIS,
012     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     *  See the License for the specific language governing permissions and
014     *  limitations under the License.
015     */
016    package com.hs.mail.smtp.server;
017    
018    import java.io.IOException;
019    import java.io.PrintStream;
020    import java.net.Socket;
021    import java.util.StringTokenizer;
022    
023    import com.hs.mail.container.config.Config;
024    import com.hs.mail.container.server.ConnectionHandler;
025    import com.hs.mail.container.server.socket.TcpSocketChannel;
026    import com.hs.mail.container.server.socket.TcpTransport;
027    import com.hs.mail.exception.LookupException;
028    import com.hs.mail.smtp.SmtpSession;
029    import com.hs.mail.smtp.processor.SmtpProcessor;
030    import com.hs.mail.smtp.processor.SmtpProcessorFactory;
031    
032    /**
033     * 
034     * @author Won Chul Doh
035     * @since May 3, 2010
036     * 
037     */
038    public class SmtpConnectionHandler implements ConnectionHandler {
039            
040            private boolean debug = false;
041    
042            private PrintStream out;        // debug output stream
043    
044            public void setDebug(boolean debug) {
045                    this.debug = debug;
046            }
047            
048            public synchronized void setDebugOut(PrintStream out) {
049                    this.out = out;
050            }
051    
052            public void handleConnection(Socket soc) throws IOException {
053                    TcpTransport trans = new TcpTransport();
054                    trans.setChannel(new TcpSocketChannel(soc));
055                    SmtpSession session = new SmtpSession(trans);
056                    session.setDebug(debug);
057                    if (debug && out != null) {
058                            session.setDebugOut(out);
059                    }
060    
061                    String greetings = new StringBuilder()
062                                    .append("220 ")
063                                    .append(Config.getHelloName())
064                                    .append(" Service ready")
065                                    .toString();
066                    session.writeResponse(greetings);
067    
068                    while (!trans.isSessionEnded()) {
069                            String line = trans.readLine();
070                            if (line != null) {
071                                    if (debug)
072                                            session.getDebugOut().println(line);
073                                    StringTokenizer st = new StringTokenizer(line);
074                                    if (!st.hasMoreTokens()) {
075                                            break;
076                                    }
077                                    String command = st.nextToken().trim();
078                                    try {
079                                            SmtpProcessor processor = SmtpProcessorFactory
080                                                            .createSmtpProcessor(command);
081                                            processor.process(session, trans, st);
082                                    } catch (LookupException e) {
083                                            session.writeResponse("500 5.5.1 Unknown command \"" + command
084                                                            + "\"");
085                                    }
086                            }
087                    }
088            }
089            
090    }