001: /*
002: * Copyright 2006-2007 The Scriptella Project Team.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package scriptella.spi;
017:
018: import scriptella.core.SystemException;
019:
020: import java.util.LinkedHashSet;
021: import java.util.Set;
022:
023: /**
024: * Thrown by connection provider to indicate any kind of failure.
025: * <p>Service Providers must provide subclasses of this exception.
026: *
027: * @author Fyodor Kupolov
028: * @version 1.0
029: */
030: public abstract class ProviderException extends SystemException {
031: private Set<String> errorCodes = new LinkedHashSet<String>();
032: private String errorStatement;
033:
034: public ProviderException() {
035: }
036:
037: public ProviderException(String message) {
038: super (message);
039: }
040:
041: public ProviderException(String message, Throwable cause) {
042: super (message, cause);
043: }
044:
045: public ProviderException(Throwable cause) {
046: super (cause);
047: }
048:
049: /**
050: * Returns error codes attached to this exception. For example
051: * JDBC drivers reports 2 error codes: SQLSTATE and vendor code.
052: * <p>Do not use "<b>, . ;</b>" in error codes.
053: *
054: * @return set of error codes.
055: */
056: public Set<String> getErrorCodes() {
057: return errorCodes;
058: }
059:
060: /**
061: * Adds error code to this exception.
062: *
063: * @param errorCode vendor specific error code.
064: * @return this exception for convenience.
065: */
066: public ProviderException addErrorCode(String errorCode) {
067: errorCodes.add(errorCode);
068: return this ;
069: }
070:
071: /**
072: * Sets problem statement which caused this exception/
073: *
074: * @param errStmt statement text.
075: * @return this exception for convenience.
076: */
077: protected ProviderException setErrorStatement(String errStmt) {
078: this .errorStatement = errStmt;
079: return this ;
080: }
081:
082: /**
083: * This method should be overriden by providers relying on external APIs to work with connections.
084: * Used only for informative error reporting.
085: * <p>Examples: SQL Exceptions, LDAP connection exceptions etc.
086: *
087: * @return external API throwable wich may be important for user to recognize the problem.
088: */
089: public Throwable getNativeException() {
090: return getCause();
091: }
092:
093: /**
094: * Returns a statement for this error if any.
095: *
096: * @return statement text and additional data.
097: */
098: public String getErrorStatement() {
099: return errorStatement;
100: }
101:
102: /**
103: * Overriden by subclasses to provide user friendly provider name.
104: *
105: * @return provider name.
106: */
107: public abstract String getProviderName();
108:
109: public String toString() {
110: StringBuilder res = new StringBuilder(super .toString());
111: String es = getErrorStatement();
112: if (es != null) {
113: res.append(". Error statement: ").append(es);
114: }
115: Set<String> codes = getErrorCodes();
116: if (codes != null && !codes.isEmpty()) {
117: res.append(". Error codes: ").append(codes);
118: }
119: return res.toString();
120:
121: }
122:
123: }
|