Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: org/hibernate/exception/SQLStateConverter.java


1   // $Id: SQLStateConverter.java,v 1.4 2005/03/16 15:43:46 oneovthafew Exp $
2   package org.hibernate.exception;
3   
4   import org.hibernate.JDBCException;
5   
6   import java.sql.SQLException;
7   import java.util.HashSet;
8   import java.util.Set;
9   
10  /**
11   * A SQLExceptionConverter implementation which performs converion based on
12   * the underlying SQLState.  Interpretation of a SQL error based on SQLState
13   * is not nearly as accurate as using the ErrorCode (which is, however, vendor-
14   * specific).  Use of a ErrorCcode-based converter should be preferred approach
15   * for converting/interpreting SQLExceptions.
16   *
17   * @author Steve Ebersole
18   */
19  public class SQLStateConverter implements SQLExceptionConverter {
20  
21    private ViolatedConstraintNameExtracter extracter;
22  
23    private static final Set SQL_GRAMMAR_CATEGORIES = new HashSet();
24    private static final Set INTEGRITY_VIOLATION_CATEGORIES = new HashSet();
25    private static final Set CONNECTION_CATEGORIES = new HashSet();
26  
27    static {
28      SQL_GRAMMAR_CATEGORIES.add( "07" );
29      SQL_GRAMMAR_CATEGORIES.add( "37" );
30      SQL_GRAMMAR_CATEGORIES.add( "42" );
31      SQL_GRAMMAR_CATEGORIES.add( "65" );
32      SQL_GRAMMAR_CATEGORIES.add( "S0" );
33  
34      INTEGRITY_VIOLATION_CATEGORIES.add( "23" );
35      INTEGRITY_VIOLATION_CATEGORIES.add( "27" );
36      INTEGRITY_VIOLATION_CATEGORIES.add( "44" );
37  
38      CONNECTION_CATEGORIES.add( "08" );
39    }
40  
41    public SQLStateConverter(ViolatedConstraintNameExtracter extracter) {
42      this.extracter = extracter;
43    }
44  
45    /**
46     * Convert the given SQLException into Hibernate's JDBCException hierarchy.
47     *
48     * @param sqlException The SQLException to be converted.
49     * @param message      An optional error message.
50     * @param sql          Optionally, the sql being performed when the exception occurred.
51     * @return The resulting JDBCException.
52     */
53    public JDBCException convert(SQLException sqlException, String message, String sql) {
54  
55      String sqlStateClassCode = JDBCExceptionHelper.extractSqlStateClassCode( sqlException );
56  
57      if ( sqlStateClassCode != null ) {
58        if ( SQL_GRAMMAR_CATEGORIES.contains( sqlStateClassCode ) ) {
59          return new SQLGrammarException( message, sqlException, sql );
60        }
61        else if ( INTEGRITY_VIOLATION_CATEGORIES.contains( sqlStateClassCode ) ) {
62          String constraintName = extracter.extractConstraintName( sqlException );
63          return new ConstraintViolationException( message, sqlException, sql, constraintName );
64        }
65        else if ( CONNECTION_CATEGORIES.contains( sqlStateClassCode ) ) {
66          return new JDBCConnectionException( message, sqlException, sql );
67        }
68      }
69  
70      return handledNonSpecificException( sqlException, message, sql );
71    }
72  
73    /**
74     * Handle an exception not converted to a specific type based on the SQLState.
75     *
76     * @param sqlException The exception to be handled.
77     * @param message      An optional message
78     * @param sql          Optionally, the sql being performed when the exception occurred.
79     * @return The converted exception; should <b>never</b> be null.
80     */
81    protected JDBCException handledNonSpecificException(SQLException sqlException, String message, String sql) {
82      return new GenericJDBCException( message, sqlException, sql );
83    }
84  }