<commit_before>package com.eljavatar.swingutils.core.modelcomponents;

import java.io.Serializable;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author <NAME> (http://www.eljavatar.com)
 * @param <E> Tipo de Objeto que tendran los elementos del JTable
 */
public abstract class TableModelGeneric<E> extends AbstractTableModel implements Serializable {

    private final Class[] typeColumns;
    private final String[] titleColumns;
    private List<E> listElements;
    
    public TableModelGeneric(Class[] typeColumns, String[] titleColumns, List<E> listElements) {
        this.typeColumns = typeColumns;
        this.titleColumns = titleColumns;
        this.listElements = listElements;
    }
    
    @Override
    public String getColumnName(int column) {
        return titleColumns[column];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return typeColumns[columnIndex];
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }
    
    @Override
    public int getRowCount() {
        return listElements.size();
    }

    @Override
    public int getColumnCount() {
        return titleColumns.length;
    }

    public List<E> getListElements() {
        return listElements;
    }

    public void setListElements(List<E> listElements) {
        this.listElements = listElements;
    }
    
    public void addElement(E element) {
        this.listElements.add(element);
    }
    
    public void addAllElements(List<E> elements) {
        this.listElements.addAll(elements);
    }
    
}<commit_msg>Se agrega opción de crear JTable con colecciones sincronizadas<commit_after>package com.eljavatar.swingutils.core.modelcomponents;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author <NAME> (http://www.eljavatar.com)
 * @param <E> Tipo de Objeto que tendran los elementos del JTable
 */
public abstract class TableModelGeneric<E> extends AbstractTableModel implements Serializable {

    private final Class[] typeColumns;
    private final String[] titleColumns;
    private List<E> listElements;
    private boolean isSynchronized;
    private boolean needDetectConcurrentModifications;
    
    /**
     * 
     * @param typeColumns Tipos de datos de cada columna del JTable
     * @param titleColumns Títulos de las columnas del JTable
     * @param listElements Lista de elementos que tendrá el Modelo del JTable
     */
    public TableModelGeneric(Class[] typeColumns, String[] titleColumns, List<E> listElements) {
        this(typeColumns, titleColumns, listElements, false, true);
    }
    
    /**
     * 
     * @param typeColumns Tipos de datos de cada columna del JTable
     * @param titleColumns Títulos de las columnas del JTable
     * @param listElements Lista de elementos que tendrá el Modelo del JTable
     * @param isSynchronized Define si la lista de elementos será una colección sincronizada
     * @param needDetectConcurrentModifications En caso de que sea una colección sincronizada,
     *      define si necesita detectar modificaciones concurrentes, ya que de acuerdo a esta
     *      opción, se decide cuál será la implementacion óptima para crear la lista de datos
     */
    public TableModelGeneric(Class[] typeColumns, String[] titleColumns, List<E> listElements, boolean isSynchronized, boolean needDetectConcurrentModifications) {
        this.typeColumns = typeColumns;
        this.titleColumns = titleColumns;
        if (this.isSynchronized) {
            this.listElements = this.needDetectConcurrentModifications ? Collections.synchronizedList(listElements) : new CopyOnWriteArrayList<>(listElements);
        } else {
            this.listElements = listElements;
        }
    }
    
    @Override
    public String getColumnName(int column) {
        return titleColumns[column];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return typeColumns[columnIndex];
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }
    
    @Override
    public int getRowCount() {
        return listElements.size();
    }

    @Override
    public int getColumnCount() {
        return titleColumns.length;
    }

    public List<E> getListElements() {
        return listElements;
    }

    public void setListElements(List<E> listElements) {
        if (this.isSynchronized) {
            this.listElements = this.needDetectConcurrentModifications ? Collections.synchronizedList(listElements) : new CopyOnWriteArrayList<>(listElements);
        } else {
            this.listElements = listElements;
        }
    }
    
    public void addElement(E element) {
        this.listElements.add(element);
    }
    
    public void addAllElements(List<E> elements) {
        this.listElements.addAll(elements);
    }
    
}
{'fraction_non_alphanumeric': 0.08024569050921339, 'fraction_numerical': 0.0, 'mean_word_length': 3.0742534301856335, 'pattern_counts': {'":': 0, '<': 24, '<?xml version=': 0, '>': 24, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1467669', 'n_tokens_mistral': 1403, 'n_tokens_neox': 1391, 'n_words': 376}