FileDocCategorySizeDatePackage
POP3Store.javaAPI DocGlassfish v2 API9119Mon May 14 15:28:46 BST 2007com.sun.mail.pop3

POP3Store

public class POP3Store extends Store
A POP3 Message Store. Contains only one folder, "INBOX". See the com.sun.mail.pop3 package documentation for further information on the POP3 protocol provider.

author
Bill Shannon
author
John Mani

Fields Summary
private String
name
private int
defaultPort
private boolean
isSSL
private Protocol
port
private POP3Folder
portOwner
private String
host
private int
portNum
private String
user
private String
passwd
boolean
rsetBeforeQuit
boolean
disableTop
boolean
forgetTopHeaders
Constructor
messageConstructor
Constructors Summary
public POP3Store(Session session, URLName url)


         
	this(session, url, "pop3", 110, false);
    
public POP3Store(Session session, URLName url, String name, int defaultPort, boolean isSSL)

	super(session, url);
	if (url != null)
	    name = url.getProtocol();
	this.name = name;
	this.defaultPort = defaultPort;
	this.isSSL = isSSL;

	String s = session.getProperty("mail." + name + ".rsetbeforequit");
	if (s != null && s.equalsIgnoreCase("true"))
	    rsetBeforeQuit = true;

	s = session.getProperty("mail." + name + ".disabletop");
	if (s != null && s.equalsIgnoreCase("true"))
	    disableTop = true;

	s = session.getProperty("mail." + name + ".forgettopheaders");
	if (s != null && s.equalsIgnoreCase("true"))
	    forgetTopHeaders = true;

	s = session.getProperty("mail." + name + ".message.class");
	if (s != null) {
	    if (session.getDebug())
		session.getDebugOut().println(
		    "DEBUG: POP3 message class: " + s);
	    try {
		ClassLoader cl = this.getClass().getClassLoader();

		// now load the class
		Class messageClass = null;
		try {
		    // First try the "application's" class loader.
		    // This should eventually be replaced by
		    // Thread.currentThread().getContextClassLoader().
		    messageClass = cl.loadClass(s);
		} catch (ClassNotFoundException ex1) {
		    // That didn't work, now try the "system" class loader.
		    // (Need both of these because JDK 1.1 class loaders
		    // may not delegate to their parent class loader.)
		    messageClass = Class.forName(s);
		}

		Class[] c = {javax.mail.Folder.class, int.class};
		messageConstructor = messageClass.getConstructor(c);
	    } catch (Exception ex) {
		if (session.getDebug())
		    session.getDebugOut().println(
			"DEBUG: failed to load POP3 message class: " + ex);
	    }
	}
    
Methods Summary
private voidcheckConnected()

	if (!super.isConnected())
	    throw new MessagingException("Not connected");
    
public synchronized voidclose()

	try {
	    if (port != null)
		port.quit();
	} catch (IOException ioex) {
	} finally {
	    port = null;

	    // to set the state and send the closed connection event
	    super.close();
	}
    
synchronized voidclosePort(com.sun.mail.pop3.POP3Folder owner)

	if (portOwner == owner) {
	    port = null;
	    portOwner = null;
	}
    
protected voidfinalize()

	super.finalize();

	if (port != null)	// don't force a connection attempt
	    close();
    
public javax.mail.FoldergetDefaultFolder()

	checkConnected();
	return new DefaultFolder(this);
    
public javax.mail.FoldergetFolder(javax.mail.URLName url)

	checkConnected();
	return new POP3Folder(this, url.getFile());
    
public javax.mail.FoldergetFolder(java.lang.String name)
Only the name "INBOX" is supported.

	checkConnected();
	return new POP3Folder(this, name);
    
synchronized com.sun.mail.pop3.ProtocolgetPort(com.sun.mail.pop3.POP3Folder owner)

	Protocol p;

	// if we already have a port, remember who's using it
	if (port != null && portOwner == null) {
	    portOwner = owner;
	    return port;
	}

	// need a new port, create it and try to login
	p = new Protocol(host, portNum, session.getDebug(),
	    session.getDebugOut(), session.getProperties(), "mail." + name,
	    isSSL);

	String msg = null;
	if ((msg = p.login(user, passwd)) != null) {
	    try {
		p.quit();
	    } catch (IOException ioex) {
	    } finally {
		throw new EOFException(msg);
	    }
	}

	/*
	 * If a Folder closes the port, and then a Folder
	 * is opened, the Store won't have a port.  In that
	 * case, the getPort call will come from Folder.open,
	 * but we need to keep track of the port in the Store
	 * so that a later call to Folder.isOpen, which calls
	 * Store.isConnected, will use the same port.
	 */
	if (port == null && owner != null) {
	    port = p;
	    portOwner = owner;
	}
	if (portOwner == null)
	    portOwner = owner;
	return p;
    
public synchronized booleanisConnected()
Check whether this store is connected. Override superclass method, to actually ping our server connection.

	if (!super.isConnected())
	    // if we haven't been connected at all, don't bother with
	    // the NOOP.
	    return false;
	synchronized (this) {
	    try {
		if (port == null)
		    port = getPort(null);
		else
		    port.noop();
		return true;
	    } catch (IOException ioex) {
		// no longer connected, close it down
		try {
		    super.close();		// notifies listeners
		} catch (MessagingException mex) {
		    // ignore it
		} finally {
		    return false;
		}
	    }
	}
    
protected synchronized booleanprotocolConnect(java.lang.String host, int portNum, java.lang.String user, java.lang.String passwd)

		    
	// check for non-null values of host, password, user
	if (host == null || passwd == null || user == null)
	    return false;

	// if port is not specified, set it to value of mail.pop3.port
        // property if it exists, otherwise default to 110
        if (portNum == -1) {
	    String portstring = session.getProperty("mail." + name + ".port");
	    if (portstring != null)
		portNum = Integer.parseInt(portstring);
	}

	if (portNum == -1)
	    portNum = defaultPort;

	this.host = host;
	this.portNum = portNum;
	this.user = user;
	this.passwd = passwd;
	try {
	    port = getPort(null);
	} catch (EOFException eex) { 
		throw new AuthenticationFailedException(eex.getMessage());
	} catch (IOException ioex) { 
	    throw new MessagingException("Connect failed", ioex);
	}

	return true;