001: /*
002: * Copyright 2002-2007 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.jca.cci.core.support;
018:
019: import javax.resource.cci.Connection;
020: import javax.resource.cci.ConnectionFactory;
021: import javax.resource.cci.ConnectionSpec;
022:
023: import org.springframework.dao.support.DaoSupport;
024: import org.springframework.jca.cci.CannotGetCciConnectionException;
025: import org.springframework.jca.cci.connection.ConnectionFactoryUtils;
026: import org.springframework.jca.cci.core.CciTemplate;
027:
028: /**
029: * Convenient super class for CCI-based data access objects.
030: *
031: * <p>Requires a {@link javax.resource.cci.ConnectionFactory} to be set,
032: * providing a {@link org.springframework.jca.cci.core.CciTemplate} based
033: * on it to subclasses through the {@link #getCciTemplate()} method.
034: *
035: * <p>This base class is mainly intended for CciTemplate usage but can
036: * also be used when working with a Connection directly or when using
037: * <code>org.springframework.jca.cci.object</code> classes.
038: *
039: * @author Thierry Templier
040: * @author Juergen Hoeller
041: * @since 1.2
042: * @see #setConnectionFactory
043: * @see #getCciTemplate
044: * @see org.springframework.jca.cci.core.CciTemplate
045: */
046: public abstract class CciDaoSupport extends DaoSupport {
047:
048: private CciTemplate cciTemplate;
049:
050: /**
051: * Set the ConnectionFactory to be used by this DAO.
052: */
053: public final void setConnectionFactory(
054: ConnectionFactory connectionFactory) {
055: this .cciTemplate = createCciTemplate(connectionFactory);
056: }
057:
058: /**
059: * Create a CciTemplate for the given ConnectionFactory.
060: * Only invoked if populating the DAO with a ConnectionFactory reference!
061: * <p>Can be overridden in subclasses to provide a CciTemplate instance
062: * with different configuration, or a custom CciTemplate subclass.
063: * @param connectionFactory the CCI ConnectionFactory to create a CciTemplate for
064: * @return the new CciTemplate instance
065: * @see #setConnectionFactory(javax.resource.cci.ConnectionFactory)
066: */
067: protected CciTemplate createCciTemplate(
068: ConnectionFactory connectionFactory) {
069: return new CciTemplate(connectionFactory);
070: }
071:
072: /**
073: * Return the ConnectionFactory used by this DAO.
074: */
075: public final ConnectionFactory getConnectionFactory() {
076: return this .cciTemplate.getConnectionFactory();
077: }
078:
079: /**
080: * Set the CciTemplate for this DAO explicitly,
081: * as an alternative to specifying a ConnectionFactory.
082: */
083: public final void setCciTemplate(CciTemplate cciTemplate) {
084: this .cciTemplate = cciTemplate;
085: }
086:
087: /**
088: * Return the CciTemplate for this DAO,
089: * pre-initialized with the ConnectionFactory or set explicitly.
090: */
091: public final CciTemplate getCciTemplate() {
092: return this .cciTemplate;
093: }
094:
095: protected final void checkDaoConfig() {
096: if (this .cciTemplate == null) {
097: throw new IllegalArgumentException(
098: "'connectionFactory' or 'cciTemplate' is required");
099: }
100: }
101:
102: /**
103: * Obtain a CciTemplate derived from the main template instance,
104: * inheriting the ConnectionFactory and other settings but
105: * overriding the ConnectionSpec used for obtaining Connections.
106: * @param connectionSpec the CCI ConnectionSpec that the returned
107: * template instance is supposed to obtain Connections for
108: * @return the derived template instance
109: * @see org.springframework.jca.cci.core.CciTemplate#getDerivedTemplate(javax.resource.cci.ConnectionSpec)
110: */
111: protected final CciTemplate getCciTemplate(
112: ConnectionSpec connectionSpec) {
113: return getCciTemplate().getDerivedTemplate(connectionSpec);
114: }
115:
116: /**
117: * Get a CCI Connection, either from the current transaction or a new one.
118: * @return the CCI Connection
119: * @throws org.springframework.jca.cci.CannotGetCciConnectionException
120: * if the attempt to get a Connection failed
121: * @see org.springframework.jca.cci.connection.ConnectionFactoryUtils#getConnection(javax.resource.cci.ConnectionFactory)
122: */
123: protected final Connection getConnection()
124: throws CannotGetCciConnectionException {
125: return ConnectionFactoryUtils
126: .getConnection(getConnectionFactory());
127: }
128:
129: /**
130: * Close the given CCI Connection, created via this bean's ConnectionFactory,
131: * if it isn't bound to the thread.
132: * @param con Connection to close
133: * @see org.springframework.jca.cci.connection.ConnectionFactoryUtils#releaseConnection
134: */
135: protected final void releaseConnection(Connection con) {
136: ConnectionFactoryUtils.releaseConnection(con,
137: getConnectionFactory());
138: }
139:
140: }
|