01: /**
02: * Sequoia: Database clustering technology.
03: * Copyright (C) 2002-2004 French National Institute For Research In Computer
04: * Science And Control (INRIA).
05: * Contact: sequoia@continuent.org
06: *
07: * Licensed under the Apache License, Version 2.0 (the "License");
08: * you may not use this file except in compliance with the License.
09: * You may obtain a copy of the License at
10: *
11: * http://www.apache.org/licenses/LICENSE-2.0
12: *
13: * Unless required by applicable law or agreed to in writing, software
14: * distributed under the License is distributed on an "AS IS" BASIS,
15: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16: * See the License for the specific language governing permissions and
17: * limitations under the License.
18: *
19: * Initial developer(s): Marc Wick.
20: * Contributor(s): ______________________.
21: */package org.continuent.sequoia.common.exceptions;
22:
23: import java.sql.SQLException;
24: import java.util.Iterator;
25: import java.util.List;
26:
27: /**
28: * This class defines a SQLExceptionFactory
29: *
30: * @author <a href="mailto:marc.wick@monte-bre.ch">Marc Wick </a>
31: * @version 1.0
32: */
33: public class SQLExceptionFactory {
34:
35: /**
36: * creates a new SQLException with the sequoiaMessage
37: *
38: * @param sqlEx the original exception
39: * @param sequoiaMessage the sequoia message to use for the new sqlexception
40: * @return a new SQLException
41: */
42: public static SQLException getSQLException(SQLException sqlEx,
43: String sequoiaMessage) {
44: SQLException newException = new SQLException(sequoiaMessage,
45: sqlEx.getSQLState(), sqlEx.getErrorCode());
46: // TODO: shouldn't we use the new initCause() standard chaining instead ?
47: // if we move to a new "SyntheticSQLException" type we will have to do
48: // it anyway.
49: // See also same issue below.
50: newException.setNextException(sqlEx);
51: return newException;
52: }
53:
54: /**
55: * creates a new SQLException with the sequoiaMessage, if all exceptions in
56: * the list have the same errorcode and sqlstate the returned SQLExcepion will
57: * be constructed with this values otherwise with null and 0
58: *
59: * @param exceptions list of exceptions
60: * @param sequoiaMessage the Sequoia message
61: * @return a new SQLException
62: */
63: public static SQLException getSQLException(List exceptions,
64: String sequoiaMessage) {
65: String sqlState = null;
66: int errorCode = 0;
67: for (int i = 0; i < exceptions.size(); i++) {
68: SQLException ex = (SQLException) exceptions.get(i);
69: if (ex == null)
70: continue;
71: sequoiaMessage += ex.getMessage() + "\n";
72: if (sqlState == null) {
73: // first exception
74: sqlState = ex.getSQLState();
75: errorCode = ex.getErrorCode();
76: }
77: // We ignore if backend reports different SQL states or error codes. We
78: // report the error of the first backend that failed. Details can be
79: // retrieved for each backend in the exception chaining below.
80: }
81: SQLException newHead = new SQLException(sequoiaMessage,
82: sqlState, errorCode);
83: Iterator exIter = exceptions.iterator();
84:
85: // TODO: shouldn't we use the new initCause() standard chaining instead ?
86: // See more comments above.
87: while (exIter.hasNext())
88: newHead.setNextException((SQLException) exIter.next());
89:
90: return newHead;
91: }
92:
93: }
|