james-server-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Danny Angus" <da...@apache.org>
Subject RE: cvs commit: james-server/src/java/org/apache/mailet Mail.java
Date Tue, 15 Jul 2003 13:23:18 GMT
Vincenzo,

I think you should remove this, it changes the Mailet API, the API should
not change between versions in this way. It is important for published API's
to remain static and for changes to be well publicised and stable before any
release is made. Making a change in this way may not be directly harmful but
it does violate good practice.

The existing plan is for this to be available in Mailet v3, not to be
retro-fitted to v2.

I think there might be a case for proposing an interim Mailet v2.1 which
includes this and some other forthcoming features of v3, but I don't think
that this is a good way of doing it.

d.


> -----Original Message-----
> From: vincenzo@apache.org [mailto:vincenzo@apache.org]
> Sent: 15 July 2003 11:12
> To: james-server-cvs@apache.org
> Subject: cvs commit: james-server/src/java/org/apache/mailet Mail.java
>
>
> vincenzo    2003/07/15 03:11:59
>
>   Modified:    src/conf sqlResources.xml
>                src/java/org/apache/james/core MailImpl.java
>                src/java/org/apache/james/mailrepository
>                         JDBCMailRepository.java
>                src/java/org/apache/mailet Mail.java
>   Log:
>   Adding mail attributes support.
>
>   Revision  Changes    Path
>   1.20      +51 -1     james-server/src/conf/sqlResources.xml
>
>   Index: sqlResources.xml
>   ===================================================================
>   RCS file: /home/cvs/james-server/src/conf/sqlResources.xml,v
>   retrieving revision 1.19
>   retrieving revision 1.20
>   diff -u -r1.19 -r1.20
>   --- sqlResources.xml	23 Jun 2003 01:53:27 -0000	1.19
>   +++ sqlResources.xml	15 Jul 2003 10:11:57 -0000	1.20
>   @@ -171,8 +171,23 @@
>        <!-- Statements used to update the body of a message
> stored in this repository. -->
>        <sql name="updateMessageBodySQL">UPDATE ${table} SET
> message_body = ? WHERE message_name = ? AND repository_name = ?</sql>
>
>   +    <!-- Statements used to update the attributes of a message
> stored in this repository. -->
>   +    <!-- Uncomment this statement to activate the attributes support.
>   +    <sql name="updateMessageAttributesSQL">UPDATE ${table} SET
> message_attributes = ? WHERE message_name = ? AND repository_name
> = ?</sql>
>   +    -->
>   +
>        <!-- Statements used to insert a message into this repository. -->
>   -    <sql name="insertMessageSQL">INSERT INTO ${table}
> (message_name, repository_name, message_state, error_message,
> sender, recipients, remote_host, remote_addr, last_updated,
> message_body) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</sql>
>   +    <sql name="insertMessageSQL">INSERT INTO ${table} (message_name,
>   +    repository_name, message_state, error_message, sender, recipients,
>   +    remote_host, remote_addr, last_updated, message_body)
> VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</sql>
>   +
>   +    <!-- Statements used to insert a message with attributes
> into this repository. -->
>   +    <!-- Uncomment this statement and comment the previous one
> to activate the attributes support.
>   +    <sql name="insertMessageSQL">INSERT INTO ${table} (message_name,
>   +    repository_name, message_state, error_message, sender, recipients,
>   +    remote_host, remote_addr, last_updated, message_body,
>   +    message_attributes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</sql>
>   +    -->
>
>        <!-- Statements used to retrieve a message stored in this
> repository. -->
>        <sql name="retrieveMessageSQL">SELECT message_state,
> error_message, sender, recipients, remote_host, remote_addr,
> last_updated FROM ${table} WHERE message_name = ? AND
> repository_name = ?</sql>
>   @@ -180,6 +195,11 @@
>        <!-- Statements used to retrieve the body of a message
> stored in this repository. -->
>        <sql name="retrieveMessageBodySQL">SELECT message_body
> FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
>
>   +    <!-- Statements used to retrieve the attributes of a
> message stored in this repository. -->
>   +    <!-- Uncomment this statement to activate the attributes support.
>   +    <sql name="retrieveMessageAttributesSQL">SELECT
> message_attributes FROM ${table} WHERE message_name = ? AND
> repository_name = ?</sql>
>   +     -->
>   +
>        <!-- Statements used to retrieve the size of the body of a
> message stored in this repository. -->
>        <!-- NOTE: This statement is optional and need not be
> implemented for a particular database to be supported. -->
>        <sql name="retrieveMessageBodySizeSQL" db="mssql">SELECT
> datalength(message_body) FROM ${table} WHERE message_name = ? AND
> repository_name = ?</sql>
>   @@ -205,6 +225,7 @@
>                remote_host varchar (255) NOT NULL ,
>                remote_addr varchar (20) NOT NULL ,
>                message_body longblob NOT NULL ,
>   +            message_attributes longblob NOT NULL ,
>                last_updated datetime NOT NULL,
>                PRIMARY KEY (repository_name, message_name)
>            )
>   @@ -220,6 +241,7 @@
>                remote_host varchar (255) NOT NULL ,
>                remote_addr varchar (20) NOT NULL ,
>                message_body varchar NOT NULL ,
>   +            message_attributes varchar NOT NULL ,
>                last_updated timestamp NOT NULL,
>                PRIMARY KEY (repository_name, message_name)
>            )
>   @@ -235,6 +257,7 @@
>                [remote_host] [varchar] (255) NOT NULL ,
>                [remote_addr] [varchar] (20) NOT NULL ,
>                [message_body] [image] NOT NULL ,
>   +            [message_attributes] [image] NOT NULL ,
>                [last_updated] [datetime] NOT NULL,
>                PRIMARY KEY (repository_name, message_name)
>            )
>   @@ -250,6 +273,7 @@
>            remote_host varchar2(100) NOT NULL ,
>            remote_addr varchar2(20) NOT NULL ,
>            message_body long raw NOT NULL ,
>   +        message_attributes long raw NOT NULL ,
>            last_updated date NOT NULL ,
>            PRIMARY KEY (repository_name, message_name)
>            )
>   @@ -266,6 +290,7 @@
>                remote_host varchar (255) NOT NULL ,
>                remote_addr varchar (20) NOT NULL ,
>                message_body bytea NOT NULL ,
>   +            message_attributes bytea NOT NULL ,
>                last_updated timestamp NOT NULL,
>                PRIMARY KEY (repository_name, message_name)
>            )
>   @@ -281,6 +306,7 @@
>                remote_host varchar (100) NOT NULL ,
>                remote_addr varchar (20) NOT NULL ,
>                message_body long byte NOT NULL ,
>   +            message_attributes long byte NOT NULL ,
>                last_updated date NOT NULL,
>                PRIMARY KEY (repository_name, message_name)
>            )
>   @@ -302,8 +328,21 @@
>        <!-- Statements used to update the body of a message
> stored in this repository. -->
>        <sql name="updateMessageBodySQL">UPDATE ${table} SET
> message_body = ? WHERE message_name = ? AND repository_name = ?</sql>
>
>   +    <!-- Statements used to update the attributes of a message
> stored in this repository. -->
>   +    <!-- Uncomment this statement to activate the attributes support.
>   +    <sql name="updateMessageAttributesSQL">UPDATE ${table} SET
> message_attributes = ? WHERE message_name = ? AND repository_name
> = ?</sql>
>   +    -->
>   +
>        <!-- Statements used to insert a message into this repository. -->
>        <sql name="insertMessageSQL">INSERT INTO ${table}
> (message_name, repository_name, message_state, error_message,
> sender, recipients, remote_host, remote_addr, last_updated,
> message_body) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</sql>
>   +
>   +    <!-- Statements used to insert a message with attributes
> into this repository. -->
>   +    <!-- Uncomment this statement and comment the previous one
> to activate the attributes support.
>   +    <sql name="insertMessageSQL">INSERT INTO ${table} (message_name,
>   +    repository_name, message_state, error_message, sender, recipients,
>   +    remote_host, remote_addr, last_updated, message_body,
>   +    message_attributes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</sql>
>   +    -->
>
>        <!-- Statements used to retrieve a message stored in this
> repository. -->
>        <sql name="retrieveMessageSQL">SELECT message_state,
> error_message, sender, recipients, remote_host, remote_addr,
> last_updated FROM ${table} WHERE message_name = ? AND
> repository_name = ?</sql>
>   @@ -311,6 +350,11 @@
>        <!-- Statements used to retrieve the body of a message
> stored in this repository. -->
>        <sql name="retrieveMessageBodySQL">SELECT message_body
> FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
>
>   +    <!-- Statements used to retrieve the attributes of a
> message stored in this repository. -->
>   +    <!-- Uncomment this statement to activate the attributes support.
>   +    <sql name="retrieveMessageAttributesSQL">SELECT
> message_attributes FROM ${table} WHERE message_name = ? AND
> repository_name = ?</sql>
>   +    -->
>   +
>        <!-- Statements used to retrieve the size of the body of a
> message stored in this repository. -->
>        <!-- NOTE: This statement is optional and need not be
> implemented for a particular database to be supported. -->
>        <sql name="retrieveMessageBodySizeSQL" db="mssql">SELECT
> datalength(message_body) FROM ${table} WHERE message_name = ? AND
> repository_name = ?</sql>
>   @@ -336,6 +380,7 @@
>                remote_host varchar (255) NOT NULL ,
>                remote_addr varchar (20) NOT NULL ,
>                message_body varchar NOT NULL ,
>   +            message_attributes varchar NOT NULL ,
>                last_updated timestamp NOT NULL,
>                PRIMARY KEY (message_name, repository_name)
>            )
>   @@ -351,6 +396,7 @@
>                remote_host varchar (255) NOT NULL ,
>                remote_addr varchar (20) NOT NULL ,
>                message_body longblob NOT NULL ,
>   +            message_attributes longblob NOT NULL ,
>                last_updated datetime NOT NULL,
>                PRIMARY KEY (message_name, repository_name)
>            )
>   @@ -366,6 +412,7 @@
>                [remote_host] [varchar] (255) NOT NULL ,
>                [remote_addr] [varchar] (20) NOT NULL ,
>                [message_body] [image] NOT NULL ,
>   +            [message_attributes] [image] NOT NULL ,
>                [last_updated] [datetime] NOT NULL,
>                PRIMARY KEY (message_name, repository_name)
>            )
>   @@ -381,6 +428,7 @@
>            remote_host varchar2(255) NOT NULL ,
>            remote_addr varchar2(20) NOT NULL ,
>            message_body long raw NOT NULL ,
>   +        message_attributes long raw NOT NULL ,
>            last_updated date NOT NULL ,
>            PRIMARY KEY (message_name, repository_name)
>            )
>   @@ -396,6 +444,7 @@
>                remote_host varchar (255) NOT NULL ,
>                remote_addr varchar (20) NOT NULL ,
>                message_body bytea NOT NULL ,
>   +            message_attributes bytea NOT NULL ,
>                last_updated timestamp NOT NULL,
>                PRIMARY KEY (message_name, repository_name)
>            )
>   @@ -411,6 +460,7 @@
>                remote_host varchar (255) NOT NULL ,
>                remote_addr varchar (20) NOT NULL ,
>                message_body long byte NOT NULL ,
>   +            message_attributes long byte NOT NULL ,
>                last_updated date NOT NULL,
>                PRIMARY KEY (message_name, repository_name)
>            )
>
>
>
>   1.26      +38 -1
> james-server/src/java/org/apache/james/core/MailImpl.java
>
>   Index: MailImpl.java
>   ===================================================================
>   RCS file:
> /home/cvs/james-server/src/java/org/apache/james/core/MailImpl.java,v
>   retrieving revision 1.25
>   retrieving revision 1.26
>   diff -u -r1.25 -r1.26
>   --- MailImpl.java	26 Apr 2003 10:00:54 -0000	1.25
>   +++ MailImpl.java	15 Jul 2003 10:11:58 -0000	1.26
>   @@ -87,7 +87,7 @@
>    /**
>     * Wraps a MimeMessage adding routing information (from SMTP)
> and some simple
>     * API enhancements.
>   - * @version 0.9
>   + * @version CVS $Revision$ $Date$
>     */
>    public class MailImpl implements Disposable, Mail {
>        /**
>   @@ -238,6 +238,7 @@
>                newMail.setRemoteHost(remoteHost);
>                newMail.setRemoteAddr(remoteAddr);
>                newMail.setLastUpdated(lastUpdated);
>   +            newMail.setAttributesRaw((HashMap) attributes.clone());
>                return newMail;
>            } catch (MessagingException me) {
>                // Ignored.  Return null in the case of an error.
>   @@ -569,6 +570,30 @@
>        }
>
>        /**
>   +     * This method is necessary, when Mail repositories needs to deal
>   +     * explicitly with storing Mail attributes as a Serializable
>   +     * Note: This method is not exposed in the Mail interface,
>   +     * it is for internal use by James only.
>   +     * @return Serializable of the entire attributes collection
>   +     **/
>   +    public HashMap getAttributesRaw ()
>   +    {
>   +        return attributes;
>   +    }
>   +
>   +    /**
>   +     * This method is necessary, when Mail repositories needs to deal
>   +     * explicitly with retriving Mail attributes as a Serializable
>   +     * Note: This method is not exposed in the Mail interface,
>   +     * it is for internal use by James only.
>   +     * @return Serializable of the entire attributes collection
>   +     **/
>   +    public void setAttributesRaw (HashMap attr)
>   +    {
>   +        this.attributes = (attr == null) ? new HashMap() : attr;
>   +    }
>   +
>   +    /**
>         * @see org.apache.mailet.Mail#getAttribute(String)
>         */
>        public Serializable getAttribute(String key) {
>   @@ -587,9 +612,21 @@
>            return (Serializable)attributes.remove(key);
>        }
>        /**
>   +     * @see org.apache.mailet.Mail#removeAllAttributes()
>   +     */
>   +    public void removeAllAttributes() {
>   +        attributes.clear();
>   +    }
>   +    /**
>         * @see org.apache.mailet.Mail#getAttributeNames()
>         */
>        public Iterator getAttributeNames() {
>            return attributes.keySet().iterator();
>   +    }
>   +    /**
>   +     * @see org.apache.mailet.Mail#hasAttributes()
>   +     */
>   +    public boolean hasAttributes() {
>   +        return !attributes.isEmpty();
>        }
>    }
>
>
>
>   1.45      +144 -2
> james-server/src/java/org/apache/james/mailrepository/JDBCMailRepo
> sitory.java
>
>   Index: JDBCMailRepository.java
>   ===================================================================
>   RCS file:
> /home/cvs/james-server/src/java/org/apache/james/mailrepository/JD
> BCMailRepository.java,v
>   retrieving revision 1.44
>   retrieving revision 1.45
>   diff -u -r1.44 -r1.45
>   --- JDBCMailRepository.java	1 Jun 2003 00:02:49 -0000	1.44
>   +++ JDBCMailRepository.java	15 Jul 2003 10:11:58 -0000	1.45
>   @@ -62,6 +62,8 @@
>    import java.io.ByteArrayOutputStream;
>    import java.io.File;
>    import java.io.IOException;
>   +import java.io.ObjectOutputStream;
>   +import java.io.ObjectInputStream;
>    import java.io.OutputStream;
>    import java.sql.Connection;
>    import java.sql.DatabaseMetaData;
>   @@ -120,7 +122,7 @@
>     *
>     * <p>Requires a logger called MailRepository.
>     *
>   - * @version 1.0.0, 24/04/1999
>   + * @version CVS $Revision$ $Date$
>     */
>    public class JDBCMailRepository
>        extends AbstractLogEnabled
>   @@ -550,6 +552,43 @@
>                        theJDBCUtil.closeJDBCStatement(localUpdateMessage);
>                    }
>
>   +                //Determine whether attribues are used and
> available for storing
>   +                //Do we have updateMessageAttributesSQL?
>   +                String updateMessageAttrSql =
>   +
> sqlQueries.getSqlString("updateMessageAttributesSQL", false);
>   +                if (updateMessageAttrSql!=null && mc.hasAttributes()) {
>   +                    PreparedStatement updateMessageAttr = null;
>   +                    try {
>   +                        updateMessageAttr =
>   +
> conn.prepareStatement(updateMessageAttrSql);
>   +                        ByteArrayOutputStream baos = new
> ByteArrayOutputStream();
>   +                        ObjectOutputStream oos = new
> ObjectOutputStream(baos);
>   +                        try {
>   +
> oos.writeObject(((MailImpl)mc).getAttributesRaw());
>   +                            oos.flush();
>   +                            ByteArrayInputStream attrInputStream =
>   +                                new
> ByteArrayInputStream(baos.toByteArray());
>   +
> updateMessageAttr.setBinaryStream(1, attrInputStream, baos.size());
>   +                        } finally {
>   +                            try {
>   +                                if (oos != null) {
>   +                                    oos.close();
>   +                                }
>   +                            } catch (IOException ioe) {
>   +
> getLogger().debug("JDBCMailRepository: Unexpected exception while
> closing output stream.");
>   +                            }
>   +                        }
>   +                        updateMessageAttr.setString(2, mc.getName());
>   +                        updateMessageAttr.setString(3, repositoryName);
>   +                        updateMessageAttr.execute();
>   +                    } catch (SQLException sqle) {
>   +                        getLogger().info("JDBCMailRepository:
> Trying to update mail attributes failed.",sqle);
>   +
>   +                    } finally {
>   +
> theJDBCUtil.closeJDBCStatement(updateMessageAttr);
>   +                    }
>   +                }
>   +
>                    //Determine whether the message body has
> changed, and possibly avoid
>                    //  updating the database.
>                    MimeMessage messageBody = mc.getMessage();
>   @@ -598,8 +637,10 @@
>                    //Insert the record into the database
>                    PreparedStatement insertMessage = null;
>                    try {
>   +                    String insertMessageSQL =
> sqlQueries.getSqlString("insertMessageSQL", true);
>   +                    int number_of_parameters =
> getNumberOfParameters (insertMessageSQL);
>                        insertMessage =
>   -
> conn.prepareStatement(sqlQueries.getSqlString("insertMessageSQL", true));
>   +                        conn.prepareStatement(insertMessageSQL);
>                        insertMessage.setString(1, mc.getName());
>                        insertMessage.setString(2, repositoryName);
>                        insertMessage.setString(3, mc.getState());
>   @@ -644,6 +685,28 @@
>                            closeOutputStreams(headerOut, bodyOut);
>                        }
>                        //Store the headers in the database
>   +
>   +                    //Store attributes
>   +                    if (number_of_parameters > 10) {
>   +                        ByteArrayOutputStream baos = new
> ByteArrayOutputStream();
>   +                        ObjectOutputStream oos = new
> ObjectOutputStream(baos);
>   +                        try {
>   +
> oos.writeObject(((MailImpl)mc).getAttributesRaw());
>   +                            oos.flush();
>   +                            ByteArrayInputStream attrInputStream =
>   +                                new
> ByteArrayInputStream(baos.toByteArray());
>   +                            insertMessage.setBinaryStream(11,
> attrInputStream, baos.size());
>   +                        } finally {
>   +                            try {
>   +                                if (oos != null) {
>   +                                    oos.close();
>   +                                }
>   +                            } catch (IOException ioe) {
>   +
> getLogger().debug("JDBCMailRepository: Unexpected exception while
> closing output stream.");
>   +                            }
>   +                        }
>   +                    }
>   +
>                        insertMessage.execute();
>                    } finally {
>                        theJDBCUtil.closeJDBCStatement(insertMessage);
>   @@ -705,7 +768,68 @@
>                    }
>                    return null;
>                }
>   +            //Determine whether attribues are used and retrieve them
>   +            //Do we have retrieveAttributesSQL?
>   +            String retrieveMessageAttrSql =
>   +
> sqlQueries.getSqlString("retrieveMessageAttributesSQL", false);
>   +            PreparedStatement retrieveMessageAttr = null;
>   +            HashMap attributes = null;
>   +            if (retrieveMessageAttrSql!=null) {
>   +                ResultSet rsMessageAttr = null;
>   +                try {
>   +                    retrieveMessageAttr =
>   +                        conn.prepareStatement(retrieveMessageAttrSql);
>   +
>   +                    retrieveMessageAttr.setString(1, key);
>   +                    retrieveMessageAttr.setString(2, repositoryName);
>   +                    rsMessageAttr = retrieveMessageAttr.executeQuery();
>   +
>   +                    if (rsMessageAttr.next()) {
>   +                        try {
>   +                            byte[] serialized_attr =
> rsMessageAttr.getBytes(1);
>   +                            ByteArrayInputStream bais = new
> ByteArrayInputStream (serialized_attr);
>   +                            ObjectInputStream ois = new
> ObjectInputStream (bais);
>   +                            attributes = (HashMap)ois.readObject();
>   +                            ois.close();
>   +                        } catch (IOException ioe) {
>   +                            if (getLogger().isDebugEnabled()) {
>   +                                StringBuffer debugBuffer =
>   +                                    new StringBuffer(64)
>   +                                    .append("Exception reading
> attributes ")
>   +                                    .append(key)
>   +                                    .append(" in ")
>   +                                    .append(repositoryName);
>   +
> getLogger().debug(debugBuffer.toString(), ioe);
>   +                            }
>   +                        }
>   +                    } else {
>   +                        if (getLogger().isDebugEnabled()) {
>   +                            StringBuffer debugBuffer =
>   +                                new StringBuffer(64)
>   +                                .append("Did not find a record
> (attributes) ")
>   +                                .append(key)
>   +                                .append(" in ")
>   +                            .append(repositoryName);
>   +                            getLogger().debug(debugBuffer.toString());
>   +                        }
>   +                    }
>   +                } catch (SQLException sqle) {
>   +                    synchronized (System.err) {
>   +                        System.err.println("Error retrieving message");
>   +                        System.err.println(sqle.getMessage());
>   +                        System.err.println(sqle.getErrorCode());
>   +                        System.err.println(sqle.getSQLState());
>   +                        System.err.println(sqle.getNextException());
>   +                        sqle.printStackTrace();
>   +                    }
>   +                } finally {
>   +                    theJDBCUtil.closeJDBCResultSet(rsMessageAttr);
>   +
> theJDBCUtil.closeJDBCStatement(retrieveMessageAttr);
>   +                }
>   +            }
>   +
>                MailImpl mc = new MailImpl();
>   +            mc.setAttributesRaw (attributes);
>                mc.setName(key);
>                mc.setState(rsMessage.getString(1));
>                mc.setErrorMessage(rsMessage.getString(2));
>   @@ -845,6 +969,7 @@
>                    ((repository.repositoryName == repositoryName)
> || ((repository.repositoryName != null) &&
> repository.repositoryName.equals(repositoryName)));
>        }
>
>   +
>        /**
>         * Provide a hash code that is consistent with equals for
> this class
>         *
>   @@ -860,6 +985,23 @@
>            }
>            return result;
>         }
>   +
>   +    /**
>   +     * This method calculates number of parameters in a
> prepared statement SQL String.
>   +     * It does so by counting the number of '?' in the string
>   +     * @param sqlstring to return parameter count for
>   +     * @return number of parameters
>   +     **/
>   +    private int getNumberOfParameters (String sqlstring) {
>   +        //it is alas a java 1.4 feature to be able to call
>   +        //getParameterMetaData which could provide us with the
> parameterCount
>   +        char[] chars = sqlstring.toCharArray();
>   +        int count = 0;
>   +        for (int i = 0; i < chars.length; i++) {
>   +            count += chars[i]=='?' ? 1 : 0;
>   +        }
>   +        return count;
>   +    }
>
>        /**
>         * Closes output streams used to update message
>
>
>
>   1.10      +9 -1      james-server/src/java/org/apache/mailet/Mail.java
>
>   Index: Mail.java
>   ===================================================================
>   RCS file: /home/cvs/james-server/src/java/org/apache/mailet/Mail.java,v
>   retrieving revision 1.9
>   retrieving revision 1.10
>   diff -u -r1.9 -r1.10
>   --- Mail.java	26 Apr 2003 10:00:55 -0000	1.9
>   +++ Mail.java	15 Jul 2003 10:11:59 -0000	1.10
>   @@ -70,7 +70,7 @@
>     * which processor in the mailet container it is currently running.
>     * Special processor names are "root" and "error".
>     *
>   - * @version 0.9
>   + * @version CVS $Revision$ $Date$
>     */
>    public interface Mail extends Serializable, Cloneable {
>        String GHOST = "ghost";
>   @@ -189,6 +189,10 @@
>         */
>        Iterator getAttributeNames();
>        /**
>   +     * @return true if this Mail instance has any attributes set.
>   +     **/
>   +    boolean hasAttributes();
>   +    /**
>         * Removes the attribute with the given name from this
> Mail instance. After
>         * removal, subsequent calls to
> getAttribute(java.lang.String) to retrieve
>         * the attribute's value will return null.
>   @@ -199,6 +203,10 @@
>         * was bound to the name)
>         */
>        Serializable removeAttribute(String name);
>   +    /**
>   +     * Removes all the attributes associated with this Mail instance.
>   +     **/
>   +    void removeAllAttributes();
>        /**
>         * Binds an object to a given attribute name in this Mail
> instance. If the name
>         * specified is already used for an attribute, this method
> will remove the old
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
> For additional commands, e-mail: server-dev-help@james.apache.org
>


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


Mime
View raw message