metodos.MetodosEliminatoriaTenis3Sets.java Source code

Java tutorial

Introduction

Here is the source code for metodos.MetodosEliminatoriaTenis3Sets.java

Source

/*
    GNU GENERAL PUBLIC LICENSE (GPL)
        Version 3, 29 June 2007
    Copyright (C) Hctor ?lvarez Castellano
    
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
    
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
    
You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>
*/
package metodos;

import datasources.DataSourceEliminatoriasTenis3SetsResultados;
import datasources.DataSourceFutbolJornada;
import equipos.EquipoTenis;
import generador.Calendario;
import generador.EquipoLista;
import generador.Jornada;
import static generador.Principal.limitarCadena;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import static java.lang.String.valueOf;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRXmlDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import partidos.Partido;
import partidos.PartidoEliminatoria;
import partidos.PartidoEliminatoriaTenis3Sets;
import renders.RenderEliminatoriaTenis3Sets;

/**
 * Vlido para Tenis, Frontenis, Pdel, Voley Playa
 * @author Alvarielli
 */
public class MetodosEliminatoriaTenis3Sets extends Metodos {

    //Le pasamos los valores de los objetos de Principal a esta clase
    private DefaultTableModel modelo;
    private int jornada;
    private JTable TableJornada;
    private JLabel LabelJornada;
    private JLabel LabelTotalJornadas;
    private JTextField TextFieldJornada;
    private Calendario calendario;
    private EquipoLista castEquipoLista;//EquipoLista con los Equipos ya casteados en Principal (seleccionarClaseEquipo)
    private boolean mensaje = false;//Se utiliza para que el programa muestre el mensaje de error al introducir datos slo una vez
    private int anchoTabla = 1740;//Ponemos un valor fijo y nos evitamos problemas //TableJornada.getWidth();
    private int alturaColumna = 25;//Indica la altura de la columna
    private RenderEliminatoriaTenis3Sets render;
    private int[] num = { 8, 8, 17, 4, 4, 4, 4, 4, 4, 17, 8, 8, 8 };// Definimos los anchos para las tablas en porcentaje (para que el usuario pueda modificarlas luego)
    private String[] columnas;

    //Variables aadidas para las eliminatorias
    private ArrayList<String> auxEquipos = new ArrayList<>();//creamos un arraylist para ir aadiendo eliminatorias
    private int numEliminatorias;
    private boolean tercerCuartoPuesto;
    private boolean idaVuelta;//Necesario para las actualizaciones de las eliminatorias
    private String[] nombresEliminatorias;//Guarda los nuevos nombres de las fases de las eliminatorias

    /*** Variables que necesitaremos para los archivos XML ***/
    private String nombreTorneo;
    private int tipoTorneo;
    private int deporte;
    private int num_jornadas;
    private int sets;
    private boolean sorteo;
    //Ruta para el calendario PDF
    private String rutaXMLCalendar = "";
    //HashMap de equipos sancionados (en eliminatorias no se utliza el HashMap)
    private HashMap<String, Integer> sancionados = new HashMap<>();

    /** Variables necesarias para el tamao de las tablas **/
    private final int CODIGO_ANCHO = 317;
    private final int CODIGO_ALTO = 29;
    //Estas simplemente son necesarias para poder utilizarlas desde la interfaz
    private int[] numc;
    private String[] columnasClasf;
    private int alturaClasfColumna;

    //En el constructor de clase le pasamos todo lo requerido para esta clase desde Principal
    public MetodosEliminatoriaTenis3Sets(DefaultTableModel modelo, int jornada, JTable TableJornada,
            JLabel LabelJornada, JLabel LabelTotalJornadas, JTextField TextFieldJornada, Calendario calendario,
            EquipoLista castEquipoLista, String nombreTorneo, int tipoTorneo, int deporte, int num_jornadas,
            boolean idaVuelta, int sets, boolean sorteo, boolean tercerCuartoPuesto) {

        this.modelo = modelo;
        this.jornada = jornada;
        this.TableJornada = TableJornada;
        this.LabelJornada = LabelJornada;
        this.LabelTotalJornadas = LabelTotalJornadas;
        this.TextFieldJornada = TextFieldJornada;
        this.calendario = calendario;
        this.castEquipoLista = castEquipoLista;
        //y ahora inicializamos las variables del torneo       
        this.nombreTorneo = nombreTorneo;
        this.tipoTorneo = tipoTorneo;
        this.deporte = deporte;
        this.num_jornadas = num_jornadas;
        this.idaVuelta = idaVuelta;
        this.sets = sets;
        this.sorteo = sorteo;
        this.tercerCuartoPuesto = tercerCuartoPuesto;
    }

