/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.control.common.loader;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.codjo.control.common.util.SQLUtil;
import net.codjo.sql.server.util.SqlTransactionalExecutor;
/**
* Objet responsable du transfert des donn�es de la table de quarantaine vers la table utilisateur.
*/
public class TransfertData {
private static final String QUARANTINE_ID = "QUARANTINE_ID";
private static final String ERROR_TYPE = "ERROR_TYPE";
private String quarantine;
private String user;
private List<String> q2user = null;
private List<String> user2q = null;
private List<String> matchingCols = new ArrayList<String>();
private boolean replaceUserData = false;
public TransfertData() {
}
public TransfertData(String quarantine, String user) {
this.quarantine = quarantine;
this.user = user;
}
public String getQuarantine() {
return quarantine;
}
public void setQuarantine(String quarantine) {
this.quarantine = quarantine;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public void setReplaceUserData(boolean replace) {
this.replaceUserData = replace;
}
public boolean isReplaceUserData() {
return replaceUserData;
}
public List<String> getMatchingCols() {
return Collections.unmodifiableList(matchingCols);
}
public void addMatchingCol(String column) {
this.matchingCols.add(column);
}
public SqlTransactionalExecutor getUserToQuarantineQuery(Connection connection) throws SQLException {
if (user2q == null) {
buildQueries(connection);
}
return createExecutorFrom(connection, user2q);
}
public SqlTransactionalExecutor getQuarantineToUserQuery(Connection connection) throws SQLException {
if (q2user == null) {
buildQueries(connection);
}
return createExecutorFrom(connection, q2user);
}
private SqlTransactionalExecutor createExecutorFrom(Connection connection,
List<String> queryList) throws SQLException {
SqlTransactionalExecutor executor = SqlTransactionalExecutor.init(connection);
for (String query : queryList) {
executor.prepare(query);
}
return executor;
}
private void buildQueries(Connection con) throws SQLException {
q2user = new ArrayList<String>();
List<String> quarantineList = SQLUtil.determineDbFieldList(con, quarantine);
if (replaceUserData) {
// TODO : Attention requete encore specifique Sybase, ne pas activer replaceUserData en Oracle
q2user.add("delete " + user
+ " from " + user
+ " inner join " + quarantine
+ " on "
+ toString(matchingCols, "convert(varchar," + user + ".", ")", " +'��'+ ")
+ " = "
+ toString(matchingCols, "convert(varchar," + quarantine + ".", ")",
" +'��'+ ") + " where " + quarantine + "." + ERROR_TYPE + " > 0 ");
}
q2user.add("insert into " + user + " " + "( " + toString(quarantineList) + " ) "
+ "select " + toString(quarantineList, quarantine + ".")
+ " from " + quarantine
+ " where " + quarantine + "." + ERROR_TYPE + " > 0");
q2user.add("delete " + quarantine
+ " where QUARANTINE_ID in ("
+ " select " + user + ".QUARANTINE_ID"
+ " from " + quarantine + " INNER JOIN " + user
+ " on " + quarantine + ".QUARANTINE_ID = " + user + ".QUARANTINE_ID)");
quarantineList.remove(QUARANTINE_ID);
user2q = new ArrayList<String>();
user2q.add("insert into " + quarantine + " " + "( " + toString(quarantineList) + " ) "
+ "select " + toString(quarantineList, user + ".")
+ " from " + user
+ " where " + user + "." + ERROR_TYPE + " <= 0");
user2q.add("delete " + user
+ " where " + ERROR_TYPE + " <= 0");
}
private String toString(List fields, String fieldPrefix, String fieldPostfix, String fieldSeparator) {
StringBuilder buffer = new StringBuilder();
for (int i = 0; i < fields.size(); i++) {
buffer.append(fieldPrefix).append(fields.get(i)).append(fieldPostfix);
if ((i + 1) < fields.size()) {
buffer.append(fieldSeparator);
}
}
return buffer.toString();
}
private String toString(List fields, String fieldPrefix) {
return toString(fields, fieldPrefix, "", ", ");
}
private String toString(List fields) {
return toString(fields, "", "", ", ");
}
}