package org.juxtasoftware.dao.impl;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.juxtasoftware.dao.NoteDao;
import org.juxtasoftware.model.Note;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import eu.interedition.text.Range;
@Repository
public class NoteDaoImpl implements NoteDao {
private static final String TABLE_NAME = "juxta_note";
@Autowired private JdbcTemplate jdbcTemplate;
@Override
public boolean hasNotes(final Long witnessId) {
final String sql = "select count(*) as cnt from "+TABLE_NAME+
" where witness_id=?";
try {
int cnt = this.jdbcTemplate.queryForInt(sql, witnessId);
return (cnt > 0);
} catch (Exception e) {
return false;
}
}
@Override
public void create(final List<Note> notes) {
if ( notes.isEmpty() ) {
return;
}
StringBuilder sql = new StringBuilder();
sql.append("insert into ").append(TABLE_NAME);
sql.append(" (witness_id, note_type, target_xml_id,");
sql.append(" anchor_start, anchor_end, content)");
sql.append(" values (?,?,?,?,?,?)");
this.jdbcTemplate.batchUpdate(sql.toString(), new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setLong(1, notes.get(i).getWitnessId());
ps.setString(2, notes.get(i).getType());
ps.setString(3, notes.get(i).getTargetID());
ps.setLong(4, notes.get(i).getAnchorRange().getStart());
ps.setLong(5, notes.get(i).getAnchorRange().getEnd() );
ps.setString(6, notes.get(i).getContent());
}
@Override
public int getBatchSize() {
return notes.size();
}
} );
}
@Override
public void deleteAll(Long witnessId) {
final String sql = "delete from "+TABLE_NAME+" where witness_id = ?";
this.jdbcTemplate.update(sql, witnessId);
}
@Override
public List<Note> find(final Long witnessId ) {
final StringBuilder sql = basicSelectSql();
sql.append(" where jn.witness_id = ? order by jn.anchor_start, jn.anchor_end").toString();
return this.jdbcTemplate.query(sql.toString(), ROW_MAPPER, witnessId);
}
protected StringBuilder basicSelectSql () {
StringBuilder sb = new StringBuilder();
sb.append("select jn.id as jn_id, jn.witness_id as jn_witness_id, ");
sb.append(" jn.note_type as jn_note_type, jn.target_xml_id as jn_target_xml_id, ");
sb.append(" jn.anchor_start as jn_anchor_start, jn.anchor_end as jn_anchor_end, ");
sb.append(" jn.content as jn_content ");
sb.append("from juxta_note jn ");
return sb;
}
private static final RowMapper<Note> ROW_MAPPER = new RowMapper<Note>() {
@Override
public Note mapRow(ResultSet rs, int rowNum) throws SQLException {
final Note note = new Note();
note.setId(rs.getLong("jn_id"));
note.setWitnessId(rs.getLong("jn_witness_id"));
note.setType(rs.getString("jn_note_type"));
note.setTargetID(rs.getString("jn_target_xml_id"));
note.setAnchorRange(new Range(rs.getLong("jn_anchor_start"), rs.getLong("jn_anchor_end")));
note.setContent(rs.getString("jn_content"));
return note;
}
};
}