/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.segmentation.server.participant.common;
import net.codjo.expression.ExpressionException;
import net.codjo.segmentation.server.preference.family.Row;
import net.codjo.segmentation.server.preference.family.XmlFamilyPreference;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Arrays;
/**
* Positionne le r�ultat en BD.
*/
public class SegmentationResult {
private PreparedStatement preparedStatement;
private boolean closed = false;
private Connection connection;
private XmlFamilyPreference familyPreference;
public SegmentationResult(Connection connection, XmlFamilyPreference familyPreference) {
this.connection = connection;
this.familyPreference = familyPreference;
}
public void add(Row row) throws SQLException {
createStatementIfNeeded();
insertRow(row, 0, null);
}
public void addError(ComputeException error) throws SQLException {
createStatementIfNeeded();
insertRow(error.getResultRow(), error.getErrorCount(), buildErrorMessage(error));
}
private String buildErrorMessage(ComputeException error) {
ExpressionException expressionException = error.getExpressionException();
if (expressionException == null) {
return error.getMessage();
}
else {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < expressionException.getNbError(); i++) {
if (buffer.length() > 0) {
buffer.append(",\n");
}
buffer.append(expressionException.getMessage(i));
}
return buffer.toString();
}
}
public void close() throws SQLException {
try {
if (preparedStatement != null) {
preparedStatement.close();
}
}
finally {
preparedStatement = null;
closed = true;
}
}
protected String buildInsertQuery() {
StringBuffer buff = new StringBuffer();
buff.append("insert into ");
buff.append(familyPreference.getResultTableName());
buff.append(" (");
appendColumns(buff);
buff.append(") values (");
appendValues(buff);
buff.append(")");
return buff.toString();
}
private void appendColumns(StringBuffer buff) {
String[] resultColumnNames = familyPreference.getResultTableColumnNames();
for (int i = 0; i < resultColumnNames.length; i++) {
String colName = resultColumnNames[i];
if (i != 0) {
buff.append(",");
}
buff.append(colName);
}
buff.append(",ANOMALY,ANOMALY_LOG");
}
private void appendValues(StringBuffer buff) {
int length = familyPreference.getResultTableColumnNames().length;
for (int i = 0; i < length; i++) {
if (i != 0) {
buff.append(",");
}
buff.append("?");
}
buff.append(",?,?");
}
private void assertRowIsCompatible(Row row) {
if (!Arrays.equals(row.getColumnNames(), familyPreference.getResultTableColumnNames())) {
throw new IllegalArgumentException("Row non compatible avec les colonnes r�sultat :"
+ Arrays.asList(familyPreference.getResultTableColumnNames()));
}
}
private void insertRow(Row row, int anomalyNumber, String anomalyLog)
throws SQLException {
assertRowIsCompatible(row);
int resultColumnCount = familyPreference.getResultTableColumnNames().length;
for (int i = 0; i < resultColumnCount; i++) {
Object columnValue = row.getColumnValue(i);
if (columnValue == null) {
preparedStatement.setNull(i + 1,
familyPreference.getResultTableColumnType(
familyPreference.getResultTableColumnNames()[i]));
}
else {
preparedStatement.setObject(i + 1, columnValue);
}
}
preparedStatement.setInt(resultColumnCount + 1, anomalyNumber);
preparedStatement.setString(resultColumnCount + 2, anomalyLog);
preparedStatement.executeUpdate();
preparedStatement.clearParameters();
}
private void createStatementIfNeeded() throws SQLException {
assertNotClosed();
if (preparedStatement == null) {
preparedStatement = connection.prepareStatement(buildInsertQuery());
}
}
private void assertNotClosed() {
if (closed) {
throw new IllegalStateException("La m�thode add est appel� apr�s un close()");
}
}
}