package com.fidufosyga.gui;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.nio.channels.FileChannel;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.swing.JFileChooser;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.SpinnerNumberModel;
import javax.swing.text.JTextComponent;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.fidufosyga.context.Context;
import com.fidufosyga.exception.CancelarException;
import com.fidufosyga.exception.GeneralException;
import com.fidufosyga.model.ArchivoModel;
import com.fidufosyga.model.EstadisticasBean;
import com.fidufosyga.model.FormularioModel;
import com.fidufosyga.model.PaqueteModel;
import com.fidufosyga.model.PropertiesManager;
import com.fidufosyga.model.Validador;
import java.awt.HeadlessException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import org.w3c.dom.DOMException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

public class Aplication extends javax.swing.JFrame {

    private static final long serialVersionUID = 4126836796788344551L;
    private String version;
    private String build;
    //private Map<String, String> registrosArchivos;

    /**
     * Creates new form MainWindow
     */
    public Aplication() {
        //validar_malla();
        initComponents();
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        this.setTitle("Malla Validadora BDUA");

        //registrosArchivos = new HashMap<String, String>();
    }
    public int numeroLineasPrev;

    private boolean validar_xml (String archivo) {

       try {
           
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            Document document = documentBuilder.newDocument();
            String HASH_XML = "";
                    
            if (archivo.equals( "MA")){ HASH_XML =  "1A220195CCEB33F36E70615F0E742E3B685E5589";}
            if (archivo.equals( "MC")){ HASH_XML =  "A36DAD92267B355179F8C04CBD3951FE0F763AC5";}
            if (archivo.equals( "MS-Entidades")){ HASH_XML =  "EFEE53D9AFF8F419FD6A189E3C000EC232407564";}
            if (archivo.equals( "R1")){ HASH_XML =  "EB04F3808CFB991C155DFA15DD5F7693C22E14FF";}
            if (archivo.equals( "S1")){ HASH_XML =  "44E8728EB0EF78D1ED230A593C0961FBF0BC13B4";}
            
            if (archivo.equals( "R4-Contributivo")){ HASH_XML =  "0B35A15A12E3B33C34D792EA791A6361CF0A9542";}
            if (archivo.equals( "R4-Subsidiado")){ HASH_XML =  "33669FE45DC4B30E155933103DD79635BA169F3F";}
            
            if (archivo.equals( "S4-Contributivo")){ HASH_XML =  "43C5F59E74C4E0D6918AE90B45D15CC8653BAA7A";}
            if (archivo.equals( "S4-Subsidiado")){ HASH_XML =  "F15DB7DB006379E8255B2A5602F78392B67BF4DF";}
                    
            if (archivo.equals( "NS-Entidades")){ HASH_XML =  "D6160DC41B6F0EAAD99CB5035A5AB7BE932BDD05";}
            if (archivo.equals( "NC")){ HASH_XML =  "E08464A668BB6CA77BC404DE0BE9730BADF6D0A5";}
            if (archivo.equals( "NS-Municipios")){ HASH_XML =  "4AF9A83F4B426BED98FBF6971783ABBBAA05FC6F";}         

            if (archivo.equals( "NR-C")){ HASH_XML =  "3588D004F2C2327A22767974B93F26B0972A8D68";}
            if (archivo.equals( "NR-S")){ HASH_XML =  "8457EE060A315B0C2428FFDB65FC898FC2066CAD";}  
            
            File dir2 = new File(System.getProperty("user.dir")+ File.separator +"xml"+ File.separator + archivo + ".xml" + File.separator);

            System.out.println(dir2.toString());
            StringBuilder sb2 = new StringBuilder();
            Element Codhash2 = document.createElement("Hash");
            //Genera HASH
            MessageDigest md2 = MessageDigest.getInstance("SHA-1");
            byte[] mdbytes;
            FileInputStream fis2 = new FileInputStream(System.getProperty("user.dir")+ File.separator +"xml"+ File.separator + archivo + ".xml" + File.separator);

               byte[] dataBytes = new byte[1024];
               int nread2;
               while ((nread2 = fis2.read(dataBytes)) != -1) {
                   md2.update(dataBytes, 0, nread2);
               }
               mdbytes = md2.digest();

               for (int p = 0; p < mdbytes.length; p++) {
                   sb2.append(Integer.toString((mdbytes[p] & 0xff) + 0x100, 16).substring(1));
               }
               System.out.println("Hash : " + sb2.toString());
               String hash_generado = "";
               hash_generado = sb2.toString();

            if ( !hash_generado.toUpperCase().equals(HASH_XML))
            {
             return false;
             
            }
            else
            {
             return false;
            }

         } catch (ParserConfigurationException | DOMException | NoSuchAlgorithmException | IOException ex) {
            GeneralException e = new GeneralException("No se pudo crear el archivo resumen de la validacion ", ex);
            throw (e);
        }
         
    }
    
