Package org.springmodules.orm.orbroker

Source Code of org.springmodules.orm.orbroker.BrokerAccessor

/*
* Copyright 2002-2006 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.springmodules.orm.orbroker;

import net.sourceforge.orbroker.Broker;
import net.sourceforge.orbroker.BrokerException;
import net.sourceforge.orbroker.Executable;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator;
import org.springframework.jdbc.support.SQLExceptionTranslator;
import org.springframework.jdbc.support.SQLStateSQLExceptionTranslator;
import org.springframework.util.Assert;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/**
* Base class for BrokerTemplate.
*
* @author Omar Irbouh
* @see BrokerTemplate
* @since 2005.06.02
*/
public abstract class BrokerAccessor implements InitializingBean {

  protected final Log logger = LogFactory.getLog(getClass());

  /**
   * Helper to translate SQL exceptions to DataAccessExceptions
   */
  private SQLExceptionTranslator exceptionTranslator;

  private boolean lazyInit = true;

  private Broker broker;

  public DataSource getDataSource() {
    return (this.broker != null ? this.broker.getDataSource() : null);
  }

  /**
   * Specify the database product name for the DataSource that this accessor uses.
   * This allows to initialize a SQLErrorCodeSQLExceptionTranslator without
   * obtaining a Connection from the DataSource to get the metadata.
   *
   * @param dbName the database product name that identifies the error codes entry
   * @see org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator#setDatabaseProductName
   * @see java.sql.DatabaseMetaData#getDatabaseProductName()
   */
  public void setDatabaseProductName(String dbName) {
    this.exceptionTranslator = new SQLErrorCodeSQLExceptionTranslator(dbName);
  }

  /**
   * Set the exception translator for this instance.
   * <p>If no custom translator is provided, a default SQLErrorCodeSQLExceptionTranslator
   * is used which examines the SQLException's vendor-specific error code.
   *
   * @param exceptionTranslator exception translator
   * @see org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator
   * @see org.springframework.jdbc.support.SQLStateSQLExceptionTranslator
   */
  public void setExceptionTranslator(SQLExceptionTranslator exceptionTranslator) {
    this.exceptionTranslator = exceptionTranslator;
  }

  /**
   * Return the exception translator for this instance.
   * <p>Creates a default SQLErrorCodeSQLExceptionTranslator for the specified
   * DataSource if none set.
   */
  public SQLExceptionTranslator getExceptionTranslator() {
    if (this.exceptionTranslator == null) {
      DataSource ds = getDataSource();
      if (ds != null) {
        return new SQLErrorCodeSQLExceptionTranslator(ds);
      }
      return new SQLStateSQLExceptionTranslator();
    }
    return this.exceptionTranslator;
  }

  /**
   * Set whether to lazily initialize the SQLExceptionTranslator for this accessor,
   * on first encounter of a SQLException. Default is "true"; can be switched to
   * "false" for initialization on startup.
   * <p>Early initialization only applies if <code>afterPropertiesSet</code> is called.
   *
   * @see #getExceptionTranslator
   * @see #afterPropertiesSet
   */
  public void setLazyInit(boolean lazyInit) {
    this.lazyInit = lazyInit;
  }

  /**
   * Return whether to lazily initialize the SQLExceptionTranslator for this accessor.
   */
  public boolean isLazyInit() {
    return lazyInit;
  }

  public void setBroker(Broker broker) {
    this.broker = broker;
  }

  public Broker getBroker() {
    return broker;
  }

  /**
   * Eagerly initialize the exception translator,
   * creating a default one for the specified Broker if none set.
   */
  public void afterPropertiesSet() {
    Assert.notNull(getBroker(), "broker is required");

    if (!isLazyInit()) {
      getExceptionTranslator();
    }
  }

  protected DataAccessException convertBrokerException(BrokerException e) {
    Throwable cause = e.getCause();
    if (cause != null && cause instanceof SQLException)
      throw translateJdbcException((SQLException) cause);
    else
      throw new BrokerOperationException(e);
  }

  protected DataAccessException translateJdbcException(SQLException cause) {
    return getExceptionTranslator().translate("ORBroker operation", null, cause);
  }

  protected Executable newExecutable(Broker broker, Connection connection) throws DataAccessException {
    Assert.notNull(broker, "No broker specified");
    return broker.obtainExecutable(connection);
  }

  protected void releaseExecutable(Broker broker, Executable executable) {
    Assert.notNull(broker, "No broker specified");
    Assert.notNull(executable, "No executable specified");

    // release orbroker executable
    try {
      broker.releaseExecutable(executable);
    } catch (BrokerException e) {
      logger.error("Could not release ORBroker Executable", e);
    }
  }

}
TOP

Related Classes of org.springmodules.orm.orbroker.BrokerAccessor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.