james-server-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From vince...@apache.org
Subject cvs commit: james-server/src/java/org/apache/james/util JDBCUtil.java
Date Mon, 08 Sep 2003 16:39:42 GMT
vincenzo    2003/09/08 09:39:42

  Modified:    src/java/org/apache/james/mailrepository Tag: branch_2_1_fcs
                        JDBCMailRepository.java
               src/java/org/apache/james/util Tag: branch_2_1_fcs
                        JDBCUtil.java
  Log:
  Now during initialization will check if everything is OK in the database definitions for
JDBC repositories support of mail attributes and behave accordingly.
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.30.4.11 +104 -11   james-server/src/java/org/apache/james/mailrepository/JDBCMailRepository.java
  
  Index: JDBCMailRepository.java
  ===================================================================
  RCS file: /home/cvs/james-server/src/java/org/apache/james/mailrepository/JDBCMailRepository.java,v
  retrieving revision 1.30.4.10
  retrieving revision 1.30.4.11
  diff -u -r1.30.4.10 -r1.30.4.11
  --- JDBCMailRepository.java	28 Aug 2003 16:32:02 -0000	1.30.4.10
  +++ JDBCMailRepository.java	8 Sep 2003 16:39:42 -0000	1.30.4.11
  @@ -195,6 +195,11 @@
        * The JDBCUtil helper class
        */
       protected JDBCUtil theJDBCUtil;
  +    
  +    /**
  +     * "Support for Mail Attributes under JDBC repositories is ready" indicator.
  +     */
  +    protected boolean jdbcMailAttributesReady = false;
   
       /**
        * @see org.apache.avalon.framework.context.Contextualizable#contextualize(Context)
  @@ -416,12 +421,102 @@
                       getLogger().info(logBuffer.toString());
                   }
               }
  +            
  +            checkJdbcAttributesSupport(dbMetaData);
   
           } finally {
               theJDBCUtil.closeJDBCStatement(createStatement);
               theJDBCUtil.closeJDBCConnection(conn);
           }
       }
  +    
  +    /** Checks whether support for JDBC Mail atributes is activated for this repository
  +     * and if everything is consistent.
  +     * Looks for both the "updateMessageAttributesSQL" and "retrieveMessageAttributesSQL"
  +     * statements in sqlResources and for a table column named "message_attributes".
  +     *
  +     * @param dbMetaData the database metadata to be used to look up the column
  +     * @throws SQLException if a fatal situation is met
  +     */
  +    protected void checkJdbcAttributesSupport(DatabaseMetaData dbMetaData) throws SQLException
{
  +        String attributesColumnName = "message_attributes";
  +        boolean hasUpdateMessageAttributesSQL = false;
  +        boolean hasRetrieveMessageAttributesSQL = false;
  +        
  +        boolean hasMessageAttributesColumn = theJDBCUtil.columnExists(dbMetaData, tableName,
attributesColumnName);
  +        
  +        StringBuffer logBuffer = new StringBuffer(64)
  +                                    .append("JdbcMailRepository '"
  +                                            + repositoryName
  +                                            + ", table '"
  +                                            + tableName
  +                                            + "': ");
  +        
  +        //Determine whether attributes are used and available for storing
  +        //Do we have updateMessageAttributesSQL?
  +        String updateMessageAttrSql =
  +            sqlQueries.getSqlString("updateMessageAttributesSQL", false);
  +        if (updateMessageAttrSql!=null) {
  +            hasUpdateMessageAttributesSQL = true;
  +        }
  +        
  +        //Determine whether attributes are used and retrieve them
  +        //Do we have retrieveAttributesSQL?
  +        String retrieveMessageAttrSql =
  +            sqlQueries.getSqlString("retrieveMessageAttributesSQL", false);
  +        if (retrieveMessageAttrSql!=null) {
  +            hasRetrieveMessageAttributesSQL = true;
  +        }
  +        
  +        if (hasUpdateMessageAttributesSQL && !hasRetrieveMessageAttributesSQL)
{
  +            logBuffer.append("JDBC Mail Attributes support was activated for update but
not for retrieval"
  +                             + "(found 'updateMessageAttributesSQL' but not 'retrieveMessageAttributesSQL'"
  +                             + "in table '"
  +                             + tableName
  +                             + "').");
  +            getLogger().fatalError(logBuffer.toString());
  +            throw new SQLException(logBuffer.toString());
  +        }
  +        if (!hasUpdateMessageAttributesSQL && hasRetrieveMessageAttributesSQL)
{
  +            logBuffer.append("JDBC Mail Attributes support was activated for retrieval
but not for update"
  +                             + "(found 'retrieveMessageAttributesSQL' but not 'updateMessageAttributesSQL'"
  +                             + "in table '"
  +                             + tableName
  +                             + "'.");
  +            getLogger().fatalError(logBuffer.toString());
  +            throw new SQLException(logBuffer.toString());
  +        }
  +        if (!hasMessageAttributesColumn
  +            && (hasUpdateMessageAttributesSQL || hasRetrieveMessageAttributesSQL)
  +            ) {
  +                logBuffer.append("JDBC Mail Attributes support was activated but column
'"
  +                                 + attributesColumnName
  +                                 + "' is missing in table '"
  +                                 + tableName
  +                                 + "'.");
  +                getLogger().fatalError(logBuffer.toString());
  +                throw new SQLException(logBuffer.toString());
  +        }
  +        if (hasUpdateMessageAttributesSQL && hasRetrieveMessageAttributesSQL) {
  +            jdbcMailAttributesReady = true;
  +            if (getLogger().isInfoEnabled()) {
  +                logBuffer.append("JDBC Mail Attributes support ready.");
  +                getLogger().info(logBuffer.toString());
  +            }
  +        } else {
  +            jdbcMailAttributesReady = false;
  +            logBuffer.append("JDBC Mail Attributes support not activated. "
  +                             + "Missing both 'updateMessageAttributesSQL' "
  +                             + "and 'retrieveMessageAttributesSQL' "
  +                             + "statements for table '"
  +                             + tableName
  +                             + "' in sqlResources.xml. "
  +                             + "Will not persist in the repository '"
  +                             + repositoryName
  +                             + "'.");
  +            getLogger().warn(logBuffer.toString());
  +        }
  +    }
   
       /**
        * Releases a lock on a message identified by a key
  @@ -540,11 +635,10 @@
                       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()) {
  +                //Determine whether attributes are used and available for storing
  +                if (jdbcMailAttributesReady && mc.hasAttributes()) {
  +                    String updateMessageAttrSql =
  +                        sqlQueries.getSqlString("updateMessageAttributesSQL", false);
                       PreparedStatement updateMessageAttr = null;
                       try {
                           updateMessageAttr =
  @@ -756,13 +850,12 @@
                   }
                   return null;
               }
  -            //Determine whether attribues are used and retrieve them
  -            //Do we have retrieveAttributesSQL?
  -            String retrieveMessageAttrSql =
  -                sqlQueries.getSqlString("retrieveMessageAttributesSQL", false);
  +            //Determine whether attributes are used and retrieve them
               PreparedStatement retrieveMessageAttr = null;
               HashMap attributes = null;
  -            if (retrieveMessageAttrSql!=null) {
  +            if (jdbcMailAttributesReady) {
  +                String retrieveMessageAttrSql =
  +                    sqlQueries.getSqlString("retrieveMessageAttributesSQL", false);
                   ResultSet rsMessageAttr = null;
                   try {
                       retrieveMessageAttr =
  
  
  
  No                   revision
  No                   revision
  1.2.4.3   +45 -3     james-server/src/java/org/apache/james/util/JDBCUtil.java
  
  Index: JDBCUtil.java
  ===================================================================
  RCS file: /home/cvs/james-server/src/java/org/apache/james/util/JDBCUtil.java,v
  retrieving revision 1.2.4.2
  retrieving revision 1.2.4.3
  diff -u -r1.2.4.2 -r1.2.4.3
  --- JDBCUtil.java	8 Mar 2003 21:54:11 -0000	1.2.4.2
  +++ JDBCUtil.java	8 Sep 2003 16:39:42 -0000	1.2.4.3
  @@ -68,9 +68,7 @@
    * take advantage of different logging capabilities/interfaces in
    * different parts of the code.</p>
    *
  - * @author Noel Bergman <noel@devtech.com>
  - * @author Peter M. Goldstein <farsight@alum.mit.edu>
  - *
  + * @version CVS $Revision$ $Date$
    */
   abstract public class JDBCUtil
   {
  @@ -110,6 +108,50 @@
       public boolean tableExistsCaseSensitive(DatabaseMetaData dbMetaData, String tableName)
           throws SQLException {
           ResultSet rsTables = dbMetaData.getTables(null, null, tableName, null);
  +        try {
  +            boolean found = rsTables.next();
  +            return found;
  +        } finally {
  +            closeJDBCResultSet(rsTables);
  +        }
  +    }
  +
  +    /**
  +     * Checks database metadata to see if a column exists in a table
  +     * Try UPPER, lower, and MixedCase, both on the table name and the column name, to
see if the column is there.
  +     *
  +     * @param dbMetaData the database metadata to be used to look up this column
  +     * @param tableName the table name
  +     * @param columnName the column name
  +     *
  +     * @throws SQLException if an exception is encountered while accessing the database
  +     */
  +    public boolean columnExists(DatabaseMetaData dbMetaData, String tableName, String columnName)
  +        throws SQLException {
  +        return ( columnExistsCaseSensitive(dbMetaData, tableName, columnName) ||
  +                 columnExistsCaseSensitive(dbMetaData, tableName, columnName.toUpperCase(Locale.US))
||
  +                 columnExistsCaseSensitive(dbMetaData, tableName, columnName.toLowerCase(Locale.US))
||
  +                 columnExistsCaseSensitive(dbMetaData, tableName.toUpperCase(Locale.US),
columnName) ||
  +                 columnExistsCaseSensitive(dbMetaData, tableName.toUpperCase(Locale.US),
columnName.toUpperCase(Locale.US)) ||
  +                 columnExistsCaseSensitive(dbMetaData, tableName.toUpperCase(Locale.US),
columnName.toLowerCase(Locale.US)) ||
  +                 columnExistsCaseSensitive(dbMetaData, tableName.toLowerCase(Locale.US),
columnName) ||
  +                 columnExistsCaseSensitive(dbMetaData, tableName.toLowerCase(Locale.US),
columnName.toUpperCase(Locale.US)) ||
  +                 columnExistsCaseSensitive(dbMetaData, tableName.toLowerCase(Locale.US),
columnName.toLowerCase(Locale.US)) );
  +    }
  +
  +    /**
  +     * Checks database metadata to see if a column exists in a table.  This method
  +     * is sensitive to the case of both the provided table name and column name.
  +     *
  +     * @param dbMetaData the database metadata to be used to look up this column
  +     * @param tableName the case sensitive table name
  +     * @param columnName the case sensitive column name
  +     *
  +     * @throws SQLException if an exception is encountered while accessing the database
  +     */
  +    public boolean columnExistsCaseSensitive(DatabaseMetaData dbMetaData, String tableName,
String columnName)
  +        throws SQLException {
  +        ResultSet rsTables = dbMetaData.getColumns(null, null, tableName, columnName);
           try {
               boolean found = rsTables.next();
               return found;
  
  
  

---------------------------------------------------------------------
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