/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.segmentation.server.paramImport;
import static net.codjo.segmentation.server.paramImport.AbstractControlManager.Anomaly.MAX_LENGTH;
import static net.codjo.segmentation.server.paramImport.AbstractControlManager.Anomaly.REPEATED_INDEX;
import static net.codjo.segmentation.server.paramImport.AbstractControlManager.Anomaly.UNICITY;
import static net.codjo.segmentation.server.util.SegmentationUtil.getColumnIndexByName;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
*/
public abstract class AbstractControlManager {
public enum Anomaly {
MAX_LENGTH,
UNICITY,
REPEATED_INDEX,
PARENT_IN_DB,
SLEEVES_IN_DB,
BAD_SLEEVE_CODE,
NO_DUSTBIN,
TOO_MANY_DUSTBIN,
INCORRECT_FORMULA,
MISSING_FORMULA,
NODE_CANNOT_HAVE_FORMULA,
CLASSIFICATION_IN_ERROR,
FORBIDDEN_FORMULA_FOR_DUSTBIN
}
private List<String[]> quarantine = new ArrayList<String[]>();
private String[][] data;
private Connection connection;
private String[] fileHeader;
public void control() throws SQLException {
controlUnicity();
controlMaxLength();
controlRepeatedValues();
performSpecificControls();
}
protected abstract void performSpecificControls() throws SQLException;
public abstract int getMaxLengthForColumn(String column);
public abstract String[] getPrimaryKeyColumns();
public abstract String getUnicitySQLQuery();
public abstract String getAnomalyLog(Anomaly anomaly, String... columnName);
public final void controlUnicity() throws SQLException {
if (getUnicitySQLQuery() == null) {
return;
}
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(getUnicitySQLQuery());
String primaryKey = getPrimaryKeyColumns()[0];
while (resultSet.next()) {
for (String[] row : data) {
if (resultSet.getString(primaryKey).equals(row[getColumnIndexByName(data[0], primaryKey)])) {
addRowToQuarantine(row, UNICITY, primaryKey);
}
}
}
closeStatement(statement);
}
public final void controlMaxLength() {
for (int rowIndex = 1; rowIndex < data.length; rowIndex++) {
String[] row = data[rowIndex];
for (int columnIndex = 0; columnIndex < row.length; columnIndex++) {
checkMaxLength(row, columnIndex);
}
}
}
private void checkMaxLength(String[] row, int column) {
String columnName = data[0][column];
if (getMaxLengthForColumn(columnName) > 0 && row[column].length() > getMaxLengthForColumn(
columnName)) {
addRowToQuarantine(row, MAX_LENGTH, columnName);
}
}
public void controlRepeatedValues() {
String[] columnNames = getPrimaryKeyColumns();
Map<String, Integer> values = new HashMap<String, Integer>();
for (int rowIndex = 0; rowIndex < data.length; rowIndex++) {
StringBuffer compositeValue = new StringBuffer();
for (String columnName : columnNames) {
compositeValue.append(data[rowIndex][getColumnIndexByName(data[0], columnName)]);
}
if (!values.containsKey(compositeValue.toString())) {
values.put(compositeValue.toString(), rowIndex);
}
else {
addRowToQuarantine(data[values.get(compositeValue.toString())], REPEATED_INDEX, columnNames);
addRowToQuarantine(data[rowIndex], REPEATED_INDEX, columnNames);
}
}
}
public String[][] getQuarantine() {
if (quarantine.size() == 0) {
return new String[0][0];
}
return quarantine.toArray(new String[quarantine.size()][data[0].length]);
}
protected final void addRowToQuarantine(String[] row, Anomaly anomalyType, String... columName) {
if (quarantine.size() == 0) {
addQuarantineColumnHeader();
}
if (!rowIsInQuarantine(row)) {
row[row.length - 1] = "true";
String[] quarantineRow = new String[row.length];
System.arraycopy(row, 0, quarantineRow, 0, row.length - 1);
quarantineRow[row.length - 1] = getAnomalyLog(anomalyType, columName);
quarantine.add(quarantineRow);
}
}
private void addQuarantineColumnHeader() {
String[] quarantineRow = new String[data[0].length];
System.arraycopy(data[0], 0, quarantineRow, 0, data[0].length - 1);
quarantineRow[data[0].length - 1] = "ANOMALY_LOG";
quarantine.add(0, quarantineRow);
}
public boolean rowIsInQuarantine(String[] row) {
return "true".equals(row[getColumnIndexByName(data[0], "IS_QUARANTINE")]);
}
public String getQuarantineStream() {
if (quarantine.size() == 0) {
return "";
}
StringBuffer result = new StringBuffer();
for (String[] row : quarantine) {
int count = 1;
for (int columnIndex = 0; columnIndex < row.length; columnIndex++) {
String columnName = quarantine.get(0)[columnIndex];
if ("ANOMALY_LOG".equals(columnName) || Arrays.binarySearch(fileHeader, columnName) > -1) {
String value = row[columnIndex];
result.append(value);
if (count < fileHeader.length + 1) {
result.append("\t");
}
count++;
}
}
result.append("\n");
}
return result.toString();
}
public void setConnection(final Connection connection) {
this.connection = connection;
}
public Connection getConnection() {
return connection;
}
public void setQuarantine(List<String[]> quarantine) {
this.quarantine = quarantine;
}
public final String[][] getData() {
return data;
}
public final void setData(String[][] data) {
this.data = data;
}
public void setFileHeader(String[] fileHeader) {
this.fileHeader = fileHeader;
Arrays.sort(this.fileHeader);
}
protected final void closeStatement(Statement statement) throws SQLException {
if (statement != null) {
statement.close();
}
}
}