    private void cargarListaTipos() {
        File dir = new File(System.getProperty("user.dir")+ File.separator + "xml" + File.separator);

        mnuListaTipos.removeAll();
        String[] children = dir.list();
        if (children == null) {
            return;
        } else {
            for (String filename : children) {
                if (filename.endsWith(".xml") || filename.endsWith(".XML")) {
                    JMenuItem itemLista = new javax.swing.JMenuItem();
                    System.out.println("nombre------:" + filename.substring(0, filename.length() - 4));
                    itemLista.setText(filename.substring(0, filename.length() - 4));
                    itemLista.addActionListener(new java.awt.event.ActionListener() {

                    boolean valor_retornado = true;
                            
                        @Override
                        public void actionPerformed(java.awt.event.ActionEvent evt) {
                         
                            valor_retornado = validar_xml(((JMenuItem) evt.getSource()).getText());

                            if ( valor_retornado == true )
                            {
                             mostrarMensaje("Consulte el Administrador " + ((JMenuItem) evt.getSource()).getText(), "Error");

                            }else{
                                    validar(((JMenuItem) evt.getSource()).getText());
                                 }
                        }
                    });
                    mnuListaTipos.add(itemLista);
                }
            }
        }
        try {
            PropertiesManager.cargarPropiedadesDelSistema();
        } catch (Exception ex) {
            mostrarMensaje(ex.getMessage(), "Error");
        }
    }

    private void leerArchivo(String fn, JTextComponent pane) {
        FileReader fr;
        try {
            fr = new FileReader(fn);
            BufferedReader bf = new BufferedReader(fr);
            int i = 0;
            int lineCount = ((Integer) jsLineCount.getValue()).intValue();
            pane.setText("");
            while (i < lineCount) {
                String line = bf.readLine();
                if (line == null) {
                    break;
                }
                i++;
                pane.setText(pane.getText() + line + "\n");
                txtNombreArchivo.setText(fn);
            }
            fr.close();
        } catch (IOException e) {
            mostrarMensaje("Ocurrio un error cargando el archivo verifique que no este en uso por otra aplicación o no se encuentre en la ubicación seleccionada", "Error");
            System.err.println(e);
        }
    }

    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jfcSeleccionarArchivo = new javax.swing.JFileChooser();
        jdlValidando = new javax.swing.JDialog(this,true);
        jfrGlosas = new javax.swing.JFrame();
        jScrollPane1 = new javax.swing.JScrollPane();
        jtbGlosas = new javax.swing.JTable();
        jPanel1 = new javax.swing.JPanel();
        jsLineCount = new javax.swing.JSpinner();
        jsllTexto = new javax.swing.JScrollPane();
        txtTexto = new javax.swing.JTextArea();
        jLabel1 = new javax.swing.JLabel();
        txtNombreArchivo = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        jSeparator1 = new javax.swing.JSeparator();
        lblValidando = new javax.swing.JLabel();
        jPanel2 = new javax.swing.JPanel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        lblTotalRegistros = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        lblRegistrosValidos = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        pgrValidos = new javax.swing.JProgressBar();
        lblPorcentajeValidos = new javax.swing.JLabel();
        lblTotalGlosados = new javax.swing.JLabel();
        pgrGlosados = new javax.swing.JProgressBar();
        lblPorcentajeGlosados = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        lblTiempoTranscurrido = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        txtDirOut = new javax.swing.JTextField();
        jbtCancelar = new javax.swing.JButton();
        mbrBarraMenus = new javax.swing.JMenuBar();
        mnuArchivo = new javax.swing.JMenu();
        mnuItemArchivo = new javax.swing.JMenuItem();
        mnuItemSalir = new javax.swing.JMenuItem();
        mnuAcciones = new javax.swing.JMenu();
        mnuListaTipos = new javax.swing.JMenu();
        mnuUtil = new javax.swing.JMenu();
        mnuItemCargarNuevosTiposDeArchivo = new javax.swing.JMenuItem();
        mnuItemVerGlosas = new javax.swing.JMenuItem();
        mnuAcerca = new javax.swing.JMenu();
        mnuItemAcerca = new javax.swing.JMenuItem();

