package fr.mch.mdo.restaurant.dao.tools.migration.v1; import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.math.BigDecimal; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import fr.mch.mdo.logs.ILogger; import fr.mch.mdo.restaurant.dao.beans.Product; import fr.mch.mdo.restaurant.dao.beans.Restaurant; import fr.mch.mdo.restaurant.dao.beans.UserAuthentication; import fr.mch.mdo.restaurant.dao.beans.ValueAddedTax; import fr.mch.mdo.restaurant.dao.tools.migration.v1.DataMigrationWork; public class DataMigrationProductWork extends DataMigrationWork { public DataMigrationProductWork(ILogger logger, File output, Restaurant restaurant, UserAuthentication user) { super(logger, output, restaurant, user); } @Override public void execute(Connection connection) throws SQLException { PrintWriter out = null; String restaurantReference = super.restaurant.getReference(); /** rateFormat is used formatting Bigdecimal rate */ DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(); dfs.setDecimalSeparator('.'); DecimalFormat vatRateFormat = new DecimalFormat("#.00", dfs); List<Product> products = new ArrayList<Product>(); PreparedStatement ps = null; ResultSet rs = null; try { out = new PrintWriter(new FileWriter(output)); ps = connection.prepareStatement("SELECT t_product.pdt_id PDT_ID, t_product.pdt_price PDT_PRICE, t_product.pdt_colorrgb PDT_COLOR_RGB, t_value_added_tax.vat_value VAT_VALUE," + " t_product_language.pdl_label PDL_LABEL" + " FROM t_product" + " JOIN t_product_language ON t_product_language.pdt_id = t_product.pdt_id" + " JOIN t_value_added_tax ON t_value_added_tax.vat_id = t_product.vat_id" + " WHERE t_product.psc_id=1" + " AND loc_id = 'fr'"); rs = ps.executeQuery(); ResultSetMetaData rsMetaData = rs.getMetaData(); int maxColumn = rsMetaData.getColumnCount(); logger.debug("Max Columns " + maxColumn); while (rs.next()) { logger.debug("START Row " + rs.getRow()); Product product = new Product(); for (int i = 1; i <= maxColumn; i++) { String columnLabel = rsMetaData.getColumnLabel(i).toUpperCase(); Object value = rs.getString(i); logger.debug("Result " + columnLabel + " with Value " + value); ProductResultSetRow.valueOf(columnLabel).fillValue(product, value); } products.add(product); logger.debug("END Row " + rs.getRow()); } // t_product for (Iterator<Product> iterator = products.iterator(); iterator.hasNext();) { Product product = iterator.next(); String insertProduct = "INSERT INTO t_product (res_id, pdt_code, pdt_price, pdt_colorRGB, vat_id, pdt_deleted) SELECT t_restaurant.res_id, '" + product.getCode() + "', " + product.getPrice() + ", " + this.getColor(product.getColorRGB()) + " , t_value_added_tax.vat_id, false " + " FROM t_value_added_tax, t_restaurant WHERE t_value_added_tax.vat_rate=" + vatRateFormat.format(product.getVat().getRate().doubleValue()) + " AND t_restaurant.res_reference = '" + restaurantReference + "';"; out.println(insertProduct); } out.flush(); // t_product_language for (Iterator<Product> iterator = products.iterator(); iterator.hasNext();) { Product product = iterator.next(); String insertProductLanguage = "INSERT INTO t_product_language (pdt_id, loc_id, pdl_label, pdl_deleted) SELECT t_product.pdt_id, t_locale.loc_id, '" + product.getLabels().get(null) + "', false FROM t_product, t_locale WHERE t_product.pdt_code='" + product.getCode()+ "' AND t_locale.loc_language='fr';"; out.println(insertProductLanguage); } } catch (SQLException e) { } catch (FileNotFoundException e) { } catch (IOException e) { } finally { if (rs != null) { try { rs.close(); } catch (Exception e) { } } if (ps != null) { try { ps.close(); } catch (Exception e) { } } try { out.close(); } catch (Exception e) { } } } private enum ProductResultSetRow { PDT_ID() { public void fillValue(Product product, Object value) { if (value != null) { product.setCode(value.toString()); } } }, PDT_PRICE() { public void fillValue(Product product, Object value) { if (value != null) { product.setPrice(new BigDecimal(value.toString())); } } }, PDT_COLOR_RGB() { public void fillValue(Product product, Object value) { if (value != null) { product.setColorRGB(value.toString()); } } }, VAT_VALUE() { public void fillValue(Product product, Object value) { ValueAddedTax vat = new ValueAddedTax(); if (value != null) { vat.setRate(new BigDecimal(value.toString())); } product.setVat(vat); } }, PDL_LABEL() { public void fillValue(Product product, Object value) { Map<Long, String> labels = new HashMap<Long, String>(); if (value != null) { labels.put(null, value.toString().replace("'", "''")); } product.setLabels(labels); } }; public void fillValue(Product product, Object value) { } } }