001: /*
002: * Copyright 2002-2006 the original author or authors.
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:
017: package org.springframework.jdbc.support.nativejdbc;
018:
019: import java.lang.reflect.Method;
020: import java.sql.Connection;
021: import java.sql.SQLException;
022:
023: import org.springframework.util.ReflectionUtils;
024:
025: /**
026: * Implementation of the NativeJdbcExtractor interface for WebLogic Server
027: * 6.1+.
028: *
029: * <p>Returns the underlying native Connection to application code instead
030: * of WebLogic's wrapper implementation; unwraps the Connection for native
031: * statements. The returned JDBC classes can then safely be cast, e.g. to
032: * <code>oracle.jdbc.OracleConnection</code>.
033: *
034: * <p>This NativeJdbcExtractor can be set just to <i>allow</i> working
035: * with a WebLogic DataSource: If a given object is not a WebLogic
036: * Connection wrapper, it will be returned as-is.
037: *
038: * @author Thomas Risberg
039: * @author Juergen Hoeller
040: * @since 1.0.2
041: * @see #getNativeConnection
042: * @see weblogic.jdbc.extensions.WLConnection#getVendorConnection
043: */
044: public class WebLogicNativeJdbcExtractor extends
045: NativeJdbcExtractorAdapter {
046:
047: private static final String JDBC_EXTENSION_NAME = "weblogic.jdbc.extensions.WLConnection";
048:
049: private final Class jdbcExtensionClass;
050:
051: private final Method getVendorConnectionMethod;
052:
053: /**
054: * This constructor retrieves the WebLogic JDBC extension interface,
055: * so we can get the underlying vendor connection using reflection.
056: */
057: public WebLogicNativeJdbcExtractor() {
058: try {
059: this .jdbcExtensionClass = getClass().getClassLoader()
060: .loadClass(JDBC_EXTENSION_NAME);
061: this .getVendorConnectionMethod = this .jdbcExtensionClass
062: .getMethod("getVendorConnection", (Class[]) null);
063: } catch (Exception ex) {
064: throw new IllegalStateException(
065: "Could not initialize WebLogicNativeJdbcExtractor because WebLogic API classes are not available: "
066: + ex);
067: }
068: }
069:
070: /**
071: * Return <code>true</code>, as WebLogic returns wrapped Statements.
072: */
073: public boolean isNativeConnectionNecessaryForNativeStatements() {
074: return true;
075: }
076:
077: /**
078: * Return <code>true</code>, as WebLogic returns wrapped PreparedStatements.
079: */
080: public boolean isNativeConnectionNecessaryForNativePreparedStatements() {
081: return true;
082: }
083:
084: /**
085: * Return <code>true</code>, as WebLogic returns wrapped CallableStatements.
086: */
087: public boolean isNativeConnectionNecessaryForNativeCallableStatements() {
088: return true;
089: }
090:
091: /**
092: * Retrieve the Connection via WebLogic's <code>getVendorConnection</code> method.
093: */
094: protected Connection doGetNativeConnection(Connection con)
095: throws SQLException {
096: if (this .jdbcExtensionClass.isAssignableFrom(con.getClass())) {
097: return (Connection) ReflectionUtils.invokeMethod(
098: this.getVendorConnectionMethod, con);
099: }
100: return con;
101: }
102:
103: }
|