/* * JBoss, Home of Professional Open Source * Copyright 2009 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.mixed; import org.infinispan.loaders.LockSupportCacheStoreConfig; import org.infinispan.loaders.jdbc.AbstractJdbcCacheStoreConfig; import org.infinispan.loaders.jdbc.DatabaseType; import org.infinispan.loaders.jdbc.TableManipulation; import org.infinispan.loaders.jdbc.binary.JdbcBinaryCacheStoreConfig; import org.infinispan.loaders.jdbc.connectionfactory.ConnectionFactoryConfig; import org.infinispan.loaders.jdbc.stringbased.JdbcStringBasedCacheStoreConfig; /** * Configuration for {@link org.infinispan.loaders.jdbc.mixed.JdbcMixedCacheStore}. * * @author Mircea.Markus@jboss.com */ public class JdbcMixedCacheStoreConfig extends AbstractJdbcCacheStoreConfig { private static final long serialVersionUID = -1343548133363285687L; private TableManipulation binaryTableManipulation = new TableManipulation(); private TableManipulation stringsTableManipulation = new TableManipulation(); private String key2StringMapper; private int binaryConcurrencyLevel = LockSupportCacheStoreConfig.DEFAULT_CONCURRENCY_LEVEL / 2; private int stringsConcurrencyLevel = LockSupportCacheStoreConfig.DEFAULT_CONCURRENCY_LEVEL / 2; private int lockAcquistionTimeout = LockSupportCacheStoreConfig.DEFAULT_LOCK_ACQUISITION_TIMEOUT; public JdbcMixedCacheStoreConfig(ConnectionFactoryConfig connectionFactoryConfig, TableManipulation binaryTableManipulation, TableManipulation stringsTableManipulation) { this.connectionFactoryConfig = connectionFactoryConfig; this.binaryTableManipulation = binaryTableManipulation; this.stringsTableManipulation = stringsTableManipulation; } public JdbcMixedCacheStoreConfig() { cacheLoaderClassName = JdbcMixedCacheStore.class.getName(); } public void setConnectionFactoryConfig(ConnectionFactoryConfig connectionFactoryConfig) { testImmutability("connectionFactoryConfig"); this.connectionFactoryConfig = connectionFactoryConfig; } public void setBinaryTableManipulation(TableManipulation binaryTableManipulation) { testImmutability("binaryTableManipulation"); this.binaryTableManipulation = binaryTableManipulation; } public void setStringsTableManipulation(TableManipulation stringsTableManipulation) { testImmutability("stringsTableManipulation"); this.stringsTableManipulation = stringsTableManipulation; } JdbcBinaryCacheStoreConfig getBinaryCacheStoreConfig() { JdbcBinaryCacheStoreConfig cacheStoreConfig = new JdbcBinaryCacheStoreConfig(false); cacheStoreConfig.setTableManipulation(binaryTableManipulation); cacheStoreConfig.setPurgeSynchronously(true);//just to make sure we don't create another thread cacheStoreConfig.setLockConcurrencyLevel(binaryConcurrencyLevel); cacheStoreConfig.setLockAcquistionTimeout(lockAcquistionTimeout); return cacheStoreConfig; } JdbcStringBasedCacheStoreConfig getStringCacheStoreConfig() { JdbcStringBasedCacheStoreConfig config = new JdbcStringBasedCacheStoreConfig(false); config.setTableManipulation(stringsTableManipulation); config.setPurgeSynchronously(true); //just to make sure we don't create another thread config.setLockConcurrencyLevel(stringsConcurrencyLevel); config.setLockAcquistionTimeout(lockAcquistionTimeout); if (key2StringMapper != null) { config.setKey2StringMapperClass(key2StringMapper); } return config; } public void setIdColumnNameForStrings(String idColumnNameForStrings) { testImmutability("stringsTableManipulation"); stringsTableManipulation.setIdColumnName(idColumnNameForStrings); } public void setIdColumnTypeForStrings(String idColumnTypeForStrings) { testImmutability("stringsTableManipulation"); stringsTableManipulation.setIdColumnType(idColumnTypeForStrings); } public void setTableNamePrefixForStrings(String tableNameForStrings) { testImmutability("stringsTableManipulation"); if (tableNameForStrings == null) { throw new IllegalArgumentException("Null table name not allowed."); } if (tableNameForStrings.equals(binaryTableManipulation.getTableNamePrefix())) { throw new IllegalArgumentException("Same table name is used for both cache loaders, this is not allowed!"); } stringsTableManipulation.setTableNamePrefix(tableNameForStrings); } public void setDataColumnNameForStrings(String dataColumnNameForStrings) { testImmutability("stringsTableManipulation"); stringsTableManipulation.setDataColumnName(dataColumnNameForStrings); } public void setDataColumnTypeForStrings(String dataColumnTypeForStrings) { testImmutability("stringsTableManipulation"); stringsTableManipulation.setDataColumnType(dataColumnTypeForStrings); } public void setTimestampColumnNameForStrings(String timestampColumnNameForStrings) { testImmutability("stringsTableManipulation"); stringsTableManipulation.setTimestampColumnName(timestampColumnNameForStrings); } public void setTimestampColumnTypeForStrings(String timestampColumnTypeForStrings) { testImmutability("stringsTableManipulation"); stringsTableManipulation.setTimestampColumnType(timestampColumnTypeForStrings); } public void setCreateTableOnStartForStrings(boolean createTableOnStartForStrings) { testImmutability("stringsTableManipulation"); stringsTableManipulation.setCreateTableOnStart(createTableOnStartForStrings); } public void setDropTableOnExitForStrings(boolean dropTableOnExitForStrings) { testImmutability("stringsTableManipulation"); stringsTableManipulation.setDropTableOnExit(dropTableOnExitForStrings); } public void setIdColumnNameForBinary(String idColumnNameForBinary) { binaryTableManipulation.setIdColumnName(idColumnNameForBinary); } public void setIdColumnTypeForBinary(String idColumnTypeForBinary) { testImmutability("stringsTableManipulation"); binaryTableManipulation.setIdColumnType(idColumnTypeForBinary); } public void setTableNamePrefixForBinary(String tableNameForBinary) { testImmutability("binaryTableManipulation"); if (tableNameForBinary == null) { throw new IllegalArgumentException("Null table name not allowed."); } if (tableNameForBinary.equals(stringsTableManipulation.getTableNamePrefix())) { throw new IllegalArgumentException("Same table name is used for both cache loaders, this is not allowed!"); } binaryTableManipulation.setTableNamePrefix(tableNameForBinary); } public void setDataColumnNameForBinary(String dataColumnNameForBinary) { testImmutability("binaryTableManipulation"); binaryTableManipulation.setDataColumnName(dataColumnNameForBinary); } public void setDataColumnTypeForBinary(String dataColumnTypeForBinary) { testImmutability("binaryTableManipulation"); binaryTableManipulation.setDataColumnType(dataColumnTypeForBinary); } public void setTimestampColumnNameForBinary(String timestampColumnNameForBinary) { testImmutability("binaryTableManipulation"); binaryTableManipulation.setTimestampColumnName(timestampColumnNameForBinary); } public void setTimestampColumnTypeForBinary(String timestampColumnTypeForBinary) { binaryTableManipulation.setTimestampColumnType(timestampColumnTypeForBinary); } public void setCreateTableOnStartForBinary(boolean createTableOnStartForBinary) { testImmutability("binaryTableManipulation"); binaryTableManipulation.setCreateTableOnStart(createTableOnStartForBinary); } public void setDropTableOnExitForBinary(boolean dropTableOnExitForBinary) { testImmutability("binaryTableManipulation"); binaryTableManipulation.setDropTableOnExit(dropTableOnExitForBinary); } public void setKey2StringMapperClass(String name) { testImmutability("key2StringMapper"); key2StringMapper = name; } public void setLockConcurrencyLevelForStrings(int concurrencyLevel) { testImmutability("stringsConcurrencyLevel"); stringsConcurrencyLevel = concurrencyLevel; } public void setLockConcurrencyLevelForBinary(int concurrencyLevel) { testImmutability("binaryConcurrencyLevel"); binaryConcurrencyLevel = concurrencyLevel; } public void setLockAcquistionTimeout(int lockAcquistionTimeout) { testImmutability("lockAcquistionTimeout"); this.lockAcquistionTimeout = lockAcquistionTimeout; } /** * @see org.infinispan.loaders.jdbc.TableManipulation#getFetchSize() */ public void setFetchSize(int fetchSize) { testImmutability("tableManipulation"); binaryTableManipulation.setFetchSize(fetchSize); stringsTableManipulation.setFetchSize(fetchSize); } /** * @see org.infinispan.loaders.jdbc.TableManipulation#getBatchSize() */ public void setBatchSize(int batchSize) { testImmutability("tableManipulation"); binaryTableManipulation.setBatchSize(batchSize); stringsTableManipulation.setBatchSize(batchSize); } public String getDatabaseType() { return binaryTableManipulation.databaseType == null ? "" : binaryTableManipulation.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) { DatabaseType type = DatabaseType.valueOf(dbType.toUpperCase().trim()); binaryTableManipulation.databaseType = type; stringsTableManipulation.databaseType = type; } } @Override public JdbcMixedCacheStoreConfig clone() { JdbcMixedCacheStoreConfig dolly = (JdbcMixedCacheStoreConfig) super.clone(); dolly.binaryTableManipulation = binaryTableManipulation.clone(); dolly.stringsTableManipulation = stringsTableManipulation.clone(); return dolly; } }