org.apache.axis2.transport.mail.server.POP3Worker.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.axis2.transport.mail.server.POP3Worker.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.axis2.transport.mail.server;

import org.apache.axis2.transport.mail.Constants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class POP3Worker extends Thread {
    private static final Log log = LogFactory.getLog(POP3Worker.class);
    boolean doneProcess = false;
    int numDeleted = 0; // This is a small hack to get the deleting working with the ArrayList. To keep it simple.
    ArrayList messages = new ArrayList();
    private Socket socket;
    private Storage st;

    public POP3Worker(Socket socket, Storage st) {
        this.socket = socket;
        this.st = st;
    }

    private void processInput(String input, PrintWriter printWriter) {
        byte[] CR_LF_DOT_CR_LF = new byte[] { 0x0D, 0x0A, '.', 0x0D, 0x0A };
        String user = "";

        if (input == null) {
            this.doneProcess = true; // This should not be happening
        } else {
            ArrayList tokens = new ArrayList();
            StringTokenizer stk = new StringTokenizer(input);

            while (stk.hasMoreTokens()) {
                tokens.add(stk.nextToken());
            }

            if (tokens.get(0).equals(Constants.USER)) {
                user = (String) tokens.get(1);
                messages = st.popUserMails(user);
                printWriter.println(Constants.OK);
            } else if (tokens.get(0).equals(Constants.PASS)) {
                printWriter.println(Constants.OK); // Passwords are not checked.
            } else if (input.equals(Constants.QUIT)) {
                printWriter.println(Constants.OK + "POP3 server signing off");
                doneProcess = true;
            } else if (input.equals(Constants.STAT)) {
                printWriter.println(Constants.OK + messages.size() + " 1"); // We take the maildrop size as one.
            } else if (tokens.get(0).equals(Constants.LIST)) { // scan listing
                if (tokens.size() > 1) {
                    try {
                        int optArg = Integer.parseInt((String) tokens.get(1));
                        int messageArrayIndex = optArg - 1;

                        if ((messageArrayIndex < messages.size()) && (messageArrayIndex >= 0)) { // that is OK careful with numbering
                            printWriter.println(Constants.OK + messageArrayIndex + 1 + " 120"); // Mail size of 120 is just some number.
                        } else {
                            printWriter.println(Constants.ERR + "no such message, only " + (messages.size() + 1)
                                    + " messages in maildrop");
                        }
                    } catch (NumberFormatException e) {
                        log.info(e.getMessage());
                        printWriter.println(
                                Constants.ERR + "problem passing the index. Index submited was " + tokens.get(1));
                    }
                } else {
                    printWriter.println(Constants.OK + messages.size());

                    for (int i = 0; i < messages.size(); i++) {
                        int messageIndex = i + 1;

                        printWriter.println(messageIndex + " 120"); // List out all the messages with a message size octet of 120
                    }

                    printWriter.println(".");
                }
            } else if (tokens.get(0).equals(Constants.RETR)) {
                String i = (String) tokens.get(1);

                try {
                    int index = Integer.parseInt(i);

                    printWriter.println(Constants.OK);

                    MimeMessage m = (MimeMessage) messages.get(index - 1);

                    m.writeTo(socket.getOutputStream());

                    socket.getOutputStream().write(CR_LF_DOT_CR_LF); // This is a bit of a hack to get it working. Have to find a bette way to handle this.
                    socket.getOutputStream().flush();
                } catch (NumberFormatException e) {
                    printWriter.println(Constants.ERR);
                } catch (IOException e1) {
                    printWriter.println(Constants.ERR);
                } catch (MessagingException e2) {
                    printWriter.println(Constants.ERR);
                }
            } else if (tokens.get(0).equals(Constants.DELE)) {
                String smIndex = (String) tokens.get(1);

                try {
                    int mIndex = Integer.parseInt(smIndex) - 1 - numDeleted; // When one mail is deleted the index of the other mails will reduce. Asumed that the delete will occure from bottom up.

                    if ((mIndex >= 0) && (mIndex < messages.size())) {
                        messages.remove(mIndex);
                        numDeleted++;
                        printWriter.println(Constants.OK);
                    } else {
                        printWriter.println(Constants.ERR);
                    }
                } catch (NumberFormatException e) {
                    printWriter.println(Constants.ERR);
                }
            } else if (tokens.get(0).equals(Constants.NOOP) || tokens.get(0).equals(Constants.RSET)) {
                printWriter.println(Constants.OK);
            } else {
                printWriter.println(Constants.ERR);
            }
        }
    }

    public void run() {
        try {
            InputStream inputStream = socket.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);

            printWriter.println(Constants.OK + " POP3 server ready");

            String s;

            while (!doneProcess) {
                s = bufferedReader.readLine();
                processInput(s, printWriter);
            }

            socket.close();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }
}