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 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.List; import java.util.Map; import org.apache.log4j.Logger; /** * */ public class DuplicateRowFactory implements QueryBuilder { private static final Logger LOG = Logger.getLogger(DuplicateRowFactory.class); public String buildQuery(Map<String, String> 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); 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"); List<String> upperIdList = new ArrayList<String>(); for (String id : args.keySet()) { upperIdList.add(sqlUpper(id)); } try { ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); for (int i = 1; i <= columnCount; i++) { if (!upperIdList.contains(rsmd.getColumnName(i))) { fields.append(rsmd.getColumnName(i)); if (i < columnCount) { fields.append(", "); } } } } finally { rs.close(); stmt.close(); } StringBuilder sbInsert = new StringBuilder("insert into "); sbInsert.append(tableName).append(" (").append(fields).append(") select ").append(fields) .append(" from ").append(tableName).append(" where "); String and = " and "; for (String id : upperIdList) { sbInsert.append(id).append(" = ?").append(and); } String result = sbInsert.toString(); if (result.endsWith(and)) { result = result.substring(0, result.length() - and.length()); } LOG.debug(result); return result; } private static String getAndExtract(Map<String, String> args, String key) { String value = args.get(key); args.remove(key); return value; } String sqlUpper(String fieldName) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < fieldName.length(); i++) { if (Character.isUpperCase(fieldName.charAt(i))) { sb.append('_'); } sb.append(fieldName.charAt(i)); } return sb.toString().toUpperCase(); } }