/*
* Copyright 2004-2015 the Seasar Foundation and the Others.
*
* 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.seasar.extension.datasource.impl;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.seasar.extension.datasource.DataSourceFactory;
import org.seasar.framework.exception.EmptyRuntimeException;
/**
* 他のデータソースに委譲するデータソースのプロキシです。
* <p>
* このプロキシはWEBアプリケーション等でユーザごとに異なったデータソースを切り替えたい場合に使われることを想定しています。
* データソースを利用するDAOはこのプロキシをデータソースとして使用します。
* </p>
*
* @author koichik
* @author higa
*
*/
public class SelectableDataSourceProxy implements DataSource {
/**
* データソースファクトリです。
*/
protected DataSourceFactory dataSourceFactory;
/**
* @param dataSourceFactory
* データソースファクトリ
*/
public void setDataSourceFactory(DataSourceFactory dataSourceFactory) {
this.dataSourceFactory = dataSourceFactory;
}
/**
* <code>DataSourceFactory</code>からデータソースを取得します。
*
* @return スレッドコンテキストに設定された名前を持つデータソース
* @throws EmptyRuntimeException
* スレッドコンテキストにデータソース名が設定されていない場合にスローされます
* @throws org.seasar.framework.container.ComponentNotFoundException
* <code>DataSourceFactory</code>に設定されたデータソース名を持つコンポーネントがS2コンテナに登録されていない場合にスローされます
*/
public DataSource getDataSource() {
String dataSourceName = dataSourceFactory.getSelectableDataSourceName();
if (dataSourceName == null) {
throw new EmptyRuntimeException("dataSourceName");
}
return dataSourceFactory.getDataSource(dataSourceName);
}
/**
* スレッドコンテキストに設定された名前を持つデータソースからコネクションを取得して返します。
*
* @return スレッドコンテキストに設定された名前を持つデータソースから取得したコネクション
* @throws EmptyRuntimeException
* スレッドコンテキストにデータソース名が設定されていない場合にスローされます
* @throws org.seasar.framework.container.ComponentNotFoundException
* スレッドコンテキストに設定されたデータソース名を持つコンポーネントがS2コンテナに登録されていない場合にスローされます
* @throws SQLException
* データソースで例外が発生した場合にスローされます
*/
public Connection getConnection() throws SQLException {
return getDataSource().getConnection();
}
/**
* スレッドコンテキストに設定された名前を持つデータソースからコネクションを取得して返します。
*
* @param username
* ユーザ名
* @param password
* パスワード
* @return スレッドコンテキストに設定された名前を持つデータソースから取得したコネクション
* @throws EmptyRuntimeException
* スレッドコンテキストにデータソース名が設定されていない場合にスローされます
* @throws org.seasar.framework.container.ComponentNotFoundException
* スレッドコンテキストに設定されたデータソース名を持つコンポーネントがS2コンテナに登録されていない場合にスローされます
* @throws SQLException
* データソースで例外が発生した場合にスローされます
*/
public Connection getConnection(final String username, final String password)
throws SQLException {
return getDataSource().getConnection(username, password);
}
/**
* スレッドコンテキストに設定された名前を持つデータソースからログライターを取得して返します。
*
* @return スレッドコンテキストに設定された名前を持つデータソースから取得したログライター
* @throws EmptyRuntimeException
* スレッドコンテキストにデータソース名が設定されていない場合にスローされます
* @throws org.seasar.framework.container.ComponentNotFoundException
* スレッドコンテキストに設定されたデータソース名を持つコンポーネントがS2コンテナに登録されていない場合にスローされます
* @throws SQLException
* データソースで例外が発生した場合にスローされます
*/
public PrintWriter getLogWriter() throws SQLException {
return getDataSource().getLogWriter();
}
/**
* スレッドコンテキストに設定された名前を持つデータソースにログライターを設定します。
*
* @param out
* スレッドコンテキストに設定された名前を持つデータソースに設定するログライター
* @throws EmptyRuntimeException
* スレッドコンテキストにデータソース名が設定されていない場合にスローされます
* @throws org.seasar.framework.container.ComponentNotFoundException
* スレッドコンテキストに設定されたデータソース名を持つコンポーネントがS2コンテナに登録されていない場合にスローされます
* @throws SQLException
* データソースで例外が発生した場合にスローされます
*/
public void setLogWriter(final PrintWriter out) throws SQLException {
getDataSource().setLogWriter(out);
}
/**
* スレッドコンテキストに設定された名前を持つデータソースからログインタイムアウト時間(秒)を取得して返します。
*
* @return スレッドコンテキストに設定された名前を持つデータソースから取得したログインタイムアウト時間(秒)
* @throws EmptyRuntimeException
* スレッドコンテキストにデータソース名が設定されていない場合にスローされます
* @throws org.seasar.framework.container.ComponentNotFoundException
* スレッドコンテキストに設定されたデータソース名を持つコンポーネントがS2コンテナに登録されていない場合にスローされます
* @throws SQLException
* データソースで例外が発生した場合にスローされます
*/
public int getLoginTimeout() throws SQLException {
return getDataSource().getLoginTimeout();
}
/**
* スレッドコンテキストに設定された名前を持つデータソースにログインタイムアウト時間(秒)を設定します。
*
* @param seconds
* スレッドコンテキストに設定された名前を持つデータソースに設定するログインタイムアウト時間(秒)
* @throws EmptyRuntimeException
* スレッドコンテキストにデータソース名が設定されていない場合にスローされます
* @throws org.seasar.framework.container.ComponentNotFoundException
* スレッドコンテキストに設定されたデータソース名を持つコンポーネントがS2コンテナに登録されていない場合にスローされます
* @throws SQLException
* データソースで例外が発生した場合にスローされます
*/
public void setLoginTimeout(int seconds) throws SQLException {
getDataSource().setLoginTimeout(seconds);
}
}