blob: 5faff5926059d146ef8a7f321800eead9d5899df [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.servicemix.store.jdbc;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.apache.servicemix.id.IdGenerator;
import org.apache.servicemix.jdbc.JDBCAdapter;
import org.apache.servicemix.jdbc.JDBCAdapterFactory;
import org.apache.servicemix.jdbc.Statements;
import org.apache.servicemix.store.Store;
import org.apache.servicemix.store.StoreListener;
import org.apache.servicemix.store.base.BaseStoreFactory;
public class JdbcStoreFactory extends BaseStoreFactory {
private boolean transactional;
private boolean clustered;
private DataSource dataSource;
private IdGenerator idGenerator = new IdGenerator();
private Map<String, JdbcStore> stores = new HashMap<String, JdbcStore>();
private String tableName = "SM_STORE";
private boolean createDataBase = true;
private JDBCAdapter adapter;
private Statements statements;
/* (non-Javadoc)
* @see org.apache.servicemix.store.ExchangeStoreFactory#get(java.lang.String)
*/
public synchronized Store open(String name) throws IOException {
if (adapter == null) {
Connection connection = null;
try {
connection = getDataSource().getConnection();
adapter = JDBCAdapterFactory.getAdapter(connection);
if (statements == null) {
statements = new Statements();
statements.setStoreTableName(tableName);
}
adapter.setStatements(statements);
if (createDataBase) {
adapter.doCreateTables(connection);
}
if (!connection.getAutoCommit())
connection.commit();
} catch (SQLException e) {
throw (IOException) new IOException("Exception while creating database").initCause(e);
} finally {
if (connection != null) {
try {
connection.close();
} catch (Exception e) {
// Do nothing
}
}
}
}
JdbcStore store = stores.get(name);
if (store == null) {
store = new JdbcStore(this, name);
for(StoreListener listener:storeListeners) {
store.addListener(listener);
}
stores.put(name, store);
}
return store;
}
/* (non-Javadoc)
* @see org.apache.servicemix.store.ExchangeStoreFactory#release(org.apache.servicemix.store.ExchangeStore)
*/
public synchronized void close(Store store) throws IOException {
stores.remove(store);
}
/**
* @return Returns the adapter.
*/
public JDBCAdapter getAdapter() {
return adapter;
}
/**
* @return Returns the dataSource.
*/
public DataSource getDataSource() {
return dataSource;
}
/**
* @param dataSource The dataSource to set.
*/
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
/**
* @return Returns the clustered.
*/
public boolean isClustered() {
return clustered;
}
/**
* @param clustered The clustered to set.
*/
public void setClustered(boolean clustered) {
this.clustered = clustered;
}
/**
* @return Returns the transactional.
*/
public boolean isTransactional() {
return transactional;
}
/**
* @param transactional The transactional to set.
*/
public void setTransactional(boolean transactional) {
this.transactional = transactional;
}
/**
* @return Returns the idGenerator.
*/
public IdGenerator getIdGenerator() {
return idGenerator;
}
/**
* @param idGenerator The idGenerator to set.
*/
public void setIdGenerator(IdGenerator idGenerator) {
this.idGenerator = idGenerator;
}
/**
* @return Returns the tableName.
*/
public String getTableName() {
return tableName;
}
/**
* @param tableName The tableName to set.
*/
public void setTableName(String tableName) {
this.tableName = tableName;
}
/**
* @return Returns the createDataBase.
*/
public boolean isCreateDataBase() {
return createDataBase;
}
/**
* @param createDataBase The createDataBase to set.
*/
public void setCreateDataBase(boolean createDataBase) {
this.createDataBase = createDataBase;
}
}