You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by jo...@apache.org on 2006/10/09 19:15:42 UTC

svn commit: r454432 [11/14] - in /james/server/sandbox/imap-integration: ./ lib/ src/java/ src/java/org/apache/james/imapserver/ src/java/org/apache/james/imapserver/commands/ src/java/org/apache/james/imapserver/debug/ src/java/org/apache/james/imapse...

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/BaseMessageRowPeer.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/BaseMessageRowPeer.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/BaseMessageRowPeer.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/BaseMessageRowPeer.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,962 @@
+package org.apache.james.mailboxmanager.torque.om;
+
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.torque.NoRowsException;
+import org.apache.torque.TooManyRowsException;
+import org.apache.torque.Torque;
+import org.apache.torque.TorqueException;
+import org.apache.torque.map.MapBuilder;
+import org.apache.torque.map.TableMap;
+import org.apache.torque.om.DateKey;
+import org.apache.torque.om.NumberKey;
+import org.apache.torque.om.StringKey;
+import org.apache.torque.om.ObjectKey;
+import org.apache.torque.om.SimpleKey;
+import org.apache.torque.util.BasePeer;
+import org.apache.torque.util.Criteria;
+
+import com.workingdogs.village.DataSetException;
+import com.workingdogs.village.QueryDataSet;
+import com.workingdogs.village.Record;
+
+// Local classes
+import org.apache.james.mailboxmanager.torque.om.map.*;
+
+
+
+/**
+ * This class was autogenerated by Torque on:
+ *
+ * [Tue Sep 19 10:06:28 CEST 2006]
+ *
+ */
+public abstract class BaseMessageRowPeer
+    extends BasePeer
+{
+
+    /** the default database name for this class */
+    public static final String DATABASE_NAME = "mailboxmanager";
+
+     /** the table name for this class */
+    public static final String TABLE_NAME = "message";
+
+    /**
+     * @return the map builder for this peer
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static MapBuilder getMapBuilder()
+        throws TorqueException
+    {
+        return getMapBuilder(MessageRowMapBuilder.CLASS_NAME);
+    }
+
+      /** the column name for the MAILBOX_ID field */
+    public static final String MAILBOX_ID;
+      /** the column name for the UID field */
+    public static final String UID;
+      /** the column name for the INTERNAL_DATE field */
+    public static final String INTERNAL_DATE;
+      /** the column name for the SIZE field */
+    public static final String SIZE;
+  
+    static
+    {
+          MAILBOX_ID = "message.MAILBOX_ID";
+          UID = "message.UID";
+          INTERNAL_DATE = "message.INTERNAL_DATE";
+          SIZE = "message.SIZE";
+          if (Torque.isInit())
+        {
+            try
+            {
+                getMapBuilder(MessageRowMapBuilder.CLASS_NAME);
+            }
+            catch (Exception e)
+            {
+                log.error("Could not initialize Peer", e);
+                throw new RuntimeException(e);
+            }
+        }
+        else
+        {
+            Torque.registerMapBuilder(MessageRowMapBuilder.CLASS_NAME);
+        }
+    }
+ 
+    /** number of columns for this peer */
+    public static final int numColumns =  4;
+
+    /** A class that can be returned by this peer. */
+    protected static final String CLASSNAME_DEFAULT =
+        "org.apache.james.mailboxmanager.torque.om.MessageRow";
+
+    /** A class that can be returned by this peer. */
+    protected static final Class CLASS_DEFAULT = initClass(CLASSNAME_DEFAULT);
+
+    /**
+     * Class object initialization method.
+     *
+     * @param className name of the class to initialize
+     * @return the initialized class
+     */
+    private static Class initClass(String className)
+    {
+        Class c = null;
+        try
+        {
+            c = Class.forName(className);
+        }
+        catch (Throwable t)
+        {
+            log.error("A FATAL ERROR has occurred which should not "
+                + "have happened under any circumstance.  Please notify "
+                + "the Torque developers <to...@db.apache.org> "
+                + "and give as many details as possible (including the error "
+                + "stack trace).", t);
+
+            // Error objects should always be propogated.
+            if (t instanceof Error)
+            {
+                throw (Error) t.fillInStackTrace();
+            }
+        }
+        return c;
+    }
+
+    /**
+     * Get the list of objects for a ResultSet.  Please not that your
+     * resultset MUST return columns in the right order.  You can use
+     * getFieldNames() in BaseObject to get the correct sequence.
+     *
+     * @param results the ResultSet
+     * @return the list of objects
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static List resultSet2Objects(java.sql.ResultSet results)
+            throws TorqueException
+    {
+        try
+        {
+            QueryDataSet qds = null;
+            List rows = null;
+            try
+            {
+                qds = new QueryDataSet(results);
+                rows = getSelectResults(qds);
+            }
+            finally
+            {
+                if (qds != null)
+                {
+                    qds.close();
+                }
+            }
+
+            return populateObjects(rows);
+        }
+        catch (SQLException e)
+        {
+            throw new TorqueException(e);
+        }
+        catch (DataSetException e)
+        {
+            throw new TorqueException(e);
+        }
+    }
+
+
+  
+    /**
+     * Method to do inserts.
+     *
+     * @param criteria object used to create the INSERT statement.
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static ObjectKey doInsert(Criteria criteria)
+        throws TorqueException
+    {
+        return BaseMessageRowPeer
+            .doInsert(criteria, (Connection) null);
+    }
+
+    /**
+     * Method to do inserts.  This method is to be used during a transaction,
+     * otherwise use the doInsert(Criteria) method.  It will take care of
+     * the connection details internally.
+     *
+     * @param criteria object used to create the INSERT statement.
+     * @param con the connection to use
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static ObjectKey doInsert(Criteria criteria, Connection con)
+        throws TorqueException
+    {
+        correctBooleans(criteria);
+
+        setDbName(criteria);
+
+        if (con == null)
+        {
+            return BasePeer.doInsert(criteria);
+        }
+        else
+        {
+            return BasePeer.doInsert(criteria, con);
+        }
+    }
+
+    /**
+     * Add all the columns needed to create a new object.
+     *
+     * @param criteria object containing the columns to add.
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static void addSelectColumns(Criteria criteria)
+            throws TorqueException
+    {
+          criteria.addSelectColumn(MAILBOX_ID);
+          criteria.addSelectColumn(UID);
+          criteria.addSelectColumn(INTERNAL_DATE);
+          criteria.addSelectColumn(SIZE);
+      }
+
+    /**
+     * changes the boolean values in the criteria to the appropriate type,
+     * whenever a booleanchar or booleanint column is involved.
+     * This enables the user to create criteria using Boolean values
+     * for booleanchar or booleanint columns
+     * @param criteria the criteria in which the boolean values should be corrected
+     */
+    public static void correctBooleans(Criteria criteria)
+    {
+                                }
+
+    /**
+     * Create a new object of type cls from a resultset row starting
+     * from a specified offset.  This is done so that you can select
+     * other rows than just those needed for this object.  You may
+     * for example want to create two objects from the same row.
+     *
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static MessageRow row2Object(Record row,
+                                             int offset,
+                                             Class cls)
+        throws TorqueException
+    {
+        try
+        {
+            MessageRow obj = (MessageRow) cls.newInstance();
+            MessageRowPeer.populateObject(row, offset, obj);
+                  obj.setModified(false);
+              obj.setNew(false);
+
+            return obj;
+        }
+        catch (InstantiationException e)
+        {
+            throw new TorqueException(e);
+        }
+        catch (IllegalAccessException e)
+        {
+            throw new TorqueException(e);
+        }
+    }
+
+    /**
+     * Populates an object from a resultset row starting
+     * from a specified offset.  This is done so that you can select
+     * other rows than just those needed for this object.  You may
+     * for example want to create two objects from the same row.
+     *
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static void populateObject(Record row,
+                                      int offset,
+                                      MessageRow obj)
+        throws TorqueException
+    {
+        try
+        {
+                obj.setMailboxId(row.getValue(offset + 0).asLong());
+                  obj.setUid(row.getValue(offset + 1).asLong());
+                  obj.setInternalDate(row.getValue(offset + 2).asUtilDate());
+                  obj.setSize(row.getValue(offset + 3).asInt());
+              }
+        catch (DataSetException e)
+        {
+            throw new TorqueException(e);
+        }
+    }
+
+    /**
+     * Method to do selects.
+     *
+     * @param criteria object used to create the SELECT statement.
+     * @return List of selected Objects
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static List doSelect(Criteria criteria) throws TorqueException
+    {
+        return populateObjects(doSelectVillageRecords(criteria));
+    }
+
+    /**
+     * Method to do selects within a transaction.
+     *
+     * @param criteria object used to create the SELECT statement.
+     * @param con the connection to use
+     * @return List of selected Objects
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static List doSelect(Criteria criteria, Connection con)
+        throws TorqueException
+    {
+        return populateObjects(doSelectVillageRecords(criteria, con));
+    }
+
+    /**
+     * Grabs the raw Village records to be formed into objects.
+     * This method handles connections internally.  The Record objects
+     * returned by this method should be considered readonly.  Do not
+     * alter the data and call save(), your results may vary, but are
+     * certainly likely to result in hard to track MT bugs.
+     *
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static List doSelectVillageRecords(Criteria criteria)
+        throws TorqueException
+    {
+        return BaseMessageRowPeer
+            .doSelectVillageRecords(criteria, (Connection) null);
+    }
+
+    /**
+     * Grabs the raw Village records to be formed into objects.
+     * This method should be used for transactions
+     *
+     * @param criteria object used to create the SELECT statement.
+     * @param con the connection to use
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static List doSelectVillageRecords(Criteria criteria, Connection con)
+        throws TorqueException
+    {
+        if (criteria.getSelectColumns().size() == 0)
+        {
+            addSelectColumns(criteria);
+        }
+        correctBooleans(criteria);
+
+        setDbName(criteria);
+
+        // BasePeer returns a List of Value (Village) arrays.  The array
+        // order follows the order columns were placed in the Select clause.
+        if (con == null)
+        {
+            return BasePeer.doSelect(criteria);
+        }
+        else
+        {
+            return BasePeer.doSelect(criteria, con);
+        }
+    }
+
+    /**
+     * The returned List will contain objects of the default type or
+     * objects that inherit from the default.
+     *
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static List populateObjects(List records)
+        throws TorqueException
+    {
+        List results = new ArrayList(records.size());
+
+        // populate the object(s)
+        for (int i = 0; i < records.size(); i++)
+        {
+            Record row = (Record) records.get(i);
+              results.add(MessageRowPeer.row2Object(row, 1,
+                MessageRowPeer.getOMClass()));
+          }
+        return results;
+    }
+ 
+
+    /**
+     * The class that the Peer will make instances of.
+     * If the BO is abstract then you must implement this method
+     * in the BO.
+     *
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static Class getOMClass()
+        throws TorqueException
+    {
+        return CLASS_DEFAULT;
+    }
+
+    /**
+     * Method to do updates.
+     *
+     * @param criteria object containing data that is used to create the UPDATE
+     *        statement.
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static void doUpdate(Criteria criteria) throws TorqueException
+    {
+         BaseMessageRowPeer
+            .doUpdate(criteria, (Connection) null);
+    }
+
+    /**
+     * Method to do updates.  This method is to be used during a transaction,
+     * otherwise use the doUpdate(Criteria) method.  It will take care of
+     * the connection details internally.
+     *
+     * @param criteria object containing data that is used to create the UPDATE
+     *        statement.
+     * @param con the connection to use
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static void doUpdate(Criteria criteria, Connection con)
+        throws TorqueException
+    {
+        Criteria selectCriteria = new Criteria(DATABASE_NAME, 2);
+        correctBooleans(criteria);
+
+  
+             selectCriteria.put(MAILBOX_ID, criteria.remove(MAILBOX_ID));
+      
+             selectCriteria.put(UID, criteria.remove(UID));
+      
+      
+      
+        setDbName(criteria);
+
+        if (con == null)
+        {
+            BasePeer.doUpdate(selectCriteria, criteria);
+        }
+        else
+        {
+            BasePeer.doUpdate(selectCriteria, criteria, con);
+        }
+    }
+
+    /**
+     * Method to do deletes.
+     *
+     * @param criteria object containing data that is used DELETE from database.
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+     public static void doDelete(Criteria criteria) throws TorqueException
+     {
+         MessageRowPeer
+            .doDelete(criteria, (Connection) null);
+     }
+
+    /**
+     * Method to do deletes.  This method is to be used during a transaction,
+     * otherwise use the doDelete(Criteria) method.  It will take care of
+     * the connection details internally.
+     *
+     * @param criteria object containing data that is used DELETE from database.
+     * @param con the connection to use
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+     public static void doDelete(Criteria criteria, Connection con)
+        throws TorqueException
+     {
+        correctBooleans(criteria);
+
+        setDbName(criteria);
+
+        if (con == null)
+        {
+            BasePeer.doDelete(criteria);
+        }
+        else
+        {
+            BasePeer.doDelete(criteria, con);
+        }
+     }
+
+    /**
+     * Method to do selects
+     *
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static List doSelect(MessageRow obj) throws TorqueException
+    {
+        return doSelect(buildSelectCriteria(obj));
+    }
+
+    /**
+     * Method to do inserts
+     *
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static void doInsert(MessageRow obj) throws TorqueException
+    {
+          doInsert(buildCriteria(obj));
+          obj.setNew(false);
+        obj.setModified(false);
+    }
+
+    /**
+     * @param obj the data object to update in the database.
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static void doUpdate(MessageRow obj) throws TorqueException
+    {
+        doUpdate(buildCriteria(obj));
+        obj.setModified(false);
+    }
+
+    /**
+     * @param obj the data object to delete in the database.
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static void doDelete(MessageRow obj) throws TorqueException
+    {
+        doDelete(buildSelectCriteria(obj));
+    }
+
+    /**
+     * Method to do inserts.  This method is to be used during a transaction,
+     * otherwise use the doInsert(MessageRow) method.  It will take
+     * care of the connection details internally.
+     *
+     * @param obj the data object to insert into the database.
+     * @param con the connection to use
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static void doInsert(MessageRow obj, Connection con)
+        throws TorqueException
+    {
+          doInsert(buildCriteria(obj), con);
+          obj.setNew(false);
+        obj.setModified(false);
+    }
+
+    /**
+     * Method to do update.  This method is to be used during a transaction,
+     * otherwise use the doUpdate(MessageRow) method.  It will take
+     * care of the connection details internally.
+     *
+     * @param obj the data object to update in the database.
+     * @param con the connection to use
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static void doUpdate(MessageRow obj, Connection con)
+        throws TorqueException
+    {
+        doUpdate(buildCriteria(obj), con);
+        obj.setModified(false);
+    }
+
+    /**
+     * Method to delete.  This method is to be used during a transaction,
+     * otherwise use the doDelete(MessageRow) method.  It will take
+     * care of the connection details internally.
+     *
+     * @param obj the data object to delete in the database.
+     * @param con the connection to use
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static void doDelete(MessageRow obj, Connection con)
+        throws TorqueException
+    {
+        doDelete(buildSelectCriteria(obj), con);
+    }
+
+    /**
+     * Method to do deletes.
+     *
+     * @param pk ObjectKey that is used DELETE from database.
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static void doDelete(ObjectKey pk) throws TorqueException
+    {
+        BaseMessageRowPeer
+           .doDelete(pk, (Connection) null);
+    }
+
+    /**
+     * Method to delete.  This method is to be used during a transaction,
+     * otherwise use the doDelete(ObjectKey) method.  It will take
+     * care of the connection details internally.
+     *
+     * @param pk the primary key for the object to delete in the database.
+     * @param con the connection to use
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static void doDelete(ObjectKey pk, Connection con)
+        throws TorqueException
+    {
+        doDelete(buildCriteria(pk), con);
+    }
+
+    /** Build a Criteria object from an ObjectKey */
+    public static Criteria buildCriteria( ObjectKey pk )
+    {
+        Criteria criteria = new Criteria();
+          SimpleKey[] keys = (SimpleKey[])pk.getValue();
+                    criteria.add(MAILBOX_ID, keys[0]);
+                      criteria.add(UID, keys[1]);
+                    return criteria;
+     }
+
+    /** Build a Criteria object from the data object for this peer */
+    public static Criteria buildCriteria( MessageRow obj )
+    {
+        Criteria criteria = new Criteria(DATABASE_NAME);
+              criteria.add(MAILBOX_ID, obj.getMailboxId());
+              criteria.add(UID, obj.getUid());
+              criteria.add(INTERNAL_DATE, obj.getInternalDate());
+              criteria.add(SIZE, obj.getSize());
+          return criteria;
+    }
+
+    /** Build a Criteria object from the data object for this peer, skipping all binary columns */
+    public static Criteria buildSelectCriteria( MessageRow obj )
+    {
+        Criteria criteria = new Criteria(DATABASE_NAME);
+                      criteria.add(MAILBOX_ID, obj.getMailboxId());
+                              criteria.add(UID, obj.getUid());
+                              criteria.add(INTERNAL_DATE, obj.getInternalDate());
+                              criteria.add(SIZE, obj.getSize());
+                  return criteria;
+    }
+ 
+    
+    
+    /**
+     * Retrieve a single object by pk
+     *
+     * @param pk the primary key
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     * @throws NoRowsException Primary key was not found in database.
+     * @throws TooManyRowsException Primary key was not found in database.
+     */
+    public static MessageRow retrieveByPK(ObjectKey pk)
+        throws TorqueException, NoRowsException, TooManyRowsException
+    {
+        Connection db = null;
+        MessageRow retVal = null;
+        try
+        {
+            db = Torque.getConnection(DATABASE_NAME);
+            retVal = retrieveByPK(pk, db);
+        }
+        finally
+        {
+            Torque.closeConnection(db);
+        }
+        return retVal;
+    }
+
+    /**
+     * Retrieve a single object by pk
+     *
+     * @param pk the primary key
+     * @param con the connection to use
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     * @throws NoRowsException Primary key was not found in database.
+     * @throws TooManyRowsException Primary key was not found in database.
+     */
+    public static MessageRow retrieveByPK(ObjectKey pk, Connection con)
+        throws TorqueException, NoRowsException, TooManyRowsException
+    {
+        Criteria criteria = buildCriteria(pk);
+        List v = doSelect(criteria, con);
+        if (v.size() == 0)
+        {
+            throw new NoRowsException("Failed to select a row.");
+        }
+        else if (v.size() > 1)
+        {
+            throw new TooManyRowsException("Failed to select only one row.");
+        }
+        else
+        {
+            return (MessageRow)v.get(0);
+        }
+    }
+
+    /**
+     * Retrieve a multiple objects by pk
+     *
+     * @param pks List of primary keys
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static List retrieveByPKs(List pks)
+        throws TorqueException
+    {
+        Connection db = null;
+        List retVal = null;
+        try
+        {
+           db = Torque.getConnection(DATABASE_NAME);
+           retVal = retrieveByPKs(pks, db);
+        }
+        finally
+        {
+            Torque.closeConnection(db);
+        }
+        return retVal;
+    }
+
+    /**
+     * Retrieve a multiple objects by pk
+     *
+     * @param pks List of primary keys
+     * @param dbcon the connection to use
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    public static List retrieveByPKs( List pks, Connection dbcon )
+        throws TorqueException
+    {
+        List objs = null;
+        if (pks == null || pks.size() == 0)
+        {
+            objs = new LinkedList();
+        }
+        else
+        {
+            Criteria criteria = new Criteria();
+              Iterator iter = pks.iterator();
+            while (iter.hasNext())
+            {
+                ObjectKey pk = (ObjectKey)iter.next();
+                SimpleKey[] keys = (SimpleKey[])pk.getValue();
+                            Criteria.Criterion c0 = criteria.getNewCriterion(
+                        MAILBOX_ID, keys[0], Criteria.EQUAL);
+                                    Criteria.Criterion c1 = criteria.getNewCriterion(
+                        UID, keys[1], Criteria.EQUAL);
+                                    c0.and(c1);
+                          criteria.or(c0);
+            }
+          objs = doSelect(criteria, dbcon);
+        }
+        return objs;
+    }
+
+ 
+    /**
+     * retrieve object using using pk values.
+     *
+       * @param mailbox_id long
+       * @param uid long
+       */
+    public static MessageRow retrieveByPK(
+       long mailbox_id
+          , long uid
+              ) throws TorqueException
+    {
+        Connection db = null;
+        MessageRow retVal = null;
+        try
+        {
+           db = Torque.getConnection(DATABASE_NAME);
+           retVal = retrieveByPK(
+         mailbox_id
+          , uid
+                     , db);
+        }
+        finally
+        {
+            Torque.closeConnection(db);
+        }
+        return retVal;
+    }
+
+      /**
+     * retrieve object using using pk values.
+     *
+       * @param mailbox_id long
+       * @param uid long
+       * @param con Connection
+     */
+    public static MessageRow retrieveByPK(
+       long mailbox_id
+          , long uid
+             ,Connection con) throws TorqueException
+    {
+
+        Criteria criteria = new Criteria(5);
+          criteria.add(MAILBOX_ID, mailbox_id);
+          criteria.add(UID, uid);
+          List v = doSelect(criteria, con);
+        if (v.size() == 1)
+        {
+            return (MessageRow) v.get(0);
+        }
+        else
+        {
+            throw new TorqueException("Failed to select one and only one row.");
+        }
+    }
+
+
+
+          
+                                              
+                
+                
+
+    /**
+     * selects a collection of MessageRow objects pre-filled with their
+     * MailboxRow objects.
+     *
+     * This method is protected by default in order to keep the public
+     * api reasonable.  You can provide public methods for those you
+     * actually need in MessageRowPeer.
+     *
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    protected static List doSelectJoinMailboxRow(Criteria criteria)
+        throws TorqueException
+    {
+        return doSelectJoinMailboxRow(criteria, null);
+    }
+
+    /**
+     * selects a collection of MessageRow objects pre-filled with their
+     * MailboxRow objects.
+     *
+     * This method is protected by default in order to keep the public
+     * api reasonable.  You can provide public methods for those you
+     * actually need in MessageRowPeer.
+     *
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    protected static List doSelectJoinMailboxRow(Criteria criteria, Connection conn)
+        throws TorqueException
+    {
+        setDbName(criteria);
+
+        MessageRowPeer.addSelectColumns(criteria);
+        int offset = numColumns + 1;
+        MailboxRowPeer.addSelectColumns(criteria);
+
+
+                        criteria.addJoin(MessageRowPeer.MAILBOX_ID,
+            MailboxRowPeer.MAILBOX_ID);
+        
+        correctBooleans(criteria);
+
+        List rows;
+        if (conn == null)
+        {
+            rows = BasePeer.doSelect(criteria);
+        }
+        else
+        {
+            rows = BasePeer.doSelect(criteria,conn);
+        }
+
+        List results = new ArrayList();
+
+        for (int i = 0; i < rows.size(); i++)
+        {
+            Record row = (Record) rows.get(i);
+
+                            Class omClass = MessageRowPeer.getOMClass();
+                    MessageRow obj1 = (MessageRow) MessageRowPeer
+                .row2Object(row, 1, omClass);
+                     omClass = MailboxRowPeer.getOMClass();
+                    MailboxRow obj2 = (MailboxRow)MailboxRowPeer
+                .row2Object(row, offset, omClass);
+
+            boolean newObject = true;
+            for (int j = 0; j < results.size(); j++)
+            {
+                MessageRow temp_obj1 = (MessageRow)results.get(j);
+                MailboxRow temp_obj2 = (MailboxRow)temp_obj1.getMailboxRow();
+                if (temp_obj2.getPrimaryKey().equals(obj2.getPrimaryKey()))
+                {
+                    newObject = false;
+                              temp_obj2.addMessageRow(obj1);
+                              break;
+                }
+            }
+                      if (newObject)
+            {
+                obj2.initMessageRows();
+                obj2.addMessageRow(obj1);
+            }
+                      results.add(obj1);
+        }
+        return results;
+    }
+                    
+  
+    
+  
+      /**
+     * Returns the TableMap related to this peer.  This method is not
+     * needed for general use but a specific application could have a need.
+     *
+     * @throws TorqueException Any exceptions caught during processing will be
+     *         rethrown wrapped into a TorqueException.
+     */
+    protected static TableMap getTableMap()
+        throws TorqueException
+    {
+        return Torque.getDatabaseMap(DATABASE_NAME).getTable(TABLE_NAME);
+    }
+   
+    private static void setDbName(Criteria crit)
+    {
+        // Set the correct dbName if it has not been overridden
+        // crit.getDbName will return the same object if not set to
+        // another value so == check is okay and faster
+        if (crit.getDbName() == Torque.getDefaultDB())
+        {
+            crit.setDbName(DATABASE_NAME);
+        }
+    }
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MailboxRow.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MailboxRow.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MailboxRow.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MailboxRow.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,91 @@
+package org.apache.james.mailboxmanager.torque.om;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.List;
+
+import javax.mail.Flags;
+
+import org.apache.torque.TorqueException;
+import org.apache.torque.om.Persistent;
+import org.apache.torque.util.Criteria;
+import org.apache.torque.util.Transaction;
+
+import com.workingdogs.village.DataSetException;
+import com.workingdogs.village.Record;
+
+/**
+ * The skeleton for this class was autogenerated by Torque on:
+ * 
+ * [Wed Sep 06 08:50:08 CEST 2006]
+ * 
+ * You should add additional methods to this class to meet the application
+ * requirements. This class will only be generated as long as it does not
+ * already exist in the output directory.
+ */
+public class MailboxRow extends
+        org.apache.james.mailboxmanager.torque.om.BaseMailboxRow implements
+        Persistent {
+
+	private static final long serialVersionUID = -8207690877715465485L;
+
+	public MailboxRow(String string, long uidValidity) {
+        this();
+        setName(string);
+        setUidValidity(uidValidity);
+    }
+
+    public MailboxRow() {
+        super();
+    }
+
+    public MailboxRow consumeNextUid() throws SQLException, TorqueException {
+        Connection c = Transaction.begin(MailboxRowPeer.DATABASE_NAME);
+        int ti = c.getTransactionIsolation();
+        boolean ac = c.getAutoCommit();
+        c.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
+        c.setAutoCommit(false);
+        try {
+            String sql = "UPDATE " + MailboxRowPeer.TABLE_NAME + " set "
+                    + MailboxRowPeer.LAST_UID + " = " + MailboxRowPeer.LAST_UID
+                    + "+1 WHERE " + MailboxRowPeer.MAILBOX_ID + " = "
+                    + getMailboxId();
+            MailboxRowPeer.executeStatement(sql, c);
+            MailboxRow mr = MailboxRowPeer.retrieveByPK(getMailboxId(), c);
+            Transaction.commit(c);
+            return mr;
+        } catch (TorqueException e) {
+            Transaction.safeRollback(c);
+            throw e;
+        } finally {
+            try {
+                c.setTransactionIsolation(ti);
+                c.setAutoCommit(ac);
+            } catch (Exception e) {
+            }
+        }
+
+    }
+
+    public int countMessages() throws TorqueException, DataSetException {
+        return countMessages(new Flags(), true);
+    }
+
+    public int countMessages(Flags flags, boolean value)
+            throws TorqueException, DataSetException {
+        Criteria criteria = new Criteria();
+        criteria.addSelectColumn(" COUNT(" + MessageRowPeer.UID + ") ");
+        criteria.add(MessageRowPeer.MAILBOX_ID, getMailboxId());
+        if (flags.getSystemFlags().length > 0) {
+            criteria.add(MessageFlagsPeer.MAILBOX_ID, getMailboxId());
+            criteria.addJoin(MessageRowPeer.UID, MessageFlagsPeer.UID);
+            MessageFlagsPeer.addFlagsToCriteria(flags, value, criteria);
+        }
+        List result = MessageRowPeer.doSelectVillageRecords(criteria);
+        Record record = (Record) result.get(0);
+        int numberOfRecords = record.getValue(1).asInt();
+        return numberOfRecords;
+    }
+
+
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MailboxRowPeer.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MailboxRowPeer.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MailboxRowPeer.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MailboxRowPeer.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,52 @@
+package org.apache.james.mailboxmanager.torque.om;
+
+import java.sql.Connection;
+import java.util.List;
+
+import org.apache.torque.TorqueException;
+import org.apache.torque.util.Criteria;
+
+/**
+ * The skeleton for this class was autogenerated by Torque on:
+ * 
+ * [Wed Sep 06 08:50:08 CEST 2006]
+ * 
+ * You should add additional methods to this class to meet the application
+ * requirements. This class will only be generated as long as it does not
+ * already exist in the output directory.
+ */
+public class MailboxRowPeer extends
+        org.apache.james.mailboxmanager.torque.om.BaseMailboxRowPeer {
+
+
+	private static final long serialVersionUID = -1906212927584890188L;
+
+	public static MailboxRow retrieveByName(String name) throws TorqueException {
+        Criteria c = new Criteria();
+        c.add(MailboxRowPeer.NAME, name);
+        List l = MailboxRowPeer.doSelect(c);
+        if (l.size() == 0) {
+            return null;
+        } else if (l.size() == 1) {
+            return (MailboxRow) l.get(0);
+        } else {
+            throw new TorqueException("More than 1 Mailbox found");
+        }
+    }
+
+    public static void doInsert(MailboxRow obj) throws TorqueException {
+        // obj.setPrimaryKey(doInsert(buildCriteria(obj)));
+        doInsert(buildCriteria(obj));
+        obj.setNew(false);
+        obj.setModified(false);
+    }
+
+    public static void doInsert(MailboxRow obj, Connection con)
+            throws TorqueException {
+        // obj.setPrimaryKey(doInsert(buildCriteria(obj), con));
+        doInsert(buildCriteria(obj), con);
+        obj.setNew(false);
+        obj.setModified(false);
+    }
+
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageBody.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageBody.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageBody.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageBody.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,22 @@
+
+package org.apache.james.mailboxmanager.torque.om;
+
+
+import org.apache.torque.om.Persistent;
+
+/**
+ * The skeleton for this class was autogenerated by Torque on:
+ *
+ * [Tue Sep 05 21:34:06 CEST 2006]
+ *
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ */
+public  class MessageBody
+    extends org.apache.james.mailboxmanager.torque.om.BaseMessageBody
+    implements Persistent
+{
+
+	private static final long serialVersionUID = -1304530949913525943L;
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageBodyPeer.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageBodyPeer.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageBodyPeer.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageBodyPeer.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,20 @@
+package org.apache.james.mailboxmanager.torque.om;
+
+/**
+ * The skeleton for this class was autogenerated by Torque on:
+ *
+ * [Tue Sep 05 21:34:06 CEST 2006]
+ *
+ *  You should add additional methods to this class to meet the
+ *  application requirements.  This class will only be generated as
+ *  long as it does not already exist in the output directory.
+ */
+public class MessageBodyPeer
+    extends org.apache.james.mailboxmanager.torque.om.BaseMessageBodyPeer
+{
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -6885801687990340939L;
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageFlags.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageFlags.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageFlags.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageFlags.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,57 @@
+
+package org.apache.james.mailboxmanager.torque.om;
+
+
+import javax.mail.Flags;
+
+import org.apache.torque.om.Persistent;
+
+/**
+ * The skeleton for this class was autogenerated by Torque on:
+ *
+ * [Wed Sep 06 19:48:03 CEST 2006]
+ *
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ */
+public  class MessageFlags
+    extends org.apache.james.mailboxmanager.torque.om.BaseMessageFlags
+    implements Persistent
+{
+	private static final long serialVersionUID = -7426028860085278304L;
+
+
+    public void setFlags(Flags flags) {
+        setAnswered(flags.contains(Flags.Flag.ANSWERED));
+        setDeleted(flags.contains(Flags.Flag.DELETED));
+        setDraft(flags.contains(Flags.Flag.DRAFT));
+        setFlagged(flags.contains(Flags.Flag.FLAGGED));
+        setRecent(flags.contains(Flags.Flag.RECENT));
+        setSeen(flags.contains(Flags.Flag.SEEN));
+    }
+    
+    public Flags getFlagsObject() {
+        Flags flags=new Flags();
+
+        if (getAnswered()) {
+            flags.add(Flags.Flag.ANSWERED);
+        }
+        if (getDeleted()) {
+            flags.add(Flags.Flag.DELETED);
+        }
+        if (getDraft()) {
+            flags.add(Flags.Flag.DRAFT);
+        }
+        if (getFlagged()) {
+            flags.add(Flags.Flag.FLAGGED);
+        }
+        if (getRecent()) {
+            flags.add(Flags.Flag.RECENT);
+        }
+        if (getSeen()) {
+            flags.add(Flags.Flag.SEEN);
+        }
+        return flags;
+    }
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageFlagsPeer.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageFlagsPeer.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageFlagsPeer.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageFlagsPeer.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,45 @@
+package org.apache.james.mailboxmanager.torque.om;
+
+import javax.mail.Flags;
+
+import org.apache.torque.util.Criteria;
+
+/**
+ * The skeleton for this class was autogenerated by Torque on:
+ *
+ * [Wed Sep 06 19:48:03 CEST 2006]
+ *
+ *  You should add additional methods to this class to meet the
+ *  application requirements.  This class will only be generated as
+ *  long as it does not already exist in the output directory.
+ */
+public class MessageFlagsPeer
+    extends org.apache.james.mailboxmanager.torque.om.BaseMessageFlagsPeer
+{
+    
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 4709341310937090513L;
+
+	public static void addFlagsToCriteria(Flags flags,boolean value,Criteria c) {
+        if (flags.contains(Flags.Flag.ANSWERED)) {
+            c.add(ANSWERED,value);
+        }
+        if (flags.contains(Flags.Flag.DELETED)) {
+            c.add(DELETED,value);
+        }
+        if (flags.contains(Flags.Flag.DRAFT)) {
+            c.add(DRAFT,value);
+        }
+        if (flags.contains(Flags.Flag.FLAGGED)) {
+            c.add(FLAGGED,value);
+        }
+        if (flags.contains(Flags.Flag.RECENT)) {
+            c.add(RECENT,value);
+        }
+        if (flags.contains(Flags.Flag.SEEN)) {
+            c.add(SEEN,value);
+        }
+    }
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageHeader.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageHeader.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageHeader.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageHeader.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,25 @@
+
+package org.apache.james.mailboxmanager.torque.om;
+
+
+import org.apache.torque.om.Persistent;
+
+/**
+ * The skeleton for this class was autogenerated by Torque on:
+ *
+ * [Tue Sep 05 21:34:06 CEST 2006]
+ *
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ */
+public  class MessageHeader
+    extends org.apache.james.mailboxmanager.torque.om.BaseMessageHeader
+    implements Persistent
+{
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -9191792349506771474L;
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageHeaderPeer.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageHeaderPeer.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageHeaderPeer.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageHeaderPeer.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,20 @@
+package org.apache.james.mailboxmanager.torque.om;
+
+/**
+ * The skeleton for this class was autogenerated by Torque on:
+ *
+ * [Tue Sep 05 21:34:06 CEST 2006]
+ *
+ *  You should add additional methods to this class to meet the
+ *  application requirements.  This class will only be generated as
+ *  long as it does not already exist in the output directory.
+ */
+public class MessageHeaderPeer
+    extends org.apache.james.mailboxmanager.torque.om.BaseMessageHeaderPeer
+{
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -4865363319883905760L;
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageRow.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageRow.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageRow.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageRow.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,37 @@
+
+package org.apache.james.mailboxmanager.torque.om;
+
+
+import java.util.List;
+
+import org.apache.torque.TorqueException;
+import org.apache.torque.om.Persistent;
+
+/**
+ * The skeleton for this class was autogenerated by Torque on:
+ *
+ * [Wed Sep 06 11:15:19 CEST 2006]
+ *
+ * You should add additional methods to this class to meet the
+ * application requirements.  This class will only be generated as
+ * long as it does not already exist in the output directory.
+ */
+public  class MessageRow
+    extends org.apache.james.mailboxmanager.torque.om.BaseMessageRow
+    implements Persistent
+{
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = -75081490028686786L;
+
+	public MessageFlags getMessageFlags() throws TorqueException {
+        MessageFlags mf =null;
+        List l = getMessageFlagss();
+        if (l.size()==1) {
+            mf=(MessageFlags)l.get(0);
+        }
+        return mf;
+    }
+
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageRowPeer.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageRowPeer.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageRowPeer.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/MessageRowPeer.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,23 @@
+package org.apache.james.mailboxmanager.torque.om;
+
+
+/**
+ * The skeleton for this class was autogenerated by Torque on:
+ * 
+ * [Wed Sep 06 11:15:19 CEST 2006]
+ * 
+ * You should add additional methods to this class to meet the application
+ * requirements. This class will only be generated as long as it does not
+ * already exist in the output directory.
+ */
+public class MessageRowPeer extends
+        org.apache.james.mailboxmanager.torque.om.BaseMessageRowPeer {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1708650986440774692L;
+
+
+
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MailboxMapBuilder.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MailboxMapBuilder.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MailboxMapBuilder.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MailboxMapBuilder.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,72 @@
+package org.apache.james.mailboxmanager.torque.om.map;
+
+import org.apache.torque.Torque;
+import org.apache.torque.TorqueException;
+import org.apache.torque.map.DatabaseMap;
+import org.apache.torque.map.MapBuilder;
+import org.apache.torque.map.TableMap;
+
+/**
+  *  This class was autogenerated by Torque on:
+  *
+  * [Tue Sep 05 21:34:06 CEST 2006]
+  *
+  */
+public class MailboxMapBuilder implements MapBuilder
+{
+    /**
+     * The name of this class
+     */
+    public static final String CLASS_NAME =
+        "org.apache.james.mailboxmanager.torque.om.map.MailboxMapBuilder";
+
+    /**
+     * The database map.
+     */
+    private DatabaseMap dbMap = null;
+
+    /**
+     * Tells us if this DatabaseMapBuilder is built so that we
+     * don't have to re-build it every time.
+     *
+     * @return true if this DatabaseMapBuilder is built
+     */
+    public boolean isBuilt()
+    {
+        return (dbMap != null);
+    }
+
+    /**
+     * Gets the databasemap this map builder built.
+     *
+     * @return the databasemap
+     */
+    public DatabaseMap getDatabaseMap()
+    {
+        return this.dbMap;
+    }
+
+    /**
+     * The doBuild() method builds the DatabaseMap
+     *
+     * @throws TorqueException
+     */
+    public void doBuild() throws TorqueException
+    {
+        dbMap = Torque.getDatabaseMap("mailboxmanager");
+
+        dbMap.addTable("mailbox");
+        TableMap tMap = dbMap.getTable("mailbox");
+
+        tMap.setPrimaryKeyMethod(TableMap.NATIVE);
+
+        tMap.setPrimaryKeyMethodInfo("mailbox");
+
+              tMap.addPrimaryKey("mailbox.MAILBOX_ID", new Long(0) );
+                        	          tMap.addColumn("mailbox.NAME", "", 255 );
+                                        tMap.addColumn("mailbox.UID_VALIDITY", new Long(0) );
+                                tMap.addColumn("mailbox.LAST_UID", new Long(0) );
+                                tMap.addColumn("mailbox.MESSAGE_COUNT", new Integer(0) );
+                                tMap.addColumn("mailbox.SIZE", new Long(0) );
+                }
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MailboxRowMapBuilder.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MailboxRowMapBuilder.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MailboxRowMapBuilder.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MailboxRowMapBuilder.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,75 @@
+package org.apache.james.mailboxmanager.torque.om.map;
+
+import java.util.Date;
+import java.math.BigDecimal;
+
+import org.apache.torque.Torque;
+import org.apache.torque.TorqueException;
+import org.apache.torque.map.MapBuilder;
+import org.apache.torque.map.DatabaseMap;
+import org.apache.torque.map.TableMap;
+
+/**
+  *  This class was autogenerated by Torque on:
+  *
+  * [Tue Sep 19 10:06:28 CEST 2006]
+  *
+  */
+public class MailboxRowMapBuilder implements MapBuilder
+{
+    /**
+     * The name of this class
+     */
+    public static final String CLASS_NAME =
+        "org.apache.james.mailboxmanager.torque.om.map.MailboxRowMapBuilder";
+
+    /**
+     * The database map.
+     */
+    private DatabaseMap dbMap = null;
+
+    /**
+     * Tells us if this DatabaseMapBuilder is built so that we
+     * don't have to re-build it every time.
+     *
+     * @return true if this DatabaseMapBuilder is built
+     */
+    public boolean isBuilt()
+    {
+        return (dbMap != null);
+    }
+
+    /**
+     * Gets the databasemap this map builder built.
+     *
+     * @return the databasemap
+     */
+    public DatabaseMap getDatabaseMap()
+    {
+        return this.dbMap;
+    }
+
+    /**
+     * The doBuild() method builds the DatabaseMap
+     *
+     * @throws TorqueException
+     */
+    public void doBuild() throws TorqueException
+    {
+        dbMap = Torque.getDatabaseMap("mailboxmanager");
+
+        dbMap.addTable("mailbox");
+        TableMap tMap = dbMap.getTable("mailbox");
+
+        tMap.setPrimaryKeyMethod(TableMap.NATIVE);
+
+        tMap.setPrimaryKeyMethodInfo("mailbox");
+
+              tMap.addPrimaryKey("mailbox.MAILBOX_ID", new Long(0) );
+                        	          tMap.addColumn("mailbox.NAME", "", 255 );
+                                        tMap.addColumn("mailbox.UID_VALIDITY", new Long(0) );
+                                tMap.addColumn("mailbox.LAST_UID", new Long(0) );
+                                tMap.addColumn("mailbox.MESSAGE_COUNT", new Integer(0) );
+                                tMap.addColumn("mailbox.SIZE", new Long(0) );
+                }
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageBodyMapBuilder.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageBodyMapBuilder.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageBodyMapBuilder.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageBodyMapBuilder.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,75 @@
+package org.apache.james.mailboxmanager.torque.om.map;
+
+import java.util.Date;
+import java.math.BigDecimal;
+
+import org.apache.torque.Torque;
+import org.apache.torque.TorqueException;
+import org.apache.torque.map.MapBuilder;
+import org.apache.torque.map.DatabaseMap;
+import org.apache.torque.map.TableMap;
+
+/**
+  *  This class was autogenerated by Torque on:
+  *
+  * [Tue Sep 19 10:06:28 CEST 2006]
+  *
+  */
+public class MessageBodyMapBuilder implements MapBuilder
+{
+    /**
+     * The name of this class
+     */
+    public static final String CLASS_NAME =
+        "org.apache.james.mailboxmanager.torque.om.map.MessageBodyMapBuilder";
+
+    /**
+     * The database map.
+     */
+    private DatabaseMap dbMap = null;
+
+    /**
+     * Tells us if this DatabaseMapBuilder is built so that we
+     * don't have to re-build it every time.
+     *
+     * @return true if this DatabaseMapBuilder is built
+     */
+    public boolean isBuilt()
+    {
+        return (dbMap != null);
+    }
+
+    /**
+     * Gets the databasemap this map builder built.
+     *
+     * @return the databasemap
+     */
+    public DatabaseMap getDatabaseMap()
+    {
+        return this.dbMap;
+    }
+
+    /**
+     * The doBuild() method builds the DatabaseMap
+     *
+     * @throws TorqueException
+     */
+    public void doBuild() throws TorqueException
+    {
+        dbMap = Torque.getDatabaseMap("mailboxmanager");
+
+        dbMap.addTable("message_body");
+        TableMap tMap = dbMap.getTable("message_body");
+
+        tMap.setPrimaryKeyMethod("none");
+
+
+              tMap.addForeignPrimaryKey(
+                "message_body.MAILBOX_ID", new Long(0) , "message" ,
+                "mailbox_id");
+                    tMap.addForeignPrimaryKey(
+                "message_body.UID", new Long(0) , "message" ,
+                "uid");
+                          tMap.addColumn("message_body.BODY", new Object() );
+                }
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageFlagsMapBuilder.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageFlagsMapBuilder.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageFlagsMapBuilder.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageFlagsMapBuilder.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,80 @@
+package org.apache.james.mailboxmanager.torque.om.map;
+
+import java.util.Date;
+import java.math.BigDecimal;
+
+import org.apache.torque.Torque;
+import org.apache.torque.TorqueException;
+import org.apache.torque.map.MapBuilder;
+import org.apache.torque.map.DatabaseMap;
+import org.apache.torque.map.TableMap;
+
+/**
+  *  This class was autogenerated by Torque on:
+  *
+  * [Tue Sep 19 10:06:28 CEST 2006]
+  *
+  */
+public class MessageFlagsMapBuilder implements MapBuilder
+{
+    /**
+     * The name of this class
+     */
+    public static final String CLASS_NAME =
+        "org.apache.james.mailboxmanager.torque.om.map.MessageFlagsMapBuilder";
+
+    /**
+     * The database map.
+     */
+    private DatabaseMap dbMap = null;
+
+    /**
+     * Tells us if this DatabaseMapBuilder is built so that we
+     * don't have to re-build it every time.
+     *
+     * @return true if this DatabaseMapBuilder is built
+     */
+    public boolean isBuilt()
+    {
+        return (dbMap != null);
+    }
+
+    /**
+     * Gets the databasemap this map builder built.
+     *
+     * @return the databasemap
+     */
+    public DatabaseMap getDatabaseMap()
+    {
+        return this.dbMap;
+    }
+
+    /**
+     * The doBuild() method builds the DatabaseMap
+     *
+     * @throws TorqueException
+     */
+    public void doBuild() throws TorqueException
+    {
+        dbMap = Torque.getDatabaseMap("mailboxmanager");
+
+        dbMap.addTable("message_flags");
+        TableMap tMap = dbMap.getTable("message_flags");
+
+        tMap.setPrimaryKeyMethod("none");
+
+
+              tMap.addForeignPrimaryKey(
+                "message_flags.MAILBOX_ID", new Long(0) , "message" ,
+                "mailbox_id");
+                    tMap.addForeignPrimaryKey(
+                "message_flags.UID", new Long(0) , "message" ,
+                "uid");
+                          tMap.addColumn("message_flags.ANSWERED", new Integer(0) );
+                                tMap.addColumn("message_flags.DELETED", new Integer(0) );
+                                tMap.addColumn("message_flags.DRAFT", new Integer(0) );
+                                tMap.addColumn("message_flags.FLAGGED", new Integer(0) );
+                                tMap.addColumn("message_flags.RECENT", new Integer(0) );
+                                tMap.addColumn("message_flags.SEEN", new Integer(0) );
+                }
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageHeaderMapBuilder.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageHeaderMapBuilder.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageHeaderMapBuilder.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageHeaderMapBuilder.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,77 @@
+package org.apache.james.mailboxmanager.torque.om.map;
+
+import java.util.Date;
+import java.math.BigDecimal;
+
+import org.apache.torque.Torque;
+import org.apache.torque.TorqueException;
+import org.apache.torque.map.MapBuilder;
+import org.apache.torque.map.DatabaseMap;
+import org.apache.torque.map.TableMap;
+
+/**
+  *  This class was autogenerated by Torque on:
+  *
+  * [Tue Sep 19 10:06:28 CEST 2006]
+  *
+  */
+public class MessageHeaderMapBuilder implements MapBuilder
+{
+    /**
+     * The name of this class
+     */
+    public static final String CLASS_NAME =
+        "org.apache.james.mailboxmanager.torque.om.map.MessageHeaderMapBuilder";
+
+    /**
+     * The database map.
+     */
+    private DatabaseMap dbMap = null;
+
+    /**
+     * Tells us if this DatabaseMapBuilder is built so that we
+     * don't have to re-build it every time.
+     *
+     * @return true if this DatabaseMapBuilder is built
+     */
+    public boolean isBuilt()
+    {
+        return (dbMap != null);
+    }
+
+    /**
+     * Gets the databasemap this map builder built.
+     *
+     * @return the databasemap
+     */
+    public DatabaseMap getDatabaseMap()
+    {
+        return this.dbMap;
+    }
+
+    /**
+     * The doBuild() method builds the DatabaseMap
+     *
+     * @throws TorqueException
+     */
+    public void doBuild() throws TorqueException
+    {
+        dbMap = Torque.getDatabaseMap("mailboxmanager");
+
+        dbMap.addTable("message_header");
+        TableMap tMap = dbMap.getTable("message_header");
+
+        tMap.setPrimaryKeyMethod("none");
+
+
+              tMap.addForeignPrimaryKey(
+                "message_header.MAILBOX_ID", new Long(0) , "message" ,
+                "mailbox_id");
+                    tMap.addForeignPrimaryKey(
+                "message_header.UID", new Long(0) , "message" ,
+                "uid");
+                    tMap.addPrimaryKey("message_header.LINE_NUMBER", new Integer(0) );
+                        	          tMap.addColumn("message_header.FIELD", "", 256 );
+                                      	          tMap.addColumn("message_header.VALUE", "", 1024 );
+                        }
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageMapBuilder.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageMapBuilder.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageMapBuilder.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageMapBuilder.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,73 @@
+package org.apache.james.mailboxmanager.torque.om.map;
+
+import java.util.Date;
+
+import org.apache.torque.Torque;
+import org.apache.torque.TorqueException;
+import org.apache.torque.map.DatabaseMap;
+import org.apache.torque.map.MapBuilder;
+import org.apache.torque.map.TableMap;
+
+/**
+  *  This class was autogenerated by Torque on:
+  *
+  * [Wed Sep 06 08:50:08 CEST 2006]
+  *
+  */
+public class MessageMapBuilder implements MapBuilder
+{
+    /**
+     * The name of this class
+     */
+    public static final String CLASS_NAME =
+        "org.apache.james.mailboxmanager.torque.om.map.MessageMapBuilder";
+
+    /**
+     * The database map.
+     */
+    private DatabaseMap dbMap = null;
+
+    /**
+     * Tells us if this DatabaseMapBuilder is built so that we
+     * don't have to re-build it every time.
+     *
+     * @return true if this DatabaseMapBuilder is built
+     */
+    public boolean isBuilt()
+    {
+        return (dbMap != null);
+    }
+
+    /**
+     * Gets the databasemap this map builder built.
+     *
+     * @return the databasemap
+     */
+    public DatabaseMap getDatabaseMap()
+    {
+        return this.dbMap;
+    }
+
+    /**
+     * The doBuild() method builds the DatabaseMap
+     *
+     * @throws TorqueException
+     */
+    public void doBuild() throws TorqueException
+    {
+        dbMap = Torque.getDatabaseMap("mailboxmanager");
+
+        dbMap.addTable("message");
+        TableMap tMap = dbMap.getTable("message");
+
+        tMap.setPrimaryKeyMethod("none");
+
+
+              tMap.addForeignPrimaryKey(
+                "message.MAILBOX_ID", new Long(0) , "mailbox" ,
+                "mailbox_id");
+                    tMap.addPrimaryKey("message.UID", new Long(0) );
+                          tMap.addColumn("message.FLAGS", new Integer(0) );
+                                tMap.addColumn("message.INTERNAL_DATE", new Date() );
+                }
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageRowMapBuilder.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageRowMapBuilder.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageRowMapBuilder.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/torque/om/map/MessageRowMapBuilder.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,74 @@
+package org.apache.james.mailboxmanager.torque.om.map;
+
+import java.util.Date;
+import java.math.BigDecimal;
+
+import org.apache.torque.Torque;
+import org.apache.torque.TorqueException;
+import org.apache.torque.map.MapBuilder;
+import org.apache.torque.map.DatabaseMap;
+import org.apache.torque.map.TableMap;
+
+/**
+  *  This class was autogenerated by Torque on:
+  *
+  * [Tue Sep 19 10:06:28 CEST 2006]
+  *
+  */
+public class MessageRowMapBuilder implements MapBuilder
+{
+    /**
+     * The name of this class
+     */
+    public static final String CLASS_NAME =
+        "org.apache.james.mailboxmanager.torque.om.map.MessageRowMapBuilder";
+
+    /**
+     * The database map.
+     */
+    private DatabaseMap dbMap = null;
+
+    /**
+     * Tells us if this DatabaseMapBuilder is built so that we
+     * don't have to re-build it every time.
+     *
+     * @return true if this DatabaseMapBuilder is built
+     */
+    public boolean isBuilt()
+    {
+        return (dbMap != null);
+    }
+
+    /**
+     * Gets the databasemap this map builder built.
+     *
+     * @return the databasemap
+     */
+    public DatabaseMap getDatabaseMap()
+    {
+        return this.dbMap;
+    }
+
+    /**
+     * The doBuild() method builds the DatabaseMap
+     *
+     * @throws TorqueException
+     */
+    public void doBuild() throws TorqueException
+    {
+        dbMap = Torque.getDatabaseMap("mailboxmanager");
+
+        dbMap.addTable("message");
+        TableMap tMap = dbMap.getTable("message");
+
+        tMap.setPrimaryKeyMethod("none");
+
+
+              tMap.addForeignPrimaryKey(
+                "message.MAILBOX_ID", new Long(0) , "mailbox" ,
+                "mailbox_id");
+                    tMap.addPrimaryKey("message.UID", new Long(0) );
+                          tMap.addColumn("message.INTERNAL_DATE", new Date() );
+                                tMap.addColumn("message.SIZE", new Integer(0) );
+                }
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/tracking/MailboxCache.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/tracking/MailboxCache.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/tracking/MailboxCache.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/tracking/MailboxCache.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,51 @@
+package org.apache.james.mailboxmanager.tracking;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class MailboxCache {
+    
+    private Map trackers=new HashMap();
+
+    public synchronized MailboxTracker getMailboxTracker(String mailboxName, Class trackerClass) {
+        MailboxTracker tracker=(MailboxTracker) trackers.get(mailboxName);
+        if (tracker!=null) {
+            if (!tracker.getClass().equals(trackerClass)) {
+                tracker.signalDeletion();
+                trackers.remove(mailboxName);
+                tracker=null;
+            }
+        }
+        return tracker;
+    }
+
+    public synchronized void notFound(String mailboxName) {
+        MailboxTracker tracker=(MailboxTracker) trackers.get(mailboxName);
+        if (tracker!=null) {
+            tracker.signalDeletion();
+            trackers.remove(mailboxName);
+        }
+    }
+
+    public synchronized void add(String mailboxName, MailboxTracker tracker) {
+        trackers.put(mailboxName,tracker);
+    }
+
+    public synchronized void unused(MailboxTracker tracker) {
+        trackers.remove(tracker.getMailboxName());
+    }
+
+	public synchronized void renamed(String origName, String newName) {
+		MailboxTracker tracker=(MailboxTracker) trackers.get(origName);
+		if (tracker!=null) {
+			// is there already a tracker at the new position??
+			notFound(newName);
+			trackers.remove(origName);
+			trackers.put(newName, tracker);
+			tracker.signalRename(newName);
+		}
+		notFound(origName);
+	}
+
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/tracking/MailboxTracker.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/tracking/MailboxTracker.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/tracking/MailboxTracker.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/tracking/MailboxTracker.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,55 @@
+package org.apache.james.mailboxmanager.tracking;
+
+import org.apache.james.mailboxmanager.MailboxListener;
+import org.apache.james.mailboxmanager.impl.MailboxEventDispatcher;
+
+public class MailboxTracker {
+    
+    protected String mailboxName;
+    
+    private MailboxCache mailboxCache;
+    
+    protected MailboxEventDispatcher eventDispatcher=new MailboxEventDispatcher();
+    
+	private boolean existing;
+
+    public MailboxTracker(MailboxCache mailboxCache, String mailboxName) {
+        this.mailboxName=mailboxName;
+        this.mailboxCache=mailboxCache;
+    }
+
+    public String getMailboxName() {
+        return mailboxName;
+    }
+
+    public void signalDeletion() {
+        eventDispatcher.mailboxDeleted();
+        existing=false;
+    }
+    
+    public void addMailboxListener(MailboxListener subject) {
+        eventDispatcher.addMailboxListener(subject);
+    }
+    
+    public void removeMailboxListener(MailboxListener subject) {
+        eventDispatcher.removeMailboxListener(subject); 
+        if (eventDispatcher.size()==0) {
+            mailboxCache.unused(this);
+        }
+    }
+    
+	public void mailboxNotFound() {
+		mailboxCache.notFound(getMailboxName());
+		existing=false;
+	}
+
+	public boolean isExisting() {
+		return existing;
+	}
+
+	public void signalRename(String newName) {
+        eventDispatcher.mailboxRenamed(mailboxName, newName);
+        mailboxName=newName;
+	}
+
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/tracking/UidChangeTracker.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/tracking/UidChangeTracker.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/tracking/UidChangeTracker.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/tracking/UidChangeTracker.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,135 @@
+package org.apache.james.mailboxmanager.tracking;
+
+import java.util.Iterator;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+import javax.mail.Flags;
+
+import org.apache.james.mailboxmanager.Constants;
+import org.apache.james.mailboxmanager.MailboxListener;
+import org.apache.james.mailboxmanager.MessageResult;
+import org.apache.james.mailboxmanager.impl.MessageResultImpl;
+
+/**
+ * 
+ * 
+ * @author Joachim
+ * 
+ */
+public class UidChangeTracker extends MailboxTracker implements Constants {
+
+	private TreeMap cache = new TreeMap();
+
+	private long lastUidAtStart;
+
+	private long lastUid;
+
+	private long lastScannedUid = 0;
+
+	public UidChangeTracker(MailboxCache mailboxCache, String mailboxName,
+			long lastUid) {
+		super(mailboxCache, mailboxName);
+		this.lastUidAtStart = lastUid;
+		this.lastUid = lastUid;
+	}
+
+	public synchronized void expunged(MessageResult[] expunged) {
+		for (int i = 0; i < expunged.length; i++) {
+			if (expunged[i] != null) {
+				cache.remove(new Long(expunged[i].getUid()));
+				eventDispatcher.expunged(expunged[i]);
+			}
+		}
+	}
+
+	public synchronized void found(UidRange range,
+			MessageResult[] messageResults, MailboxListener silentListener) {
+		Set expectedSet = getSubSet(range);
+		for (int i = 0; i < messageResults.length; i++) {
+			if (messageResults[i] != null) {
+				long uid = messageResults[i].getUid();
+				if (uid>lastScannedUid) {
+					lastScannedUid=uid;
+				}
+				if (expectedSet.contains(new Long(uid))) {
+					expectedSet.remove(new Long(uid));
+					if (messageResults[i].getFlags() != null) {
+						Flags cachedFlags = (Flags) cache.get(new Long(uid));
+						if (cachedFlags == null
+								|| !messageResults[i].getFlags().equals(
+										cachedFlags)) {
+							eventDispatcher.flagsUpdated(messageResults[i],
+									silentListener);
+							cache.put(new Long(uid), messageResults[i].getFlags());
+						}
+					}
+				} else {
+					cache.put(new Long(uid), messageResults[i].getFlags());
+					if (uid > lastUidAtStart) {
+						eventDispatcher.added(messageResults[i]);
+					}
+				}
+			}
+
+		}
+
+		if (lastScannedUid>lastUid) {
+			lastUid=lastScannedUid;
+		}
+		if (range.getToUid()==UID_INFINITY || range.getToUid()>=lastUid) {
+			lastScannedUid=lastUid;
+		} else if (range.getToUid()!=UID_INFINITY && range.getToUid()<lastUid && range.getToUid() > lastScannedUid) {
+			lastScannedUid=range.getToUid();
+		}
+		
+
+		
+		for (Iterator iter = expectedSet.iterator(); iter.hasNext();) {
+			long uid = ((Long) iter.next()).longValue();
+
+			MessageResultImpl mr = new MessageResultImpl();
+			mr.setUid(uid);
+			eventDispatcher.expunged(mr);
+		}
+	}
+
+	private SortedSet getSubSet(UidRange range) {
+		if (range.getToUid() > 0) {
+			return new TreeSet(cache.subMap(new Long(range.getFromUid()),
+					new Long(range.getToUid() + 1)).keySet());
+		} else {
+			return new TreeSet(cache
+					.tailMap(new Long(range.getFromUid())).keySet());
+		}
+
+	}
+
+	public synchronized void found(MessageResult messageResult,
+			MailboxListener silentListener) {
+		if (messageResult != null) {
+			long uid = messageResult.getUid();
+			found(new UidRange(uid, uid),
+					new MessageResult[] { messageResult }, silentListener);
+		}
+	}
+
+	public synchronized long getLastUid() {
+		return lastUid;
+	}
+	
+	public synchronized void foundLastUid(long foundLastUid) {
+		if (foundLastUid>lastUid) {
+			lastUid=foundLastUid;
+		}
+	}
+
+	public synchronized long getLastScannedUid() {
+		return lastScannedUid;
+	}
+
+
+
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/tracking/UidRange.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/tracking/UidRange.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/tracking/UidRange.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/tracking/UidRange.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,35 @@
+package org.apache.james.mailboxmanager.tracking;
+
+public class UidRange implements Comparable {
+    
+    private long fromUid;
+    
+    private long toUid;
+    
+    public UidRange(long fromUid,long toUid) {
+        this.fromUid=fromUid;
+        this.toUid=toUid;
+    }
+
+    public long getFromUid() {
+        return fromUid;
+    }
+
+    public long getToUid() {
+        return toUid;
+    }
+    
+    public String toString() {
+        return fromUid+":"+toUid;
+    }
+
+    public int compareTo(Object o) {
+		if (!(o instanceof UidRange)) {
+			return 1;
+		} else {
+			UidRange that = (UidRange) o;
+			return new Long(fromUid).compareTo(new Long(that.fromUid));
+		}
+	}
+
+}

Added: james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/util/AbstractLogEnabled.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/util/AbstractLogEnabled.java?view=auto&rev=454432
==============================================================================
--- james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/util/AbstractLogEnabled.java (added)
+++ james/server/sandbox/imap-integration/src/java/org/apache/james/mailboxmanager/util/AbstractLogEnabled.java Mon Oct  9 10:15:30 2006
@@ -0,0 +1,21 @@
+package org.apache.james.mailboxmanager.util;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.impl.SimpleLog;
+
+public abstract class AbstractLogEnabled {
+	
+	private Log log;
+
+	protected Log getLog() {
+		if (log==null) {
+			log=new SimpleLog(this.getClass().getName());
+		}
+		return log;
+	}
+	
+	public void setLog(Log log) {
+		this.log=log;
+	}
+
+}



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