        jfcSeleccionarArchivo.setFileSelectionMode(javax.swing.JFileChooser.FILES_AND_DIRECTORIES);
        jfcSeleccionarArchivo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jfcSeleccionarArchivoActionPerformed(evt);
            }
        });

        jdlValidando.setModal(true);
        jdlValidando.setName("jdlValidando"); // NOI18N
        jdlValidando.setResizable(false);
        jdlValidando.setUndecorated(true);

        org.jdesktop.layout.GroupLayout jdlValidandoLayout = new org.jdesktop.layout.GroupLayout(jdlValidando.getContentPane());
        jdlValidando.getContentPane().setLayout(jdlValidandoLayout);
        jdlValidandoLayout.setHorizontalGroup(
            jdlValidandoLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(0, 310, Short.MAX_VALUE)
        );
        jdlValidandoLayout.setVerticalGroup(
            jdlValidandoLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(0, 51, Short.MAX_VALUE)
        );

        jfrGlosas.setTitle("Glosario");
        jfrGlosas.setResizable(false);

        jScrollPane1.setToolTipText("Descripcion de Glosas");

        jtbGlosas.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null},
                {null, null},
                {null, null},
                {null, null}
            },
            new String [] {
                "Glosa", "Descripcion"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jtbGlosas.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        TreeMap tree=new TreeMap(PropertiesManager.getGlosasDescripcion());
        java.util.Set ks=tree.keySet();
        jtbGlosas.setModel(new javax.swing.table.DefaultTableModel(
            ks.size(), 2

        ) {
            Class[] types = new Class [] {

                java.lang.String.class, java.lang.String.class
            };

            String ColNames[]={"Glosa", "Descripcion"};
            public String getColumnName(int col) { return ColNames[col].toString(); }

            boolean[] canEdit = new boolean [] {
                false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });

        Iterator iter=ks.iterator();
        jtbGlosas.getColumnModel().getColumn(0).setPreferredWidth(60);
        jtbGlosas.getColumnModel().getColumn(1).setPreferredWidth(710);
        int i=0;
        while (iter.hasNext()){
            String value=(String)iter.next();
            jtbGlosas.setValueAt(value, i,0);
            jtbGlosas.setValueAt(tree.get(value), i,1);
            i++;
        }
        jScrollPane1.setViewportView(jtbGlosas);

        org.jdesktop.layout.GroupLayout jfrGlosasLayout = new org.jdesktop.layout.GroupLayout(jfrGlosas.getContentPane());
        jfrGlosas.getContentPane().setLayout(jfrGlosasLayout);
        jfrGlosasLayout.setHorizontalGroup(
            jfrGlosasLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jfrGlosasLayout.createSequentialGroup()
                .addContainerGap()
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 645, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(18, Short.MAX_VALUE))
        );
        jfrGlosasLayout.setVerticalGroup(
            jfrGlosasLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jfrGlosasLayout.createSequentialGroup()
                .addContainerGap()
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(29, Short.MAX_VALUE))
        );

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Malla Validadora de Estructura");
        setResizable(false);

        jPanel1.setBorder(javax.swing.BorderFactory.createCompoundBorder(javax.swing.BorderFactory.createEtchedBorder(), javax.swing.BorderFactory.createEtchedBorder()));

        jsLineCount.setModel(new SpinnerNumberModel (
            new Integer(0), //initial value
            new Integer(0), //Minimum value
            new Integer(500), //Maximum value - not set
            new Integer(1) // Step
        )
    );
    jsLineCount.setValue(new Integer(50));

    txtTexto.setEditable(false);
    txtTexto.setColumns(20);
    txtTexto.setRows(15);
    jsllTexto.setViewportView(txtTexto);

    jLabel1.setText("Archivo:");

    txtNombreArchivo.setEditable(false);
    txtNombreArchivo.setMaximumSize(new java.awt.Dimension(320000, 2147483647));
    txtNombreArchivo.setPreferredSize(new java.awt.Dimension(370, 19));

    jLabel2.setText("Lineas a previsualizar");

    org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(jPanel1Layout.createSequentialGroup()
            .addContainerGap()
            .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                .add(org.jdesktop.layout.GroupLayout.LEADING, jsllTexto, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 426, Short.MAX_VALUE)
                .add(org.jdesktop.layout.GroupLayout.LEADING, jPanel1Layout.createSequentialGroup()
                    .add(jLabel2)
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                    .add(jsLineCount, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 49, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .add(jPanel1Layout.createSequentialGroup()
                    .add(jLabel1)
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 16, Short.MAX_VALUE)
                    .add(txtNombreArchivo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
            .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    );
    jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel1Layout.createSequentialGroup()
            .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .add(jsllTexto, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 262, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                .add(txtNombreArchivo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(jLabel1))
            .add(12, 12, 12)
            .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                .add(jLabel2)
                .add(jsLineCount, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
            .addContainerGap())
    );

    lblValidando.setFont(new java.awt.Font("Arial", 1, 16)); // NOI18N

    jPanel2.setBorder(javax.swing.BorderFactory.createCompoundBorder(null, javax.swing.BorderFactory.createEtchedBorder()));

    jLabel3.setFont(new java.awt.Font("Arial", 1, 12)); // NOI18N
    jLabel3.setText("Estadísticas");

    jLabel4.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
    jLabel4.setText("Total de Registros");

    lblTotalRegistros.setFont(new java.awt.Font("Arial", 0, 11)); // NOI18N
    lblTotalRegistros.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
    lblTotalRegistros.setText("No Calculado");

    jLabel5.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
    jLabel5.setText("Registros Válidos");

    lblRegistrosValidos.setFont(new java.awt.Font("Arial", 0, 11)); // NOI18N
    lblRegistrosValidos.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
    lblRegistrosValidos.setText("No Calculado");

    jLabel6.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
    jLabel6.setText("Registros Glosados");

    pgrValidos.setFont(new java.awt.Font("Arial", 0, 11)); // NOI18N

    lblPorcentajeValidos.setFont(new java.awt.Font("Arial", 0, 11)); // NOI18N
    lblPorcentajeValidos.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
    lblPorcentajeValidos.setText("0%");

    lblTotalGlosados.setFont(new java.awt.Font("Arial", 0, 11)); // NOI18N
    lblTotalGlosados.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
    lblTotalGlosados.setText("No Calculado");

    pgrGlosados.setFont(new java.awt.Font("Arial", 0, 11)); // NOI18N

    lblPorcentajeGlosados.setFont(new java.awt.Font("Arial", 0, 11)); // NOI18N
    lblPorcentajeGlosados.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
    lblPorcentajeGlosados.setText("0%");

    jLabel8.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
    jLabel8.setText("Tiempo de Validación");

    lblTiempoTranscurrido.setFont(new java.awt.Font("Arial", 0, 11)); // NOI18N
    lblTiempoTranscurrido.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
    lblTiempoTranscurrido.setText("No Calculado");
    lblTiempoTranscurrido.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);

    jLabel7.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
    jLabel7.setText("Directorio de salida");

    txtDirOut.setEditable(false);
    txtDirOut.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
    txtDirOut.setText("No Seleccionado");
    txtDirOut.setPreferredSize(new java.awt.Dimension(245, 19));

    org.jdesktop.layout.GroupLayout jPanel2Layout = new org.jdesktop.layout.GroupLayout(jPanel2);
    jPanel2.setLayout(jPanel2Layout);
    jPanel2Layout.setHorizontalGroup(
        jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(jPanel2Layout.createSequentialGroup()
            .addContainerGap()
            .add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
                .add(org.jdesktop.layout.GroupLayout.LEADING, jLabel3)
                .add(org.jdesktop.layout.GroupLayout.LEADING, jLabel7)
                .add(org.jdesktop.layout.GroupLayout.LEADING, jLabel4)
                .add(org.jdesktop.layout.GroupLayout.LEADING, jLabel5)
                .add(org.jdesktop.layout.GroupLayout.LEADING, jLabel6, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 124, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(org.jdesktop.layout.GroupLayout.LEADING, jLabel8)
                .add(lblTiempoTranscurrido, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 129, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(org.jdesktop.layout.GroupLayout.LEADING, jPanel2Layout.createSequentialGroup()
                    .add(pgrGlosados, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 199, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                    .add(lblPorcentajeGlosados, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 40, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .add(org.jdesktop.layout.GroupLayout.LEADING, jPanel2Layout.createSequentialGroup()
                    .add(pgrValidos, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 198, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                    .add(lblPorcentajeValidos, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .add(lblTotalGlosados, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 109, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(lblTotalRegistros, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .add(lblRegistrosValidos, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .add(org.jdesktop.layout.GroupLayout.LEADING, txtDirOut, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
            .addContainerGap(27, Short.MAX_VALUE))
    );
    jPanel2Layout.setVerticalGroup(
        jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(jPanel2Layout.createSequentialGroup()
            .add(jLabel3)
            .add(21, 21, 21)
            .add(jLabel4)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(lblTotalRegistros)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(jLabel5)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(lblRegistrosValidos)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                .add(pgrValidos, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(lblPorcentajeValidos))
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(jLabel6)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(lblTotalGlosados)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                .add(pgrGlosados, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(lblPorcentajeGlosados))
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(jLabel8)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(lblTiempoTranscurrido)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(jLabel7)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(txtDirOut, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    );

    jbtCancelar.setText("Cancelar");
    jbtCancelar.setEnabled(false);
    jbtCancelar.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jbtCancelarActionPerformed(evt);
        }
    });
    jbtCancelar.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            OnClick(evt);
        }
    });

    mnuArchivo.setText("Archivo");
    mnuArchivo.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            mnuArchivoActionPerformed(evt);
        }
    });

    mnuItemArchivo.setText("Abrir");
    mnuItemArchivo.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            mnuItemArchivoActionPerformed(evt);
        }
    });
    mnuArchivo.add(mnuItemArchivo);
    mnuItemArchivo.getAccessibleContext().setAccessibleName("\"Archivo\"");

    mnuItemSalir.setText("Salir");
    mnuItemSalir.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            mnuItemSalirActionPerformed(evt);
        }
    });
    mnuArchivo.add(mnuItemSalir);

    mbrBarraMenus.add(mnuArchivo);

    mnuAcciones.setText("Validar");

    mnuListaTipos.setText("Tipos de Archivo");
    mnuListaTipos.setEnabled(false);
    mnuListaTipos.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            mnuListaTiposActionPerformed(evt);
        }
    });
    mnuAcciones.add(mnuListaTipos);

    mbrBarraMenus.add(mnuAcciones);

    mnuUtil.setText("Utilidades");

    mnuItemCargarNuevosTiposDeArchivo.setText("Cargar/Actualizar Tipos de Archivo");
    mnuItemCargarNuevosTiposDeArchivo.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            mnuItemCargarNuevosTiposAction(evt);
        }
    });
    mnuUtil.add(mnuItemCargarNuevosTiposDeArchivo);

    mnuItemVerGlosas.setText("Glosario");
    mnuItemVerGlosas.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            mnuItemVerGlosasActionPerformed(evt);
        }
    });
    mnuUtil.add(mnuItemVerGlosas);

    mbrBarraMenus.add(mnuUtil);

    mnuAcerca.setText("Acerca de");

    mnuItemAcerca.setText("Acerca de...");
    mnuItemAcerca.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            mnuItemAcercaActionPerformed(evt);
        }
    });
    mnuAcerca.add(mnuItemAcerca);

    mbrBarraMenus.add(mnuAcerca);

    setJMenuBar(mbrBarraMenus);

    org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(layout.createSequentialGroup()
            .addContainerGap()
            .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                .add(jPanel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(jbtCancelar))
            .addContainerGap())
        .add(org.jdesktop.layout.GroupLayout.TRAILING, jSeparator1)
        .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
            .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .add(lblValidando, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 404, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
            .add(162, 162, 162))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(layout.createSequentialGroup()
            .addContainerGap()
            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .add(jPanel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                    .add(jbtCancelar))
                .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
            .add(20, 20, 20)
            .add(jSeparator1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(lblValidando, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 21, Short.MAX_VALUE)
            .addContainerGap())
    );

    pack();
    }// </editor-fold>//GEN-END:initComponents

    private void mnuListaTiposActionPerformed(java.awt.event.ActionEvent evt) {
        System.out.println("mnuListaTiposActionPerformed");
    }

    private void mnuItemAcercaActionPerformed(java.awt.event.ActionEvent evt) {
        JOptionPane.showConfirmDialog(this, "Malla Validadora de Estructura \n Versión" + Context.getContext().getAttribute(Context.VERSION)
                + " - Build " + Context.getContext().getAttribute(Context.BUILD), "Acerca de...", JOptionPane.DEFAULT_OPTION);
    }

    private void mnuItemVerGlosasActionPerformed(java.awt.event.ActionEvent evt) {
        jfrGlosas.pack();
        jfrGlosas.setVisible(true);
        jfrGlosas.setLocationRelativeTo(this);
    }

    private void mnuItemSalirActionPerformed(java.awt.event.ActionEvent evt) {
        this.dispose();
    }

    private void mnuItemCargarNuevosTiposAction(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_mnuItemCargarNuevosTiposAction
        jfcSeleccionarArchivo.setFileSelectionMode(JFileChooser.FILES_ONLY);
        jfcSeleccionarArchivo.setDialogTitle("Seleccione el archivo a cargar");
        jfcSeleccionarArchivo.resetChoosableFileFilters();
        jfcSeleccionarArchivo.addChoosableFileFilter(new MiFiltro("xml"));
        int returnVal = jfcSeleccionarArchivo.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File fileDest = new File(System.getProperty("user.dir") + File.separator + "xml" + File.separator + jfcSeleccionarArchivo.getSelectedFile().getName());
            if (fileDest.exists()) {
                int res = JOptionPane.showConfirmDialog(this, "El archivo de reglas para el tipo de archivo ya existe, desea sobreescribirlo?", "Archivo Existente", JOptionPane.YES_NO_OPTION);
                if (res == JOptionPane.NO_OPTION) {
                    return;
                }
            }
            try {
                FileChannel dstChannel;
                FileChannel srcChannel = new FileInputStream(jfcSeleccionarArchivo.getSelectedFile()).getChannel();
                dstChannel = new FileOutputStream(fileDest).getChannel();
                dstChannel.transferFrom(srcChannel, 0, srcChannel.size());

                dstChannel.close();
                Context.getContext().removeAttribute(fileDest.getName().substring(0, fileDest.getName().length() - 4));
                this.cargarListaTipos();
                JOptionPane.showConfirmDialog(this, "El archivo de reglas fue cargado satisfactoriamente", "Archivo cargado con Exito", JOptionPane.DEFAULT_OPTION);
            } catch (HeadlessException ex) {
                mostrarMensaje("Ocurrio un error copiando el archivo verifique que no este en uso por otra aplicaci�n o no se encuentre en la ubicación seleccionada", "Error");
            } catch (IOException ex) {
                mostrarMensaje("Ocurrio un error copiando el archivo verifique que no este en uso por otra aplicaci�n o no se encuentre en la ubicación seleccionada", "Error");
            }
        }
    }

    private void jbtCancelarActionPerformed(java.awt.event.ActionEvent evt) {
        Context.getContext().addAttribute(Context.STATUS_VALIDACION, Context.STATUS_CANCELADO);
    }

    private void OnClick(java.awt.event.MouseEvent evt) {
    }

    private void jfcSeleccionarArchivoActionPerformed(java.awt.event.ActionEvent evt) {
    }

    private void validar(String tipoArchivo) {
        jfcSeleccionarArchivo.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        jfcSeleccionarArchivo.setDialogTitle("Seleccione la carpeta destino");
        jfcSeleccionarArchivo.resetChoosableFileFilters();
        int returnVal = jfcSeleccionarArchivo.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            if (((File) Context.getContext().getAttribute(
                    Context.ARCHIVO_ACTUAL)).getParent().equals(
                    jfcSeleccionarArchivo.getSelectedFile().getPath())) {
                mostrarMensaje("No puede seleccionar el mismo directorio de el archivo de entrada", "Carpeta destino no válida");
                return;
            }
            Context.getContext().addAttribute(
                    Context.DIRECTORIO_SALIDA, jfcSeleccionarArchivo.getSelectedFile().getPath() + File.separator);
            Context.getContext().addAttribute(Context.TIPO_ARCHIVO, tipoArchivo);
            Context.getContext().addAttribute(Context.STATUS_VALIDACION, Context.STATUS_INICIADO);
            jbtCancelar.setEnabled(true);
            lblValidando.setText("Validando Archivo. Por favor espere...");
            mnuAcciones.setEnabled(false);
            mnuArchivo.setEnabled(false);
            mnuUtil.setEnabled(false);
            jPanel1.setEnabled(false);
            Thread t = new Thread(new ValidadorLoader(this));
            t.start();
        }
    }

    private void mostrarMensaje(String msg, String titulo) {
        JOptionPane.showMessageDialog(this, msg, titulo, JOptionPane.ERROR_MESSAGE);
        
    }

    private void mnuItemArchivoActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_mnuItemArchivoActionPerformed
        jfcSeleccionarArchivo.setFileSelectionMode(JFileChooser.FILES_ONLY);
        jfcSeleccionarArchivo.setDialogTitle("Seleccione el archivo a validar");
        jfcSeleccionarArchivo.resetChoosableFileFilters();
        jfcSeleccionarArchivo.addChoosableFileFilter(new MiFiltro("txt"));
        int returnVal = jfcSeleccionarArchivo.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            Context.getContext().addAttribute(Context.ARCHIVO_ACTUAL, jfcSeleccionarArchivo.getSelectedFile());
            leerArchivo(jfcSeleccionarArchivo.getSelectedFile().toString(), txtTexto);
            mnuListaTipos.setEnabled(true);
            setearEstadisticas(new EstadisticasBean());
        }
    }

    private void mnuArchivoActionPerformed(java.awt.event.ActionEvent evt) {
    }

    private void setearEstadisticas(EstadisticasBean estadisticas) {
        lblRegistrosValidos.setText(estadisticas.getValidosString());
        lblTotalGlosados.setText(estadisticas.getGlosadosString());
        lblTiempoTranscurrido.setText(estadisticas.getTiempoString());
        lblTotalRegistros.setText(estadisticas.getTotalRegistrosString());
        pgrGlosados.setValue((int) estadisticas.getPctGlosados());
        pgrValidos.setValue((int) estadisticas.getPctValidos());
        lblPorcentajeValidos.setText(estadisticas.getPctValidos() + "%");
        lblPorcentajeGlosados.setText(estadisticas.getPctGlosados() + "%");
        txtDirOut.setText(estadisticas.getDirectorioOut());
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        String version = "5.11";//args[0];
        String build = "5.11";//args[1];
                
        
//        String version = args[0];
//        String build = args[1];
        Context.getContext().addAttribute(Context.BUILD, build);
        Context.getContext().addAttribute(Context.VERSION, version);
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                Aplication mw = new Aplication();
                mw.pack();
                mw.setVisible(true);
                mw.cargarListaTipos();
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JButton jbtCancelar;
    private javax.swing.JDialog jdlValidando;
    private javax.swing.JFileChooser jfcSeleccionarArchivo;
    private javax.swing.JFrame jfrGlosas;
    private javax.swing.JSpinner jsLineCount;
    private javax.swing.JScrollPane jsllTexto;
    private javax.swing.JTable jtbGlosas;
    private javax.swing.JLabel lblPorcentajeGlosados;
    private javax.swing.JLabel lblPorcentajeValidos;
    private javax.swing.JLabel lblRegistrosValidos;
    private javax.swing.JLabel lblTiempoTranscurrido;
    private javax.swing.JLabel lblTotalGlosados;
    private javax.swing.JLabel lblTotalRegistros;
    private javax.swing.JLabel lblValidando;
    private javax.swing.JMenuBar mbrBarraMenus;
    private javax.swing.JMenu mnuAcciones;
    private javax.swing.JMenu mnuAcerca;
    private javax.swing.JMenu mnuArchivo;
    private javax.swing.JMenuItem mnuItemAcerca;
    private javax.swing.JMenuItem mnuItemArchivo;
    private javax.swing.JMenuItem mnuItemCargarNuevosTiposDeArchivo;
    private javax.swing.JMenuItem mnuItemSalir;
    private javax.swing.JMenuItem mnuItemVerGlosas;
    private javax.swing.JMenu mnuListaTipos;
    private javax.swing.JMenu mnuUtil;
    private javax.swing.JProgressBar pgrGlosados;
    private javax.swing.JProgressBar pgrValidos;
    private javax.swing.JTextField txtDirOut;
    private javax.swing.JTextField txtNombreArchivo;
    private javax.swing.JTextArea txtTexto;
    // End of variables declaration//GEN-END:variables

    public class ValidadorLoader implements Runnable {

        private final Aplication bar;

        /**
         * Creates a new instance of ValidadorLoader
         *
         * @param bar
         */
        public ValidadorLoader(Aplication bar) {
            this.bar = bar;
        }

        @Override
        @SuppressWarnings("empty-statement")
        public void run() {
            try {
                String formatoValidar = "BDUA" + (String) Context.getContext().getAttribute(Context.TIPO_ARCHIVO);
                Context.getContext().addAttribute(Context.TIPO_FORMULARIO, formatoValidar);
                String destino = (String) Context.getContext().getAttribute(Context.DIRECTORIO_SALIDA);
                String tipoFormulario = (String) Context.getContext().getAttribute(Context.TIPO_FORMULARIO);
                FormularioModel formulario = new FormularioModel(tipoFormulario);
                // formulario.setVersion(Context.getContext().getAttribute(Context.VERSION).toString());
                Context.getContext().addAttribute(formulario.getTipoFormulario(), formulario);
                String tipo = (String) Context.getContext().getAttribute(Context.TIPO_ARCHIVO);
                formulario.setEstadisticas(new EstadisticasBean());
                int nombreValido = Validador.ValidarNombreArchivo();
                if (nombreValido > 0) {
                    switch (nombreValido) {
                        case 1:
                            bar.mostrarMensaje("Estructura del nombre de archivo no valida", "Importante");
                            break;
                        case 2:
                            bar.mostrarMensaje("Mes del archivo no valido en el nombre del archivo", "Importante");
                            break;
                        case 3:
                            bar.mostrarMensaje("A�o del archivo no valido en el nombre del archivo", "Importante");
                            break;
                        case 4:
                            bar.mostrarMensaje("No se pudo cargar el archivo xml de entidades", "Importante");
                            break;
                        case 5:
                            bar.mostrarMensaje("No existe el archivo xml de entidades", "Importante");
                            break;
                        case 6:
                            bar.mostrarMensaje("Codigo de entidad no valido en el nombre del archivo", "Importante");
                            break;
                        case 7:
                            bar.mostrarMensaje("Codigo de departamento no valido en el nombre del archivo", "Importante");
                            break;
                        case 8:
                            bar.mostrarMensaje("No se pudo cargar el archivo xml de municipio", "Importante");
                            break;
                        case 9:
                            bar.mostrarMensaje("No existe el archivo xml de municipio", "Importante");
                            break;
                        case 10:
                            bar.mostrarMensaje("Codigo de municipio no valido en el nombre del archivo", "Importante");
                            break;
                    }
                } else {
                    boolean inconsistencias = false;
                    EstadisticasBean estadisticas = null;
                    try {
                        estadisticas = Validador.validar();
                    } catch (NoSuchPaddingException ex) {
                        Logger.getLogger(Aplication.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (NoSuchAlgorithmException ex) {
                        Logger.getLogger(Aplication.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (InvalidKeyException ex) {
                        Logger.getLogger(Aplication.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IllegalBlockSizeException ex) {
                        Logger.getLogger(Aplication.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (BadPaddingException ex) {
                        Logger.getLogger(Aplication.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (Exception ex) {
                        Logger.getLogger(Aplication.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    
                    bar.setearEstadisticas(estadisticas);
                    
                    for (int i = 0; i < formulario.getArchivosValidar().size(); i++) {
                        ArchivoModel modeloArchivo = (ArchivoModel) formulario.getArchivosValidar().get(i);
                        String tipoArchivo = modeloArchivo.getTipoArchivo();
                        // JARB.04-07-2008. PRIMER RELEASE. INI
                        formulario.setVersion(modeloArchivo.getVersion());
                        // JARB.04-07-2008. PRIMER RELEASE. INI
                        if (modeloArchivo.getNombreArchivoEntrada() != null) {
                            File archivo = new File(modeloArchivo.getNombreArchivoEntrada());
                            Context.getContext().addAttribute(Context.ARCHIVO_ACTUAL, archivo);
                            Context.getContext().addAttribute(Context.TIPO_ARCHIVO, tipoArchivo);
                            Context.getContext().addAttribute(Context.MODELO_ARCHIVO_ACTUAL, i);
                            // EstadisticasBean estadisticas =
                            // Validador.validar();
                            modeloArchivo.setEstadisticas(estadisticas);
                            if (!inconsistencias) {
                                inconsistencias = (estadisticas.getRegistrosGlosados() > 0);
                            }
                        }
                        System.out.println("Tipo formulario 1: " + tipoFormulario);
                        System.out.println("formulario 2: " + formulario);
                        if (!inconsistencias) {
                            crearPaquete(formulario, destino);
                            bar.mostrarMensaje("Se va a generar el paquete con los registros validos del archivo", "Importante");
                        } else {
                            // crearPaquete(formulario, destino);
                            bar.mostrarMensaje("Se encontraron inconsistencias en los archivos, por lo que no se creo el paquete\n", "Importante");
                        }
                    }
                }
            } catch (CancelarException ex) {
                bar.mostrarMensaje(ex.getMessage(), "Error");
                bar.setearEstadisticas(new EstadisticasBean());
            } catch (GeneralException ex) {
                bar.mostrarMensaje(ex.getMessage(), "Error");
                bar.setearEstadisticas(new EstadisticasBean());
            } finally {
                bar.mnuAcciones.setEnabled(true);
                bar.mnuArchivo.setEnabled(true);
                bar.mnuUtil.setEnabled(true);
                bar.lblValidando.setText("");
                bar.jbtCancelar.setEnabled(false);
                bar.jPanel1.setEnabled(true);
            }
        }
    }

    class MiFiltro extends javax.swing.filechooser.FileFilter {

        public String extension;

        public MiFiltro(String ext) {
            extension = ext;
        }

        @Override
        public boolean accept(File file) {
            String filename = file.getName();
            return filename.endsWith("." + extension.toLowerCase()) || file.isDirectory() || filename.endsWith("." + extension.toUpperCase());
        }

        @Override
        public String getDescription() {
            return "*." + extension;
        }
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getBuild() {
        return build;
    }

    public void setBuild(String build) {
        this.build = build;
    }

    public void crearPaquete(FormularioModel formulario, String destino) {
        String nombreArchivo = ((File) Context.getContext().getAttribute(Context.ARCHIVO_ACTUAL)).getName();
        String nombrePaquete = (String) Context.getContext().getAttribute(Context.DIRECTORIO_SALIDA) + nombreArchivo.substring(0, nombreArchivo.length() - 4) + ".pak";
        if (nombrePaquete == null) {
            mostrarMensaje("No se definio formato para el nombre del paquete en el archivo de configuracion de " + formulario.getTipoFormulario(), "Adventencia");
            return;
        }
        List<String> archivos = formulario.getArchivosSalida();
        if (archivos.isEmpty()) {
            mostrarMensaje("No hay registros validos para empaquetar", "Adventencia");
            return;
        }
        Iterator<String> iterArch = archivos.iterator();
        Map<String, Boolean> lista = new HashMap();
        while (iterArch.hasNext()) {
            lista.put(iterArch.next(), true);
        }

        String archivoXML = crearResumenXML(formulario, destino, lista);
        lista.put(archivoXML, true);
        PaqueteModel paquete = new PaqueteModel(nombrePaquete, lista, destino);

        try {
            paquete.empaquetar();
        } catch (Exception e) {
            mostrarMensaje("No se pudo crear el paquete con los archivos de salida Error:" + e.getMessage(), "Adventencia");
        }
    }

    private String crearResumenXML(FormularioModel formulario, String destino, Map<String, Boolean> archivoslista) {
        try {
            // Crear Documento Padre
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            Document document = documentBuilder.newDocument();
            Element rootElement = document.createElement("Paquete");
            document.appendChild(rootElement);
            // Creando elementos del formulario
            Element nodoFormulario = document.createElement("Formulario");
            Element campo = document.createElement("Campo");
            campo.setAttribute("TipoFormulario", formulario.getTipoFormulario());
            nodoFormulario.appendChild(campo);
            campo = document.createElement("Campo");
            campo.setAttribute("VersionMalla", Context.VERSION_MALLA);
            nodoFormulario.appendChild(campo);
            campo = document.createElement("Campo");
            campo.setAttribute("VersionFormulario", formulario.getVersion());
            nodoFormulario.appendChild(campo);
            rootElement.appendChild(nodoFormulario);
            // formulario.appendChild(document.createTextNode("Texto dentro del nodo"));
            // Creando elementos del archivo

            Element archivos = document.createElement("Archivos");
            for (int i = 0; i < formulario.getArchivosValidar().size(); i++) {
                StringBuilder sb = new StringBuilder();
                File filetmp;
                ArchivoModel modeloArchivo = (ArchivoModel) formulario.getArchivosValidar().get(i);
                //System.out.println("DatosXML: " + );
                if (modeloArchivo.getNombreArchivoSalida() != null) {
                    Element archivo = document.createElement("Archivo");
                    Element registro = document.createElement("Registro");
                    Element Codhash = document.createElement("Hash");
                    filetmp = new File(modeloArchivo.getNombreArchivoSalida());
                    String nombre = filetmp.getName();
                    //Genera HASH
                    MessageDigest md = MessageDigest.getInstance("SHA-1");
                    byte[] mdbytes;
                    FileInputStream fis = new FileInputStream(modeloArchivo.getNombreArchivoSalida());

                    byte[] dataBytes = new byte[1024];
                    int nread;
                    while ((nread = fis.read(dataBytes)) != -1) {
                        md.update(dataBytes, 0, nread);
                    }
                    mdbytes = md.digest();

                    for (int p = 0; p < mdbytes.length; p++) {
                        sb.append(Integer.toString((mdbytes[p] & 0xff) + 0x100, 16).substring(1));
                    }
                    System.out.println("Hash : " + sb.toString());
                    archivo.setAttribute("Tipo", modeloArchivo.getTipoArchivo());
                    archivo.setAttribute("Nombre", nombre);
                    registro.setAttribute("Cantidad", modeloArchivo.getEstadisticas().getValidosString());
                    Codhash.setAttribute("Cadena", sb.toString());
                    archivos.appendChild(Codhash);
                    archivos.appendChild(registro);
                    archivos.appendChild(archivo);
                    rootElement.appendChild(archivos);
                }
            }
            String nombreArchivo = ((File) Context.getContext().getAttribute(Context.ARCHIVO_ACTUAL)).getName();
            String rutaDestinos = (String) Context.getContext().getAttribute(Context.DIRECTORIO_SALIDA);
            String nombrePaquete = rutaDestinos+ nombreArchivo.substring(0, nombreArchivo.length() - 4)+ ".pak";
            String nombreXML = nombrePaquete.substring(0,nombrePaquete.lastIndexOf("."))+ ".XML";
            System.out.println("nombreXML: " + nombreXML);
            // transform the Document into a String
            DOMSource source = new DOMSource(document);
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            
            Transformer transformer = transformerFactory.newTransformer();
            PrintWriter xmlf;
                       
                java.io.StringWriter sw = new java.io.StringWriter();
                StreamResult sr = new StreamResult(sw);
                transformer.transform(source, sr);
                String xml = sw.toString();
                xmlf = new PrintWriter(new FileWriter(nombreXML));
                xmlf.println(xml);     
                xmlf.close();
                return nombreXML;
            } catch (ParserConfigurationException | DOMException | NoSuchAlgorithmException | IOException | TransformerException ex) {
                GeneralException e = new GeneralException("No se pudo crear el archivo resumen de la validacion ", ex);
                throw (e);
            }
	}
}