    /**
    * Carga los datos de la joranda pasada en la tabla
    * @param jornada
    */
    @Override
    public void cargarTabla(int jornada) {
        /* Actualizamos las eliminatorias cada vez que cargamos la tabla*/
        setNumEliminatorias(calcularNumeroEliminatorias(castEquipoLista.getEquipos(), idaVuelta));//Las definimos aqu porque necesitamos que se carguen los equipos para calcular el nmero de eliminatorias
        if (idaVuelta) {
            actualizarNuevaEliminatoriaIdaVuelta();
        } else {
            actualizarNuevaEliminatoria();//Lo hacemos aqu para que actualize la tabla desde la primera jornada
        }

        TableJornada.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);//Reasignamos el AutoAjustado
        //Textos para las columnas
        String[] columnasLocal = { "FECHA", "HORA", "LOCAL", "SET 1 (L)", "SET 1 (V)", "SET 2 (L)", "SET 2 (V)",
                "SET 3 (L)", "SET 3 (V)", "VISITANTE", "PISTA", "GANADOR", "DESEMPATE" };
        setColumnas(columnasLocal);
        //Indicamos que columnas sern editables
        final boolean[] canEdit = new boolean[] { true, true, false, true, true, true, true, true, true, false,
                true, true, true };
        //Asignamos los nuevos anchos al array (los del archivo.txt)
        setNum(getAnchoTabla(getNum().length, CODIGO_ANCHO));
        //Definimos los anchos de las columnas y los asignamos como tamao preferente
        int[] anchos = { (anchoTabla * num[0]) / 100, (anchoTabla * num[1]) / 100, (anchoTabla * num[2]) / 100,
                (anchoTabla * num[3]) / 100, (anchoTabla * num[4]) / 100, (anchoTabla * num[5]) / 100,
                (anchoTabla * num[6]) / 100, (anchoTabla * num[7]) / 100, (anchoTabla * num[8]) / 100,
                (anchoTabla * num[9]) / 100, (anchoTabla * num[10]) / 100, (anchoTabla * num[11]) / 100,
                (anchoTabla * num[12]) / 100 };
        //Modelo de tabla por defecto
        setModelo(new DefaultTableModel(getColumnas(), 0) {
            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit[columnIndex];
            }
        });

        //Asignamos a nuestra variable global jornada el valor de la jornada pasada (pues el calculo se realiza en los botones de Principal)
        this.jornada = jornada;
        //En funcin de las caractersticas de la eliminatoria se escoger un ArrayList (ida y vuelta, tercer y cuarto puesto... (10 rondas y 20 con la vuelta)
        if (idaVuelta == false) {
            if (tercerCuartoPuesto == false) {
                nombresEliminatorias = new String[] { "Final", "Semifinales", "Cuartos de Final",
                        "Octavos de Final", "Dieciseisavos de Final", "Treintaidosavos de Final", "64avos de Final",
                        "128avos de Final", "256avos de Final", "512avos de Final" };
            } else {
                nombresEliminatorias = new String[] { "Final - 3 y 4 Puesto", "Semifinales", "Cuartos de Final",
                        "Octavos de Final", "Dieciseisavos de Final", "Treintaidosavos de Final", "64avos de Final",
                        "128avos de Final", "256avos de Final", "512avos de Final" };
            } //end if tercerCuartoPuesto
        } else {
            if (tercerCuartoPuesto == false) {
                nombresEliminatorias = new String[] { "Final - Vuelta", "Final", "Semifinales - Vuelta",
                        "Semifinales", "Cuartos de Final - Vuelta", "Cuartos de Final", "Octavos de Final - Vuelta",
                        "Octavos de Final", "Dieciseisavos de Final - Vuelta", "Dieciseisavos de Final",
                        "Treintaidosavos de Final - Vuelta", "Treintaidosavos de Final", "64avos de Final - Vuelta",
                        "64avos de Final", "128avos de Final - Vuelta", "128avos de Final",
                        "256avos de Final - Vuelta", "256avos de Final", "512avos de Final - Vuelta",
                        "512avos de Final" };
            } else {
                nombresEliminatorias = new String[] { "Final - 3 y 4 Puesto  - Vuelta",
                        "Final - 3 y 4 Puesto", "Semifinales - Vuelta", "Semifinales",
                        "Cuartos de Final - Vuelta", "Cuartos de Final", "Octavos de Final - Vuelta",
                        "Octavos de Final", "Dieciseisavos de Final - Vuelta", "Dieciseisavos de Final",
                        "Treintaidosavos de Final - Vuelta", "Treintaidosavos de Final", "64avos de Final - Vuelta",
                        "64avos de Final", "128avos de Final - Vuelta", "128avos de Final",
                        "256avos de Final - Vuelta", "256avos de Final", "512avos de Final - Vuelta",
                        "512avos de Final" };
            } //end if tercerCuartoPuesto
        } //end if nombresEliminatorias 
          //Lo primero de todo, cada vez que se carga el mtodo que pinta la tabla, borramos las filas que pudiera haber escritas
        getTableJornada().removeAll();
        //modelo.getDataVector().removeAllElements();
        getTableJornada().repaint();//Repinta el elemento en cuestin repaint()???
        //Creamos una variable Jornada y obtenemos la jornada indicada de nuestro objeto calendario
        Jornada J = getCalendario().jornadas.get(jornada - 1);//-1 porque es un ndice
        //Ahora usamos el for-each y obtenemos la lista de partidos de este objeto Jornada
        for (PartidoEliminatoria partido : (ArrayList<PartidoEliminatoria>) J.getListaPartidos())
            getModelo().addRow(partido.getTableRepresentation());

        //Indicamos a la tabla cual es su modelo y asignamos el ganador de la eliminatoria
        getTableJornada().setModel(getModelo());
        asignarGanador(TableJornada, TableJornada.getColumnModel().getColumn(11));
        //Le asignamos el render al calendario
        render = new RenderEliminatoriaTenis3Sets();
        getTableJornada().setDefaultRenderer(Object.class, render);
        //Le asignamos a la etiqueta Jornada su nmero correspondiente
        if (idaVuelta) {
            getLabelJornada().setText(nombresEliminatorias[calendario.jornadas.size() - jornada]);
        } else {
            getLabelJornada().setText(nombresEliminatorias[calendario.jornadas.size() - jornada]);
        }
        //getLabelJornada().setText("JORNADA " + jornada);
        //Asignamos el total de jornadas a su etiqueta
        getLabelTotalJornadas().setText("JORNADAS EN TOTAL: " + getCalendario().jornadas.size());
        //Asignamos la nueva altura (la del archivo.txt)
        setAlturaColumna(getAltoTabla(CODIGO_ALTO));
        TableJornada.setRowHeight(getAlturaColumna());//Mtodo que cambia la altura de las filas del JTable (funciona una vez asignado el modelo) 
        for (int i = 0; i < getColumnas().length; i++) {
            TableJornada.getColumnModel().getColumn(i).setPreferredWidth(anchos[i]);
        }
        //Indicamos que las columnas no se puedan mover
        TableJornada.getTableHeader().setReorderingAllowed(false);
    }//End of cargarTabla()

    /**
     * Recoge los datos que se estn mostrando en la tabla y los pasa a su ArrayList correspondiente
     */
    @Override
    public void guardarTabla() {
        //Creamos una variable Jornada y obtenemos la jornada indicada de nuestro objeto calendario
        Jornada J = getCalendario().jornadas.get(getJornada() - 1);//coge la jornada como variable global, -1 porque es un ndice
        int filas = getTableJornada().getRowCount();//nmero de filas en la tabla
        //Por cada fila guardo los datos en el partido correspondiente del ArrayList 
        for (int i = 0; i < filas; i++) {
            //Obtenemos el partido en el ArrayList y le asignamos los nuevos datos
            PartidoEliminatoriaTenis3Sets P = (PartidoEliminatoriaTenis3Sets) J.partidos.get(i);
            P.setFecha(limitarCadena(getModelo().getValueAt(i, 0).toString().trim(), 30, false));//el toString() para que lo coja como una cadena
            P.setHora(limitarCadena(getModelo().getValueAt(i, 1).toString().trim(), 30, false));
            P.setLocal(limitarCadena(getModelo().getValueAt(i, 2).toString().trim(), 40, false));
            P.setSet1L(validarEnteros(getModelo().getValueAt(i, 3).toString().trim()));
            P.setSet1V(validarEnteros(getModelo().getValueAt(i, 4).toString().trim()));
            P.setSet2L(validarEnteros(getModelo().getValueAt(i, 5).toString().trim()));
            P.setSet2V(validarEnteros(getModelo().getValueAt(i, 6).toString().trim()));
            P.setSet3L(validarEnteros(getModelo().getValueAt(i, 7).toString().trim()));
            P.setSet3V(validarEnteros(getModelo().getValueAt(i, 8).toString().trim()));
            P.setVisitante(limitarCadena(getModelo().getValueAt(i, 9).toString().trim(), 40, false));
            P.setPista(limitarCadena(getModelo().getValueAt(i, 10).toString().trim(), 30, false));
            P.setGanador(limitarCadena(getModelo().getValueAt(i, 11).toString().trim(), 30, false));
            P.setDesempate(limitarCadena(getModelo().getValueAt(i, 12).toString().trim(), 30, false));

            //Si los resultados arrojan un empate avisamos al usuario de su error (lo cargar al usar las flechas de jornada) Son iguales y no estn vacas
            if (P.getSet1L() == P.getSet1V() && !getModelo().getValueAt(i, 3).toString().equalsIgnoreCase("")
                    && !getModelo().getValueAt(i, 4).toString().equalsIgnoreCase("")) {
                P.setSet1L(-1);
                P.setSet1V(-1);
                //Mostramos un mensaje de error en caso de que el usuario coloque un empate en la tabla
                if (!this.mensaje) {//if esclusivamente para mostrar o no el mensaje
                    JOptionPane.showMessageDialog(TableJornada,
                            "El resultado no es vlido, los participantes no pueden empatar en ningn set",
                            "Error al insertar los datos de la tabla", JOptionPane.ERROR_MESSAGE, null);
                    this.mensaje = true;
                }
            }
            if (P.getSet2L() == P.getSet2V() && !getModelo().getValueAt(i, 5).toString().equalsIgnoreCase("")
                    && !getModelo().getValueAt(i, 6).toString().equalsIgnoreCase("")) {
                P.setSet2L(-1);
                P.setSet2V(-1);
                //Mostramos un mensaje de error en caso de que el usuario coloque un empate en la tabla
                if (!this.mensaje) {//if esclusivamente para mostrar o no el mensaje
                    JOptionPane.showMessageDialog(TableJornada,
                            "El resultado no es vlido, los participantes no pueden empatar en ningn set",
                            "Error al insertar los datos de la tabla", JOptionPane.ERROR_MESSAGE, null);
                    this.mensaje = true;
                }
            }
            if (P.getSet3L() == P.getSet3V() && !getModelo().getValueAt(i, 7).toString().equalsIgnoreCase("")
                    && !getModelo().getValueAt(i, 8).toString().equalsIgnoreCase("")) {
                P.setSet3L(-1);
                P.setSet3V(-1);
                //Mostramos un mensaje de error en caso de que el usuario coloque un empate en la tabla
                if (!this.mensaje) {//if esclusivamente para mostrar o no el mensaje
                    JOptionPane.showMessageDialog(TableJornada,
                            "El resultado no es vlido, los participantes no pueden empatar en ningn set",
                            "Error al insertar los datos de la tabla", JOptionPane.ERROR_MESSAGE, null);
                    this.mensaje = true;
                }
            }
        } //end for
          //Tras acabar el for y recorrer todos los resultados ponemos el mensaje como false de nuevo
        this.mensaje = false;
    }//End of guardarTabla() 

    /**
     * Muestra la joranda indicada en el JTextField
     */
    @Override
    public void mostrarJornada() {
        //Lo primero de todo guardamos los datos que tenga asignados la tabla
        guardarTabla();
        //Obtenemos el valor del TextField para buscar la jornada
        setJornada(validarEnteros(getTextFieldJornada().getText()));
        //Si la jornada es mayor que el total de jornadas lo igualamos a ste y si es 0 lo pasamos a la jornada 1
        if (getJornada() > getCalendario().jornadas.size()) {
            setJornada(getCalendario().jornadas.size());
        } else if (getJornada() <= 0) {
            setJornada(1);
        }
        cargarTabla(getJornada());
    }

    /**
     * Recibe los goles en formato cadena y comprueba que son un nmero entero positivo
     * @param cadena
     * @return 
     */
    @Override
    public int validarEnteros(String cadena) {
        int numero;
        if (!cadena.equalsIgnoreCase("")) {
            //Si la casilla est vaca ignoramos el chequeo, pues no hay informacin que comprobar
            try {
                //Casteamos la cadena pasada
                numero = Integer.parseInt(cadena);

                if (numero < 0) {
                    //Si lo recibido es un nmero negativo
                    if (!this.mensaje) {//if esclusivamente para mostrar o no el mensaje
                        JOptionPane.showMessageDialog(TableJornada,
                                "Los Goles deben contener nmeros enteros no negativos",
                                "Error al insertar los datos de la tabla", JOptionPane.ERROR_MESSAGE, null);
                        this.mensaje = true;
                    }
                    numero = -1;
                    return numero;
                } else {
                    return numero;
                }
            } catch (NumberFormatException nfe) {
                //Si lo recibido no es un nmero entero guardamos un -1 y mostramos un mensaje de error
                if (!this.mensaje) {//if esclusivamente para mostrar o no el mensaje
                    JOptionPane.showMessageDialog(TableJornada,
                            "Los Goles deben contener nmeros enteros no negativos",
                            "Error al insertar los datos de la tabla", JOptionPane.ERROR_MESSAGE, null);
                    this.mensaje = true;
                }
                numero = -1;
                return numero;
            }
        } //End if de chequeo de cadena
        return -1;//Devolvemos el nmero que ser tratado por nuestro programa
    }//End of validarEnteros()

    /**
      * Mtodo que asigna un JComboBox a la columna del ganador
      * @param tabla
      * @param columna 
      */
    public void asignarGanador(JTable tabla, TableColumn columna) {
        String[] valores = { "LOCAL", "VISITANTE" };
        JComboBox combo = new JComboBox(valores);
        columna.setCellEditor(new DefaultCellEditor(combo));
    }

    /**
     * Mtodo que se utiliza para actualizar los ganadores de las eliminatorias en funcin de si el usuario marca LOCAL o VISITANTE
     */
    public void actualizarNuevaEliminatoria() {
        int jor = 1;
        //Mientras haya eliminatorias vamos creando jornadas
        while (jor < getNumEliminatorias()) {
            getAuxEquipos().clear();//vaciamos el arrayList auxiliar
            Jornada Jsiguiente = getCalendario().jornadas.get(jor);//Una ms que la jornada (sera -1 pues es un array)
            //Comprobamos la jornada actual y aadimos los equipos ganadores al nuevo ArrayList con el que formaremos la siguiente ronda
            Jornada J = getCalendario().jornadas.get(jor - 1);
            //Definimos el tamao del Arraylist en caso de que la Eliminatoria sea la ltima y la opcin tercerCuartoPuesto sea verdadera para poder aadir los equipos con posicin 2,3
            for (PartidoEliminatoria partido : (ArrayList<PartidoEliminatoria>) J.getListaPartidos())
                //Si el local o el visitante no tienen rival les asignamos como ganadores
                if (partido.getGanador().equalsIgnoreCase("LOCAL")) {
                    getAuxEquipos().add(partido.getLocal());
                    //Si hay tercer y cuarto puesto y son semifinales aadimos tambin al Arraylist el equipo derrotado
                    if (jor == (getNumEliminatorias() - 1) && isTercerCuartoPuesto() == true) {
                        getAuxEquipos().add(partido.getVisitante());
                    }
                } else if (partido.getGanador().equalsIgnoreCase("VISITANTE")) {
                    //Si hay tercer y cuarto puesto y son semifinales aadimos tambin al Arraylist el equipo derrotado
                    getAuxEquipos().add(partido.getVisitante());
                    if (jor == (getNumEliminatorias() - 1) && isTercerCuartoPuesto() == true) {
                        getAuxEquipos().add(partido.getLocal());
                    }
                } else {
                    //getModelo().addRow(partido.getTableRepresentation()); 
                }
            int indice = 0;//ndice auxiliar que nos ayudar a poner cada equipo en su hueco correspondiente
            for (PartidoEliminatoria partidoSig : (ArrayList<PartidoEliminatoria>) Jsiguiente.getListaPartidos()) {
                //Si hay tercer y cuarto puesto y son semifinales modificamos la forma de recoger los equipos, pues ahora estn tambin los que han perdido en el ArrayList
                if (jor == (getNumEliminatorias() - 1) && isTercerCuartoPuesto() == true) {
                    partidoSig.setLocal(getAuxEquipos().get(indice));
                    partidoSig.setVisitante(getAuxEquipos().get(indice + 2));
                    indice += 1;
                } else {
                    partidoSig.setLocal(getAuxEquipos().get(indice));
                    partidoSig.setVisitante(getAuxEquipos().get(indice + 1));
                    indice += 2;
                }
            }
            jor++;//Aadimos una jornada para que pueda salir del bucle
        } //End while
    }//End of calcularNuevaEliminatoria()    

    /**
     * Calcula el nmero de jornadas que se utilizarn en la eliminatoria
     * @param equipos
     * @param idaVuelta
     * @return 
     */
    public int calcularNumeroEliminatorias(ArrayList<String> equipos, boolean idaVuelta) {
        boolean salida = true;//true para que siga con los ciclos
        int jornadas = 1;//Definimos la jornada y vamos sumando conforme a lo que toque
        int indice = 1;
        do {

            if (equipos.size() > Math.pow(2, indice)) {//2 es la base
                //Aadimos una jornada y aumentamos el indice en 1
                jornadas++;
                indice++;
            } else {
                //salimos del bucle
                salida = false;
            }
        } while (salida);

        //Si hay ida y vuelta devolvemos el doble de jornadas
        if (idaVuelta) {
            return (jornadas * 2);
        } else {
            return jornadas;
        }

    }

    public void actualizarNuevaEliminatoriaIdaVuelta() {
        int jor = 1;
        //System.out.println(calendario.getCalendario().size());
        //Mientras haya eliminatorias vamos creando jornadas
        while (jor < getNumEliminatorias()) {
            getAuxEquipos().clear();//vaciamos el arrayList auxiliar
            Jornada Jsiguiente = getCalendario().jornadas.get(jor);//Una ms que la jornada (sera -1 pues es un array)
            //Comprobamos la jornada actual y aadimos los equipos ganadores al nuevo ArrayList con el que formaremos la siguiente ronda
            Jornada J = getCalendario().jornadas.get(jor - 1);
            if (jor % 2 != 0) {
                //Ignoramos instrucciones con jornada impar
            } else {
                //Definimos el tamao del Arraylist en caso de que la Eliminatoria sea la ltima y la opcin tercerCuartoPuesto sea verdadera para poder aadir los equipos con posicin 2,3
                for (PartidoEliminatoria partido : (ArrayList<PartidoEliminatoria>) J.getListaPartidos())
                    //Si el local o el visitante no tienen rival les asignamos como ganadores
                    if (partido.getGanador().equalsIgnoreCase("LOCAL")) {
                        getAuxEquipos().add(partido.getLocal());
                        //Si hay tercer y cuarto puesto y son semifinales aadimos tambin al Arraylist el equipo derrotado
                        if (jor == (getNumEliminatorias() - 2) && isTercerCuartoPuesto() == true) {
                            getAuxEquipos().add(partido.getVisitante());
                        }
                    } else if (partido.getGanador().equalsIgnoreCase("VISITANTE")) {
                        //Si hay tercer y cuarto puesto y son semifinales aadimos tambin al Arraylist el equipo derrotado
                        getAuxEquipos().add(partido.getVisitante());
                        if (jor == (getNumEliminatorias() - 2) && isTercerCuartoPuesto() == true) {
                            getAuxEquipos().add(partido.getLocal());
                        }
                    } else {
                        //getModelo().addRow(partido.getTableRepresentation()); 
                    }
                int indice = 0;//ndice auxiliar que nos ayudar a poner cada equipo en su hueco correspondiente
                for (PartidoEliminatoria partidoSig : (ArrayList<PartidoEliminatoria>) Jsiguiente
                        .getListaPartidos()) {
                    //Si hay tercer y cuarto puesto y son semifinales modificamos la forma de recoger los equipos, pues ahora estn tambin los que han perdido en el ArrayList
                    if (jor == (getNumEliminatorias() - 2) && isTercerCuartoPuesto() == true) {
                        partidoSig.setLocal(getAuxEquipos().get(indice));
                        partidoSig.setVisitante(getAuxEquipos().get(indice + 2));
                        indice += 1;
                    } else {
                        partidoSig.setLocal(getAuxEquipos().get(indice));
                        partidoSig.setVisitante(getAuxEquipos().get(indice + 1));
                        indice += 2;
                    }
                }

                //Comprobamos la jornada actual y aadimos los equipos ganadores al nuevo ArrayList con el que formaremos la siguiente ronda
                Jornada J2 = getCalendario().jornadas.get(jor);
                Jsiguiente = getCalendario().jornadas.get(jor + 1);
                getAuxEquipos().clear();//vaciamos el arrayList auxiliar
                //Definimos el tamao del Arraylist en caso de que la Eliminatoria sea la ltima y la opcin tercerCuartoPuesto sea verdadera para poder aadir los equipos con posicin 2,3
                for (PartidoEliminatoria partido : (ArrayList<PartidoEliminatoria>) J2.getListaPartidos()) {
                    getAuxEquipos().add(partido.getVisitante());
                    getAuxEquipos().add(partido.getLocal());
                }
                indice = 0;//ndice auxiliar que nos ayudar a poner cada equipo en su hueco correspondiente
                for (PartidoEliminatoria partidoSig : (ArrayList<PartidoEliminatoria>) Jsiguiente
                        .getListaPartidos()) {
                    //Si hay tercer y cuarto puesto y son semifinales modificamos la forma de recoger los equipos, pues ahora estn tambin los que han perdido en el ArrayList
                    if (jor == (getNumEliminatorias() - 2) && isTercerCuartoPuesto() == true) {
                        //Para IdayVuelta es diferente, invertimos el +1 y el +2
                        partidoSig.setLocal(getAuxEquipos().get(indice));
                        partidoSig.setVisitante(getAuxEquipos().get(indice + 1));
                        indice += 2;
                    } else {
                        partidoSig.setLocal(getAuxEquipos().get(indice));
                        partidoSig.setVisitante(getAuxEquipos().get(indice + 1));
                        indice += 2;
                    }
                }
            } //if jor%2
            jor++;//Aadimos una jornada para que pueda salir del bucle
        } //End while
    }//End of calcularNuevaEliminatoria()    

    /**
     * Mtodo que guarda los datos en un archivo XML
     * @param ruta
     * @param nombreArchivo
     */
    @Override
    public void guardarXML(String ruta, String nombreArchivo) {

        //Variables auxiliaes
        int num_partidos;
        int num_equipos;

        try {

            Document doc = new Document();
            Element xml_torneo = new Element("torneo");
            doc.setRootElement(xml_torneo);

            //Elementos principales del torneo
            Element xml_nombreTorneo = new Element("nombreTorneo");
            xml_nombreTorneo.setText(nombreTorneo);
            doc.getRootElement().addContent(xml_nombreTorneo);

            Element xml_tipoTorneo = new Element("tipoTorneo");
            xml_tipoTorneo.setText(Integer.toString(tipoTorneo));
            doc.getRootElement().addContent(xml_tipoTorneo);

            Element xml_deporte = new Element("deporte");
            xml_deporte.setText(Integer.toString(deporte));
            doc.getRootElement().addContent(xml_deporte);

            Element xml_num_jornadas = new Element("jornadas");
            xml_num_jornadas.setText(Integer.toString(num_jornadas));
            doc.getRootElement().addContent(xml_num_jornadas);

            Element xml_idaVuelta = new Element("idaVuelta");
            xml_idaVuelta.setText(Boolean.toString(idaVuelta));
            doc.getRootElement().addContent(xml_idaVuelta);

            Element xml_sets = new Element("sets");
            xml_sets.setText(Integer.toString(sets));
            doc.getRootElement().addContent(xml_sets);

            Element xml_sorteo = new Element("sorteo");
            xml_sorteo.setText(Boolean.toString(sorteo));
            doc.getRootElement().addContent(xml_sorteo);

            Element xml_tercerCuartoPuesto = new Element("tercerCuartoPuesto");
            xml_tercerCuartoPuesto.setText(Boolean.toString(tercerCuartoPuesto));
            doc.getRootElement().addContent(xml_tercerCuartoPuesto);

            Element xml_sanciones = new Element("sanciones");
            doc.getRootElement().addContent(xml_sanciones);

            //Calendario y jornadas con sus partidos
            Element xml_calendario = new Element("calendario");
            for (int i = 0; i < num_jornadas; i++) {
                //Recorremos todos los partidos del objeto jornada (nmero i) para obtener los datos de cada partido y asginarlos a los elementos
                Jornada J = getCalendario().jornadas.get(i);//i porque es un ndice

                Element xml_jornada = new Element("jornada");
                //Aadimos como atributo el nmero de jornada                
                xml_jornada.setAttribute(new Attribute("numero", Integer.toString(i + 1)));

                //Ahora usamos el for-each y obtenemos la lista de partidos de este objeto Jornada
                for (PartidoEliminatoriaTenis3Sets partido : (ArrayList<PartidoEliminatoriaTenis3Sets>) J
                        .getListaPartidos()) {

                    //Creamos un elemento partido por cada partido en la lista
                    Element xml_partido = new Element("partido");

                    xml_partido.addContent(new Element("fecha").setText(partido.getFecha()));
                    xml_partido.addContent(new Element("hora").setText(partido.getHora()));
                    xml_partido.addContent(new Element("local").setText(partido.getLocal()));
                    xml_partido.addContent(new Element("set1L").setText((Integer.toString(partido.getSet1L()))));//Convertimos los valores enteros a String
                    xml_partido.addContent(new Element("set1V").setText((Integer.toString(partido.getSet1V()))));
                    xml_partido.addContent(new Element("set2L").setText((Integer.toString(partido.getSet2L()))));
                    xml_partido.addContent(new Element("set2V").setText((Integer.toString(partido.getSet2V()))));
                    xml_partido.addContent(new Element("set3L").setText((Integer.toString(partido.getSet3L()))));
                    xml_partido.addContent(new Element("set3V").setText((Integer.toString(partido.getSet3V()))));
                    xml_partido.addContent(new Element("visitante").setText(partido.getVisitante()));
                    xml_partido.addContent(new Element("pista").setText(partido.getPista()));
                    xml_partido.addContent(new Element("ganador").setText(partido.getGanador()));
                    xml_partido.addContent(new Element("desempate").setText(partido.getDesempate()));

                    xml_jornada.addContent(xml_partido);
                }
                //Aadimos la jornada al documento XML
                xml_calendario.addContent(xml_jornada);

            }
            doc.getRootElement().addContent(xml_calendario);

            //Aadimos ahora los datos de la clasificacin
            num_equipos = castEquipoLista.getEquipos().size();

            Element xml_clasificacion = new Element("clasificacion");

            for (EquipoTenis equipo : (ArrayList<EquipoTenis>) getCastEquipoLista().getEquipos())
                //Si el local o el visitante descansan ignoramos la accin
                if (equipo.getNombre().equalsIgnoreCase("EquipoFantasma")) {
                    //No hagas nada pues no este equipo es el comodn para los torneos impares
                } else {
                    Element xml_equipo = new Element("equipo");

                    xml_equipo.addContent(new Element("numero").setText(Integer.toString(equipo.getNumero())));
                    xml_equipo.addContent(new Element("team").setText(equipo.getNombre()));
                    xml_equipo.addContent(
                            new Element("posicion").setText(Integer.toString(equipo.getPosicion() + 1)));
                    xml_equipo.addContent(new Element("pj").setText(Integer.toString(equipo.getPj())));
                    xml_equipo.addContent(new Element("pg").setText(Integer.toString(equipo.getPg())));
                    xml_equipo.addContent(new Element("pp").setText(Integer.toString(equipo.getPp())));
                    xml_equipo.addContent(new Element("sf").setText(Integer.toString(equipo.getSf())));
                    xml_equipo.addContent(new Element("sc").setText(Integer.toString(equipo.getSc())));
                    xml_equipo.addContent(new Element("jf").setText(Integer.toString(equipo.getJf())));
                    xml_equipo.addContent(new Element("jc").setText(Integer.toString(equipo.getJc())));

                    xml_clasificacion.addContent(xml_equipo);
                }

            doc.getRootElement().addContent(xml_clasificacion);
            // new XMLOutputter().output(doc, System.out);
            XMLOutputter xmlOutput = new XMLOutputter();

            // display nice nice
            xmlOutput.setFormat(Format.getPrettyFormat());
            BufferedWriter out = new BufferedWriter(
                    new OutputStreamWriter(new FileOutputStream(ruta + "/" + nombreArchivo), "UTF8"));//Lo utiliamos para asignar utf-8 (as funciona)

            //Creamos el archivo xml con FileWriter(el formato se supone que ya viene dado)
            //xmlOutput.output(doc, new FileWriter(ruta+"/"+nombreArchivo)); //"competiciones/torneo.xml"
            xmlOutput.output(doc, out);//resuelve los problemas de encoding utf-8 que se daban fuera de Netbeans

            JOptionPane.showMessageDialog(null,
                    "<html>Archivo <b>" + nombreArchivo + "</b> guardado con xito</html>", "Guardar Archivo",
                    JOptionPane.INFORMATION_MESSAGE, null);
        } catch (IOException io) {
            System.out.println(io.getMessage());
        }

    }//End of guardarXML()

    /**
     * Genera un informe de la jornada actual en PDF
     * @param rutaPDF
     * @param nombreArchivo
     * @param aplazados
     * @param partidosAplazados
     */
    @Override
    public void informeJornada(String rutaPDF, String nombreArchivo, boolean aplazados,
            ArrayList<Partido> partidosAplazados) {
        //lo primero de todo nos aseguramos de que ha guardado los datos de la tabla
        this.guardarTabla();
        //Creamos un HashMap para poder utilizar los parmetros en el informe
        HashMap<String, Object> parametros = new HashMap<>();
        String descansa = "";//Obtenemos el nombre del equipo que descansa        
        DataSourceFutbolJornada datasource = new DataSourceFutbolJornada();
        if (aplazados) {
            //Aadimos los partidos aplazados al datasource
            for (int i = 0; i < partidosAplazados.size(); i++) {
                Partido P = (Partido) partidosAplazados.get(i);
                datasource.addPartido(P);
            }
        } else {
            Jornada J = getCalendario().jornadas.get(getJornada() - 1);//coge la jornada como variable global, -1 porque es un ndice
            //Aadimos los partidos de la jornada al datasource
            for (int i = 0; i < J.getListaPartidos().size(); i++) {
                Partido P = (Partido) J.partidos.get(i);
                //Comprobamos si descansa algn equipo y guardamos su nombre en la variable indicada
                if (P.getLocal().equalsIgnoreCase("EquipoFantasma")) {
                    descansa = P.getVisitante();
                } else if (P.getVisitante().equalsIgnoreCase("EquipoFantasma")) {
                    descansa = P.getLocal();
                } else {
                    datasource.addPartido(P);
                }
            }
        } //end if aplazados 

        File archivoInforme = new File("src/informes/eliFutbolJornadaPista.jasper");
        JasperReport reporte;

        parametros.put("nombreTorneo", nombreTorneo);
        if (aplazados) {
            parametros.put("jornada", "Partidos Aplazados");
        } else {
            parametros.put("jornada", nombresEliminatorias[calendario.jornadas.size() - jornada]);
        }
        try {
            reporte = (JasperReport) JRLoader.loadObject(archivoInforme);
            JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametros, datasource);
            JRExporter exporter = new JRPdfExporter();
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            //En funcin del nombre del archivo lo nombramos de una forma o de otra
            if (nombreArchivo.equalsIgnoreCase("")) {
                exporter.setParameter(JRExporterParameter.OUTPUT_FILE,
                        new java.io.File(rutaPDF + "/" + nombreTorneo + "_JOR" + jornada + ".pdf"));
            } else {
                exporter.setParameter(JRExporterParameter.OUTPUT_FILE,
                        new java.io.File(rutaPDF + "/" + nombreArchivo));
            }
            exporter.exportReport();
            if (aplazados) {
                JOptionPane.showMessageDialog(null,
                        "<html>El documento de partidos aplazados <b>" + nombreArchivo
                                + "</b> se ha creado correctamente</html>",
                        "Se cre un documento con xito", JOptionPane.INFORMATION_MESSAGE, null);
            } else {
                JOptionPane.showMessageDialog(null,
                        "<html>El documento <b>" + nombreArchivo + "</b> se ha creado correctamente</html>",
                        "Se cre un documento con xito", JOptionPane.INFORMATION_MESSAGE, null);
            }
        } catch (JRException ex) {
            Logger.getLogger(MetodosEliminatoriaTenis3Sets.class.getName()).log(Level.SEVERE, null, ex);
        }
    }//End of informeJornada()

    /**
     * Genera un informe de resultados de la jornada actual en PDF
     * @param rutaPDF
     * @param nombreArchivo
     * @param aplazados
     * @param partidosAplazados
     */
    @Override
    public void informeResultados(String rutaPDF, String nombreArchivo, boolean aplazados,
            ArrayList<Partido> partidosAplazados) {
        //lo primero de todo nos aseguramos de que ha guardado los datos de la tabla
        this.guardarTabla();
        //Creamos un HashMap para poder utilizar los parmetros en el informe
        HashMap<String, Object> parametros = new HashMap<>();
        String descansa = "";//Obtenemos el nombre del equipo que descansa        
        DataSourceEliminatoriasTenis3SetsResultados datasource = new DataSourceEliminatoriasTenis3SetsResultados();
        if (aplazados) {
            //Aadimos los partidos aplazados al datasource
            for (int i = 0; i < partidosAplazados.size(); i++) {
                PartidoEliminatoriaTenis3Sets P = (PartidoEliminatoriaTenis3Sets) partidosAplazados.get(i);
                datasource.addPartido(P);
            }
        } else {
            Jornada J = getCalendario().jornadas.get(getJornada() - 1);//coge la jornada como variable global, -1 porque es un ndice
            //Aadimos los partidos de la jornada al datasource
            for (int i = 0; i < J.getListaPartidos().size(); i++) {
                PartidoEliminatoriaTenis3Sets P = (PartidoEliminatoriaTenis3Sets) J.partidos.get(i);
                //Comprobamos si descansa algn equipo y guardamos su nombre en la variable indicada
                if (P.getLocal().equalsIgnoreCase("EquipoFantasma")) {
                    descansa = P.getVisitante();
                } else if (P.getVisitante().equalsIgnoreCase("EquipoFantasma")) {
                    descansa = P.getLocal();
                } else {
                    datasource.addPartido(P);
                }
            }
        } //end if aplazados 

        File archivoInforme = new File("src/informes/eliTenis3SResultados.jasper");
        JasperReport reporte;
        parametros.put("nombreTorneo", nombreTorneo);
        if (aplazados) {
            parametros.put("jornada", "Partidos Aplazados");
        } else {
            parametros.put("jornada", nombresEliminatorias[calendario.jornadas.size() - jornada]);
        }
        try {
            reporte = (JasperReport) JRLoader.loadObject(archivoInforme);
            JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametros, datasource);
            JRExporter exporter = new JRPdfExporter();
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            //En funcin del nombre del archivo lo nombramos de una forma o de otra
            if (nombreArchivo.equalsIgnoreCase("")) {
                exporter.setParameter(JRExporterParameter.OUTPUT_FILE,
                        new java.io.File(rutaPDF + "/" + nombreTorneo + "_RES" + jornada + ".pdf"));
            } else {
                exporter.setParameter(JRExporterParameter.OUTPUT_FILE,
                        new java.io.File(rutaPDF + "/" + nombreArchivo));
            }
            exporter.exportReport();
            if (aplazados) {
                JOptionPane.showMessageDialog(null,
                        "<html>El documento de partidos aplazados <b>" + nombreArchivo
                                + "</b> se ha creado correctamente</html>",
                        "Se cre un documento con xito", JOptionPane.INFORMATION_MESSAGE, null);
            } else {
                JOptionPane.showMessageDialog(null,
                        "<html>El documento <b>" + nombreArchivo + "</b> se ha creado correctamente</html>",
                        "Se cre un documento con xito", JOptionPane.INFORMATION_MESSAGE, null);
            }
        } catch (JRException ex) {
            Logger.getLogger(MetodosEliminatoriaTenis3Sets.class.getName()).log(Level.SEVERE, null, ex);
        }
    }//End informeResultados()

    /**
     * Genera un informe de la clasificacin actual en PDF
     * @param rutaPDF
     * @param nombreArchivo
     */
    @Override
    public void informeClasificacion(String rutaPDF, String nombreArchivo) {
        //Las eliminatorias no utilizan clasificacin
    }//End informeClasificacion()

    /**
    * Genera un informe del calendario del torneo en PDF
    * @param rutaPDF
    * @param nombreArchivo
    */
    @Override
    public void informeCalendario(String rutaPDF, String nombreArchivo) {
        //lo primero de todo nos aseguramos de que ha guardado los datos de la tabla
        this.guardarTabla();
        int jornadaActual = jornada;//guardamos el valor de la jornada actual en una variable auxiliar
        int numero_jornadas = calendario.jornadas.size();
        int num_partidos = calendario.jornadas.get(0).partidos.size();//la jornada 0 es de ejemplo, solo hace falta para conseguir el nmero de partidos(igual en todas las jornadas)
        File archivoInforme;//archivo.jasper
        JRXmlDataSource datasource;
        //Variables necesarias para mostrar la vuelta de la ronda final
        int opcion;
        ArrayList<String> neAList = new ArrayList<>();
        Boolean mostrar = true;
        try {
            /*** Evitamos que muestre la jornada de vuelta de la ltima ronda si as lo desea el usuario ***/
            if (idaVuelta) {//si hay vuelta consideramos la opcin (de lo contrario no)
                opcion = JOptionPane.showConfirmDialog(null,
                        "<html>Desea que el calendario muestre la <b>jornada de vuelta de la ronda final</b>?</html>",
                        "Advertencia", JOptionPane.YES_NO_OPTION);
                if (JOptionPane.YES_OPTION == opcion) {
                    for (int i = 1; i <= calendario.jornadas.size(); i++) {// i=1 para que la resta de 0 y utilice ese ndice
                        neAList.add(nombresEliminatorias[calendario.jornadas.size() - i]);
                    }
                } else {
                    //si no vamos a mostrar la vuelta modificamos el array nombresEliminatorias[]
                    if (tercerCuartoPuesto) {
                        nombresEliminatorias = new String[] { "Final - 3 y 4 Puesto", "Semifinales - Vuelta",
                                "Semifinales", "Cuartos de Final - Vuelta", "Cuartos de Final",
                                "Octavos de Final - Vuelta", "Octavos de Final", "Dieciseisavos de Final - Vuelta",
                                "Dieciseisavos de Final", "Treintaidosavos de Final - Vuelta",
                                "Treintaidosavos de Final", "64avos de Final - Vuelta", "64avos de Final",
                                "128avos de Final - Vuelta", "128avos de Final", "256avos de Final - Vuelta",
                                "256avos de Final", "512avos de Final - Vuelta", "512avos de Final" };
                    } else {
                        nombresEliminatorias = new String[] { "Final", "Semifinales - Vuelta", "Semifinales",
                                "Cuartos de Final - Vuelta", "Cuartos de Final", "Octavos de Final - Vuelta",
                                "Octavos de Final", "Dieciseisavos de Final - Vuelta", "Dieciseisavos de Final",
                                "Treintaidosavos de Final - Vuelta", "Treintaidosavos de Final",
                                "64avos de Final - Vuelta", "64avos de Final", "128avos de Final - Vuelta",
                                "128avos de Final", "256avos de Final - Vuelta", "256avos de Final",
                                "512avos de Final - Vuelta", "512avos de Final" };
                    } //end if
                    for (int i = 1; i <= calendario.jornadas.size() - 1; i++) {// i=1 para que la resta de 0 y utilice ese ndice
                        neAList.add(nombresEliminatorias[calendario.jornadas.size() - (i + 1)]);
                    } //end for
                    mostrar = false;
                } //end if
            } else {
                for (int i = 1; i <= calendario.jornadas.size(); i++) {// i=1 para que la resta de 0 y utilice ese ndice
                    neAList.add(nombresEliminatorias[calendario.jornadas.size() - i]);
                }
            } //end if idaVuelta

            //Pasamos la ruta del archivo XML y la expresin XPath que ha de utilizar el informe
            datasource = new JRXmlDataSource(rutaXMLCalendar, "torneo/calendario/jornada/partido");
            jornada = 1;//Ponemos la jornada en la primera para que el while actue con todas las jornadas
            //Segn el nmero de partidos que tenga cada jornada cargaremos el .jasper normal o el especial para grandes torneos
            if (num_partidos > 40) {//40 es el limite de campos que le hemos puesto al page break en el futbolCalendario.jasper
                if (mostrar) {
                    archivoInforme = new File("src/informes/eliTenisCalendarioBIG.jasper");
                } else {
                    archivoInforme = new File("src/informes/eliTenisCalendarioBIGNo.jasper");//No muestra la vuelta de la ronda final
                } //end if
            } else {
                if (mostrar) {
                    archivoInforme = new File("src/informes/eliTenisCalendario.jasper");
                } else {
                    archivoInforme = new File("src/informes/eliTenisCalendarioNo.jasper");//No muestra la vuelta de la ronda final
                } //end if              
            }
            JasperReport reporte;

            //Creamos un HashMap para poder utilizar los parmetros en el informe
            HashMap<String, Object> parametros = new HashMap<>();
            parametros.put("nombreTorneo", nombreTorneo);
            parametros.put("listaJornadas", neAList);
            parametros.put("num_partidos", num_partidos);
            parametros.put("num_jornadas", num_jornadas);

            reporte = (JasperReport) JRLoader.loadObject(archivoInforme);
            JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametros, datasource);
            //jasperPrint.addPage(jasperPrint.getPages().get(jornada - 1));
            JRExporter exporter = new JRPdfExporter();
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File(rutaPDF + "/" + nombreArchivo));
            exporter.exportReport();
        } catch (JRException ex) {
            Logger.getLogger(MetodosEliminatoriaTenis3Sets.class.getName()).log(Level.SEVERE, null, ex);
        }
        //Al terminar el ciclo le devolvemos a la jornada su valor actual
        jornada = jornadaActual;
        JOptionPane.showMessageDialog(null,
                "<html>El documento <b>" + nombreArchivo + "</b> se ha creado correctamente</html>",
                "Se cre un documento con xito", JOptionPane.INFORMATION_MESSAGE, null);
    }//End informeCalendario()

    /**
     * Mtodo que recoge de principal el valor de la ruta del archivo XML que se utilizara para el calendario PDF (as evitamos incongruencias entre archivos)
     * @param rutaXMLCalendar
     */
    @Override
    public void getRutaXMLCalendar(String rutaXMLCalendar) {
        this.rutaXMLCalendar = rutaXMLCalendar;
    }//end getRutaXMLCalendar();

    /**
     * Genera los informes de todas las jornadas del torneo en PDF
     * @param rutaPDF
     * @param nombreArchivo
     */
    @Override
    public void informeTodasJornadas(String rutaPDF, String nombreArchivo) {
        //lo primero de todo nos aseguramos de que ha guardado los datos de la tabla
        this.guardarTabla();
        int jornadaActual = jornada;//guardamos el valor de la jornada actual en una variable auxiliar
        jornada = 1;//Ponemos la jornada en la primera para que el while actue con todas las jornadas
        String descansa = "";//Obtenemos el nombre del equipo que descansa 
        do {//repetimos el ciclo mientras queden jornadas en el torneo
            Jornada J = getCalendario().jornadas.get(getJornada() - 1);//coge la jornada como variable global, -1 porque es un ndice    
            DataSourceFutbolJornada datasource = new DataSourceFutbolJornada();
            //Aadimos los partidos de la jornada al datasource
            for (int i = 0; i < J.getListaPartidos().size(); i++) {
                Partido P = (Partido) J.partidos.get(i);
                //Comprobamos si descansa algn equipo y guardamos su nombre en la variable indicada
                if (P.getLocal().equalsIgnoreCase("EquipoFantasma")) {
                    descansa = P.getVisitante();
                } else if (P.getVisitante().equalsIgnoreCase("EquipoFantasma")) {
                    descansa = P.getLocal();
                } else {
                    datasource.addPartido(P);
                }
            }

            File archivoInforme = new File("src/informes/eliFutbolJornadaPista.jasper");
            JasperReport reporte;
            //Creamos un HashMap para poder utilizar los parmetros en el informe
            HashMap<String, Object> parametros = new HashMap<>();
            parametros.put("nombreTorneo", nombreTorneo);
            parametros.put("jornada", nombresEliminatorias[calendario.jornadas.size() - jornada]);
            //Si el nmero de equipos es impar aadimos el texto DESCANSA: y el nombre del equipo que descansa al informe, de lo contrario mejor que no aparezca
            if (castEquipoLista.getEquipos().size() % 2 != 0) {
                parametros.put("equipoDescansa", descansa);
            } else {
                parametros.put("equipoDescansa", "");
            }
            try {
                reporte = (JasperReport) JRLoader.loadObject(archivoInforme);
                JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametros, datasource);
                JRExporter exporter = new JRPdfExporter();
                exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                exporter.setParameter(JRExporterParameter.OUTPUT_FILE,
                        new java.io.File(rutaPDF + "/" + "JOR" + jornada + "_" + nombreArchivo));
                exporter.exportReport();
            } catch (JRException ex) {
                Logger.getLogger(MetodosEliminatoriaTenis3Sets.class.getName()).log(Level.SEVERE, null, ex);
            }
            jornada++;
        } while (jornada <= calendario.jornadas.size());
        //Al terminar el ciclo le devolvemos a la jornada su valor actual
        jornada = jornadaActual;
        JOptionPane.showMessageDialog(null,
                "<html>Los documentos <b>" + nombreArchivo + "</b> se han creado correctamente</html>",
                "Se crearon documentos con xito", JOptionPane.INFORMATION_MESSAGE, null);
    }//End informeTodasJornadas()

    /**
     * Genera los informes de todos los resultados del torneo en PDF
     * @param rutaPDF
     * @param nombreArchivo
     */
    @Override
    public void informeTodosResultados(String rutaPDF, String nombreArchivo) {
        //lo primero de todo nos aseguramos de que ha guardado los datos de la tabla
        this.guardarTabla();
        int jornadaActual = jornada;//guardamos el valor de la jornada actual en una variable auxiliar
        jornada = 1;//Ponemos la jornada en la primera para que el while actue con todas las jornadas
        String descansa = "";//Obtenemos el nombre del equipo que descansa 
        do {//repetimos el ciclo mientras queden jornadas en el torneo
            Jornada J = getCalendario().jornadas.get(getJornada() - 1);//coge la jornada como variable global, -1 porque es un ndice    
            DataSourceEliminatoriasTenis3SetsResultados datasource = new DataSourceEliminatoriasTenis3SetsResultados();
            //Aadimos los partidos de la jornada al datasource
            for (int i = 0; i < J.getListaPartidos().size(); i++) {
                PartidoEliminatoriaTenis3Sets P = (PartidoEliminatoriaTenis3Sets) J.partidos.get(i);
                //Comprobamos si descansa algn equipo y guardamos su nombre en la variable indicada
                if (P.getLocal().equalsIgnoreCase("EquipoFantasma")) {
                    descansa = P.getVisitante();
                } else if (P.getVisitante().equalsIgnoreCase("EquipoFantasma")) {
                    descansa = P.getLocal();
                } else {
                    datasource.addPartido(P);
                }
            }

            File archivoInforme = new File("src/informes/eliTenis3SResultados.jasper");
            JasperReport reporte;
            //Creamos un HashMap para poder utilizar los parmetros en el informe
            HashMap<String, Object> parametros = new HashMap<>();
            parametros.put("nombreTorneo", nombreTorneo);
            parametros.put("jornada", nombresEliminatorias[calendario.jornadas.size() - jornada]);
            //Si el nmero de equipos es impar aadimos el texto DESCANSA: y el nombre del equipo que descansa al informe, de lo contrario mejor que no aparezca
            if (castEquipoLista.getEquipos().size() % 2 != 0) {
                parametros.put("equipoDescansa", descansa);
            } else {
                parametros.put("equipoDescansa", "");
            }
            try {
                reporte = (JasperReport) JRLoader.loadObject(archivoInforme);
                JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametros, datasource);
                JRExporter exporter = new JRPdfExporter();
                exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                exporter.setParameter(JRExporterParameter.OUTPUT_FILE,
                        new java.io.File(rutaPDF + "/" + "RES" + jornada + "_" + nombreArchivo));
                exporter.exportReport();
            } catch (JRException ex) {
                Logger.getLogger(MetodosEliminatoriaTenis3Sets.class.getName()).log(Level.SEVERE, null, ex);
            }
            jornada++;
        } while (jornada <= calendario.jornadas.size());
        //Al terminar el ciclo le devolvemos a la jornada su valor actual
        jornada = jornadaActual;
        JOptionPane.showMessageDialog(null,
                "<html>Los documentos <b>" + nombreArchivo + "</b> se han creado correctamente</html>",
                "Se crearon documentos con xito", JOptionPane.INFORMATION_MESSAGE, null);
    }//End informeTodosResultados()

