/*
* JBoss, Home of Professional Open Source
* Copyright 2010 Red Hat Inc. and/or its affiliates and other
* contributors as indicated by the @author tags. All rights reserved.
* See the copyright.txt in the distribution for a full listing of
* individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.infinispan.loaders.jdbc;
/**
* An abstract configuration for JDBC cache stores which have support for locking.
*
* @author Manik Surtani
* @version 4.1
*/
public abstract class AbstractNonDelegatingJdbcCacheStoreConfig extends AbstractJdbcCacheStoreConfig {
private static final long serialVersionUID = 842757200078048889L;
public static final int DEFAULT_CONCURRENCY_LEVEL = 2048;
public static final int DEFAULT_LOCK_ACQUISITION_TIMEOUT = 60000;
private int lockConcurrencyLevel = DEFAULT_CONCURRENCY_LEVEL;
private long lockAcquistionTimeout = DEFAULT_LOCK_ACQUISITION_TIMEOUT;
protected TableManipulation tableManipulation = new TableManipulation();
protected boolean manageConnectionFactory = true;
/**
* Sets the name of the table where data will be stored.
*/
public void setCacheName(String cacheName) {
testImmutability("tableManipulation");
this.tableManipulation.setCacheName(cacheName);
}
/**
* Sets the name of the column where the id will be stored. The id is obtained through:
* <pre>
* key2StringMapper.getStringMapping(storedEntry.getKey());
* </pre>
* Mandatory.
*/
public void setIdColumnName(String idColumnName) {
testImmutability("tableManipulation");
this.tableManipulation.setIdColumnName(idColumnName);
}
/**
* Sets the name of the column where the StoredEntry will be binary stored. Mandatory.
*/
public void setDataColumnName(String dataColumnName) {
testImmutability("tableManipulation");
this.tableManipulation.setDataColumnName(dataColumnName);
}
/**
* Sets the name of the column where the timestamp (Long in java) will be stored. Mandatory.
*/
public void setTimestampColumnName(String timestampColumnName) {
testImmutability("tableManipulation");
this.tableManipulation.setTimestampColumnName(timestampColumnName);
}
/**
* Sets the prefix for the name of the table where the data will be stored. "_<cache name>" will be appended
* to this prefix in order to enforce unique table names for each cache.
*/
public void setTimestampColumnType(String timestampColumnType) {
testImmutability("tableManipulation");
this.tableManipulation.setTimestampColumnType(timestampColumnType);
}
public TableManipulation getTableManipulation() {
return tableManipulation;
}
/**
* sql equivalent for java's String. Mandatory.
*/
public void setIdColumnType(String idColumnType) {
testImmutability("tableManipulation");
this.tableManipulation.setIdColumnType(idColumnType);
}
/**
* Sets the type of the column where data will be binary stored. It should be a binary type like <tt>BLOB</tt>.
* Mandatory.
* <br>
* Character types like <tt>CLOB</tt>/<tt>LONGVARCHAR</tt>/<tt>VARCHAR</tt> are <b>not</b> supported.
* <br>
* Note that on MySQL you need to use <a href="http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html#sqlmode_strict_all_tables">strict mode</a>
* or the database will truncate long values without raising any errors, leading to unmarshalling errors on load.
*/
public void setDataColumnType(String dataColumnType) {
testImmutability("tableManipulation");
this.tableManipulation.setDataColumnType(dataColumnType);
}
public void setDropTableOnExit(boolean dropTableOnExit) {
testImmutability("tableManipulation");
this.tableManipulation.setDropTableOnExit(dropTableOnExit);
}
public void setCreateTableOnStart(boolean createTableOnStart) {
testImmutability("tableManipulation");
this.tableManipulation.setCreateTableOnStart(createTableOnStart);
}
/**
* If this method returns false, then the connection factory should not be created by the {@link
* org.infinispan.loaders.jdbc.stringbased.JdbcStringBasedCacheStore}, but will be injected through {@link
* org.infinispan.loaders.jdbc.stringbased.JdbcStringBasedCacheStore#doConnectionFactoryInitialization(org.infinispan.loaders.jdbc.connectionfactory.ConnectionFactory)}
*/
public boolean isManageConnectionFactory() {
return manageConnectionFactory;
}
public void setTableManipulation(TableManipulation tableManipulation) {
testImmutability("tableManipulation");
this.tableManipulation = tableManipulation;
}
/**
* @see org.infinispan.loaders.jdbc.TableManipulation#getFetchSize()
*/
public void setFetchSize(int fetchSize) {
testImmutability("tableManipulation");
this.tableManipulation.setFetchSize(fetchSize);
}
/**
* @see org.infinispan.loaders.jdbc.TableManipulation#getBatchSize()
*/
public void setBatchSize(int batchSize) {
testImmutability("tableManipulation");
this.tableManipulation.setBatchSize(batchSize);
}
/**
* @see org.infinispan.loaders.jdbc.TableManipulation#getFetchSize()
*/
public int getFetchSize() {
return this.tableManipulation.getFetchSize();
}
/**
* @see org.infinispan.loaders.jdbc.TableManipulation#getBatchSize()
*/
public int getBatchSize() {
return this.tableManipulation.getBatchSize();
}
public String getDatabaseType() {
return this.tableManipulation.databaseType == null ? "" : this.tableManipulation.databaseType.toString();
}
/**
* Sets the database dialect. Valid types are reflected in the DatabaseType enum. If unspecified, will attempt to
* "guess" appropriate dialect from the JDBC driver specified.
*
* @param dbType
*/
public void setDatabaseType(String dbType) {
if (dbType != null)
this.tableManipulation.databaseType = DatabaseType.valueOf(dbType.toUpperCase().trim());
}
@Override
public AbstractNonDelegatingJdbcCacheStoreConfig clone() {
AbstractNonDelegatingJdbcCacheStoreConfig result = (AbstractNonDelegatingJdbcCacheStoreConfig) super.clone();
result.tableManipulation = tableManipulation.clone();
return result;
}
@Override
public String toString() {
return "AbstractNonDelegatingJdbcCacheStoreConfig{" +
"lockConcurrencyLevel=" + lockConcurrencyLevel +
", lockAcquistionTimeout=" + lockAcquistionTimeout +
", tableManipulation=" + tableManipulation +
", manageConnectionFactory=" + manageConnectionFactory +
"} " + super.toString();
}
}