package org.cagrid.dorian.service.util;
import java.math.BigInteger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;
public class PreparedStatementBuilder {
private List fields;
private List whereFields;
private List whereValues;
private List whereOperators;
private List clauses;
private String table;
public PreparedStatementBuilder(String table) {
this.fields = new ArrayList();
this.whereFields = new ArrayList();
this.whereValues = new ArrayList();
this.whereOperators = new ArrayList();
this.clauses = new ArrayList();
this.table = table;
}
public void addSelectField(String field) {
this.fields.add(field);
}
public void addWhereField(String field, String operator, Object value) {
this.whereFields.add(field);
this.whereOperators.add(operator);
this.whereValues.add(value);
}
public void addClause(String clause) {
this.clauses.add(clause);
}
public PreparedStatement prepareStatement(Connection c) throws Exception {
StringBuffer sql = new StringBuffer("select ");
boolean first = true;
for (int i = 0; i < fields.size(); i++) {
if (!first) {
sql.append(",");
} else {
first = false;
}
sql.append((String) fields.get(i));
}
sql.append(" FROM " + table);
if ((whereFields.size() > 0) || (clauses.size() > 0)) {
sql.append(" WHERE ");
}
first = true;
for (int i = 0; i < whereFields.size(); i++) {
if (!first) {
sql.append(" AND ");
} else {
first = false;
}
sql.append((String) whereFields.get(i) + " " + (String) whereOperators.get(i) + " ?");
}
for (int i = 0; i < clauses.size(); i++) {
if (!first) {
sql.append(" AND");
} else {
first = false;
}
sql.append((String) clauses.get(i));
}
PreparedStatement s = c.prepareStatement(sql.toString());
for (int i = 0; i < whereValues.size(); i++) {
Object o = whereValues.get(i);
int index = i + 1;
if (o instanceof String) {
s.setString((index), (String) o);
} else if (o instanceof Long) {
s.setLong((index), ((Long) o).longValue());
} else if (o instanceof BigInteger) {
s.setLong((index), ((BigInteger) o).longValue());
} else if (o instanceof Integer) {
s.setInt((index), ((Integer) o).intValue());
} else {
throw new Exception("Unsupported type " + o.getClass().getName());
}
}
// System.out.println(sql.toString());
return s;
}
}