/*
* Copyright 2010 Research Studios Austria Forschungsgesellschaft mBH
*
* This file is part of easyrec.
*
* easyrec is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* easyrec 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with easyrec. If not, see <http://www.gnu.org/licenses/>.
*/
package org.easyrec.store.dao.impl;
import org.easyrec.model.core.TenantVO;
import org.easyrec.store.dao.BaseTenantDAO;
import org.easyrec.utils.spring.cache.annotation.LongCacheable;
import org.easyrec.utils.spring.store.dao.DaoUtils;
import org.easyrec.utils.spring.store.dao.annotation.DAO;
import org.easyrec.utils.spring.store.dao.impl.AbstractTableCreatingDAOImpl;
import org.easyrec.utils.spring.store.service.sqlscript.SqlScriptService;
import org.springframework.jdbc.core.PreparedStatementCreatorFactory;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;
/**
* This class provides a Mysql implementation of the {@link org.easyrec.store.dao.BaseTenantDAO} interface.
* <p/>
* <p><b>Company: </b>
* SAT, Research Studios Austria</p>
* <p/>
* <p><b>Copyright: </b>
* (c) 2007</p>
* <p/>
* <p><b>last modified:</b><br/>
* $Author: pmarschik $<br/>
* $Date: 2011-02-11 10:43:43 +0100 (Fr, 11 Feb 2011) $<br/>
* $Revision: 17651 $</p>
*
* @author Roman Cerny
*/
@DAO
public abstract class AbstractBaseTenantDAOMysqlImpl extends AbstractTableCreatingDAOImpl implements BaseTenantDAO {
// constants
private final static String TABLE_CREATING_SQL_SCRIPT_NAME = "classpath:sql/Tenant.sql";
// members
private TenantVORowMapper tenantVORowMapper = new TenantVORowMapper();
// constructor
protected AbstractBaseTenantDAOMysqlImpl(SqlScriptService sqlScriptService) {
super(sqlScriptService);
}
// abstract template method implementation of 'AbstractTableCreatingDAOImpl'
@Override
public String getDefaultTableName() {
return DEFAULT_TABLE_NAME;
}
@Override
public String getTableCreatingSQLScriptName() {
return TABLE_CREATING_SQL_SCRIPT_NAME;
}
// interface 'BaseTenantDAO' implementation
@LongCacheable
public TenantVO getTenantById(Integer tenantId) {
// validate input parameters
if (tenantId == null) {
throw new IllegalArgumentException("missing 'tenantId'");
}
if (logger.isDebugEnabled()) {
logger.debug("loading 'tenant' with id '" + tenantId + "'");
}
StringBuilder sqlString = new StringBuilder("SELECT * FROM ");
sqlString.append(DEFAULT_TABLE_NAME);
sqlString.append(" WHERE ");
sqlString.append(DEFAULT_ID_COLUMN_NAME);
sqlString.append("=?");
Object[] args = {tenantId};
int[] argTypes = {Types.INTEGER};
return getJdbcTemplate().queryForObject(sqlString.toString(), args, argTypes, tenantVORowMapper);
}
@LongCacheable
public TenantVO getTenantByStringId(String stringId) {
// validate input parameters
if (stringId == null) {
throw new IllegalArgumentException("missing 'stringId'");
}
if (logger.isDebugEnabled()) {
logger.debug("loading 'tenant' with stringId '" + stringId + "'");
}
StringBuilder sqlString = new StringBuilder("SELECT * FROM ");
sqlString.append(DEFAULT_TABLE_NAME);
sqlString.append(" WHERE ");
sqlString.append(DEFAULT_STRING_ID_COLUMN_NAME);
sqlString.append(" LIKE ?");
Object[] args = {stringId};
int[] argTypes = {Types.VARCHAR};
return getJdbcTemplate().queryForObject(sqlString.toString(), args, argTypes, tenantVORowMapper);
}
public List<TenantVO> getAllTenants() {
if (logger.isDebugEnabled()) {
logger.debug("loading list of all tenants'");
}
StringBuilder sqlString = new StringBuilder("SELECT * FROM ");
sqlString.append(DEFAULT_TABLE_NAME);
return getJdbcTemplate().query(sqlString.toString(), tenantVORowMapper);
}
public int insertTenant(TenantVO tenant) {
if (logger.isDebugEnabled()) {
logger.debug("inserting tenant '" + tenant.getStringId() + "'");
}
StringBuilder query = new StringBuilder("INSERT INTO ");
query.append(DEFAULT_TABLE_NAME);
query.append(" SET ");
query.append(DEFAULT_ID_COLUMN_NAME);
query.append(" =?, ");
query.append(DEFAULT_STRING_ID_COLUMN_NAME);
query.append(" =?, ");
query.append(DEFAULT_DESCRIPTION_COLUMN_NAME);
query.append(" =?, ");
query.append(DEFAULT_RATING_RANGE_MIN_COLUMN_NAME);
query.append(" =?, ");
query.append(DEFAULT_RATING_RANGE_MAX_COLUMN_NAME);
query.append(" =?, ");
query.append(DEFAULT_RATING_RANGE_NEUTRAL_COLUMN_NAME);
query.append(" =?");
tenant.setId(getNewTenantId());
Object[] args = {tenant.getId(), tenant.getStringId(), tenant.getDescription(), tenant.getRatingRangeMin(),
tenant.getRatingRangeMax(), tenant.getRatingRangeNeutral()};
int[] argTypes = {Types.INTEGER, Types.VARCHAR, Types.VARCHAR, Types.INTEGER, Types.INTEGER, Types.DOUBLE};
PreparedStatementCreatorFactory factory = new PreparedStatementCreatorFactory(query.toString(), argTypes);
getJdbcTemplate().update(factory.newPreparedStatementCreator(args));
return tenant.getId();
}
public int setTenantActive(TenantVO tenant, boolean active) {
if (logger.isDebugEnabled()) {
logger.debug("setting tenant '" + tenant.getStringId() + "' to " + active);
}
StringBuilder query = new StringBuilder("UPDATE ");
query.append(DEFAULT_TABLE_NAME);
query.append(" SET ");
query.append(DEFAULT_ACTIVE_COLUMN_NAME).append("=?");
query.append(" WHERE ");
query.append(DEFAULT_ID_COLUMN_NAME).append("=?");
Object[] args = {active, tenant.getId()};
int[] argTypes = {Types.BOOLEAN, Types.INTEGER};
PreparedStatementCreatorFactory factory = new PreparedStatementCreatorFactory(query.toString(), argTypes);
return getJdbcTemplate().update(factory.newPreparedStatementCreator(args));
}
public String getTenantConfig(Integer tenantId) {
if (tenantId == null) {
throw new IllegalArgumentException("tenantId must not be 'null'!");
}
if (logger.isDebugEnabled()) {
logger.debug("loading 'tenantConfig' for tenant '" + tenantId + "'");
}
StringBuilder sqlString = new StringBuilder("SELECT ");
sqlString.append(DEFAULT_CONFIG_COLUMN_NAME);
sqlString.append(" FROM ");
sqlString.append(DEFAULT_TABLE_NAME);
sqlString.append(" WHERE ");
sqlString.append(DEFAULT_ID_COLUMN_NAME);
sqlString.append("=?");
Object[] args;
int[] argTypes;
args = new Object[]{tenantId};
argTypes = new int[]{Types.INTEGER};
return getJdbcTemplate().queryForObject(sqlString.toString(), args, argTypes, String.class);
}
public int storeTenantConfig(Integer tenantId, String tenantConfig) {
if (tenantId == null) {
throw new IllegalArgumentException("tenantId must not be 'null'!");
}
if (logger.isDebugEnabled()) {
logger.debug("storing tenantConfig for tenant '" + tenantId + "'");
}
StringBuilder query = new StringBuilder("UPDATE ");
query.append(DEFAULT_TABLE_NAME);
query.append(" SET ");
query.append(DEFAULT_CONFIG_COLUMN_NAME).append("=?");
query.append(" WHERE ");
query.append(DEFAULT_ID_COLUMN_NAME).append("=?");
Object[] args = {tenantConfig, tenantId};
int[] argTypes = {Types.VARCHAR, Types.INTEGER};
PreparedStatementCreatorFactory factory = new PreparedStatementCreatorFactory(query.toString(), argTypes);
return getJdbcTemplate().update(factory.newPreparedStatementCreator(args));
}
public String getTenantStatistic(Integer tenantId) {
if (tenantId == null) {
throw new IllegalArgumentException("tenantId must not be 'null'!");
}
if (logger.isDebugEnabled()) {
logger.debug("loading 'tenantStatistic' for tenant '" + tenantId + "'");
}
StringBuilder sqlString = new StringBuilder("SELECT ");
sqlString.append(DEFAULT_STATISTIC_COLUMN_NAME);
sqlString.append(" FROM ");
sqlString.append(DEFAULT_TABLE_NAME);
sqlString.append(" WHERE ");
sqlString.append(DEFAULT_ID_COLUMN_NAME);
sqlString.append("=?");
Object[] args;
int[] argTypes;
args = new Object[]{tenantId};
argTypes = new int[]{Types.INTEGER};
return getJdbcTemplate().queryForObject(sqlString.toString(), args, argTypes, String.class);
}
public int storeTenantStatistic(Integer tenantId, String tenantStatistic) {
if (tenantId == null) {
throw new IllegalArgumentException("tenantId must not be 'null'!");
}
if (logger.isDebugEnabled()) {
logger.debug("storing tenantStatistic for tenant '" + tenantId + "'");
}
StringBuilder query = new StringBuilder("UPDATE ");
query.append(DEFAULT_TABLE_NAME);
query.append(" SET ");
query.append(DEFAULT_STATISTIC_COLUMN_NAME).append("=?");
query.append(" WHERE ");
query.append(DEFAULT_ID_COLUMN_NAME).append("=?");
PreparedStatementCreatorFactory factory = new PreparedStatementCreatorFactory(query.toString(),
new int[]{Types.VARCHAR, Types.INTEGER});
return getJdbcTemplate().update(factory.newPreparedStatementCreator(new Object[]{tenantStatistic, tenantId}));
}
//////////////////////////////////////////////////////////////////////////////
// private methods
private int getNewTenantId() {
StringBuilder query = new StringBuilder("Select MAX(").append(DEFAULT_ID_COLUMN_NAME).append(") FROM ")
.append(DEFAULT_TABLE_NAME);
return getJdbcTemplate().queryForInt(query.toString()) + 1;
}
//////////////////////////////////////////////////////////////////////////////
// private inner classes
private class TenantVORowMapper implements RowMapper<TenantVO> {
public TenantVO mapRow(ResultSet rs, int rowNum) throws SQLException {
TenantVO tenant = new TenantVO(DaoUtils.getInteger(rs, DEFAULT_ID_COLUMN_NAME),
DaoUtils.getStringIfPresent(rs, DEFAULT_STRING_ID_COLUMN_NAME),
DaoUtils.getStringIfPresent(rs, DEFAULT_DESCRIPTION_COLUMN_NAME),
DaoUtils.getInteger(rs, DEFAULT_RATING_RANGE_MIN_COLUMN_NAME),
DaoUtils.getInteger(rs, DEFAULT_RATING_RANGE_MAX_COLUMN_NAME),
DaoUtils.getDouble(rs, DEFAULT_RATING_RANGE_NEUTRAL_COLUMN_NAME),
DaoUtils.getBoolean(rs, DEFAULT_ACTIVE_COLUMN_NAME));
return tenant;
}
}
}