/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.segmentation.server.preference.treatment;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
/**
* Classe permettant de charger le param�trage base d'un traitement donn�.
*/
public class SegmentationPreference {
private String family;
private String segmentationName;
private int segmentationId;
private List<Expression> expressions;
private static final String VAR_PREFIX = "VAR_";
private static final Pattern PATTERN_EXPRESSION = Pattern.compile("[0-9_]+");
public static SegmentationPreference createPreference(Connection connection,
int segmentationId,
Map<String, String> parameters)
throws SQLException, NullDustbinException {
return new SegmentationPreference(connection, segmentationId, parameters);
}
protected SegmentationPreference(Connection connection,
int segmentationId,
Map<String, String> parameters)
throws SQLException, NullDustbinException {
this.segmentationId = segmentationId;
loadSegmentation(connection);
loadExpressions(connection, parameters);
}
public String getFamily() {
return family;
}
public String getSegmentationName() {
return segmentationName;
}
public int getSegmentationId() {
return segmentationId;
}
public List<Expression> getExpressions() {
return expressions;
}
protected void loadSegmentation(Connection connection) throws SQLException {
Statement statement = connection.createStatement();
String sql =
"select SEGMENTATION_NAME, FAMILY from PM_SEGMENTATION where SEGMENTATION_ID = "
+ segmentationId;
try {
ResultSet resultSet = statement.executeQuery(sql);
if (!resultSet.next()) {
throw new IllegalArgumentException("Le traitement " + segmentationId + " est inconnu");
}
family = resultSet.getString("FAMILY");
segmentationName = resultSet.getString("SEGMENTATION_NAME");
}
finally {
statement.close();
}
}
protected void loadExpressions(Connection connection, Map<String, String> parameters)
throws SQLException, NullDustbinException {
Statement statement = connection.createStatement();
expressions = new ArrayList<Expression>();
try {
String sql =
"select DESTINATION_FIELD,EXPRESSION,PRIORITY,IS_VARIABLE,VARIABLE_TYPE "
+ "from PM_EXPRESSION where SEGMENTATION_ID = " + segmentationId;
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
String expression = replaceParameters(resultSet.getString("EXPRESSION"), parameters);
Expression currentExpression =
new Expression(resultSet.getInt("VARIABLE_TYPE"),
resultSet.getString("DESTINATION_FIELD"), expression,
resultSet.getBoolean("IS_VARIABLE"));
currentExpression.setPriority(resultSet.getInt("PRIORITY"));
expressions.add(currentExpression);
}
}
finally {
statement.close();
}
if (expressions.isEmpty()) {
throw new IllegalArgumentException("Aucune expression pour le traitement " + segmentationId);
}
computeSleeveCodeExpression();
}
private void computeSleeveCodeExpression() throws NullDustbinException {
String dustbinCode = null;
Expression sleeveCodeExpression = null;
List<String> varList = new ArrayList<String>();
for (Expression expression : expressions) {
String field = expression.getDestinationField();
if ("SLEEVE_CODE".equals(field)) {
dustbinCode = expression.getExpression();
sleeveCodeExpression = expression;
}
else if (field.startsWith(VAR_PREFIX) &&
PATTERN_EXPRESSION.matcher(field.substring(VAR_PREFIX.length())).matches()) {
varList.add(field);
}
}
if (dustbinCode == null) {
throw new NullDustbinException(segmentationId, segmentationName);
}
sleeveCodeExpression.setExpression(buildSleeveCode(dustbinCode, varList));
}
private String buildSleeveCode(String dustbinCode, List<String> varList) {
StringBuilder builderVar = new StringBuilder();
StringBuilder builderExpression = new StringBuilder();
Iterator<String> iterator = varList.iterator();
while (iterator.hasNext()) {
String var = iterator.next();
builderVar.append(var);
builderExpression.append("\"").append(replace(var)).append("\"");
if (iterator.hasNext()) {
builderVar.append(",");
builderExpression.append(",");
}
}
builderExpression.append("}");
builderVar.append("}");
return "utils.caseOf(new boolean[] {" + builderVar + ", new String[] {" + builderExpression + ", \""
+ dustbinCode + "\")";
}
protected static String replace(String value) {
value = value.substring(VAR_PREFIX.length());
value = value.replaceFirst("_", "-");
return value.replaceAll("_", ".");
}
private String replaceParameters(String stringToEvaluate, Map<String, String> parameters) {
for (String parameter : parameters.keySet()) {
stringToEvaluate = stringToEvaluate.replaceAll("\\$" + parameter + "\\$",
parameters.get(parameter));
}
return stringToEvaluate;
}
}