/**
 * Recupera el valor de los anchos de la tabla en el archivo datosTablas.txt
 * @param tamao
 * @param codigo
 * @return 
 */
@Override
public int[] getAnchoTabla(int tamao, int codigo){
    String cadena;
    String[] aux;//guarda el split de la linea
    int[] numAnchos = new int[tamao];
    int i = 0;
    try {
        FileReader reader = new FileReader("datosTablas.txt");
        BufferedReader buffer = new BufferedReader(reader);
        while((cadena = buffer.readLine())!=null) {
          //Si coincide con el codigo es que estamos en la seccin correcta del archivo (y mientras el contador no sobrepase el tamao de la tabla)
          if(cadena.contains("anchoW"+Integer.toString(i+codigo)) && i < tamao){
              aux = cadena.split("=");
              numAnchos[i] = Integer.parseInt(aux[1]);
              i++;
              Arrays.fill(aux, null);//vaciamos el array auxiliar
          }else{
              //si no hay coincidencia ignoramos la informacin
          }
        }
        buffer.close();
        return numAnchos;
    } catch (FileNotFoundException ex) {
        Logger.getLogger(MetodosEliminatoriaTenis3Sets.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(MetodosEliminatoriaTenis3Sets.class.getName()).log(Level.SEVERE, null, ex);
    }
    return numAnchos;
}//End of getAnchoTabla()

    /**
     * Recupera el valor del alto de las filas de la tabla en el archivo datosTablas.txt
     * @param codigo
     * @return 
     */
    @Override
    public int getAltoTabla(int codigo) {
        String alto;
        String[] aux;//guarda el split de la linea
        int numAlto = 0;
        int i = 0;
        try {
            FileReader reader = new FileReader("datosTablas.txt");
            BufferedReader buffer = new BufferedReader(reader);
            while ((alto = buffer.readLine()) != null) {
                //Si coincide con el codigo es que estamos en la seccin correcta del archivo (y mientras el contador no sobrepase el tamao de la tabla)
                if (alto.contains("altoH" + Integer.toString(codigo))) {
                    aux = alto.split("=");
                    numAlto = Integer.parseInt(aux[1]);
                } else {
                    //si no hay coincidencia ignoramos la informacin
                }
            }
            buffer.close();
            return numAlto;
        } catch (FileNotFoundException ex) {
            Logger.getLogger(MetodosEliminatoriaTenis3Sets.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(MetodosEliminatoriaTenis3Sets.class.getName()).log(Level.SEVERE, null, ex);
        }
        return numAlto;
    }//End of getAltoTabla()

    /**
     * Mtodo que modifica los datos del tamao de la tabla en el archivo datosTablas.txt
     * @param valores
     * @param altura
     */
    @Override
    public void setDatosTabla(int[] valores, int altura) {
        String cadena;
        String[] aux;//guarda el split de la linea
        int i = 0;
        FileWriter writer;
        PrintWriter pw;
        ArrayList<String> almacen = new ArrayList<>();
        try {
            FileReader reader = new FileReader("datosTablas.txt");
            BufferedReader buffer = new BufferedReader(reader);
            //RandomAccessFile raf = new RandomAccessFile("datosTablas.txt", "rw");//rw es lectura/escritura (finalmente no utilizaremos el raf)
            //Leemos el texto hasta que haya coincidencia
            while ((cadena = buffer.readLine()) != null) {
                cadena = cadena.trim();//limpiamos los posibles espacios
                //Si coincide con el codigo es que estamos en la seccin correcta del archivo (y mientras el contador no sobrepase el tamao de la tabla)
                if (cadena.startsWith("anchoW" + Integer.toString(i + CODIGO_ANCHO)) && i < valores.length) {
                    aux = cadena.split("=");
                    aux[1] = valueOf(valores[i]);
                    //Guardamos en el ArrayList las lneas modificadas del ancho
                    almacen.add(aux[0] + "=" + aux[1]);
                    i++;
                    Arrays.fill(aux, null);//vaciamos el array auxiliar
                } else if (cadena.startsWith("altoH" + Integer.toString(CODIGO_ALTO))) {
                    aux = cadena.split("=");
                    aux[1] = valueOf(altura);
                    //Guardamos en el ArrayList la lnea modificadas del alto
                    almacen.add(aux[0] + "=" + aux[1]);
                } else {
                    //Guardamos en el ArrayList las lneas que quedan intactas
                    almacen.add(cadena);
                } //end if          
            } //end while
              //reseteamos el indice y reescribimos todo el fichero usando el ArrayList
            buffer.close();
            //Hay que declarar aqu los writer porque si lo hacemos antes nos borra el fichero y no lo podemos leer (se encontrar vaco)
            writer = new FileWriter("datosTablas.txt");
            pw = new PrintWriter(writer);
            for (i = 0; i < almacen.size(); i++) {
                pw.println(almacen.get(i));
            }
            writer.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(MetodosEliminatoriaTenis3Sets.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(MetodosEliminatoriaTenis3Sets.class.getName()).log(Level.SEVERE, null, ex);
        }
        //Finalmente cargamos los datos modificados
        almacen.clear();
        this.cargarTabla(jornada);
    }//End of setDatosTabla()

    /**
     * En Eliminatorias este mtodo es intil, solo esta para poder usarlo con la interfaz
     * @param valores
     * @param alturaClasf 
     */
    @Override
    public void setDatosTablaClasf(int[] valores, int alturaClasf) {
        //No hacemos nada pues no hay clasificacin en una eliminatoria
    }//End of setDatosTablaClasf()   

    /**
      *  MTODOS GETTERS AND SETTERS
      */

    /**
     * @return the modelo
     */
    @Override
    public DefaultTableModel getModelo() {
        return modelo;
    }

    /**
     * @param modelo the modelo to set
     */
    @Override
    public void setModelo(DefaultTableModel modelo) {
        this.modelo = modelo;
    }

    /**
     * @return the jornada
     */
    @Override
    public int getJornada() {
        return jornada;
    }

    /**
     * @param jornada the jornada to set
     */
    @Override
    public void setJornada(int jornada) {
        this.jornada = jornada;
    }

    /**
     * @return the TableJornada
     */
    @Override
    public JTable getTableJornada() {
        return TableJornada;
    }

    /**
     * @param TableJornada the TableJornada to set
     */
    @Override
    public void setTableJornada(JTable TableJornada) {
        this.TableJornada = TableJornada;
    }

    /**
     * @return the LabelJornada
     */
    @Override
    public JLabel getLabelJornada() {
        return LabelJornada;
    }

    /**
     * @param LabelJornada the LabelJornada to set
     */
    @Override
    public void setLabelJornada(JLabel LabelJornada) {
        this.LabelJornada = LabelJornada;
    }

    /**
     * @return the LabelTotalJornadas
     */
    @Override
    public JLabel getLabelTotalJornadas() {
        return LabelTotalJornadas;
    }

    /**
     * @param LabelTotalJornadas the LabelTotalJornadas to set
     */
    @Override
    public void setLabelTotalJornadas(JLabel LabelTotalJornadas) {
        this.LabelTotalJornadas = LabelTotalJornadas;
    }

    /**
     * @return the TextFieldJornada
     */
    @Override
    public JTextField getTextFieldJornada() {
        return TextFieldJornada;
    }

    /**
     * @param TextFieldJornada the TextFieldJornada to set
     */
    @Override
    public void setTextFieldJornada(JTextField TextFieldJornada) {
        this.TextFieldJornada = TextFieldJornada;
    }

    /**
     * @return the calendario
     */
    @Override
    public Calendario getCalendario() {
        return calendario;
    }

    /**
     * @param calendario the calendario to set
     */
    @Override
    public void setCalendario(Calendario calendario) {
        this.calendario = calendario;
    }

    /**
     * @return the equipoLista
     */
    @Override
    public EquipoLista getCastEquipoLista() {
        return castEquipoLista;
    }

    /**
     * @param equipoLista the equipoLista to set
     */
    @Override
    public void setCastEquipoLista(EquipoLista equipoLista) {
        this.castEquipoLista = equipoLista;
    }

    @Override
    public void cargarClasificacion() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void calcularClasificacion() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void borrarClasificacion() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void ordenarClasificacion() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public DefaultTableModel getClasificacion() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void setClasificacion(DefaultTableModel clasificacion) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public JTable getTableClasificacion() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void setTableClasificacion(JTable TableClasificacion) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public JLabel getLabelEquipoDescansa() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void setLabelEquipoDescansa(JLabel LabelEquipoDescansa) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    /**
     * @return the auxEquipos
     */
    public ArrayList<String> getAuxEquipos() {
        return auxEquipos;
    }

    /**
     * @param auxEquipos the auxEquipos to set
     */
    public void setAuxEquipos(ArrayList<String> auxEquipos) {
        this.auxEquipos = auxEquipos;
    }

    /**
     * @return the numEliminatorias
     */
    public int getNumEliminatorias() {
        return numEliminatorias;
    }

    /**
     * @param numEliminatorias the numEliminatorias to set
     */
    public void setNumEliminatorias(int numEliminatorias) {
        this.numEliminatorias = numEliminatorias;
    }

    /**
     * @return the tercerCuartoPuesto
     */
    @Override
    public boolean isTercerCuartoPuesto() {
        return tercerCuartoPuesto;
    }

    /**
     * @param tercerCuartoPuesto the tercerCuartoPuesto to set
     */
    @Override
    public void setTercerCuartoPuesto(boolean tercerCuartoPuesto) {
        this.tercerCuartoPuesto = tercerCuartoPuesto;
    }

    /**
     * @return the idaVuelta
     */
    @Override
    public boolean isIdaVuelta() {
        return idaVuelta;
    }

    /**
     * @param idaVuelta the idaVuelta to set
     */
    @Override
    public void setIdaVuelta(boolean idaVuelta) {
        this.idaVuelta = idaVuelta;
    }

    /**
    * @return the nombreTorneo
    */
    @Override
    public String getNombreTorneo() {
        return nombreTorneo;
    }

    /**
     * @param nombreTorneo the nombreTorneo to set
     */
    @Override
    public void setNombreTorneo(String nombreTorneo) {
        this.nombreTorneo = nombreTorneo;
    }

    /**
     * @return the tipoTorneo
     */
    @Override
    public int getTipoTorneo() {
        return tipoTorneo;
    }

    /**
     * @param tipoTorneo the tipoTorneo to set
     */
    @Override
    public void setTipoTorneo(int tipoTorneo) {
        this.tipoTorneo = tipoTorneo;
    }

    /**
     * @return the deporte
     */
    @Override
    public int getDeporte() {
        return deporte;
    }

    /**
     * @param deporte the deporte to set
     */
    @Override
    public void setDeporte(int deporte) {
        this.deporte = deporte;
    }

    /**
     * @return the num_jornadas
     */
    @Override
    public int getNum_jornadas() {
        return num_jornadas;
    }

    /**
     * @param num_jornadas the num_jornadas to set
     */
    @Override
    public void setNum_jornadas(int num_jornadas) {
        this.num_jornadas = num_jornadas;
    }

    /**
     * @return the sets
     */
    @Override
    public int getSets() {
        return sets;
    }

    /**
     * @param sets the sets to set
     */
    @Override
    public void setSets(int sets) {
        this.sets = sets;
    }

    /**
     * @return the sorteo
     */
    @Override
    public boolean isSorteo() {
        return sorteo;
    }

    /**
     * @param sorteo the sorteo to set
     */
    @Override
    public void setSorteo(boolean sorteo) {
        this.sorteo = sorteo;
    }

    /**
     * @return the alturaColumna
     */
    @Override
    public int getAlturaColumna() {
        return alturaColumna;
    }

    /**
     * @param alturaColumna the alturaColumna to set
     */
    @Override
    public void setAlturaColumna(int alturaColumna) {
        this.alturaColumna = alturaColumna;
    }

    /**
     * @return the alturaClasfColumna
     */
    @Override
    public int getAlturaClasfColumna() {
        return alturaClasfColumna;
    }

    /**
     * @param alturaClasfColumna the alturaClasfColumna to set
     */
    @Override
    public void setAlturaClasfColumna(int alturaClasfColumna) {
        this.alturaClasfColumna = alturaClasfColumna;
    }

    /**
     * @return the num
     */
    @Override
    public int[] getNum() {
        return num;
    }

    /**
     * @param num the num to set
     */
    @Override
    public void setNum(int[] num) {
        this.num = num;
    }

    /**
     * @return the numc
     */
    @Override
    public int[] getNumc() {
        return numc;
    }

    /**
     * @param numc the numc to set
     */
    @Override
    public void setNumc(int[] numc) {
        this.numc = numc;
    }

    /**
     * @return the columnasClasf
     */
    @Override
    public String[] getColumnas() {
        return columnas;
    }

    /**
     * @param columnas the columnas to set
     */
    @Override
    public void setColumnas(String[] columnas) {
        this.columnas = columnas;
    }

    /**
     * @return the columnasClasf
     */
    @Override
    public String[] getColumnasClasf() {
        return columnasClasf;
    }

    /**
     * @param columnasClasf the columnasClasf to set
     */
    @Override
    public void setColumnasClasf(String[] columnasClasf) {
        this.columnasClasf = columnasClasf;
    }

    /**
     * @return the sancionados
     */
    @Override
    public HashMap<String, Integer> getSancionados() {
        return sancionados;
    }

    /**
     * @param sancionados the sancionados to set
     */
    @Override
    public void setSancionados(HashMap<String, Integer> sancionados) {
        this.sancionados = sancionados;
    }
}