/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.control.common; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Map; import net.codjo.control.common.util.SQLUtil; import net.codjo.shipment.DataField; import net.codjo.shipment.DataShipment; import net.codjo.shipment.DataShipmentHome; import net.codjo.shipment.QuarantineError; import org.apache.log4j.Logger; /** * Implantation par defaut d'un RequestProcessor. Cette classe utilise la librairie codjo-shipment. * * @version $Revision: 1.5 $ */ class DefaultShipmentProcessor implements ShipmentProcessor { private static final Logger APP = Logger.getLogger(DefaultShipmentProcessor.class); private DataShipmentBuilder builder = new DataShipmentBuilder(); private DataShipmentFactory dsFactory = new DataShipmentFactory(); public DataShipmentBuilder getBuilder() { return builder; } public DataShipmentFactory getDsFactory() { return dsFactory; } public void setDsFactory(DataShipmentFactory dsFactory) { this.dsFactory = dsFactory; } public void execute(Connection con, Dictionary dico, Shipment shipment) throws SQLException { DataShipment ds = builder.buildDataShipment(con, dico, shipment); ds.proceed(con); } static class DataShipmentFactory { public DataField buildDataField(Connection con, String sourceFieldName, int sourceTypeSQLField, String destField, int destTypeSQLField) throws SQLException { return DataShipmentHome.buildDataField(con, sourceFieldName, sourceTypeSQLField, destField, destTypeSQLField); } } class DataShipmentBuilder { DataField[] buildDataFieldList(Connection con, Map<String, Integer> srceFields, Map<String, Integer> destFields) throws SQLException { List<DataField> dataFields = new ArrayList<DataField>(); for (Map.Entry<String, Integer> src : srceFields.entrySet()) { APP.debug(" transfert de " + src.getKey() + " type " + src.getValue() + " vers type " + destFields.get(src.getKey())); dataFields.add(dsFactory.buildDataField(con, src.getKey(), src.getValue(), src.getKey(), getDestType(src.getKey(), destFields))); } return dataFields.toArray(new DataField[]{}); } DataShipment buildDataShipment(Connection con, Dictionary dico, Shipment data) throws SQLException { Map<String, Integer> src = SQLUtil.determineDbFieldDef(con, dico.replaceVariables(data.getFrom()), null); Map<String, Integer> dest = SQLUtil.determineDbFieldDef(con, dico.replaceVariables(data.getTo()), "tempdb"); DataField[] dataFields = buildDataFieldList(con, src, dest); DataShipment ds = new DataShipment(dico.replaceVariables(data.getFrom()), dataFields, dico.replaceVariables(data.getTo()), new QuarantineError(data.getFromPk(), "ERROR_LOG", "ERROR_TYPE")); ds.setSelectWhereClause(dico.replaceVariables(data.getSelectWhereClause())); return ds; } private int getDestType(Object srcField, Map destFields) { if (!destFields.containsKey(srcField)) { throw new IllegalArgumentException("Champs " + srcField + "ne poss�de pas d'�quivalent dans la table des controles"); } return ((Number)destFields.get(srcField)).intValue(); } } }