package org.agnitas.util;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
public class SqlPreparedStatementManager {
private static final String SQL_WHERE_SIGN = "WHERE";
private static final String SQL_OPERATOR_AND = "AND";
private static final String SQL_OPERATOR_OR = "OR";
private StringBuilder statement = new StringBuilder();
private List<Object> statementParameters = new ArrayList<Object>();
private boolean hasAppendedClauses = false;
public SqlPreparedStatementManager(String baseStatement) {
String baseStatementString = baseStatement.trim();
if (baseStatementString.toLowerCase().endsWith(" " + SQL_WHERE_SIGN.toLowerCase())) {
statement.append(baseStatementString.substring(0, baseStatementString.length() - SQL_WHERE_SIGN.length() - 1));
} else {
statement.append(baseStatementString);
}
}
/**
* Append a where clause to the statement concatenated by " AND "
*
* @param whereClause
* @param parameter
* @throws Exception
*/
public void addWhereClause(String whereClause, Object... parameter) throws Exception {
addWhereClause(false, whereClause, parameter);
}
/**
* Append a where clause to the statement.
*
* @param concatenateByOr type of concatenation (false = AND / true = OR)
* @param whereClause
* @param parameter
* @throws Exception
*/
public void addWhereClause(boolean concatenateByOr, String whereClause, Object... parameter) throws Exception {
if (StringUtils.isBlank(whereClause)) {
throw new Exception("Invalid empty where clause");
}
int numberOfQuestionMarks = StringUtils.countMatches(whereClause, "?");
if ((parameter == null && numberOfQuestionMarks != 0) || (numberOfQuestionMarks != parameter.length)) {
throw new Exception("Invalid number of parameters in where clause");
}
if (hasAppendedClauses) {
statement.append(" ");
statement.append(concatenateByOr ? SQL_OPERATOR_OR : SQL_OPERATOR_AND);
} else {
statement.append(" ");
statement.append(SQL_WHERE_SIGN);
}
statement.append(" (");
statement.append(whereClause.trim());
statement.append(")");
if (parameter != null) {
for (Object item : parameter) {
statementParameters.add(item);
}
}
hasAppendedClauses = true;
}
public void finalizeStatement(String statementTail) {
statement.append(" ");
statement.append(statementTail.trim());
}
public boolean hasAppendedWhereClauses() {
return hasAppendedClauses;
}
public String getPreparedSqlString() {
return statement.toString();
}
public Object[] getPreparedSqlParameters() {
return statementParameters.toArray();
}
}