package net.codjo.dataprocess.server.handlerfactory;
import net.codjo.dataprocess.common.DataProcessConstants;
import net.codjo.mad.server.handler.HandlerException;
import net.codjo.mad.server.handler.sql.QueryBuilder;
import net.codjo.mad.server.handler.sql.SqlHandler;
import net.codjo.util.string.StringUtil;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.log4j.Logger;
/**
*
*/
public class SelectAllByFilterFactory implements QueryBuilder {
private static final Logger LOG = Logger.getLogger(SelectAllByFilterFactory.class);
public String buildQuery(Map args, SqlHandler sqlHandler) throws HandlerException {
Connection con = null;
try {
con = sqlHandler.getConnection();
return proceed(con, args);
}
catch (Exception ex) {
LOG.error(ex);
}
finally {
try {
if (con != null) {
con.close();
}
}
catch (Exception ex) {
LOG.error(ex);
}
}
return "";
}
String proceed(Connection con, Map<String, String> args) throws SQLException {
StringBuilder fields = new StringBuilder();
String tableName = getAndExtract(args, DataProcessConstants.TABLE_NAME_KEY);
String whereClause = getAndExtract(args, DataProcessConstants.WHERE_CLAUSE_KEY);
if (tableName == null) {
throw new IllegalArgumentException("'" + DataProcessConstants.TABLE_NAME_KEY + "'"
+ " n'a pas �t� trouv� dans la map d'arguments !");
}
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from " + tableName + " where 1=0");
try {
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
fields.append(rsmd.getColumnName(i));
if (i < columnCount) {
fields.append(", ");
}
}
}
finally {
rs.close();
stmt.close();
}
StringBuilder sbSelect = new StringBuilder("Select ");
sbSelect.append(fields).append(" from ").append(tableName);
if (whereClause != null && whereClause.trim().length() != 0) {
sbSelect.append(" where ").append(whereClause);
args.clear();
}
else {
removeNullValue(args);
if (!args.isEmpty()) {
sbSelect.append(" where ");
List<String> list = new ArrayList<String>();
for (Entry entry : args.entrySet()) {
list.add(entry.getKey().toString());
}
Collections.sort(list);
int size = list.size();
for (String field : list) {
sbSelect.append(StringUtil.javaToSqlName(field)).append(" = ?");
size--;
if (size != 0) {
sbSelect.append(" and ");
}
}
}
}
return sbSelect.toString();
}
private static void removeNullValue(Map<String, String> args) {
Map<String, String> argsWithoutNull = new HashMap<String, String>();
for (Entry<String, String> entry : args.entrySet()) {
if (!"null".equals(entry.getValue())) {
argsWithoutNull.put(entry.getKey(), entry.getValue());
}
}
args.clear();
args.putAll(argsWithoutNull);
}
private static String getAndExtract(Map<String, String> args, String key) {
String value = args.get(key);
args.remove(key);
return value;
}
}