package com.fitbank.manual; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.sql.Clob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.text.MessageFormat; import org.apache.commons.configuration.Configuration; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; import com.fitbank.common.properties.PropertiesHandler; import com.fitbank.util.Debug; /** * Lee la tabla de manuales y genera los HTML * * @author FitBank */ public final class GenerateHTMLManual { private static final String CSUBSISTEMA = "csubsistema"; private static final String CTRANSACCION = "ctransaccion"; /** * Sentencia para obtener todas las transacciones del cliente para las que * se van a generar las ayudas en html */ private static final String SQL_TRANSACCIONES = "SELECT csubsistema, ctransaccion" + " FROM %s" + " WHERE cliente=?" + " GROUP BY csubsistema, ctransaccion" + " ORDER BY csubsistema, ctransaccion"; /** * Sentencia para saber si una transacción es multi-pantalla */ private static final String SQL_MULTI_TAB = "SELECT COUNT(*)" + " FROM %s" + " WHERE cliente=? AND csubsistema=? AND ctransaccion=?"; /** * Sentencia para obtener la documentación de una transacción específica */ private static final String SQL_MANUAL = "SELECT csubsistema, ctransaccion, documentacion, campos, pantalla" + " FROM %s" + " WHERE cliente= ? AND csubsistema = ? AND ctransaccion = ?" + " ORDER BY pantalla"; private static final Configuration CONFIG = PropertiesHandler.getConfig( "templates"); private static final String TITULO_TAB = CONFIG.getString("TITULO_TAB"); private static final String ALINEACION = CONFIG.getString("ALINEACION"); private static final String TITULO_MEDIO = CONFIG.getString("TITULO_MEDIO"); private GenerateHTMLManual() { } static { try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException ex) { throw new RuntimeException(ex); } } public static void generate(File base, String conexion, String usuario, String clave, String tabla, String cliente) throws SQLException, IOException { Connection conn = DriverManager.getConnection(conexion, usuario, clave); PreparedStatement psTransacciones = null; PreparedStatement psManual = null; PreparedStatement psMultiTab = null; ResultSet rsTransacciones = null; try { psTransacciones = conn.prepareStatement(String.format( SQL_TRANSACCIONES, tabla)); psTransacciones.setString(1, cliente); psMultiTab = conn.prepareStatement(String.format( SQL_MULTI_TAB, tabla)); psMultiTab.setString(1, cliente); psManual = conn.prepareStatement(String.format( SQL_MANUAL, tabla)); psManual.setString(1, cliente); rsTransacciones = psTransacciones.executeQuery(); while (rsTransacciones.next()) { String subs = rsTransacciones.getString(CSUBSISTEMA); String tran = rsTransacciones.getString(CTRANSACCION); ResultSet rsMultiTab = null; try { // Obtener el Número de tabs que tiene cada transacción psMultiTab.setString(2, subs); psMultiTab.setString(3, tran); rsMultiTab = psMultiTab.executeQuery(); rsMultiTab.next(); boolean multiTab = rsMultiTab.getInt(1) > 1; StringBuilder manual = new StringBuilder(); generarHTMLTabs(manual, psManual, subs, tran, multiTab); FileOutputStream fos = new FileOutputStream(new File(base, subs + tran + ".html")); IOUtils.write(manual.toString(), fos, "UTF-8"); fos.close(); } finally { if (rsMultiTab != null) { rsMultiTab.close(); } } } Debug.info("Proceso Finalizado Satisfactoriamente"); } finally { if (rsTransacciones != null) { rsTransacciones.close(); } if (psTransacciones != null) { psTransacciones.close(); } if (psManual != null) { psManual.close(); } if (psMultiTab != null) { psMultiTab.close(); } if (conn != null) { conn.close(); } } } private static void generarHTMLTabs(StringBuilder manualFinal, PreparedStatement psManual, String subs, String tran, boolean multiTab) throws SQLException, IOException { int cont = 0; ResultSet rsManual = null; try { // Documentación por transacción psManual.setString(2, subs); psManual.setString(3, tran); rsManual = psManual.executeQuery(); while (rsManual.next()) { cont++; String manual = generarHTMLManual(rsManual, subs, tran); if (StringUtils.isEmpty(manual)) { continue; } if (multiTab) { manualFinal.append(MessageFormat.format(TITULO_TAB, cont)); } manualFinal.append(manual); } } finally { rsManual.close(); } } private static String generarHTMLManual(ResultSet rsDocumentacion, String subs, String tran) throws SQLException, IOException { Object cDocumentacion = rsDocumentacion.getClob("documentacion"); if (cDocumentacion == null) { return null; } String pantalla = rsDocumentacion.getString("pantalla"); Debug.info("Generando manual de la transacción: " + subs + "-" + tran + " PANTALLA: " + pantalla); String doc = alinear(IOUtils.toString(rsDocumentacion.getClob( "documentacion").getCharacterStream()).trim()); Clob cCampos = rsDocumentacion.getClob("campos"); if (cCampos != null) { String campos = alinear(IOUtils.toString(rsDocumentacion.getClob( "campos").getCharacterStream()).trim()); return doc + TITULO_MEDIO + campos; } return doc; } private static String alinear(String str) { return MessageFormat.format(ALINEACION, StringEscapeUtils.escapeHtml(str). replaceAll("\n", "
")); } }