package org.juxtasoftware.dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import org.juxtasoftware.dao.QNameFilterDao;
import org.juxtasoftware.dao.WorkspaceDao;
import org.juxtasoftware.model.QNameFilter;
import org.juxtasoftware.model.Workspace;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.support.DataAccessUtils;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.stereotype.Repository;
import eu.interedition.text.Name;
import eu.interedition.text.rdbms.RelationalName;
@Repository
public class QNameFilterDaoImpl extends JuxtaDaoImpl<QNameFilter> implements QNameFilterDao {
@Autowired WorkspaceDao workspaceDao;
public static final String MEMBER_TABLE_NAME = "juxta_qname_filter_member";
private SimpleJdbcInsert memberInsert;
protected QNameFilterDaoImpl() {
super("juxta_qname_filter");
}
@Override
public void afterPropertiesSet() throws Exception {
super.afterPropertiesSet();
this.memberInsert = new SimpleJdbcInsert(this.jt).withTableName(MEMBER_TABLE_NAME);
}
@Override
public long create(QNameFilter filter) {
Long id = super.create(filter);
filter.setId( id );
insertQnames(filter);
return id;
}
private void insertQnames(QNameFilter filter) {
if ( filter.getQNames().size() > 0 ) {
final List<SqlParameterSource> batch = new ArrayList<SqlParameterSource>();
for ( Name qname : filter.getQNames()) {
MapSqlParameterSource ps = new MapSqlParameterSource();
ps.addValue("filter_id", filter.getId() );
ps.addValue("qname_id", ((RelationalName)qname).getId() );
batch.add(ps);
}
this.memberInsert.executeBatch(batch.toArray(new SqlParameterSource[batch.size()]));
}
}
@Override
public void update(QNameFilter filter) {
jt.update("update " + this.tableName + " set name = ? where id = ?", filter.getName(), filter.getId());
jt.update("delete from " + MEMBER_TABLE_NAME + " where filter_id = ?", filter.getId());
insertQnames(filter);
}
@Override
public void delete(QNameFilter filter) {
final String sql = "delete from " + this.tableName+" where id=?";
this.jt.update(sql, filter.getId());
}
@Override
public QNameFilter find(String name) {
Workspace w = this.workspaceDao.getPublic();
return find( w, name);
}
@Override
public QNameFilter find(final Workspace workspace, final String name) {
final String sql = "select id,name,workspace_id from " + this.tableName +
" where name=? and workspace_id=?";
final QNameFilter filter = DataAccessUtils.uniqueResult(
this.jt.query(sql, new FilterMapper(), name, workspace.getId()));
addFilterMembers(filter);
return filter;
}
private void addFilterMembers( QNameFilter filter) {
if ( filter != null ) {
final String memberSql = "select text_qname.id, local_name, namespace from "+
MEMBER_TABLE_NAME+" inner join text_qname on text_qname.id = qname_id" +
" where filter_id=?";
List<Name> names = this.jt.query(memberSql, new QnameMapper(), filter.getId());
filter.setQNames( new HashSet<Name>( names) );
}
}
@Override
public QNameFilter find(Long id) {
final String sql = "select id,name,workspace_id from " + this.tableName + " where id=?";
final QNameFilter filter = DataAccessUtils.uniqueResult(
this.jt.query(sql, new FilterMapper(), id));
addFilterMembers(filter);
return filter;
}
@Override
public List<QNameFilter> list( final Workspace ws) {
final String sql = "select id,name,workspace_id from "+this.tableName+" where workspace_id=?";
return this.jt.query(sql, new FilterMapper(), ws.getId() );
}
@Override
protected SqlParameterSource toInsertData(QNameFilter object) {
final MapSqlParameterSource ps = new MapSqlParameterSource();
ps.addValue("name", object.getName());
ps.addValue("workspace_id", object.getWorkspaceId());
return ps;
}
/**
* Map qname filter db to model
* @author loufoster
*/
private static class FilterMapper implements RowMapper<QNameFilter> {
public QNameFilter mapRow(ResultSet rs, int rowNum) throws SQLException {
QNameFilter filter = new QNameFilter();
filter.setId(rs.getLong("id"));
filter.setName(rs.getString("name"));
filter.setWorkspaceId(rs.getLong("workspace_id"));
return filter;
}
}
/**
* Map Qname db to model
* @author loufoster
*/
private static class QnameMapper implements RowMapper<Name> {
public Name mapRow(ResultSet rs, int rowNum) throws SQLException {
return new RelationalName(rs.getString("namespace"), rs.getString("local_name"), rs.getInt("id"));
}
}
}