/*
* Copyright 2011 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.plugin.impl;
import com.google.common.base.Preconditions;
import org.easyrec.model.plugin.NamedConfiguration;
import org.easyrec.plugin.container.PluginRegistry;
import org.easyrec.plugin.generator.Generator;
import org.easyrec.plugin.generator.GeneratorConfiguration;
import org.easyrec.plugin.generator.GeneratorConfigurationConstants;
import org.easyrec.plugin.model.PluginId;
import org.easyrec.store.dao.plugin.NamedConfigurationDAO;
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.SqlParameter;
import org.springframework.jdbc.object.MappingSqlQuery;
import org.springframework.jdbc.object.SqlUpdate;
import javax.sql.DataSource;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;
import java.io.StringReader;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;
/**
* @author pmarschik
*/
@DAO
public class NamedConfigurationDAOMysqlImpl extends AbstractTableCreatingDAOImpl implements NamedConfigurationDAO {
private SqlUpdate createConfiguration;
private SqlUpdate updateConfigurationActive;
private SqlUpdate updateConfigurationInactive;
private SqlUpdate updateAllInactive;
private SqlUpdate deleteConfiguration;
private SqlUpdate updateSetInactiveByPluginId;
private MappingSqlQuery<NamedConfiguration> readConfiguration;
private MappingSqlQuery<NamedConfiguration> readActiveConfiguration;
private MappingSqlQuery<NamedConfiguration> readConfigurations;
public NamedConfigurationDAOMysqlImpl(DataSource dataSource, SqlScriptService sqlScriptService,
PluginRegistry pluginRegistry) {
super(sqlScriptService);
setDataSource(dataSource);
createConfiguration = new SqlUpdate(dataSource,
"INSERT INTO plugin_configuration(tenantId, assocTypeId, pluginId, pluginVersion, name, " +
"configuration, active) VALUES(?, ?, ?, ?, ?, ?, ?)",
new int[]{Types.INTEGER, Types.INTEGER, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.BLOB,
Types.BIT}, 1);
createConfiguration.compile();
updateConfigurationActive = new SqlUpdate(dataSource,
"UPDATE plugin_configuration SET name = ?, configuration = ?, active = b'1' " +
"WHERE tenantId = ? AND assocTypeId = ? AND pluginId = ? AND pluginVersion = ? AND name = ?",
new int[]{Types.VARCHAR, Types.BLOB, Types.INTEGER, Types.INTEGER, Types.VARCHAR,
Types.VARCHAR, Types.VARCHAR}, 1);
updateConfigurationActive.compile();
updateConfigurationInactive = new SqlUpdate(dataSource,
"UPDATE plugin_configuration SET name = ?, configuration = ? " +
"WHERE tenantId = ? AND assocTypeId = ? AND pluginId = ? AND pluginVersion = ? AND name = ?",
new int[]{Types.VARCHAR, Types.BLOB, Types.INTEGER, Types.INTEGER, Types.VARCHAR,
Types.VARCHAR, Types.VARCHAR}, 1);
updateConfigurationInactive.compile();
updateAllInactive = new SqlUpdate(dataSource,
"UPDATE plugin_configuration SET active = b'0' WHERE tenantId = ? AND assocTypeId = ?",
new int[]{Types.INTEGER, Types.INTEGER});
updateSetInactiveByPluginId = new SqlUpdate(dataSource,
"UPDATE plugin_configuration SET active = b'0' WHERE pluginId = ? AND pluginVersion = ?",
new int[]{Types.VARCHAR, Types.VARCHAR});
deleteConfiguration = new SqlUpdate(dataSource,
"DELETE FROM plugin_configuration WHERE tenantId = ? AND assocTypeId = ? AND pluginId = ? AND " +
"pluginVersion = ? AND name = ? AND active = b'0'",
new int[]{Types.INTEGER, Types.INTEGER, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR}, 1);
deleteConfiguration.compile();
readConfiguration = new NamedConfigurationMappingStatement(dataSource,
"SELECT * FROM plugin_configuration WHERE tenantId = ? AND assocTypeId = ? AND pluginId = ? AND " +
"pluginVersion = ? AND name = ?", pluginRegistry);
readConfiguration.declareParameter(new SqlParameter("tenantId", Types.INTEGER));
readConfiguration.declareParameter(new SqlParameter("assocTypeId", Types.INTEGER));
readConfiguration.declareParameter(new SqlParameter("pluginId", Types.VARCHAR));
readConfiguration.declareParameter(new SqlParameter("pluginVersion", Types.VARCHAR));
readConfiguration.declareParameter(new SqlParameter("name", Types.VARCHAR));
readConfiguration.compile();
readConfigurations = new NamedConfigurationMappingStatement(dataSource,
"SELECT * FROM plugin_configuration WHERE tenantId = ? AND assocTypeId = ? AND pluginId = ? AND " +
"pluginVersion = ?", pluginRegistry);
readConfigurations.declareParameter(new SqlParameter("tenantId", Types.INTEGER));
readConfigurations.declareParameter(new SqlParameter("assocTypeId", Types.INTEGER));
readConfigurations.declareParameter(new SqlParameter("pluginId", Types.VARCHAR));
readConfigurations.declareParameter(new SqlParameter("pluginVersion", Types.VARCHAR));
readConfigurations.compile();
readActiveConfiguration = new NamedConfigurationMappingStatement(dataSource,
"SELECT * FROM plugin_configuration WHERE tenantId = ? AND assocTypeId = ? AND active = b'1'",
pluginRegistry);
readActiveConfiguration.declareParameter(new SqlParameter("tenantId", Types.INTEGER));
readActiveConfiguration.declareParameter(new SqlParameter("assocTypeId", Types.INTEGER));
readActiveConfiguration.compile();
}
@Override
public String getDefaultTableName() {
return "plugin_configuration";
}
@Override
public String getTableCreatingSQLScriptName() {
return "classpath:sql/pluginContainer/PluginConfiguration.sql";
}
public int updateConfiguration(NamedConfiguration namedConfiguration) {
Preconditions.checkNotNull(namedConfiguration);
Preconditions.checkNotNull(namedConfiguration.getPluginId());
Preconditions.checkNotNull(namedConfiguration.getPluginId().getUri());
Preconditions.checkNotNull(namedConfiguration.getPluginId().getVersion());
Preconditions.checkNotNull(namedConfiguration.getName());
Preconditions.checkNotNull(namedConfiguration.getConfiguration());
Preconditions.checkNotNull(namedConfiguration.getConfiguration().getConfigurationName());
String oldName = namedConfiguration.getName();
String newName = namedConfiguration.getConfiguration().getConfigurationName();
int rowsAffected;
if (namedConfiguration.isActive()) {
updateAllInactive.update(namedConfiguration.getTenantId(), namedConfiguration.getAssocTypeId());
rowsAffected =
updateConfigurationActive.update(newName, namedConfiguration.getConfiguration().marshal(false),
namedConfiguration.getTenantId(), namedConfiguration.getAssocTypeId(),
namedConfiguration.getPluginId().getUri(), namedConfiguration.getPluginId().getVersion(),
oldName);
} else
rowsAffected =
updateConfigurationInactive.update(newName, namedConfiguration.getConfiguration().marshal(false),
namedConfiguration.getTenantId(), namedConfiguration.getAssocTypeId(),
namedConfiguration.getPluginId().getUri(), namedConfiguration.getPluginId().getVersion(),
oldName);
namedConfiguration.setName(newName);
return rowsAffected;
}
public int createConfiguration(NamedConfiguration namedConfiguration) {
Preconditions.checkNotNull(namedConfiguration);
Preconditions.checkNotNull(namedConfiguration.getPluginId());
Preconditions.checkNotNull(namedConfiguration.getPluginId().getUri());
Preconditions.checkNotNull(namedConfiguration.getPluginId().getVersion());
Preconditions.checkNotNull(namedConfiguration.getName());
Preconditions.checkNotNull(namedConfiguration.getConfiguration());
if (namedConfiguration.isActive())
updateAllInactive.update(namedConfiguration.getTenantId(), namedConfiguration.getAssocTypeId());
namedConfiguration.getConfiguration().setConfigurationName(namedConfiguration.getName());
return createConfiguration.update(namedConfiguration.getTenantId(), namedConfiguration.getAssocTypeId(),
namedConfiguration.getPluginId().getUri().toASCIIString(),
namedConfiguration.getPluginId().getVersion().toString(), namedConfiguration.getName(),
namedConfiguration.getConfiguration().marshal(false), namedConfiguration.isActive());
}
public int deleteConfiguration(NamedConfiguration namedConfiguration) {
Preconditions.checkNotNull(namedConfiguration);
Preconditions.checkNotNull(namedConfiguration.getName());
Preconditions.checkNotNull(namedConfiguration.getPluginId());
Preconditions.checkNotNull(namedConfiguration.getPluginId().getUri());
Preconditions.checkNotNull(namedConfiguration.getPluginId().getVersion());
return deleteConfiguration.update(namedConfiguration.getTenantId(), namedConfiguration.getAssocTypeId(),
namedConfiguration.getPluginId().getUri().toASCIIString(),
namedConfiguration.getPluginId().getVersion().toString(), namedConfiguration.getName());
}
public NamedConfiguration readConfiguration(int tenantId, int assocTypeId, PluginId pluginId, String name) {
Preconditions.checkNotNull(pluginId);
Preconditions.checkNotNull(pluginId.getUri());
Preconditions.checkNotNull(pluginId.getVersion());
Preconditions.checkNotNull(name);
return readConfiguration.findObject(tenantId, assocTypeId, pluginId.getUri().toASCIIString(),
pluginId.getVersion().toString(), name);
}
public List<NamedConfiguration> readConfigurations(int tenantId, int assocTypeId, PluginId pluginId) {
Preconditions.checkNotNull(pluginId);
Preconditions.checkNotNull(pluginId.getUri());
Preconditions.checkNotNull(pluginId.getVersion());
return readConfigurations.execute(tenantId, assocTypeId, pluginId.getUri().toASCIIString(),
pluginId.getVersion().toString());
}
public NamedConfiguration readActiveConfiguration(int tenantId, int assocTypeId) {
return readActiveConfiguration.findObject(tenantId, assocTypeId);
}
public int deactivateByPlugin(PluginId pluginId) {
Preconditions.checkNotNull(pluginId);
Preconditions.checkNotNull(pluginId.getUri());
Preconditions.checkNotNull(pluginId.getVersion());
if (logger.isDebugEnabled()) {
logger.debug("inActivating plugin configs: " + pluginId.getUri() + "-" + pluginId.getVersion());
}
return updateSetInactiveByPluginId.update(pluginId.getUri(), pluginId.getVersion());
}
public int deactivateByAssocType(Integer tenantId, Integer assocTypeId) {
Preconditions.checkNotNull(tenantId);
Preconditions.checkNotNull(assocTypeId);
if (logger.isDebugEnabled()) {
logger.debug("inActivating all plugin configs for assocType: " + assocTypeId);
}
return updateAllInactive.update(tenantId, assocTypeId);
}
private static class NamedConfigurationMappingStatement extends MappingSqlQuery<NamedConfiguration> {
private PluginRegistry pluginRegistry;
private NamedConfigurationMappingStatement(DataSource ds, String sql,
PluginRegistry pluginRegistry) {
super(ds, sql);
this.pluginRegistry = pluginRegistry;
}
@Override
protected NamedConfiguration mapRow(ResultSet rs, int rowNum) throws SQLException {
int id = rs.getInt("id");
int tenantId = rs.getInt("tenantId");
int assocTypeId = rs.getInt("assocTypeId");
String pluginIdStr = rs.getString("pluginId");
String pluginVersionStr = rs.getString("pluginVersion");
String name = rs.getString("name");
String configurationStr = rs.getString("configuration");
boolean active = rs.getBoolean("active");
PluginId pluginId = new PluginId(pluginIdStr, pluginVersionStr);
GeneratorConfiguration configuration;
Generator<?, ?> generator = pluginRegistry.getGenerators().get(pluginId);
if (generator != null) {
try {
StringReader xmlRepresentation = new StringReader(configurationStr);
StreamSource streamSource = new StreamSource(xmlRepresentation);
JAXBContext jaxbContext =
JAXBContext.newInstance(generator.getConfigurationClass(),
GeneratorConfigurationConstants.CONF_MARSHAL_FAILED.getClass(),
GeneratorConfigurationConstants.CONF_UNMARSHAL_FAILED.getClass());
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
JAXBElement<? extends GeneratorConfiguration> jaxbElement =
unmarshaller.unmarshal(streamSource, generator.getConfigurationClass());
configuration = jaxbElement.getValue();
} catch (JAXBException e) {
logger.warn("Unable to unmarshal configuration", e);
configuration = GeneratorConfigurationConstants.CONF_UNMARSHAL_FAILED;
}
if (!name.equals(configuration.getConfigurationName()))
logger.warn("Configuration name mismatch between column \"name\" and serialized configuration.");
return new NamedConfiguration(id, tenantId, assocTypeId, pluginId, name, configuration, active);
}
else
return null;
}
}
}