ips1ap101.lib.core.db.xdp.RecursoCachedRowSetDataProvider.java Source code

Java tutorial

Introduction

Here is the source code for ips1ap101.lib.core.db.xdp.RecursoCachedRowSetDataProvider.java

Source

/*
 * Este programa es software libre; usted puede redistribuirlo y/o modificarlo bajo los trminos
 * de la licencia "GNU General Public License" publicada por la Fundacin "Free Software Foundation".
 * Este programa se distribuye con la esperanza de que pueda ser til, pero SIN NINGUNA GARANTIA;
 * vea la licencia "GNU General Public License" para obtener cursor informacion.
 */
package ips1ap101.lib.core.db.xdp;

import com.sun.data.provider.DataProviderException;
import com.sun.data.provider.FieldKey;
import com.sun.data.provider.RowKey;
import com.sun.data.provider.TableCursorVetoException;
import com.sun.data.provider.TableDataAdapter;
import com.sun.data.provider.TableDataProvider;
import com.sun.data.provider.impl.CachedRowSetDataProvider;
import com.sun.data.provider.impl.TableRowDataProvider;
import com.sun.sql.rowset.CachedRowSetX;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.spi.SyncResolver;
import ips1ap101.lib.base.BaseBundle;
import ips1ap101.lib.base.bundle.BundleWebui;
import ips1ap101.lib.base.constant.CBM;
import ips1ap101.lib.base.entity.enumeration.CondicionEjeFunEnumeration;
import ips1ap101.lib.base.entity.enumeration.OperadorComEnumeration;
import ips1ap101.lib.base.entity.enumeration.TipoRastroFunEnumeration;
import ips1ap101.lib.base.util.BitUtils;
import ips1ap101.lib.base.util.LongUtils;
import ips1ap101.lib.base.util.NumUtils;
import ips1ap101.lib.base.util.TimeUtils;
import ips1ap101.lib.core.app.Bitacora;
import ips1ap101.lib.core.app.CampoBusqueda;
import ips1ap101.lib.core.app.ConsultaBusqueda;
import ips1ap101.lib.core.app.ExcepcionAplicacion;
import ips1ap101.lib.core.app.FiltroBusqueda;
import ips1ap101.lib.core.app.OrdenConjuntoResultados;
import ips1ap101.lib.core.app.TLC;
import ips1ap101.lib.core.constant.EAC;
import ips1ap101.lib.core.constant.Global;
import ips1ap101.lib.core.control.RastroFuncion;
import ips1ap101.lib.core.control.SeudoTareaUsuario;
import ips1ap101.lib.core.db.util.DB;
import ips1ap101.lib.core.db.util.DBUtils;
import ips1ap101.lib.core.db.util.InterpreteSql;
import ips1ap101.lib.core.enumeration.EnumColumnaEtiqueta;
import ips1ap101.lib.core.enumeration.EnumOpcionZumNodo;
import ips1ap101.lib.core.jsf.JSF;
import ips1ap101.lib.core.util.EA;
import ips1ap101.lib.core.web.app.RowChecker;
import org.apache.commons.lang.StringUtils;

/**
 * @author Jorge Campins
 */
public class RecursoCachedRowSetDataProvider extends CachedRowSetDataProvider {

    /**
     * Conserva el valor de la propiedad testing.
     */
    private boolean testing = EA.isTestingStage();

    /**
     * Conserva el valor de la propiedad filasElegidas.
     */
    private Set filasElegidas = new LinkedHashSet();

    /**
     * Conserva el valor de la propiedad listaRastroFuncion.
     */
    private Map<String, RastroFuncion> listaRastroFuncion;

    /**
     * Conserva el valor de la propiedad listaTareasUsuario.
     */
    protected List<SeudoTareaUsuario> listaTareasUsuario;

    /**
     * Creates a new instance of RecursoCachedRowSetDataProvider
     */
    public RecursoCachedRowSetDataProvider() {
        super();
        init();
    }

    /**
     * Creates a new instance of RecursoCachedRowSetDataProvider
     */
    public RecursoCachedRowSetDataProvider(CachedRowSet cachedRowSet) {
        super(cachedRowSet);
        init();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setCachedRowSet(CachedRowSet cachedRowSet) {
        super.setCachedRowSet(cachedRowSet);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isRowAvailable(RowKey row) throws DataProviderException {
        return row != null && super.isRowAvailable(row);
    }

    public boolean isNotRowAvailable(RowKey row) throws DataProviderException {
        return !isRowAvailable(row);
    }

    /**
     * Conserva el valor de la propiedad rowChecker.
     */
    private RowChecker rowChecker;

    /**
     * @return the rowChecker
     */
    public RowChecker getRowChecker() {
        return rowChecker;
    }

    /**
     * @param rowChecker the rowChecker to set
     */
    public void setRowChecker(RowChecker rowChecker) {
        this.rowChecker = rowChecker;
    }

    /**
     * Conserva el valor de la propiedad tipoRastroFuncion.
     */
    private TipoRastroFunEnumeration tipoRastroFuncion = TipoRastroFunEnumeration.EXITO;

    /**
     * @return the tipoRastroFuncion
     */
    public TipoRastroFunEnumeration getTipoRastroFuncion() {
        return tipoRastroFuncion;
    }

    /**
     * @param tipoRastroFuncion the tipoRastroFuncion to set
     */
    public void setTipoRastroFuncion(TipoRastroFunEnumeration tipoRastroFuncion) {
        this.tipoRastroFuncion = tipoRastroFuncion;
    }

    private void init() {
        super.addTableDataListener(new TableDataAdapter() {

            @Override
            public void valueChanged(TableDataProvider tdp, FieldKey fk, RowKey rk, Object o3, Object o4) {
                recursoCachedRowSetDataProvider_valueChanged(tdp, fk, rk, o3, o4);
            }

        });
    }

    // <editor-fold defaultstate="collapsed" desc="metodos correspondientes a interfaces">
    public boolean isRecursoIdentificable() {
        return this instanceof RecursoIdentificableDataProvider && StringUtils
                .isNotBlank(((RecursoIdentificableDataProvider) this).getColumnaIdentificacionRecurso());
    }

    public boolean isRecursoVersionable() {
        return this instanceof RecursoVersionableDataProvider
                && StringUtils.isNotBlank(((RecursoVersionableDataProvider) this).getColumnaVersionRecurso());
    }

    public boolean isRecursoCodificable() {
        return this instanceof RecursoCodificableDataProvider
                && StringUtils.isNotBlank(((RecursoCodificableDataProvider) this).getColumnaCodigoRecurso());
    }

    public boolean isRecursoNombrable() {
        return this instanceof RecursoNombrableDataProvider
                && StringUtils.isNotBlank(((RecursoNombrableDataProvider) this).getColumnaNombreRecurso());
    }

    public boolean isRecursoDescriptible() {
        return this instanceof RecursoDescriptibleDataProvider
                && StringUtils.isNotBlank(((RecursoDescriptibleDataProvider) this).getColumnaDescripcionRecurso());
    }

    public boolean isRecursoPersonalizable() {
        return this instanceof RecursoPersonalizableDataProvider && StringUtils
                .isNotBlank(((RecursoPersonalizableDataProvider) this).getColumnaPropietarioRecurso());
    }

    public boolean isRecursoSegmentable() {
        return this instanceof RecursoSegmentableDataProvider
                && StringUtils.isNotBlank(((RecursoSegmentableDataProvider) this).getColumnaSegmentoRecurso());
    }

    public boolean isRecursoJerarquizable() {
        return this instanceof RecursoJerarquizableDataProvider
                && StringUtils.isNotBlank(((RecursoJerarquizableDataProvider) this).getColumnaRecursoSuperior());
    }

    public boolean isRecursoDesactivable() {
        return this instanceof RecursoDesactivableDataProvider
                && StringUtils.isNotBlank(((RecursoDesactivableDataProvider) this).getColumnaEsRecursoInactivo());
    }

    public boolean isRecursoEnumerable() {
        return this instanceof RecursoEnumerableDataProvider
                && StringUtils.isNotBlank(((RecursoEnumerableDataProvider) this).getColumnaNumeroRecurso());
    }

    public boolean isRecursoLocalizable() {
        return this instanceof RecursoLocalizableDataProvider;
    }

    public boolean isRecursoConsultable() {
        return this instanceof RecursoConsultableDataProvider;
    }

    public RecursoIdentificableDataProvider getRecursoIdentificableDataProvider() {
        return isRecursoIdentificable() ? (RecursoIdentificableDataProvider) this : null;
    }

    public RecursoVersionableDataProvider getRecursoVersionableDataProvider() {
        return isRecursoVersionable() ? (RecursoVersionableDataProvider) this : null;
    }

    public RecursoCodificableDataProvider getRecursoCodificableDataProvider() {
        return isRecursoCodificable() ? (RecursoCodificableDataProvider) this : null;
    }

    public RecursoNombrableDataProvider getRecursoNombrableDataProvider() {
        return isRecursoNombrable() ? (RecursoNombrableDataProvider) this : null;
    }

    public RecursoDescriptibleDataProvider getRecursoDescriptibleDataProvider() {
        return isRecursoDescriptible() ? (RecursoDescriptibleDataProvider) this : null;
    }

    public RecursoPersonalizableDataProvider getRecursoPersonalizableDataProvider() {
        return isRecursoPersonalizable() ? (RecursoPersonalizableDataProvider) this : null;
    }

    public RecursoSegmentableDataProvider getRecursoSegmentableDataProvider() {
        return isRecursoSegmentable() ? (RecursoSegmentableDataProvider) this : null;
    }

    public RecursoJerarquizableDataProvider getRecursoJerarquizableDataProvider() {
        return isRecursoJerarquizable() ? (RecursoJerarquizableDataProvider) this : null;
    }

    public RecursoDesactivableDataProvider getRecursoDesactivableDataProvider() {
        return isRecursoDesactivable() ? (RecursoDesactivableDataProvider) this : null;
    }

    public RecursoEnumerableDataProvider getRecursoEnumerableDataProvider() {
        return isRecursoEnumerable() ? (RecursoEnumerableDataProvider) this : null;
    }

    public RecursoLocalizableDataProvider getRecursoLocalizableDataProvider() {
        return isRecursoLocalizable() ? (RecursoLocalizableDataProvider) this : null;
    }

    public RecursoConsultableDataProvider getRecursoConsultableDataProvider() {
        return isRecursoConsultable() ? (RecursoConsultableDataProvider) this : null;
    }

    public Long getIdentificacionRecurso() {
        return isRecursoIdentificable() ? getRecursoIdentificableDataProvider().getIdentificacionRecurso() : null;
    }

    public Long getIdentificacionRecurso(RowKey rowKey) {
        return isRecursoIdentificable() ? getRecursoIdentificableDataProvider().getIdentificacionRecurso(rowKey)
                : null;
    }

    public Long getVersionRecurso() {
        return isRecursoVersionable() ? getRecursoVersionableDataProvider().getVersionRecurso() : null;
    }

    public Long getVersionRecurso(RowKey rowKey) {
        return isRecursoVersionable() ? getRecursoVersionableDataProvider().getVersionRecurso(rowKey) : null;
    }

    public String getCodigoRecurso() {
        return isRecursoCodificable() ? getRecursoCodificableDataProvider().getCodigoRecurso() : null;
    }

    public String getCodigoRecurso(RowKey rowKey) {
        return isRecursoCodificable() ? getRecursoCodificableDataProvider().getCodigoRecurso(rowKey) : null;
    }

    public String getNombreRecurso() {
        return isRecursoNombrable() ? getRecursoNombrableDataProvider().getNombreRecurso() : null;
    }

    public String getNombreRecurso(RowKey rowKey) {
        return isRecursoNombrable() ? getRecursoNombrableDataProvider().getNombreRecurso(rowKey) : null;
    }

    public Long getPropietarioRecurso() {
        return isRecursoPersonalizable() ? getRecursoPersonalizableDataProvider().getPropietarioRecurso() : null;
    }

    public Long getPropietarioRecurso(RowKey rowKey) {
        return isRecursoPersonalizable() ? getRecursoPersonalizableDataProvider().getPropietarioRecurso(rowKey)
                : null;
    }

    public Long getSegmentoRecurso() {
        return isRecursoSegmentable() ? getRecursoSegmentableDataProvider().getSegmentoRecurso() : null;
    }

    public Long getSegmentoRecurso(RowKey rowKey) {
        return isRecursoSegmentable() ? getRecursoSegmentableDataProvider().getSegmentoRecurso(rowKey) : null;
    }

    public Long getRecursoSuperior() {
        return isRecursoJerarquizable() ? getRecursoJerarquizableDataProvider().getRecursoSuperior() : null;
    }

    public Long getRecursoSuperior(RowKey rowKey) {
        return isRecursoJerarquizable() ? getRecursoJerarquizableDataProvider().getRecursoSuperior(rowKey) : null;
    }

    public Boolean getEsRecursoInactivo() {
        return isRecursoDesactivable() ? getRecursoDesactivableDataProvider().getEsRecursoInactivo() : null;
    }

    public Boolean getEsRecursoInactivo(RowKey rowKey) {
        return isRecursoDesactivable() ? getRecursoDesactivableDataProvider().getEsRecursoInactivo(rowKey) : null;
    }

    public Integer getNumeroRecurso() {
        return isRecursoEnumerable() ? getRecursoEnumerableDataProvider().getNumeroRecurso() : null;
    }

    public Integer getNumeroRecurso(RowKey rowKey) {
        return isRecursoEnumerable() ? getRecursoEnumerableDataProvider().getNumeroRecurso(rowKey) : null;
    }

    public String getUrl() {
        return isRecursoLocalizable() ? getRecursoLocalizableDataProvider().getUrl() : null;
    }

    public String getUrl(RowKey rowKey) {
        return isRecursoLocalizable() ? getRecursoLocalizableDataProvider().getUrl(rowKey) : null;
    }

    public long getFuncionConsultarRecurso() {
        return isRecursoConsultable() ? getRecursoConsultableDataProvider().getFuncionConsultarRecurso() : null;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Getters y Setters de propiedades propias">
    /**
     * Getter para propiedad filasElegidas.
     *
     * @return Valor de la propiedad filasElegidas.
     */
    public Set getFilasElegidas() {
        return filasElegidas;
    }

    public boolean esFilaElegida(TableRowDataProvider tableRowDataProvider) {
        return tableRowDataProvider != null && esFilaElegida(tableRowDataProvider.getTableRow());
    }

    public boolean esFilaElegida(RowKey rowKey) {
        return rowKey != null && getFilasElegidas().contains(rowKey);
    }

    public void eligeFila(TableRowDataProvider tableRowDataProvider, boolean eleccion) {
        if (tableRowDataProvider != null) {
            eligeFila(tableRowDataProvider.getTableRow(), eleccion);
        }
    }

    public void eligeFila(RowKey rowKey, boolean eleccion) {
        if (eleccion) {
            getFilasElegidas().add(rowKey);
        } else {
            getFilasElegidas().remove(rowKey);
        }
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Getters y Setters de propiedades de RecursoCachedRowSet">
    /**
     * Getter para propiedad recursoCachedRowSetXImpl.
     *
     * @return Valor de la propiedad recursoCachedRowSetXImpl.
     */
    public RecursoCachedRowSet getRecursoCachedRowSet() {
        CachedRowSet crs = getCachedRowSet();
        return crs instanceof RecursoCachedRowSet ? (RecursoCachedRowSet) crs : null;
    }

    /**
     * @return the nombreClaseRecurso
     */
    public String getNombreClaseRecurso() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getNombreClaseRecurso();
    }

    /**
     * @param nombreClaseRecurso the nombreClaseRecurso to set
     */
    public void setNombreClaseRecurso(String nombreClaseRecurso) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setNombreClaseRecurso(nombreClaseRecurso);
        }
    }

    /**
     * Getter para propiedad inicializado.
     *
     * @return Valor de la propiedad inicializado.
     */
    public boolean isInicializado() {
        return getRecursoCachedRowSet() == null ? false : getRecursoCachedRowSet().isInicializado();
    }

    /**
     * Setter para propiedad inicializado.
     *
     * @param inicializado Nuevo valor de la propiedad inicializado.
     */
    protected void setInicializado(boolean inicializado) {
        if (getRecursoCachedRowSet() != null) {
            getRecursoCachedRowSet().setInicializado(inicializado);
        }
    }

    /**
     * Getter para propiedad soloReferencia.
     *
     * @return Valor de la propiedad soloReferencia.
     */
    public boolean isSoloReferencia() {
        return !isInicializado() ? false : getRecursoCachedRowSet().isSoloReferencia();
    }

    /**
     * Setter para propiedad soloReferencia.
     *
     * @param soloReferencia Nuevo valor de la propiedad soloReferencia.
     */
    public void setSoloReferencia(boolean soloReferencia) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setSoloReferencia(soloReferencia);
        }
    }

    /**
     * Getter para propiedad filaEscogida.
     *
     * @return Valor de la propiedad filaEscogida.
     */
    public RowKey getFilaEscogida() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getFilaEscogida();
    }

    /**
     * Setter para propiedad filaEscogida.
     *
     * @param filaElegida Nuevo valor de la propiedad filaEscogida.
     */
    public void setFilaEscogida() {
        // Bitacora.trace(getClass(), "setFilaEscogida");
        if (isInicializado()) {
            try {
                if (isCursorRowAvailable()) {
                    setFilaEscogida(getCursorRow());
                } else {
                    resetFilaEscogida();
                }
            } catch (Exception ex) {
                resetFilaEscogida();
            }
        }
    }

    /**
     * Setter para propiedad filaEscogida.
     *
     * @param filaElegida Nuevo valor de la propiedad filaEscogida.
     */
    public void setFilaEscogida(RowKey rowKey) {
        Bitacora.trace(getClass(), "setFilaEscogida", "RowKey=" + rowKey);
        if (isRowAvailable(rowKey) && isInicializado()) {
            getRecursoCachedRowSet().setFilaEscogida(rowKey);
            Long identificacion = null;
            if (isRecursoIdentificable()) {
                identificacion = getRecursoIdentificableDataProvider().getIdentificacionRecurso(rowKey);
            }
            setIdentificacionFilaEscogida(identificacion);
            Integer numero = null;
            if (isRecursoEnumerable()) {
                numero = getRecursoEnumerableDataProvider().getNumeroRecurso(rowKey);
            }
            setNumeroFilaEscogida(numero);
            String codigo = null;
            if (isRecursoCodificable()) {
                codigo = getRecursoCodificableDataProvider().getCodigoRecurso(rowKey);
            }
            setCodigoFilaEscogida(codigo);
            Bitacora.trace(getClass(), "setFilaEscogida", "RowKey=" + rowKey, "identificacion=" + identificacion,
                    "numero=" + numero, "codigo=" + codigo);
        } else {
            resetFilaEscogida();
        }
    }

    /**
     * Setter para propiedad filaEscogida.
     *
     * @param filaElegida Nuevo valor de la propiedad filaEscogida.
     */
    protected void resetFilaEscogida() {
        // Bitacora.trace(getClass(), "resetFilaEscogida");
        if (isInicializado()) {
            getRecursoCachedRowSet().setFilaEscogida(null);
            getRecursoCachedRowSet().setIdentificacionFilaEscogida(null);
            getRecursoCachedRowSet().setCodigoFilaEscogida(null);
        }
    }

    public boolean esFilaEscogida(RowKey rowKey) {
        RowKey filaEscogida = !isInicializado() ? null : getRecursoCachedRowSet().getFilaEscogida();
        return filaEscogida != null && rowKey != null && rowKey.equals(filaEscogida);
    }

    /**
     * Getter para propiedad identificacionFilaEscogida.
     *
     * @return Valor de la propiedad identificacionFilaEscogida.
     */
    public Long getIdentificacionFilaEscogida() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getIdentificacionFilaEscogida();
    }

    /**
     * Setter para propiedad identificacionFilaEscogida.
     *
     * @param identificacionFilaEscogida Nuevo valor de la propiedad identificacionFilaEscogida.
     */
    protected void setIdentificacionFilaEscogida(Long identificacionFilaEscogida) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setIdentificacionFilaEscogida(identificacionFilaEscogida);
        }
    }

    /**
     * Getter para propiedad numeroFilaEscogida.
     *
     * @return Valor de la propiedad numeroFilaEscogida.
     */
    public Integer getNumeroFilaEscogida() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getNumeroFilaEscogida();
    }

    /**
     * Setter para propiedad numeroFilaEscogida.
     *
     * @param numeroFilaEscogida Nuevo valor de la propiedad numeroFilaEscogida.
     */
    protected void setNumeroFilaEscogida(Integer numeroFilaEscogida) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setNumeroFilaEscogida(numeroFilaEscogida);
        }
    }

    /**
     * Getter para propiedad codigoFilaEscogida.
     *
     * @return Valor de la propiedad codigoFilaEscogida.
     */
    public String getCodigoFilaEscogida() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getCodigoFilaEscogida();
    }

    /**
     * Setter para propiedad codigoFilaEscogida.
     *
     * @param codigoFilaEscogida Nuevo valor de la propiedad codigoFilaEscogida.
     */
    protected void setCodigoFilaEscogida(String codigoFilaEscogida) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setCodigoFilaEscogida(codigoFilaEscogida);
        }
    }

    /**
     * Getter para propiedad tablaMaestro.
     *
     * @return Valor de la propiedad tablaMaestro.
     */
    public String getTablaMaestro() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getTablaMaestro();
    }

    /**
     * Setter para propiedad tablaMaestro.
     *
     * @param tablaMaestro Nuevo valor de la propiedad tablaMaestro.
     */
    public void setTablaMaestro(String tablaMaestro) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setTablaMaestro(tablaMaestro);
        }
    }

    /**
     * Getter para propiedad columnaMaestro.
     *
     * @return Valor de la propiedad columnaMaestro.
     */
    public String getColumnaMaestro() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getColumnaMaestro();
    }

    /**
     * Setter para propiedad columnaMaestro.
     *
     * @param columnaMaestro Nuevo valor de la propiedad columnaMaestro.
     */
    public void setColumnaMaestro(String columnaMaestro) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setColumnaMaestro(columnaMaestro);
        }
    }

    /**
     * Getter para propiedad columnaMaestroAnterior.
     *
     * @return Valor de la propiedad columnaMaestroAnterior.
     */
    public String getColumnaMaestroAnterior() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getColumnaMaestroAnterior();
    }

    /**
     * Setter para propiedad columnaMaestroAnterior.
     *
     * @param columnaMaestroAnterior Nuevo valor de la propiedad columnaMaestroAnterior.
     */
    public void setColumnaMaestroAnterior(String columnaMaestroAnterior) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setColumnaMaestroAnterior(columnaMaestroAnterior);
        }
    }

    /**
     * Getter para propiedad identificacionMaestro.
     *
     * @return Valor de la propiedad identificacionMaestro.
     */
    public Long getIdentificacionMaestro() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getIdentificacionMaestro();
    }

    /**
     * Setter para propiedad identificacionMaestro.
     *
     * @param identificacionMaestro Nuevo valor de la propiedad identificacionMaestro.
     */
    public void setIdentificacionMaestro(Long identificacionMaestro) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setIdentificacionMaestro(identificacionMaestro);
        }
    }

    /**
     * Getter para propiedad identificacionMaestroAnterior.
     *
     * @return Valor de la propiedad identificacionMaestroAnterior.
     */
    public Long getIdentificacionMaestroAnterior() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getIdentificacionMaestroAnterior();
    }

    /**
     * Setter para propiedad identificacionMaestroAnterior.
     *
     * @param identificacionMaestroAnterior Nuevo valor de la propiedad identificacionMaestroAnterior.
     */
    public void setIdentificacionMaestroAnterior(Long identificacionMaestroAnterior) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setIdentificacionMaestroAnterior(identificacionMaestroAnterior);
        }
    }

    /**
     * Getter para propiedad filasProcesadas.
     *
     * @return Valor de la propiedad filasProcesadas.
     */
    public Map getFilasProcesadas() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getFilasProcesadas();
    }

    public boolean esFilaProcesada(TableRowDataProvider tableRowDataProvider) {
        return tableRowDataProvider != null && esFilaProcesada(tableRowDataProvider.getTableRow());
    }

    public boolean esFilaProcesada(RowKey rowKey) {
        return rowKey != null && getFilasProcesadas().containsKey(rowKey.getRowId());
    }

    /**
     * Getter para propiedad filasRemovidas.
     *
     * @return Valor de la propiedad filasRemovidas.
     */
    public Map getFilasRemovidas() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getFilasRemovidas();
    }

    public boolean esFilaRemovida(TableRowDataProvider tableRowDataProvider) {
        return tableRowDataProvider != null && esFilaRemovida(tableRowDataProvider.getTableRow());
    }

    public boolean esFilaRemovida(RowKey rowKey) {
        return rowKey != null && getFilasRemovidas().containsKey(rowKey.getRowId());
    }

    /**
     * Conserva el valor de la propiedad filasPorConfirmar.
     */
    private int filasProcesadasPorConfirmar = 0;

    /**
     * Getter para propiedad filasPorConfirmar.
     *
     * @return Valor de la propiedad filasPorConfirmar.
     */
    protected int getFilasProcesadasPorConfirmar() {
        return filasProcesadasPorConfirmar;
    }

    /**
     * Getter para propiedad filasConflictivas.
     *
     * @return Valor de la propiedad filasConflictivas.
     */
    public Map getFilasConflictivas() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getFilasConflictivas();
    }

    public boolean esFilaConflictiva(TableRowDataProvider tableRowDataProvider) {
        return tableRowDataProvider != null && esFilaConflictiva(tableRowDataProvider.getTableRow());
    }

    public boolean esFilaConflictiva(RowKey rowKey) {
        return rowKey != null && getFilasConflictivas().containsKey(rowKey.getRowId());
    }

    /**
     * Getter para propiedad filasEliminadas.
     *
     * @return Valor de la propiedad filasEliminadas.
     */
    public int getFilasEliminadas() {
        return !isInicializado() ? 0 : getRecursoCachedRowSet().getFilasEliminadas();
    }

    /**
     * Setter para propiedad filasEliminadas.
     *
     * @param filasEliminadas Nuevo valor de la propiedad filasEliminadas.
     */
    protected void setFilasEliminadas(int filasEliminadas) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setFilasEliminadas(filasEliminadas);
        }
    }

    protected int incrementaFilasEliminadas() {
        int i = getFilasEliminadas();
        setFilasEliminadas(++i);
        return getFilasEliminadas();
    }

    public Map<String, RastroFuncion> getRastrosFuncion() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getRastrosFuncion();
    }

    public Map<String, CampoBusqueda> getCamposBusqueda() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getCamposBusqueda();
    }

    public CampoBusqueda getCampoBusqueda(String campo) {
        return !isInicializado() || campo == null ? null : getRecursoCachedRowSet().getCamposBusqueda().get(campo);
    }

    public CampoBusqueda setCampoBusqueda(String campo, String columna, Object valor) {
        if (!isInicializado() || campo == null || columna == null) {
            return null;
        }
        Map<String, CampoBusqueda> camposBusqueda = getRecursoCachedRowSet().getCamposBusqueda();
        CampoBusqueda cb = camposBusqueda.get(campo);
        if (cb == null) {
            cb = new CampoBusqueda(columna);
        }
        cb.setValor(valor);
        return camposBusqueda.put(campo, cb);
    }

    /**
     * Getter para propiedad vistaFuncionSelect.
     *
     * @return Valor de la propiedad vistaFuncionSelect.
     */
    public Long getVistaFuncionSelect() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getVistaFuncionSelect();
    }

    /**
     * Setter para propiedad vistaFuncionSelect.
     *
     * @param vistaFuncionSelect Nuevo valor de la propiedad vistaFuncionSelect.
     */
    public void setVistaFuncionSelect(Long vistaFuncionSelect) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setVistaFuncionSelect(vistaFuncionSelect);
        }
    }

    /**
     * Getter para propiedad filtroFuncionSelect.
     *
     * @return Valor de la propiedad filtroFuncionSelect.
     */
    public Long getFiltroFuncionSelect() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getFiltroFuncionSelect();
    }

    /**
     * Setter para propiedad filtroFuncionSelect.
     *
     * @param filtroFuncionSelect Nuevo valor de la propiedad filtroFuncionSelect.
     */
    public void setFiltroFuncionSelect(Long filtroFuncionSelect) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setFiltroFuncionSelect(filtroFuncionSelect);
        }
    }

    /**
     * Getter para propiedad filtroFuncionSelectAnterior.
     *
     * @return Valor de la propiedad filtroFuncionSelectAnterior.
     */
    public Long getFiltroFuncionSelectAnterior() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getFiltroFuncionSelectAnterior();
    }

    /**
     * Setter para propiedad filtroFuncionSelectAnterior.
     *
     * @param filtroFuncionSelectAnterior Nuevo valor de la propiedad filtroFuncionSelectAnterior.
     */
    public void setFiltroFuncionSelectAnterior(Long filtroFuncionSelectAnterior) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setFiltroFuncionSelectAnterior(filtroFuncionSelectAnterior);
        }
    }

    /**
     * Getter para propiedad filtroFuncionSelectModificado.
     *
     * @return Valor de la propiedad filtroFuncionSelectModificado.
     */
    public boolean isFiltroFuncionSelectModificado() {
        return !isInicializado() ? false : getRecursoCachedRowSet().isFiltroFuncionSelectModificado();
    }
    //
    //  /**
    //   * Setter para propiedad filtroFuncionSelectModificado.
    //   *
    //   * @param filtroFuncionSelectModificado Nuevo valor de la propiedad filtroFuncionSelectModificado.
    //   */
    //  public void setFiltroFuncionSelectModificado(boolean filtroFuncionSelectModificado) {
    //      if (isInicializado()) {
    //          getRecursoCachedRowSet().setFiltroFuncionSelectModificado(filtroFuncionSelectModificado);
    //      }
    //  }

    /**
     * Getter para propiedad codigoFuncionSelect.
     *
     * @return Valor de la propiedad codigoFuncionSelect.
     */
    public String getCodigoFuncionSelect() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getCodigoFuncionSelect();
    }

    /**
     * Setter para propiedad codigoFuncionSelect.
     *
     * @param codigoFuncionSelect Nuevo valor de la propiedad codigoFuncionSelect.
     */
    public void setCodigoFuncionSelect(String codigoFuncionSelect) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setCodigoFuncionSelect(codigoFuncionSelect);
        }
    }

    /**
     * Getter para propiedad codigoFuncionSelectAnterior.
     *
     * @return Valor de la propiedad codigoFuncionSelectAnterior.
     */
    public String getCodigoFuncionSelectAnterior() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getCodigoFuncionSelectAnterior();
    }

    /**
     * Setter para propiedad codigoFuncionSelectAnterior.
     *
     * @param codigoFuncionSelectAnterior Nuevo valor de la propiedad codigoFuncionSelectAnterior.
     */
    public void setCodigoFuncionSelectAnterior(String codigoFuncionSelectAnterior) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setCodigoFuncionSelectAnterior(codigoFuncionSelectAnterior);
        }
    }

    /**
     * Getter para propiedad codigoFuncionSelectModificado.
     *
     * @return Valor de la propiedad codigoFuncionSelectModificado.
     */
    public boolean isCodigoFuncionSelectModificado() {
        return !isInicializado() ? false : getRecursoCachedRowSet().isCodigoFuncionSelectModificado();
    }
    //
    //  /**
    //   * Setter para propiedad codigoFuncionSelectModificado.
    //   *
    //   * @param codigoFuncionSelectModificado Nuevo valor de la propiedad codigoFuncionSelectModificado.
    //   */
    //  public void setCodigoFuncionSelectModificado(boolean codigoFuncionSelectModificado) {
    //      if (isInicializado()) {
    //          getRecursoCachedRowSet().setCodigoFuncionSelectModificado(codigoFuncionSelectModificado);
    //      }
    //  }

    /**
     * Getter para propiedad nombreFuncionSelect.
     *
     * @return Valor de la propiedad nombreFuncionSelect.
     */
    public String getNombreFuncionSelect() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getNombreFuncionSelect();
    }

    /**
     * Setter para propiedad nombreFuncionSelect.
     *
     * @param nombreFuncionSelect Nuevo valor de la propiedad nombreFuncionSelect.
     */
    public void setNombreFuncionSelect(String nombreFuncionSelect) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setNombreFuncionSelect(nombreFuncionSelect);
        }
    }

    /**
     * Getter para propiedad nombreFuncionSelectAnterior.
     *
     * @return Valor de la propiedad nombreFuncionSelectAnterior.
     */
    public String getNombreFuncionSelectAnterior() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getNombreFuncionSelectAnterior();
    }

    /**
     * Setter para propiedad nombreFuncionSelectAnterior.
     *
     * @param nombreFuncionSelectAnterior Nuevo valor de la propiedad nombreFuncionSelectAnterior.
     */
    public void setNombreFuncionSelectAnterior(String nombreFuncionSelectAnterior) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setNombreFuncionSelectAnterior(nombreFuncionSelectAnterior);
        }
    }

    /**
     * Getter para propiedad nombreFuncionSelectModificado.
     *
     * @return Valor de la propiedad nombreFuncionSelectModificado.
     */
    public boolean isNombreFuncionSelectModificado() {
        return !isInicializado() ? false : getRecursoCachedRowSet().isNombreFuncionSelectModificado();
    }
    //
    //  /**
    //   * Setter para propiedad nombreFuncionSelectModificado.
    //   *
    //   * @param nombreFuncionSelectModificado Nuevo valor de la propiedad nombreFuncionSelectModificado.
    //   */
    //  public void setNombreFuncionSelectModificado(boolean nombreFuncionSelectModificado) {
    //      if (isInicializado()) {
    //          getRecursoCachedRowSet().setNombreFuncionSelectModificado(nombreFuncionSelectModificado);
    //      }
    //  }

    /**
     * Getter para propiedad filtroFuncionSelect.
     *
     * @return Valor de la propiedad filtroFuncionSelect.
     */
    public Long getSegmentoFuncionSelect() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getSegmentoFuncionSelect();
    }

    /**
     * Setter para propiedad filtroFuncionSelect.
     *
     * @param filtroFuncionSelect Nuevo valor de la propiedad filtroFuncionSelect.
     */
    public void setSegmentoFuncionSelect(Long filtroFuncionSelect) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setSegmentoFuncionSelect(filtroFuncionSelect);
        }
    }

    /**
     * Getter para propiedad dominioSelect.
     *
     * @return Valor de la propiedad dominioSelect
     */
    public long getDominioSelect() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getDominioSelect();
    }

    /**
     * Setter para propiedad dominioSelect.
     *
     * @param dominioSelect Nuevo valor de la propiedad dominioSelect
     */
    public void setDominioSelect(long dominioSelect) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setDominioSelect(dominioSelect);
        }
    }

    /**
     * Getter para propiedad funcionSelect.
     *
     * @return Valor de la propiedad funcionSelect.
     */
    public long getFuncionSelect() {
        return !isInicializado() ? -1L : getRecursoCachedRowSet().getFuncionSelect();
    }

    /**
     * Setter para propiedad funcionSelect.
     *
     * @param funcionSelect Nuevo valor de la propiedad funcionSelect.
     */
    public void setFuncionSelect(long funcion) throws ExcepcionAplicacion {
        if (isInicializado()) {
            getRecursoCachedRowSet().setFuncionSelect(funcion);
        }
    }

    /**
     * Getter para propiedad funcionInsert.
     *
     * @return Valor de la propiedad funcionInsert.
     */
    public long getFuncionInsert() {
        return !isInicializado() ? -1L : getRecursoCachedRowSet().getFuncionInsert();
    }

    /**
     * Setter para propiedad funcionInsert.
     *
     * @param funcionInsert Nuevo valor de la propiedad funcionInsert.
     */
    public void setFuncionInsert(long funcion) throws ExcepcionAplicacion {
        if (isInicializado()) {
            getRecursoCachedRowSet().setFuncionInsert(funcion);
        }
    }

    /**
     * Getter para propiedad funcionUpdate.
     *
     * @return Valor de la propiedad funcionUpdate.
     */
    public long getFuncionUpdate() {
        return !isInicializado() ? -1L : getRecursoCachedRowSet().getFuncionUpdate();
    }

    /**
     * Setter para propiedad funcionUpdate.
     *
     * @param funcionUpdate Nuevo valor de la propiedad funcionUpdate.
     */
    public void setFuncionUpdate(long funcion) throws ExcepcionAplicacion {
        if (isInicializado()) {
            getRecursoCachedRowSet().setFuncionUpdate(funcion);
        }
    }

    /**
     * Getter para propiedad funcionDelete.
     *
     * @return Valor de la propiedad funcionDelete.
     */
    public long getFuncionDelete() {
        return !isInicializado() ? -1L : getRecursoCachedRowSet().getFuncionDelete();
    }

    /**
     * Setter para propiedad funcionDelete.
     *
     * @param funcionDelete Nuevo valor de la propiedad funcionDelete.
     */
    public void setFuncionDelete(long funcion) throws ExcepcionAplicacion {
        if (isInicializado()) {
            getRecursoCachedRowSet().setFuncionDelete(funcion);
        }
    }

    /**
     * Getter para propiedad funcionBusinessProcess.
     *
     * @return Valor de la propiedad funcionBusinessProcess.
     */
    public long getFuncionBusinessProcess() {
        return !isInicializado() ? -1L : getRecursoCachedRowSet().getFuncionBusinessProcess();
    }

    /**
     * Setter para propiedad funcionBusinessProcess.
     *
     * @param funcionBusinessProcess Nuevo valor de la propiedad funcionBusinessProcess.
     */
    public void setFuncionBusinessProcess(long funcion) throws ExcepcionAplicacion {
        if (isInicializado()) {
            getRecursoCachedRowSet().setFuncionBusinessProcess(funcion);
        }
    }

    /**
     * Getter para propiedad funcionSelectAutorizada.
     *
     * @return Valor de la propiedad funcionSelectAutorizada.
     */
    public boolean isFuncionSelectAutorizada() {
        return !isInicializado() ? false : getRecursoCachedRowSet().isFuncionSelectAutorizada();
    }

    /**
     * Getter para propiedad funcionInsertAutorizada.
     *
     * @return Valor de la propiedad funcionInsertAutorizada.
     */
    public boolean isFuncionInsertAutorizada() {
        return !isInicializado() ? false : getRecursoCachedRowSet().isFuncionInsertAutorizada();
    }

    /**
     * Getter para propiedad funcionUpdateAutorizada.
     *
     * @return Valor de la propiedad funcionUpdateAutorizada.
     */
    public boolean isFuncionUpdateAutorizada() {
        return !isInicializado() ? false : getRecursoCachedRowSet().isFuncionUpdateAutorizada();
    }

    /**
     * Getter para propiedad funcionDeleteAutorizada.
     *
     * @return Valor de la propiedad funcionDeleteAutorizada.
     */
    public boolean isFuncionDeleteAutorizada() {
        return !isInicializado() ? false : getRecursoCachedRowSet().isFuncionDeleteAutorizada();
    }

    /**
     * Getter para propiedad funcionBusinessProcessAutorizada.
     *
     * @return Valor de la propiedad funcionBusinessProcessAutorizada.
     */
    public boolean isFuncionBusinessProcessAutorizada() {
        return !isInicializado() ? false : getRecursoCachedRowSet().isFuncionBusinessProcessAutorizada();
    }

    /**
     * Getter para propiedad funcionSelectEjecutada.
     *
     * @return Valor de la propiedad funcionSelectEjecutada.
     */
    public boolean isFuncionSelectEjecutada() {
        return !isInicializado() ? false : getRecursoCachedRowSet().isFuncionSelectEjecutada();
    }

    /**
     * Setter para propiedad funcionSelectEjecutada.
     *
     * @param funcionSelectEjecutada Nuevo valor de la propiedad funcionSelectEjecutada.
     */
    protected void setFuncionSelectEjecutada(boolean funcionSelectEjecutada) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setFuncionSelectEjecutada(funcionSelectEjecutada);
        }
    }

    /**
     * Getter para propiedad funcionInsertEjecutada.
     *
     * @return Valor de la propiedad funcionInsertEjecutada.
     */
    public boolean isFuncionInsertEjecutada() {
        return !isInicializado() ? false : getRecursoCachedRowSet().isFuncionInsertEjecutada();
    }

    /**
     * Setter para propiedad funcionInsertEjecutada.
     *
     * @param funcionInsertEjecutada Nuevo valor de la propiedad funcionInsertEjecutada.
     */
    protected void setFuncionInsertEjecutada(boolean funcionInsertEjecutada) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setFuncionInsertEjecutada(funcionInsertEjecutada);
        }
    }

    /**
     * Getter para propiedad funcionUpdateEjecutada.
     *
     * @return Valor de la propiedad funcionUpdateEjecutada.
     */
    public boolean isFuncionUpdateEjecutada() {
        return !isInicializado() ? false : getRecursoCachedRowSet().isFuncionUpdateEjecutada();
    }

    /**
     * Setter para propiedad funcionUpdateEjecutada.
     *
     * @param funcionUpdateEjecutada Nuevo valor de la propiedad funcionUpdateEjecutada.
     */
    protected void setFuncionUpdateEjecutada(boolean funcionUpdateEjecutada) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setFuncionUpdateEjecutada(funcionUpdateEjecutada);
        }
    }

    /**
     * Getter para propiedad funcionDeleteEjecutada.
     *
     * @return Valor de la propiedad funcionDeleteEjecutada.
     */
    public boolean isFuncionDeleteEjecutada() {
        return !isInicializado() ? false : getRecursoCachedRowSet().isFuncionDeleteEjecutada();
    }

    /**
     * Setter para propiedad funcionDeleteEjecutada.
     *
     * @param funcionDeleteEjecutada Nuevo valor de la propiedad funcionDeleteEjecutada.
     */
    protected void setFuncionDeleteEjecutada(boolean funcionDeleteEjecutada) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setFuncionDeleteEjecutada(funcionDeleteEjecutada);
        }
    }

    /**
     * Getter para propiedad funcionBusinessProcessEjecutada.
     *
     * @return Valor de la propiedad funcionBusinessProcessEjecutada.
     */
    //  public boolean isFuncionBusinessProcessEjecutada() {
    //      return !isInicializado() ? false : getRecursoCachedRowSet().isFuncionBusinessProcessEjecutada();
    //  }
    //
    /**
     * Setter para propiedad funcionBusinessProcessEjecutada.
     *
     * @param funcionBusinessProcessEjecutada Nuevo valor de la propiedad funcionBusinessProcessEjecutada.
     */

    //  protected void setFuncionBusinessProcessEjecutada(boolean funcionBusinessProcessEjecutada) {
    //      if (isInicializado()) {
    //          getRecursoCachedRowSet().setFuncionBusinessProcessEjecutada(funcionBusinessProcessEjecutada);
    //      }
    //  }
    //
    /**
     * Getter para propiedad visorEscondido.
     *
     * @return Valor de la propiedad visorEscondido.
     */
    public boolean isVisorEscondido() {
        return !isInicializado() ? false : getRecursoCachedRowSet().isVisorEscondido();
    }

    /**
     * Setter para propiedad visorEscondido.
     *
     * @param visorEscondido Nuevo valor de la propiedad visorEscondido.
     */
    public void setVisorEscondido(boolean visorEscondido) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setVisorEscondido(visorEscondido);
        }
    }

    /**
     * Getter para propiedad filtroAnulado.
     *
     * @return Valor de la propiedad filtroAnulado.
     */
    public boolean isFiltroAnulado() {
        return !isInicializado() ? false : getRecursoCachedRowSet().isFiltroAnulado();
    }

    /**
     * Setter para propiedad filtroAnulado.
     *
     * @param filtroAnulado Nuevo valor de la propiedad filtroAnulado.
     */
    public void setFiltroAnulado(boolean filtroAnulado) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setFiltroAnulado(filtroAnulado);
        }
    }

    /**
     * Getter para propiedad filtroEscondido.
     *
     * @return Valor de la propiedad filtroEscondido.
     */
    public boolean isFiltroEscondido() {
        return !isInicializado() ? false : getRecursoCachedRowSet().isFiltroEscondido();
    }

    /**
     * Setter para propiedad filtroEscondido.
     *
     * @param filtroEscondido Nuevo valor de la propiedad filtroEscondido.
     */
    public void setFiltroEscondido(boolean filtroEscondido) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setFiltroEscondido(filtroEscondido);
        }
    }

    /**
     * Getter para propiedad versionComandoSelect.
     *
     * @return Valor de la propiedad versionComandoSelect.
     */
    public long getVersionComandoSelect() {
        return !isInicializado() ? -1L : getRecursoCachedRowSet().getVersionComandoSelect();
    }

    /**
     * Setter para propiedad versionComandoSelect.
     *
     * @param versionComandoSelect Nuevo valor de la propiedad versionComandoSelect.
     */
    protected void setVersionComandoSelect(long versionComandoSelect) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setVersionComandoSelect(versionComandoSelect);
        }
    }

    protected void incrementaVersionComandoSelect() {
        long i = getVersionComandoSelect();
        setVersionComandoSelect(++i);
    }

    /**
     * Getter para propiedad versionComandoSelectAnterior.
     *
     * @return Valor de la propiedad versionComandoSelectAnterior.
     */
    public long getVersionComandoSelectAnterior() {
        return !isInicializado() ? -1L : getRecursoCachedRowSet().getVersionComandoSelectAnterior();
    }

    /**
     * Setter para propiedad versionComandoSelectAnterior.
     *
     * @param versionComandoSelectAnterior Nuevo valor de la propiedad versionComandoSelectAnterior.
     */
    protected void setVersionComandoSelectAnterior(long versionComandoSelectAnterior) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setVersionComandoSelectAnterior(versionComandoSelectAnterior);
        }
    }

    /**
     * Getter para propiedad versionComandoInsert.
     *
     * @return Valor de la propiedad versionComandoInsert.
     */
    public long getVersionComandoInsert() {
        return !isInicializado() ? -1L : getRecursoCachedRowSet().getVersionComandoInsert();
    }

    /**
     * Setter para propiedad versionComandoInsert.
     *
     * @param versionComandoInsert Nuevo valor de la propiedad versionComandoInsert.
     */
    protected void setVersionComandoInsert(long versionComandoInsert) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setVersionComandoInsert(versionComandoInsert);
        }
    }

    /**
     * Getter para propiedad consultaBusqueda.
     *
     * @return Valor de la propiedad consultaBusqueda.
     */
    public String getConsultaBusqueda() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getConsultaBusqueda();
    }

    /**
     * Setter para propiedad consultaBusqueda.
     *
     * @param consultaBusqueda Nuevo valor de la propiedad consultaBusqueda.
     */
    public void setConsultaBusqueda(String consultaBusqueda) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setConsultaBusqueda(consultaBusqueda);
        }
    }

    /**
     * Setter para propiedad consultaBusqueda.
     *
     * @param consultaBusqueda Nuevo valor de la propiedad consultaBusqueda.
     */
    public void setConsultaBusqueda(ConsultaBusqueda consulta) {
        if (isInicializado()) {
            String consultaBusqueda = consulta == null ? null : consulta.getId();
            getRecursoCachedRowSet().setConsultaBusqueda(consultaBusqueda);
        }
    }

    /**
     * Getter para propiedad criteriosBusqueda.
     *
     * @return Valor de la propiedad criteriosBusqueda.
     */
    public String getCriteriosBusqueda() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getCriteriosBusqueda();
    }

    /**
     * Setter para propiedad criteriosBusqueda.
     *
     * @param criteriosBusqueda Nuevo valor de la propiedad criteriosBusqueda.
     */
    public void setCriteriosBusqueda(String criteriosBusqueda) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setCriteriosBusqueda(criteriosBusqueda);
        }
    }

    /**
     * Setter para propiedad criteriosBusqueda.
     *
     * @param criteriosBusqueda Nuevo valor de la propiedad criteriosBusqueda.
     */
    public void setCriteriosBusqueda(FiltroBusqueda filtro) {
        if (isInicializado()) {
            String criteriosBusqueda = filtro == null ? null : filtro.toString();
            getRecursoCachedRowSet().setCriteriosBusqueda(criteriosBusqueda);
        }
    }

    /**
     * Getter para propiedad criteriosOrden.
     *
     * @return Valor de la propiedad criteriosOrden.
     */
    public String getCriteriosOrden() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getCriteriosOrden();
    }

    /**
     * Setter para propiedad criteriosOrden.
     *
     * @param criteriosOrden Nuevo valor de la propiedad criteriosOrden.
     */
    public void setCriteriosOrden(String criteriosOrden) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setCriteriosOrden(criteriosOrden);
        }
    }

    /**
     * Setter para propiedad criteriosOrden.
     *
     * @param criteriosOrden Nuevo valor de la propiedad criteriosOrden.
     */
    public void setCriteriosOrden(OrdenConjuntoResultados orden) {
        if (isInicializado()) {
            String criteriosOrden = orden == null ? null : orden.toString();
            getRecursoCachedRowSet().setCriteriosOrden(criteriosOrden);
        }
    }

    /**
     * Getter para propiedad comandoSelectRestringido.
     *
     * @return Valor de la propiedad comandoSelectRestringido.
     */
    public String getComandoSelectRestringido() {
        String select = getComandoSelectAnsi();
        String columnas = getColumnasComandoSelectRestringido();
        int i = StringUtils.isBlank(columnas) ? -1 : StringUtils.indexOfIgnoreCase(select, " FROM ");
        return i < 0 ? select : "SELECT " + columnas + select.substring(i);
    }

    protected String getColumnasComandoSelectRestringido() {
        if (isFuncionSelectEjecutada()) {
            long funcion = getFuncionSelect();
            if (TLC.getControlador().esFuncionConParametrosRestringidos(funcion)) {
                String column;
                Long select;
                String dominio = getCodigoDominioRecurso();
                ArrayList<String> list = new ArrayList<>();
                List<String> columnas = getListaColumnasComandoSelect();
                for (String string : columnas) {
                    column = BaseBundle.getPropertyColumn(dominio, string);
                    select = BaseBundle.getPropertySelect(dominio, string);
                    if (column == null || select == null) {
                        list.add(string);
                    } else if (TLC.getControlador().esParametroAutorizado(column, select)) {
                        list.add(string);
                    } else {
                        list.add("NULL AS " + string);
                    }
                }
                String join = StringUtils.join(list, ", ");
                //              Bitacora.trace(join);
                return join;
            }
        }
        return null;
    }

    protected List<String> getListaColumnasComandoSelect() {
        ArrayList<String> list = new ArrayList<>();
        FieldKey[] keys = getFieldKeys();
        for (FieldKey key : keys) {
            list.add(key.getFieldId());
        }
        return list;
    }

    /**
     * Getter para propiedad comandoSelectAnsi.
     *
     * @return Valor de la propiedad comandoSelectAnsi.
     */
    public String getComandoSelectAnsi() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getComandoSelectAnsi();
    }

    /**
     * Setter para propiedad comandoSelectAnsi.
     *
     * @param comandoSelectAnsi Nuevo valor de la propiedad comandoSelectAnsi.
     */
    protected void setComandoSelectAnsi(String comandoSelectAnsi) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setComandoSelectAnsi(comandoSelectAnsi);
        }
    }

    /**
     * Getter para propiedad comandoSelectAnterior.
     *
     * @return Valor de la propiedad comandoSelectAnterior.
     */
    public String getComandoSelectAnterior() {
        return !isInicializado() ? null : getRecursoCachedRowSet().getComandoSelectAnterior();
    }

    /**
     * Setter para propiedad comandoSelectAnterior.
     *
     * @param comandoSelectAnterior Nuevo valor de la propiedad comandoSelectAnterior.
     */
    protected void setComandoSelectAnterior(String comandoSelectAnterior) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setComandoSelectAnterior(comandoSelectAnterior);
        }
    }

    /**
     * Getter para propiedad opcionZumNodo.
     *
     * @return Valor de la propiedad opcionZumNodo.
     */
    public EnumOpcionZumNodo getOpcionZumNodo() {
        return !isInicializado() ? EnumOpcionZumNodo.TODO : getRecursoCachedRowSet().getOpcionZumNodo();
    }

    /**
     * Setter para propiedad opcionZumNodo.
     *
     * @param opcionZumNodo Nuevo valor de la propiedad opcionZumNodo.
     */
    public void setOpcionZumNodo(EnumOpcionZumNodo opcionZumNodo) {
        if (isInicializado()) {
            getRecursoCachedRowSet().setOpcionZumNodo(opcionZumNodo);
        }
    }

    /**
     * Getter para propiedad consultaInsertDisponible.
     *
     * @return Valor de la propiedad consultaInsertDisponible.
     */
    public boolean isConsultaInsertDisponible() {
        return !isInicializado() ? false : getVersionComandoInsert() > 0L;
    }

    /**
     * Getter para propiedad consultaAnteriorDisponible.
     *
     * @return Valor de la propiedad consultaAnteriorDisponible.
     */
    public boolean isConsultaAnteriorDisponible() {
        return !isInicializado() ? false : getVersionComandoSelectAnterior() > 0L;
    }

    /**
     * Getter para propiedad funcionSelectHabilitada.
     *
     * @return Valor de la propiedad funcionSelectHabilitada.
     */
    public boolean isFuncionSelectHabilitada() {
        // boolean b = isFuncionSelectAutorizada();
        // int i = getFilasProcesadas().size() + getFilasEliminadas();
        // return b && i == 0;
        return isFuncionSelectAutorizada() && isLoteSinCambios();
    }

    /**
     * Getter para propiedad funcionInsertHabilitada.
     *
     * @return Valor de la propiedad funcionInsertHabilitada.
     */
    public boolean isFuncionInsertHabilitada() {
        // removeRow + appendRow + setCursorRow = java.lang.IllegalArgumentException
        // por lo tanto, hay que evitar el appendRow(con su consecuente setCursorRow) si se ejecuta un removeRow
        // boolean b = isFuncionInsertAutorizada();
        // int i = getFilasEliminadas();
        // return b && i == 0;
        // return isFuncionInsertAutorizada() && !isFuncionDeleteEjecutada();
        //      return isFuncionSelectEjecutada() && !isFuncionUpdateEjecutada() && !isFuncionDeleteEjecutada();
        return !isFuncionUpdateEjecutada() && !isFuncionDeleteEjecutada();
    }

    /**
     * Getter para propiedad funcionUpdateHabilitada.
     *
     * @return Valor de la propiedad funcionUpdateHabilitada.
     */
    public boolean isFuncionUpdateHabilitada() {
        // return isFuncionUpdateAutorizada() && isLoteConFilas();
        return isLoteConFilas() && !isFuncionInsertEjecutada() && !isFuncionDeleteEjecutada();
    }

    /**
     * Getter para propiedad funcionDeleteHabilitada.
     *
     * @return Valor de la propiedad funcionDeleteHabilitada.
     */
    public boolean isFuncionDeleteHabilitada() {
        // return isFuncionDeleteAutorizada() && isLoteConFilas();
        return isLoteConFilas() && !isFuncionInsertEjecutada() && !isFuncionUpdateEjecutada();
    }

    /**
     * Getter para propiedad funcionBusinessProcessHabilitada.
     *
     * @return Valor de la propiedad funcionBusinessProcessHabilitada.
     */
    public boolean isFuncionBusinessProcessHabilitada() {
        // return isFuncionBusinessProcessAutorizada() && isLoteConFilas();
        return isFuncionBusinessProcessAutorizada() && isLoteConFilas() && isLoteSinCambios();
    }

    /**
     * Getter para propiedad funcionHideViewerHabilitada.
     *
     * @return Valor de la propiedad funcionHideViewerHabilitada.
     */
    public boolean isFuncionHideViewerHabilitada() {
        return !isFuncionHideViewerInhabilitada();
    }

    /**
     * Getter para propiedad funcionHideViewerInhabilitada.
     *
     * @return Valor de la propiedad funcionHideViewerInhabilitada.
     */
    public boolean isFuncionHideViewerInhabilitada() {
        return isVisorEscondido();
    }

    /**
     * Getter para propiedad funcionShowViewerHabilitada.
     *
     * @return Valor de la propiedad funcionShowViewerHabilitada.
     */
    public boolean isFuncionShowViewerHabilitada() {
        String enabled = BaseBundle.getCurrentPageString("fragmento_visor_enabled");
        return BitUtils.valueOf(enabled) && isFuncionSelectEjecutada() && isVisorEscondido();
    }

    /**
     * Getter para propiedad funcionShowViewerInhabilitada.
     *
     * @return Valor de la propiedad funcionShowViewerInhabilitada.
     */
    public boolean isFuncionShowViewerInhabilitada() {
        return !isFuncionShowViewerHabilitada();
    }

    /**
     * Getter para propiedad funcionModifyViewerHabilitada.
     *
     * @return Valor de la propiedad funcionModifyViewerHabilitada.
     */
    public boolean isFuncionViewViewerHabilitada() {
        String enabled = BaseBundle.getCurrentPageString("fragmento_visor_enabled");
        return BitUtils.valueOf(enabled) && isFuncionSelectEjecutada() && !isVisorEscondido();
    }

    /**
     * Getter para propiedad funcionModifyViewerInhabilitada.
     *
     * @return Valor de la propiedad funcionModifyViewerInhabilitada.
     */
    public boolean isFuncionViewViewerInhabilitada() {
        return !isFuncionViewViewerHabilitada();
    }

    /**
     * Getter para propiedad funcionApplyViewerHabilitada.
     *
     * @return Valor de la propiedad funcionApplyViewerHabilitada.
     */
    public boolean isFuncionApplyViewerHabilitada() {
        return isFuncionSelectEjecutada();
    }

    /**
     * Getter para propiedad funcionApplyViewerInhabilitada.
     *
     * @return Valor de la propiedad funcionApplyViewerInhabilitada.
     */
    public boolean isFuncionApplyViewerInhabilitada() {
        return !isFuncionApplyViewerHabilitada();
    }

    /**
     * Getter para propiedad funcionHideFilterHabilitada.
     *
     * @return Valor de la propiedad funcionHideFilterHabilitada.
     */
    public boolean isFuncionHideFilterHabilitada() {
        return isFuncionSelectHabilitada() && isFuncionSelectEjecutada() && isCursorRowAvailable()
                && !isFiltroEscondido();
    }

    /**
     * Getter para propiedad funcionHideFilterInhabilitada.
     *
     * @return Valor de la propiedad funcionHideFilterInhabilitada.
     */
    public boolean isFuncionHideFilterInhabilitada() {
        return !isFuncionHideFilterHabilitada();
    }

    /**
     * Getter para propiedad funcionShowFilterHabilitada.
     *
     * @return Valor de la propiedad funcionShowFilterHabilitada.
     */
    public boolean isFuncionShowFilterHabilitada() {
        return isFuncionSelectHabilitada() && isFiltroEscondido();
    }

    /**
     * Getter para propiedad funcionShowFilterInhabilitada.
     *
     * @return Valor de la propiedad funcionShowFilterInhabilitada.
     */
    public boolean isFuncionShowFilterInhabilitada() {
        return !isFuncionShowFilterHabilitada();
    }

    /**
     * Getter para propiedad funcionModifyFilterHabilitada.
     *
     * @return Valor de la propiedad funcionModifyFilterHabilitada.
     */
    public boolean isFuncionViewFilterHabilitada() {
        return isFuncionSelectHabilitada() && !isFiltroEscondido();
    }

    /**
     * Getter para propiedad funcionModifyFilterInhabilitada.
     *
     * @return Valor de la propiedad funcionModifyFilterInhabilitada.
     */
    public boolean isFuncionViewFilterInhabilitada() {
        return !isFuncionViewFilterHabilitada();
    }

    /**
     * Getter para propiedad funcionApplyFilterHabilitada.
     *
     * @return Valor de la propiedad funcionApplyFilterHabilitada.
     */
    public boolean isFuncionApplyFilterHabilitada() {
        return isFuncionSelectHabilitada();
    }

    /**
     * Getter para propiedad funcionApplyFilterInhabilitada.
     *
     * @return Valor de la propiedad funcionApplyFilterInhabilitada.
     */
    public boolean isFuncionApplyFilterInhabilitada() {
        return !isFuncionApplyFilterHabilitada();
    }

    /**
     * Getter para propiedad funcionRemoveFilterHabilitada.
     *
     * @return Valor de la propiedad funcionRemoveFilterHabilitada.
     */
    public boolean isFuncionRemoveFilterHabilitada() {
        return isFuncionSelectHabilitada() && isFiltroFuncionSelectDisponible();
    }

    /**
     * Getter para propiedad funcionRemoveFilterInhabilitada.
     *
     * @return Valor de la propiedad funcionRemoveFilterInhabilitada.
     */
    public boolean isFuncionRemoveFilterInhabilitada() {
        return !isFuncionRemoveFilterHabilitada();
    }

    /**
     * Getter para propiedad funcionRestoreFilterHabilitada.
     *
     * @return Valor de la propiedad funcionRestoreFilterHabilitada.
     */
    public boolean isFuncionRestoreFilterHabilitada() {
        return isFuncionSelectHabilitada() && isFiltroFuncionSelectAnteriorDisponible();
    }

    /**
     * Getter para propiedad funcionRestoreFilterInhabilitada.
     *
     * @return Valor de la propiedad funcionRestoreFilterInhabilitada.
     */
    public boolean isFuncionRestoreFilterInhabilitada() {
        return !isFuncionRestoreFilterHabilitada();
    }

    /**
     * Getter para propiedad filtroFuncionSelectDisponible.
     *
     * @return Valor de la propiedad filtroFuncionSelectDisponible.
     */
    private boolean isFiltroFuncionSelectDisponible() {
        return (hayCamposBusquedaDisponibles() || getFiltroFuncionSelect() != null
                || getCodigoFuncionSelect() != null || getNombreFuncionSelect() != null);
    }

    /**
     * Getter para propiedad filtroFuncionSelectAnteriorDisponible.
     *
     * @return Valor de la propiedad filtroFuncionSelectAnteriorDisponible.
     */
    private boolean isFiltroFuncionSelectAnteriorDisponible() {
        return (hayCamposBusquedaAnterioresDisponibles() || getFiltroFuncionSelectAnterior() != null
                || getCodigoFuncionSelectAnterior() != null || getNombreFuncionSelectAnterior() != null);
    }

    private boolean hayCamposBusquedaDisponibles() {
        Map<String, CampoBusqueda> camposBusqueda = getCamposBusqueda();
        if (camposBusqueda == null) {
            return false;
        }
        for (CampoBusqueda campo : camposBusqueda.values()) {
            if (campo.getValor() != null) {
                return true;
            }
        }
        return false;
    }

    private boolean hayCamposBusquedaAnterioresDisponibles() {
        Map<String, CampoBusqueda> camposBusqueda = getCamposBusqueda();
        if (camposBusqueda == null) {
            return false;
        }
        for (CampoBusqueda campo : camposBusqueda.values()) {
            if (campo.getValorAnterior() != null) {
                return true;
            }
        }
        return false;
    }

    /**
     * Getter para propiedad loteConFilas.
     *
     * @return Valor de la propiedad loteConFilas.
     */
    public boolean isLoteConFilas() {
        //      return isInicializado() && getRowCount() > 0;
        return isInicializado() && getRowKeys(1, null).length > 0;
    }

    /**
     * Getter para propiedad loteSinFilas.
     *
     * @return Valor de la propiedad loteSinFilas.
     */
    public boolean isLoteSinFilas() {
        return !isLoteConFilas();
    }

    /**
     * Getter para propiedad loteConCambios.
     *
     * @return Valor de la propiedad loteConCambios.
     */
    public boolean isLoteConCambios() {
        return isFuncionInsertEjecutada() || isFuncionUpdateEjecutada() || isFuncionDeleteEjecutada();
    }

    /**
     * Getter para propiedad loteSinCambios.
     *
     * @return Valor de la propiedad loteSinCambios.
     */
    public boolean isLoteSinCambios() {
        return !isLoteConCambios();
    }

    /**
     * Getter para propiedad loteConFilasEliminadas.
     *
     * @return Valor de la propiedad loteConFilasEliminadas.
     */
    public boolean isLoteConFilasEliminadas() {
        int i = !isInicializado() ? 0 : getFilasEliminadas();
        return i > 0;
    }

    /**
     * Getter para propiedad loteSinFilasEliminadas.
     *
     * @return Valor de la propiedad loteSinFilasEliminadas.
     */
    public boolean isLoteSinFilasEliminadas() {
        return !isLoteConFilasEliminadas();
    }

    /**
     * Getter para propiedad cursorRowAvailable.
     *
     * @return Valor de la propiedad cursorRowAvailable.
     */
    public boolean isCursorRowAvailable() {
        if (isInicializado()) {
            try {
                RowKey rowKey = getCursorRow();
                return isRowAvailable(rowKey);
            } catch (Exception ex) {
            }
        }
        return false;
    }

    /**
     * Getter para propiedad filaEscogidaDisponible.
     *
     * @return Valor de la propiedad filaEscogidaDisponible.
     */
    public boolean isFilaEscogidaDisponible() {
        if (isInicializado()) {
            try {
                RowKey rowKey = getFilaEscogida();
                return isRowAvailable(rowKey);
            } catch (Exception ex) {
            }
        }
        return false;
    }

    /**
     * Conserva el valor de la propiedad idDominioRecurso.
     */
    private static final long ID_DOMINIO_RECURSO = -1L;

    /**
     * Getter para propiedad idDominioRecurso.
     *
     * @return Valor de la propiedad idDominioRecurso.
     */
    public long getIdDominioRecurso() {
        return ID_DOMINIO_RECURSO;
    }

    /**
     * Conserva el valor de la propiedad codigoDominioRecurso.
     */
    private static final String CODIGO_DOMINIO_RECURSO = DB.DOMINIO_RECURSO;

    /**
     * Getter para propiedad codigoDominioRecurso.
     *
     * @return Valor de la propiedad codigoDominioRecurso.
     */
    public String getCodigoDominioRecurso() {
        return CODIGO_DOMINIO_RECURSO;
    }

    /**
     * Conserva el valor de la propiedad nombreDominioRecurso.
     */
    private static final String NOMBRE_DOMINIO_RECURSO = "Recursos";

    /**
     * Getter para propiedad nombreDominioRecurso.
     *
     * @return Valor de la propiedad nombreDominioRecurso.
     */
    public String getNombreDominioRecurso() {
        return NOMBRE_DOMINIO_RECURSO;
    }

    /**
     * Conserva el valor de la propiedad comandoSelect.
     */
    private static final String COMANDO_SELECT = "SELECT * FROM " + DB.DOMINIO_RECURSO + " ";

    /**
     * Getter para propiedad comandoSelect.
     *
     * @return Valor de la propiedad comandoSelect.
     */
    public String getComandoSelect() {
        return COMANDO_SELECT;
    }

    /**
     * Conserva el valor de la propiedad comandoSelectNothing.
     */
    private static final String COMANDO_SELECT_NOTHING = COMANDO_SELECT + "WHERE (0=1)";

    /**
     * Getter para propiedad comandoSelectNothing.
     *
     * @return Valor de la propiedad comandoSelectNothing.
     */
    public String getComandoSelectNothing() {
        return COMANDO_SELECT_NOTHING;
    }

    /**
     * Conserva el valor de la propiedad tablaDestino.
     */
    private static final String TABLA_DESTINO = CODIGO_DOMINIO_RECURSO;

    /**
     * Getter para propiedad tablaDestino.
     *
     * @return Valor de la propiedad tablaDestino.
     */
    public String getTablaDestino() {
        return TABLA_DESTINO;
    }

    /**
     * Getter para propiedad etiquetaRecurso.
     *
     * @return Valor de la propiedad etiquetaRecurso.
     */
    public String getEtiquetaRecurso() {
        return !isInicializado() ? null : getEtiquetaRecurso(getCursorRow());
    }

    /**
     * Getter para propiedad etiquetaRecurso.
     *
     * @return Valor de la propiedad etiquetaRecurso.
     */
    public String getEtiquetaRecurso(RowKey rowKey) {
        Integer id = Integer.valueOf(rowKey.getRowId());
        String tag = Global.PREFIJO_ETIQUETA_ID_RECURSO + String.valueOf(id + 1);
        return tag;
    }

    /**
     * Getter para propiedad denominacionFilaEscogida.
     *
     * @return Valor de la propiedad denominacionFilaEscogida.
     */
    public String getDenominacionFilaEscogida() {
        return getDenominacionFilaEscogida(null);
    }

    /**
     * Getter para propiedad denominacionFilaEscogida.
     *
     * @return Valor de la propiedad denominacionFilaEscogida.
     */
    public String getDenominacionFilaEscogida(String etiqueta) {
        String tag1 = StringUtils.trimToEmpty(etiqueta);
        String tag2 = null;
        if (isInicializado()) { /* DTR (design-time-requirement) */
            RowKey rowKey = getFilaEscogida();
            if (isRowAvailable(rowKey)) {
                String quotes = StringUtils.isBlank(tag1) ? "" : "\"";
                String nosym1 = StringUtils.isBlank(tag1) ? "" : "N\272 ";
                String nosym2 = StringUtils.isBlank(tag1) ? "" : "#";
                String codigo = null;
                String numero = null;
                String serial = null;
                String nombre = null;
                String cognom = null;
                if (isRecursoCodificable()) {
                    String string = getRecursoCodificableDataProvider().getCodigoRecurso(rowKey);
                    codigo = StringUtils.isBlank(string) ? null : quotes + string + quotes;
                }
                if (isRecursoEnumerable()) {
                    Integer number = getRecursoEnumerableDataProvider().getNumeroRecurso(rowKey);
                    numero = number == null ? null : nosym1 + number;
                }
                if (isRecursoIdentificable()) {
                    Long number = getRecursoIdentificableDataProvider().getIdentificacionRecurso(rowKey);
                    serial = number == null ? null : nosym2 + number;
                }
                if (isRecursoNombrable()) {
                    String string = getRecursoNombrableDataProvider().getNombreRecurso(rowKey);
                    nombre = StringUtils.isBlank(string) ? null : quotes + string + quotes;
                    cognom = nombre == null ? null : " (" + string + ")";
                }
                tag2 = codigo != null ? codigo : numero != null ? numero : serial != null ? serial : null;
                tag2 = nombre == null ? tag2
                        : tag2 == null ? nombre : tag2.equalsIgnoreCase(nombre) ? tag2 : tag2 + cognom;
            }
        }
        return StringUtils.isBlank(tag2) ? tag1 : StringUtils.isBlank(tag1) ? tag2 : tag1 + " " + tag2;
    }

    /**
     * Getter para propiedad mensajeCambiosPorConfirmar.
     *
     * @return Valor de la propiedad mensajeCambiosPorConfirmar.
     */
    public String getMensajeCambiosPorConfirmar() {
        if (!isInicializado()) {
            return null;
        }
        String clave = CBM.CHANGES_TO_COMMIT;
        int i = getFilasProcesadas().size();
        int j = getFilasEliminadas();
        return i > 0 || j > 0 ? Bitacora.getTextoMensaje(clave, Integer.valueOf(i), Integer.valueOf(j)) : null;
    }

    /**
     * Getter para propiedad mensajeCambiosPorDescartar.
     *
     * @return Valor de la propiedad mensajeCambiosPorDescartar.
     */
    public String getMensajeCambiosPorDescartar() {
        if (!isInicializado()) {
            return null;
        }
        String clave = CBM.CHANGES_TO_REVERT;
        int i = getFilasProcesadas().size();
        int j = getFilasEliminadas();
        return i > 0 || j > 0 ? Bitacora.getTextoMensaje(clave, Integer.valueOf(i), Integer.valueOf(j)) : null;
    }

    /**
     * Conserva el valor de la propiedad mensajeErrorFinal.
     */
    private String mensajeErrorFinal;

    /**
     * Conserva el valor de la propiedad mensajeAdvertenciaFinal.
     */
    private String mensajeAdvertenciaFinal;

    /**
     * Conserva el valor de la propiedad mensajeInformativoFinal.
     */
    private String mensajeInformativoFinal;

    private void darMensajeFinal() {
        if (mensajeErrorFinal != null) {
            TLC.getBitacora().error(mensajeErrorFinal);
        }
        if (mensajeAdvertenciaFinal != null) {
            TLC.getBitacora().warn(mensajeAdvertenciaFinal);
        }
        if (mensajeInformativoFinal != null) {
            TLC.getBitacora().info(mensajeInformativoFinal);
        }
        resetMensajesFinales();
    }

    private void resetMensajesFinales() {
        mensajeErrorFinal = null;
        mensajeAdvertenciaFinal = null;
        mensajeInformativoFinal = null;
    }

    /**
     * Conserva el valor de la propiedad limiteFilasFuncionSelect.
     */
    private int limiteFilasFuncionSelect = 0;

    /**
     * Getter para propiedad limiteFilasFuncionSelect.
     *
     * @return Valor de la propiedad limiteFilasFuncionSelect.
     */
    public int getLimiteFilasFuncionSelect() {
        return limiteFilasFuncionSelect;
    }

    /**
     * Setter para propiedad limiteFilasFuncionSelect.
     *
     * @param limiteFilasFuncionSelect Nuevo valor de la propiedad limiteFilasFuncionSelect.
     */
    public void setLimiteFilasFuncionSelect(int limiteFilasFuncionSelect) {
        this.limiteFilasFuncionSelect = limiteFilasFuncionSelect;
    }

    public String getDataSourceCachedRowSet() {
        CachedRowSet crs = getCachedRowSet();
        return crs == null ? "" : crs.getDataSourceName();
    }

    protected void setDataSourceCachedRowSet(String dataSource) throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "setDataSourceCachedRowSet", dataSource);
        if (StringUtils.isNotBlank(dataSource)) {
            CachedRowSet crs = getCachedRowSet();
            Bitacora.trace(getClass(), "setDataSourceCachedRowSet",
                    crs == null ? "CachedRowSet=?" : "CachedRowSet=" + crs);
            if (crs != null && !dataSource.equalsIgnoreCase(crs.getDataSourceName())) {
                try {
                    crs.setDataSourceName(dataSource); /* throws SQLException */
                } catch (SQLException ex) {
                    TLC.getBitacora().fatal(ex);
                    throw new ExcepcionAplicacion(ex);
                }
            }
        }
    }

    public String getComandoCachedRowSet() {
        CachedRowSet crs = getCachedRowSet();
        return crs == null ? "" : crs.getCommand();
    }

    protected void setComandoCachedRowSet(String comando) throws ExcepcionAplicacion {
        if (EA.isLoaded() && StringUtils.isBlank(getDataSourceCachedRowSet())) {
            setDataSourceCachedRowSet(EA.getString(EAC.JDBC_DATASOURCE));
        }
        setComandoCachedRowSet(comando, false);
    }

    protected void setComandoCachedRowSet(String comando, boolean refresh) throws ExcepcionAplicacion {
        setComandoCachedRowSet(comando, refresh, 0L);
    }

    private void setComandoCachedRowSet(String comando, boolean refresh, long version) throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "setComandoCachedRowSet", comando, "refresh=" + refresh);
        if (StringUtils.isNotBlank(comando)) {
            CachedRowSet crs = getCachedRowSet();
            Bitacora.trace(getClass(), "setComandoCachedRowSet",
                    crs == null ? "CachedRowSet=?" : "CachedRowSet=" + crs);
            if (crs != null) {
                try {
                    InterpreteSql interprete = TLC.getInterpreteSql();
                    if (interprete != null) {
                        String command = crs.getCommand();
                        String comandoSelect = interprete.getComandoSelect(comando, getLimiteFilasFuncionSelect());
                        if (comandoSelect != null && !comandoSelect.equals(command)) {
                            crs.setCommand(comandoSelect); /* throws SQLException */
                            setComandoSelectAnsi(comando);
                            incrementaVersionComandoSelect();
                            setVersionComandoInsert(version);
                        }
                        if (refresh) {
                            refresh(); /* throws DataProviderException */
                        }
                    }
                } catch (SQLException | DataProviderException ex) {
                    TLC.getBitacora().fatal(ex);
                    throw new ExcepcionAplicacion(ex);
                }
            }
        }
    }

    public String getTablaCachedRowSet() throws SQLException {
        CachedRowSet crs = getCachedRowSet();
        return crs == null ? "" : crs.getTableName();
    }

    protected void setTablaCachedRowSet(String tabla) throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "setTablaCachedRowSet", tabla);
        if (StringUtils.isNotBlank(tabla)) {
            CachedRowSet crs = getCachedRowSet();
            Bitacora.trace(getClass(), "setTablaCachedRowSet",
                    crs == null ? "CachedRowSet=?" : "CachedRowSet=" + crs);
            if (crs != null) {
                try {
                    InterpreteSql interprete = TLC.getInterpreteSql();
                    if (interprete != null) {
                        String tableName = crs.getTableName(); /* throws SQLException */
                        String nombreTabla = interprete.getNombreTabla(tabla);
                        if (nombreTabla != null && !nombreTabla.equals(tableName)) {
                            crs.setTableName(nombreTabla); /* throws SQLException */
                        }
                    }
                } catch (SQLException ex) {
                    TLC.getBitacora().fatal(ex);
                    throw new ExcepcionAplicacion(ex);
                }
            }
        }
    }

    protected void setColumnasInsertables(boolean insertable) {
        CachedRowSet crs = getCachedRowSet();
        if (crs instanceof CachedRowSetX) {
            FieldKey[] keys = getFieldKeys();
            if (keys != null && keys.length > 0) {
                CachedRowSetX crsx = (CachedRowSetX) crs;
                boolean[] columns = crsx.getInsertableColumns();
                if (columns != null) {
                    int colcount = columns.length;
                    if (keys.length != colcount) {
                        columns = new boolean[keys.length];
                    }
                    for (int i = 0; i < columns.length; i++) {
                        columns[i] = insertable;
                    }
                    crsx.setInsertableColumns(columns);
                }
            }
        }
    }

    protected void setColumnasInsertables(String columna, boolean insertable) {
        CachedRowSet crs = getCachedRowSet();
        if (crs instanceof CachedRowSetX) {
            FieldKey[] keys = getFieldKeys();
            if (keys != null && keys.length > 0) {
                CachedRowSetX crsx = (CachedRowSetX) crs;
                boolean[] columns = crsx.getInsertableColumns();
                int colcount = columns == null ? 0 : columns.length;
                if (keys.length != colcount) {
                    columns = new boolean[keys.length];
                    for (int i = 0; i < columns.length; i++) {
                        columns[i] = false;
                    }
                    crsx.setInsertableColumns(columns);
                }
                for (int i = 0; i < keys.length; i++) {
                    if (columna.equalsIgnoreCase(keys[i].getDisplayName())) {
                        crsx.setInsertableColumns(i, insertable);
                    }
                }
            }
        }
    }

    protected void setColumnasModificables(boolean modificable) {
        CachedRowSet crs = getCachedRowSet();
        if (crs instanceof CachedRowSetX) {
            FieldKey[] keys = getFieldKeys();
            if (keys != null && keys.length > 0) {
                CachedRowSetX crsx = (CachedRowSetX) crs;
                boolean[] columns = crsx.getUpdatableColumns();
                if (columns != null) {
                    int colcount = columns.length;
                    if (keys.length != colcount) {
                        columns = new boolean[keys.length];
                    }
                    for (int i = 0; i < columns.length; i++) {
                        columns[i] = modificable;
                    }
                    crsx.setUpdatableColumns(columns);
                }
            }
        }
    }

    protected void setColumnasModificables(String columna, boolean modificable) {
        CachedRowSet crs = getCachedRowSet();
        if (crs instanceof CachedRowSetX) {
            FieldKey[] keys = getFieldKeys();
            if (keys != null && keys.length > 0) {
                CachedRowSetX crsx = (CachedRowSetX) crs;
                boolean[] columns = crsx.getUpdatableColumns();
                int colcount = columns == null ? 0 : columns.length;
                if (keys.length != colcount) {
                    columns = new boolean[keys.length];
                    for (int i = 0; i < columns.length; i++) {
                        columns[i] = false;
                    }
                    crsx.setUpdatableColumns(columns);
                }
                for (int i = 0; i < keys.length; i++) {
                    if (columna.equalsIgnoreCase(keys[i].getDisplayName())) {
                        crsx.setUpdatableColumns(i, modificable);
                    }
                }
            }
        }
    }

    public boolean isColumnaInsertable(String columna) {
        CachedRowSet crs = getCachedRowSet();
        if (crs instanceof CachedRowSetX) {
            FieldKey[] keys = getFieldKeys();
            if (keys == null || keys.length == 0) {
                return false;
            }
            CachedRowSetX crsx = (CachedRowSetX) crs;
            boolean[] columns = crsx.getInsertableColumns();
            if (columns == null || columns.length == 0 || columns.length != keys.length) {
                return false;
            }
            for (int i = 0; i < keys.length; i++) {
                if (columna.equalsIgnoreCase(keys[i].getDisplayName())) {
                    return columns[i];
                }
            }
        }
        return false;
    }

    public boolean isColumnaModificable(String columna) {
        CachedRowSet crs = getCachedRowSet();
        if (crs instanceof CachedRowSetX) {
            FieldKey[] keys = getFieldKeys();
            if (keys == null || keys.length == 0) {
                return false;
            }
            CachedRowSetX crsx = (CachedRowSetX) crs;
            boolean[] columns = crsx.getUpdatableColumns();
            if (columns == null || columns.length == 0 || columns.length != keys.length) {
                return false;
            }
            for (int i = 0; i < keys.length; i++) {
                if (columna.equalsIgnoreCase(keys[i].getDisplayName())) {
                    return columns[i];
                }
            }
        }
        return false;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos correspondientes a la Lista de Opciones">
    public ArrayList getListaOpciones() {
        return getListaOpciones(false, EnumColumnaEtiqueta.AMBAS_COLUMNAS, true);
    }

    public ArrayList getListaOpciones(boolean anulable) {
        return getListaOpciones(anulable, EnumColumnaEtiqueta.AMBAS_COLUMNAS, true);
    }

    public ArrayList getListaOpciones(boolean anulable, String columna) {
        return getListaOpciones(anulable, columna, true);
    }

    public ArrayList getListaOpciones(boolean anulable, EnumColumnaEtiqueta columna) {
        return getListaOpciones(anulable, columna, true);
    }

    public ArrayList getListaOpciones(boolean anulable, boolean ordenado) {
        return getListaOpciones(anulable, EnumColumnaEtiqueta.AMBAS_COLUMNAS, ordenado);
    }

    public ArrayList getListaOpciones(String columna) {
        return getListaOpciones(false, columna, true);
    }

    public ArrayList getListaOpciones(EnumColumnaEtiqueta columna) {
        return getListaOpciones(false, columna, true);
    }

    public ArrayList getListaOpciones(String columna, boolean ordenado) {
        return getListaOpciones(false, columna, ordenado);
    }

    public ArrayList getListaOpciones(EnumColumnaEtiqueta columna, boolean ordenado) {
        return getListaOpciones(false, columna, ordenado);
    }

    public ArrayList getListaOpciones(boolean anulable, String columna, boolean ordenado) {
        return JSF.getListaOpciones(this, anulable, columna, ordenado);
    }

    public ArrayList getListaOpciones(boolean anulable, EnumColumnaEtiqueta columna, boolean ordenado) {
        return JSF.getListaOpciones(this, anulable, columna, ordenado);
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos correspondientes a la Etiqueta de la Transaccion">
    public String getEtiquetaTransaccion(RowKey rowKey) throws SQLException {
        if (isInicializado()) {
            setCursorRow(rowKey); /* throws TableCursorVetoException */
            return getEtiquetaTransaccion();
        }
        return null;
    }

    public String getEtiquetaTransaccion() throws SQLException {
        if (isInicializado()) {
            CachedRowSet crs = getCachedRowSet();
            if (crs == null) {
                return null;
            } else if (crs.rowInserted()) {
                return BundleWebui.getString("database.insert.command");
            } else if (crs.rowUpdated()) {
                return BundleWebui.getString("database.update.command");
            } else if (crs.rowDeleted()) {
                return BundleWebui.getString("database.delete.command");
            } else {
                return BundleWebui.getString("database.commit.command");
            }
        }
        return null;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos correspondientes a appendRow">
    /**
     * {@inheritDoc}
     */
    @Override
    public RowKey appendRow() throws DataProviderException {
        return appendRow(getFuncionInsert());
    }

    public RowKey appendRow(long funcion) throws DataProviderException {
        Bitacora.trace(getClass(), "appendRow", funcion);
        try {
            if (isFuncionUpdateEjecutada() || isFuncionDeleteEjecutada()) {
                throw new ExcepcionAplicacion(TLC.getBitacora().error(CBM.INSERT_ROW_EXCEPTION_4));
            }
            setFuncionInsert(funcion); /* throws ExcepcionAplicacion */
            if (esPermitidoAgregar()) {
                setComandoSelectVersion(); /* throws ExcepcionAplicacion */
                RowKey rowKey = super.appendRow(); /* throws DataProviderException */
                setFuncionInsertEjecutada(true);
                getFilasProcesadas().put(rowKey.getRowId(), rowKey);
                posAppendRow(rowKey, funcion); /* fire afterAppendRow event? */
                setAppendedRowVersion(rowKey);
                setFilaEscogida(rowKey);
                return rowKey;
            }
            String message = getBeforeAppendingProcedureDefaultErrorMessage();
            if (message != null) {
                TLC.getBitacora().error(message);
            }
            String transaction = DBUtils.getTransactionLabel(SyncResolver.INSERT_ROW_CONFLICT);
            TLC.getBitacora().error(CBM.FUNCION_NO_DISPONIBLE, transaction, "");
            return null;
        } catch (ExcepcionAplicacion ex) {
            throw new DataProviderException(ex);
        } catch (DataProviderException ex) {
            TLC.getBitacora().fatal(ex);
            throw ex;
        }
    }

    protected boolean esPermitidoAgregar() {
        Bitacora.trace(getClass(), "esPermitidoAgregar");
        Object object = execute(getBeforeAppendingProcedure(), getIdentificacionMaestro());
        return object instanceof Exception ? false : object == null || BitUtils.valueOf(object);
    }
    //
    //    protected boolean esFilaInsertable(RowKey rowKey, long funcion) {
    //        Bitacora.trace(getClass(), "esFilaInsertable", rowKey, funcion);
    //        return isRowAvailable(rowKey)
    //            && esFilaRecursoActivo(rowKey, funcion)
    //            && esFilaRecursoAutorizado(rowKey, funcion);
    //    }

    protected void setComandoSelectVersion() throws ExcepcionAplicacion {
        if (isRecursoVersionable() && getVersionComandoInsert() == 0L) {
            String columnaId = getRecursoVersionableDataProvider().getColumnaIdentificacionRecurso();
            String columnaVersion = getRecursoVersionableDataProvider().getColumnaVersionRecurso();
            long version = LongUtils.getNewId();
            FiltroBusqueda filtro = new FiltroBusqueda();
            filtro.addCriterio(columnaVersion, OperadorComEnumeration.ES_IGUAL, version);
            String comando = getComandoSelect();
            comando += "WHERE " + filtro.toString() + " ";
            comando += "ORDER BY " + columnaId + " ";
            setComandoCachedRowSet(comando, true, version);
            resetFilter();
        }
    }

    protected void posAppendRow(RowKey rowKey, long funcion) {
        /* fire afterAppendRow event? */
        Bitacora.trace(getClass(), "posAppendRow", rowKey, funcion);
    }

    protected void setAppendedRowVersion(RowKey rowKey) {
        if (isRecursoVersionable()) {
            getRecursoVersionableDataProvider().setVersionRecurso(rowKey, getVersionComandoInsert());
        }
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos correspondientes a editRow">
    public void recursoCachedRowSetDataProvider_valueChanged(TableDataProvider tdp, FieldKey fk, RowKey rk,
            Object o3, Object o4) {
        // o3 es el valor original y o4 es el nuevo
        Bitacora.trace(getClass(), "valueChanged", fk.getDisplayName() + "(" + rk.getRowId() + ")", o3, o4);
        //
        // CachedRowSetX crsx = (CachedRowSetX) getCachedRowSet();
        // FieldKey[] fieldKeys = getFieldKeys();
        // int columnsUpdated = 0;
        // for (int i = 0; i < fieldKeys.length; i++)
        //     if (crsx.columnUpdated(fieldKeys[i].getDisplayName()))
        //         columnsUpdated++;
        //
        try {
            setCursorRow(rk); /* throws TableCursorVetoException */
            if (getFilasProcesadas().containsKey(rk.getRowId())) {
                setFilaEscogida(rk); /* fila recion insertada o ya editada */
            } else {
                String texto = Bitacora.getTextoMensaje(CBM.CHECK_CHANGES_EXCEPTION_3, getEtiquetaRecurso(rk));
                //              boolean b = TLC.getBitacora().isSinDuplicados();
                //              TLC.getBitacora().setSinDuplicados(true);
                //              TLC.getBitacora().error(texto);
                //              TLC.getBitacora().setSinDuplicados(b);
                throw new ExcepcionAplicacion(texto);
            }
        } catch (TableCursorVetoException ex) {
            TLC.getBitacora().fatal(ex); /* throw new DataProviderException(ex); */
        } catch (ExcepcionAplicacion ex) {
            try {
                getCachedRowSet().cancelRowUpdates(); /* throws SQLException */
            } catch (SQLException sqlex) {
                TLC.getBitacora().fatal(sqlex); /* throw new DataProviderException(sqlex); */
            }
        }
    }

    public boolean editRow(RowKey rowKey) throws ExcepcionAplicacion {
        return editRow(rowKey, getFuncionUpdate());
    }

    public boolean editRow(Set rowSet) throws ExcepcionAplicacion {
        return editRow(rowSet, getFuncionUpdate());
    }

    public boolean editRow(Set rowSet, long funcion) throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "editRow", funcion);
        setFuncionUpdate(funcion); /* throws ExcepcionAplicacion */
        if (rowSet.isEmpty()) {
            TLC.getBitacora().warn(CBM.UPDATE_NONE);
            return false;
        }
        boolean edited = false;
        resetMensajesFinales();
        mensajeAdvertenciaFinal = CBM.UPDATE_NONE;
        Iterator iterator = rowSet.iterator();
        while (iterator.hasNext()) {
            RowKey rowKey = (RowKey) iterator.next();
            edited |= editRow(rowKey, funcion); /* throws ExcepcionAplicacion */
        }
        darMensajeFinal();
        return edited;
    }

    public boolean editRow(RowKey rowKey, long funcion) throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "editRow", rowKey, funcion);
        try {
            boolean edited = false;
            if (isRowAvailable(rowKey)) {
                setCursorRow(rowKey); /* throws SQLException */
                if (getFilasProcesadas().containsKey(rowKey.getRowId())) {
                    return false; /* fila recion insertada o ya editada */
                }
                if (getCachedRowSet().rowDeleted() || getCachedRowSet().rowInserted()) { /* throws SQLException */
                    throw new ExcepcionAplicacion(TLC.getBitacora().error(CBM.UPDATE_ROW_EXCEPTION_3));
                }
                if (isFuncionInsertEjecutada() || isFuncionDeleteEjecutada()) {
                    throw new ExcepcionAplicacion(TLC.getBitacora().error(CBM.UPDATE_ROW_EXCEPTION_4));
                }
                setFuncionUpdate(funcion); /* throws ExcepcionAplicacion */
                if (esPermitidoEditar(rowKey)) {
                    if (esFilaModificable(rowKey, funcion)) {
                        setFuncionUpdateEjecutada(true);
                        getFilasProcesadas().put(rowKey.getRowId(), rowKey);
                        posEditRow(rowKey, funcion); /* fire afterEditRow event? */
                        setFilaEscogida(rowKey);
                        edited = true;
                    }
                }
                if (edited) {
                    mensajeAdvertenciaFinal = null;
                } else {
                    mensajeErrorFinal = CBM.CHECK_CHANGES_EXCEPTION_0;
                }
            }
            return edited;
        } catch (SQLException ex) {
            TLC.getBitacora().fatal(ex);
            throw new ExcepcionAplicacion(ex);
        }
    }

    protected boolean esPermitidoEditar(RowKey rowKey) {
        Bitacora.trace(getClass(), "esPermitidoEditar", rowKey);
        Object object = execute(getBeforeEditingProcedure(), getIdentificacionRecurso(rowKey));
        return object instanceof Exception ? false : object == null || BitUtils.valueOf(object);
    }

    protected boolean esFilaModificable(RowKey rowKey, long funcion) {
        Bitacora.trace(getClass(), "esFilaModificable", rowKey, funcion);
        return isRowAvailable(rowKey) && esFilaRecursoActivo(rowKey, funcion)
                && esFilaRecursoAutorizado(rowKey, funcion);
    }

    protected void posEditRow(RowKey rowKey, long funcion) {
        /* fire afterEditRow event? */
        Bitacora.trace(getClass(), "posEditRow", rowKey, funcion);
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos correspondientes a undoRow">
    public boolean undoRow(Set rowSet) throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "undoRow");
        if (rowSet.isEmpty()) {
            TLC.getBitacora().warn(CBM.UNDO_CHANGES_NONE);
            return false;
        } else {
            Iterator iterator = rowSet.iterator();
            while (iterator.hasNext()) {
                RowKey rowKey = (RowKey) iterator.next();
                undoRow(rowKey); /* throws ExcepcionAplicacion */
            }
            return true;
        }
    }

    public boolean undoRow(RowKey rowKey) throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "undoRow", rowKey);
        try {
            if (isRowAvailable(rowKey)) {
                if (getFilasProcesadas()
                        .containsKey(rowKey.getRowId())) { /* fila insertada o editada y aun no confirmada */
                    setCursorRow(rowKey); /* throws SQLException */
                    if (getCachedRowSet().rowInserted()) { /* throws SQLException */
                        // getCachedRowSet().undoInsert(); throws SQLException Y NO FUNCIONA!
                        super.removeRow(
                                rowKey); /* siempre es posible eliminar lo recion insertado y aun no guardado */
                    } else {
                        // getCachedRowSet().undoUpdate(); /* throws SQLException */ NO FUNCIONA!
                        getCachedRowSet().cancelRowUpdates(); /* throws SQLException */
                    }
                    if (esFilaEscogida(rowKey)) {
                        resetFilaEscogida();
                    }
                    getFilasProcesadas().remove(rowKey.getRowId());
                    getFilasConflictivas().remove(rowKey.getRowId());
                    checkRevertChanges();
                    return true;
                }
            } else {
                TLC.getBitacora().warn(CBM.UNDO_CHANGES_NONE);
            }
            return false;
        } catch (SQLException | DataProviderException ex) {
            TLC.getBitacora().fatal(ex);
            throw new ExcepcionAplicacion(ex);
        }
    }

    private boolean checkRevertChanges() throws DataProviderException {
        //      ejecuta el metodo revertChanges si NO quedan filas agregadas, editadas o eliminadas
        //      vale mas un "por si acaso" ...
        boolean check = (getFilasProcesadas().isEmpty() && getFilasEliminadas() == 0);
        if (check) {
            revertChanges();
            refresh();
        }
        return check;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos correspondientes a removeRow">
    /**
     * {@inheritDoc}
     */
    @Override
    public void removeRow(RowKey rowKey) throws DataProviderException {
        removeRow(rowKey, getFuncionDelete()); /* throws ExcepcionAplicacion */
    }

    public void removeRow(Set rowSet) throws DataProviderException {
        removeRow(rowSet, getFuncionDelete()); /* throws ExcepcionAplicacion */
    }

    public void removeRow(Set rowSet, long funcion) throws DataProviderException {
        Bitacora.trace(getClass(), "removeRow", funcion);
        try {
            setFuncionDelete(funcion); /* throws ExcepcionAplicacion */
            if (rowSet.isEmpty()) {
                TLC.getBitacora().warn(CBM.DELETE_NONE);
            } else {
                resetMensajesFinales();
                mensajeAdvertenciaFinal = CBM.DELETE_NONE;
                Iterator iterator = rowSet.iterator();
                while (iterator.hasNext()) {
                    RowKey rowKey = (RowKey) iterator.next();
                    removeRow(rowKey, funcion); /* throws DataProviderException */
                }
                darMensajeFinal();
            }
        } catch (ExcepcionAplicacion ex) {
            throw new DataProviderException(ex);
        } catch (DataProviderException ex) {
            // viene de removeRow(rowKey, funcion) y por lo tanto ya esta anotado en la bitacora
            throw ex;
        }
    }

    public void removeRow(RowKey rowKey, long funcion) throws DataProviderException {
        Bitacora.trace(getClass(), "removeRow", rowKey, funcion);
        try {
            boolean removed = false;
            if (isRowAvailable(rowKey)) {
                setCursorRow(rowKey); /* throws TableCursorVetoException */
                if (getCachedRowSet().rowInserted()) { /* throws SQLException */
                    undoRow(rowKey); /* siempre es posible eliminar lo recion insertado y aun no guardado */
                } else {
                    if (isFuncionInsertEjecutada() || isFuncionUpdateEjecutada()) {
                        throw new ExcepcionAplicacion(TLC.getBitacora().error(CBM.DELETE_ROW_EXCEPTION_4));
                    }
                    setFuncionDelete(funcion); /* throws ExcepcionAplicacion */
                    if (esPermitidoEliminar(rowKey)) {
                        if (esFilaEliminable(rowKey, funcion)) {
                            preRemoveRow(rowKey, funcion); /* fire beforeRemoveRow event? */
                            super.removeRow(rowKey); /* throws DataProviderException */
                            setFuncionDeleteEjecutada(true);
                            getFilasRemovidas().put(rowKey.getRowId(), rowKey);
                            if (esFilaEscogida(rowKey)) {
                                resetFilaEscogida();
                            }
                            getFilasProcesadas().remove(rowKey.getRowId());
                            getFilasConflictivas().remove(rowKey.getRowId());
                            posRemoveRow(rowKey, funcion); /* fire afterRemoveRow event? */
                            incrementaFilasEliminadas();
                            if (cursorNext() || cursorPrevious() || cursorFirst()) {
                                setFilaEscogida();
                            }
                            removed = true;
                        }
                    }
                    if (removed) {
                        mensajeAdvertenciaFinal = null;
                        mensajeInformativoFinal = getMensajeCambiosPorConfirmar();
                    } else {
                        mensajeErrorFinal = CBM.CHECK_CHANGES_EXCEPTION_0;
                    }
                }
            }
        } catch (ExcepcionAplicacion ex) {
            throw new DataProviderException(ex);
        } catch (SQLException ex) {
            TLC.getBitacora().fatal(ex);
            throw new DataProviderException(ex);
        } catch (DataProviderException ex) {
            TLC.getBitacora().fatal(ex);
            throw ex;
        }
    }

    protected boolean esPermitidoEliminar(RowKey rowKey) {
        Bitacora.trace(getClass(), "esPermitidoEliminar", rowKey);
        Object object = execute(getBeforeRemovingProcedure(), getIdentificacionRecurso(rowKey));
        return object instanceof Exception ? false : object == null || BitUtils.valueOf(object);
    }

    protected boolean esFilaEliminable(RowKey rowKey, long funcion) {
        Bitacora.trace(getClass(), "esFilaEliminable", rowKey, funcion);
        return isRowAvailable(rowKey) && esFilaRecursoAutorizado(rowKey, funcion);
    }

    protected void preRemoveRow(RowKey rowKey, long funcion) {
        /* fire beforeRemoveRow event? */
        Bitacora.trace(getClass(), "preRemoveRow", rowKey, funcion);
    }

    protected void posRemoveRow(RowKey rowKey, long funcion) {
        /* fire afterRemoveRow event? */
        Bitacora.trace(getClass(), "posRemoveRow", rowKey, funcion);
        FieldKey[] fields = getFieldKeys();
        for (int i = 0; i < fields.length; i++) {
            Object obj = getValue(fields[i]);
            String value = "NULL";
            if (obj != null) {
                value = getValue(fields[i]).toString();
            }
            Bitacora.trace(fields[i].getDisplayName() + " = " + value);
        }
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos correspondientes a processRow">
    public boolean processRow(Set rowSet, long funcion) throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "processRow", funcion);
        //      if (!TLC.getControlador().esFuncionAutorizada(funcion)) {
        //          throw new ExcepcionAplicacion(TLC.getBitacora().error(CBM.PROCESS_ROW_EXCEPTION_1));
        //      }
        setFuncionBusinessProcess(funcion); /* throws ExcepcionAplicacion */
        if (rowSet.isEmpty()) {
            TLC.getBitacora().warn(CBM.PROCESS_NONE);
            return false;
        }
        boolean processed = false;
        resetMensajesFinales();
        mensajeAdvertenciaFinal = CBM.PROCESS_NONE;
        Iterator iterator = rowSet.iterator();
        while (iterator.hasNext()) {
            RowKey rowKey = (RowKey) iterator.next();
            processed |= processRow(rowKey, funcion); /* throws ExcepcionAplicacion */
        }
        darMensajeFinal();
        return processed;
    }

    public boolean processRow(RowKey rowKey, long funcion) throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "processRow", rowKey, funcion);
        if (canProcessRow(rowKey, funcion)) {
            runProcessRow(rowKey, funcion); /* fire onProcessRow event? */
            posProcessRow(rowKey, funcion); /* fire afterProcessRow event? */
            return true;
        }
        return false;
    }

    public boolean canProcessRow(RowKey rowKey, long funcion) throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "canProcessRow", rowKey, funcion);
        try {
            boolean processed = false;
            if (isRowAvailable(rowKey)) {
                setCursorRow(rowKey); /* throws SQLException */
                if (getCachedRowSet().rowDeleted() || getCachedRowSet().rowUpdated()
                        || getCachedRowSet().rowInserted()) { /* throws SQLException */
                    throw new ExcepcionAplicacion(TLC.getBitacora().error(CBM.PROCESS_ROW_EXCEPTION_3));
                }
                if (isLoteConCambios()) { /*(isFuncionInsertEjecutada() || isFuncionUpdateEjecutada() || isFuncionDeleteEjecutada())*/
                    throw new ExcepcionAplicacion(TLC.getBitacora().error(CBM.PROCESS_ROW_EXCEPTION_4));
                }
                //              if (!TLC.getControlador().esFuncionAutorizada(funcion)) {
                //                  throw new ExcepcionAplicacion(TLC.getBitacora().error(CBM.PROCESS_ROW_EXCEPTION_1));
                //              }
                setFuncionBusinessProcess(funcion); /* throws ExcepcionAplicacion */
                if (esFilaProcesable(rowKey, funcion)) {
                    TLC.getBitacora().hint(CBM.CHECK_CHANGES_1, getEtiquetaRecurso(rowKey));
                    processed = true;
                }
                if (processed) {
                    mensajeAdvertenciaFinal = null;
                } else {
                    mensajeErrorFinal = CBM.CHECK_CHANGES_EXCEPTION_0;
                }
            }
            return processed;
        } catch (SQLException ex) {
            TLC.getBitacora().fatal(ex);
            throw new ExcepcionAplicacion(ex);
        }
    }

    protected boolean esFilaProcesable(RowKey rowKey, long funcion) {
        Bitacora.trace(getClass(), "esFilaProcesable", rowKey, funcion);
        return isRowAvailable(rowKey) && esFilaRecursoAutorizado(rowKey, funcion);
    }

    protected void runProcessRow(RowKey rowKey, long funcion) throws ExcepcionAplicacion {
        /* fire onProcessRow event? */
        Bitacora.trace(getClass(), "runProcessRow", rowKey, funcion);
    }

    protected void posProcessRow(RowKey rowKey, long funcion) {
        /* fire afterProcessRow event? */
        Bitacora.trace(getClass(), "posProcessRow", rowKey, funcion);
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos correspondientes a commit y revert">
    /**
     * (@inheritDoc}
     */
    @Override
    public void commitChanges() throws DataProviderException {
        Bitacora.trace(getClass(), "commitChanges");
        try {
            if (isFuncionDeleteEjecutada() || !getFilasProcesadas().isEmpty()) {
                if (isFuncionDeleteEjecutada() || esLoteValido()) { /* throws ExcepcionAplicacion */
                    beforeCommit();
                    preCommitChanges(); /* graba los rastros de auditoria // throws ExcepcionAplicacion */
                    super.commitChanges(); /* confirma los cambios // throws DataProviderException */
                    posCommitChanges(); /* graba las tareas de usuario // throws ExcepcionAplicacion */
                    afterCommit();
                    resetState();
                } else {
                    throw new ExcepcionAplicacion(TLC.getBitacora().error(CBM.COMMIT_CHANGES_EXCEPTION));
                }
            } else {
                TLC.getBitacora().warn(CBM.NO_CHANGES_TO_COMMIT);
                resetState();
            }
        } catch (DataProviderException ex) {
            TLC.getBitacora().fatal(ex);
            afterCommitException();
            throw ex;
        } catch (Exception ex) {
            afterCommitException();
            throw new DataProviderException(ex);
        }
    }

    private void beforeCommit() {
        //      preCommitRow(rowKey, funcion) modifica tipoRastroFuncion y agrega a listaRastroFuncion y listaTareasUsuario
        tipoRastroFuncion = TipoRastroFunEnumeration.EXITO;
        listaRastroFuncion = getRastrosFuncion();
        listaTareasUsuario = new ArrayList<>();
    }

    private void afterCommit() {
        Long maestro = getIdentificacionMaestro();
        String procedure = maestro == null ? null : getAfterCommitProcedure();
        boolean b0 = procedure != null;
        boolean b1 = listaRastroFuncion != null && !listaRastroFuncion.isEmpty()
                && (testing || loggingEnabledForSuccess());
        boolean b2 = listaTareasUsuario != null && !listaTareasUsuario.isEmpty();
        if (b0 || b1 || b2) {
            Connection connection = TLC.getConnection();
            if (connection != null) {
                try {
                    boolean autoCommit = connection.getAutoCommit();
                    if (DB.setAutoCommit(connection, false)) {
                        if (b0 && TLC.getAgenteSql().isStoredProcedure(procedure)) {
                            Object[] args = new Object[] { maestro };
                            TLC.getAgenteSql().executeProcedure(procedure, args);
                        }
                        if (b1) {
                            for (RastroFuncion rastro : listaRastroFuncion.values()) {
                                TLC.getControlador().grabarRastroFuncion(rastro);
                            }
                        }
                        if (b2) {
                            for (SeudoTareaUsuario seudo : listaTareasUsuario) {
                                TLC.getControlador().grabarTareasUsuario(seudo);
                            }
                        }
                        DB.commit(connection);
                        if (autoCommit) {
                            DB.setAutoCommit(connection, true);
                        }
                    }
                } catch (SQLException ex) {
                    TLC.getBitacora().error(ex);
                    DB.rollback(connection);
                }
            }
        }
        listaRastroFuncion.clear();
        listaTareasUsuario.clear();
    }

    private void afterCommitException() {
        boolean b1 = listaRastroFuncion != null && !listaRastroFuncion.isEmpty()
                && (testing || loggingEnabledForFailure());
        if (b1) {
            Connection connection = TLC.getConnection();
            if (connection != null) {
                try {
                    boolean autoCommit = connection.getAutoCommit();
                    if (DB.setAutoCommit(connection, false)) {
                        grabarRastroFilasConflictivas();
                        DB.commit(connection);
                        if (autoCommit) {
                            DB.setAutoCommit(connection, true);
                        }
                    }
                } catch (SQLException ex) {
                    TLC.getBitacora().error(ex);
                    DB.rollback(connection);
                }
            }
        }
    }

    protected String getAfterCommitProcedure() {
        String tablaDestino = getTablaDestino();
        String tablaMaestro = getTablaMaestro();
        if (StringUtils.isBlank(tablaDestino) || StringUtils.isBlank(tablaMaestro)) {
            return null;
        }
        if (isFuncionInsertEjecutada()) {
            return DB.getAfterAppendingProcedure(tablaDestino, tablaMaestro);
        }
        if (isFuncionUpdateEjecutada()) {
            return DB.getAfterEditingProcedure(tablaDestino, tablaMaestro);
        }
        if (isFuncionDeleteEjecutada()) {
            return DB.getAfterRemovingProcedure(tablaDestino, tablaMaestro);
        }
        return null;
    }

    private void grabarRastroFilasConflictivas() {
        Object object;
        String string;
        RastroFuncion rastro;
        Map filasConflictivas = getFilasConflictivas();
        if (filasConflictivas != null && !filasConflictivas.isEmpty()) {
            for (Object key : filasConflictivas.keySet()) {
                if (key instanceof String) {
                    object = filasConflictivas.get(key);
                    if (object instanceof String) {
                        string = (String) object;
                        if (string.substring(0, 1).matches("[123]")) {
                            rastro = listaRastroFuncion.get((String) key);
                            if (rastro != null) {
                                rastro.setNumeroCondicionEjeFun(
                                        CondicionEjeFunEnumeration.EJECUCION_CANCELADA.intValue());
                                rastro.setDescripcionError(string.substring(1));
                                TLC.getControlador().grabarRastroFuncion(rastro);
                            }
                        }
                    }
                }
            }
        }
    }

    private boolean loggingEnabledForSuccess() {
        switch (tipoRastroFuncion) {
        case EXITO:
        case AMBOS:
            return true;
        default:
            return false;
        }
    }

    private boolean loggingEnabledForFailure() {
        switch (tipoRastroFuncion) {
        case ERROR:
        case AMBOS:
            return true;
        default:
            return false;
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void revertChanges() throws DataProviderException {
        Bitacora.trace(getClass(), "revertChanges");
        super.revertChanges(); /* throws DataProviderException */
        resetState();
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos correspondientes a refresh">
    /**
     * {@inheritDoc}
     */
    @Override
    public void refresh() throws DataProviderException {
        Bitacora.trace(getClass(), "refresh");
        super.refresh(); /* throws DataProviderException */
        resetFlags();
        resetState();
        setFuncionSelectEjecutada(true);
        //      setFuncionDeleteEjecutada(false) en este punto, porque despues del refresh ya no ocurre el java.lang.IllegalArgumentException
        setFuncionDeleteEjecutada(
                false); /* removeRow + appendRow + setCursorRow = java.lang.IllegalArgumentException ... */
        restoreFilaEscogida();
        int limite = getLimiteFilasFuncionSelect();
        if (limite > 0) {
            int filas = getRowCount();
            Bitacora.trace(getClass(), "refresh", "limite=" + limite, "filas=" + filas);
            if (filas == limite) {
                TLC.getBitacora().warn(CBM.SELECT_ROW_LIMIT_REACHED, String.valueOf(limite));
            }
        }
    }

    private void resetFlags() {
        //      setFiltroFuncionSelectModificado(false);
        //      setCodigoFuncionSelectModificado(false);
        //      setNombreFuncionSelectModificado(false);
    }

    private void resetState() {
        getFilasElegidas().clear();
        getFilasProcesadas().clear();
        getFilasRemovidas().clear();
        getFilasConflictivas().clear();
        setFilasEliminadas(0);
        getRastrosFuncion().clear();
        setFuncionInsertEjecutada(false);
        setFuncionUpdateEjecutada(false);
        //----->setFuncionDeleteEjecutada(false); /* removeRow + appendRow + setCursorRow = java.lang.IllegalArgumentException ... */
    }

    public void restoreFilaEscogida() {
        Bitacora.trace(getClass(), "restoreFilaEscogida");
        try {
            if (isLoteSinFilas()) {
                resetFilaEscogida();
            } else {
                RowKey rowKey = null;
                if (isRecursoIdentificable()) {
                    String clave = getRecursoIdentificableDataProvider().getColumnaIdentificacionRecurso();
                    Long valor = getIdentificacionFilaEscogida();
                    Bitacora.trace(getClass(), "restoreFilaEscogida", clave + "=" + valor);
                    if (valor != null) {
                        rowKey = findFirst(clave, valor);
                    }
                }
                if (rowKey == null && isRecursoEnumerable()) {
                    String clave = getRecursoEnumerableDataProvider().getColumnaNumeroRecurso();
                    Integer valor = getNumeroFilaEscogida();
                    Bitacora.trace(getClass(), "restoreFilaEscogida", clave + "=" + valor);
                    if (valor != null) {
                        rowKey = findFirst(clave, valor);
                    }
                }
                if (rowKey == null && isRecursoCodificable()) {
                    String clave = getRecursoCodificableDataProvider().getColumnaCodigoRecurso();
                    String valor = getCodigoFilaEscogida();
                    Bitacora.trace(getClass(), "restoreFilaEscogida", clave + "=" + valor);
                    if (valor != null) {
                        rowKey = findFirst(clave,
                                valor); /* TODO: OJO con (appendRow + codigo que ya existe + revert + refresh) */
                    }
                }
                if (isRowAvailable(rowKey)) {
                    setCursorRow(rowKey);
                    setFilaEscogida(rowKey);
                } else {
                    setFilaEscogida(); /* attempt to set to current cursor row */
                }
            }
        } catch (Exception ex) {
            resetFilaEscogida();
        }
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos correspondientes a release, ...">
    public void release() throws SQLException {
        getCachedRowSet().release();
        incrementaVersionComandoSelect();
        reset();
    }

    public void setComandoEmptyCachedRowSet() throws ExcepcionAplicacion {
        setComandoEmptyCachedRowSet("SELECT * FROM " + getCodigoDominioRecurso() + " WHERE (0=1)");
    }

    public void setComandoEmptyCachedRowSet(String comando) throws ExcepcionAplicacion {
        setComandoCachedRowSet(comando, true);
        reset();
    }

    private void reset() {
        resetFilter();
        resetState();
        setFuncionSelectEjecutada(false);
        setFuncionDeleteEjecutada(false);
        setFilaEscogida(null);
    }

    public void storeQuery() {
        storeCommand();
        storeFilter();
        storeMaster();
    }

    public void restoreQuery() throws ExcepcionAplicacion {
        restoreCommand();
        restoreFilter();
        restoreMaster();
    }

    public void resetFilter() {
        if (isFiltroAnulado()) {
            return;
        }
        setFiltroFuncionSelect(null);
        setCodigoFuncionSelect(null);
        setNombreFuncionSelect(null);
        //      setFiltroFuncionSelectModificado(true);
        //      setCodigoFuncionSelectModificado(true);
        //      setNombreFuncionSelectModificado(true);
        for (CampoBusqueda campo : getCamposBusqueda().values()) {
            campo.setValor(null);
        }
        setFiltroAnulado(true);
    }

    private void resetMaster() {
        setColumnaMaestro(null);
        setIdentificacionMaestro(null);
    }

    private void storeCommand() {
        Bitacora.trace(getClass(), "storeCommand", "Comando=" + getComandoSelectAnsi());
        Bitacora.trace(getClass(), "storeCommand", "Version=" + getVersionComandoSelect());
        setComandoSelectAnterior(getComandoSelectAnsi());
        setVersionComandoSelectAnterior(getVersionComandoSelect());
    }

    private void restoreCommand() throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "restoreCommand", "Comando=" + getComandoSelectAnterior());
        Bitacora.trace(getClass(), "restoreCommand", "Version=" + getVersionComandoSelectAnterior());
        setComandoCachedRowSet(getComandoSelectAnterior(), true);
        setVersionComandoSelect(getVersionComandoSelectAnterior());
    }

    private void storeFilter() {
        Bitacora.trace(getClass(), "storeFilter", "Filtro=" + getFiltroFuncionSelect());
        Bitacora.trace(getClass(), "storeFilter", "Codigo=" + getCodigoFuncionSelect());
        Bitacora.trace(getClass(), "storeFilter", "Nombre=" + getNombreFuncionSelect());
        setFiltroAnulado(false);
        setFiltroFuncionSelectAnterior(getFiltroFuncionSelect());
        setCodigoFuncionSelectAnterior(getCodigoFuncionSelect());
        setNombreFuncionSelectAnterior(getNombreFuncionSelect());
        for (CampoBusqueda campo : getCamposBusqueda().values()) {
            campo.setValorAnterior(campo.getValor());
        }
    }

    public void restoreFilter() {
        Bitacora.trace(getClass(), "restoreFilter", "Filtro=" + getFiltroFuncionSelectAnterior());
        Bitacora.trace(getClass(), "restoreFilter", "Codigo=" + getCodigoFuncionSelectAnterior());
        Bitacora.trace(getClass(), "restoreFilter", "Nombre=" + getNombreFuncionSelectAnterior());
        setFiltroAnulado(false);
        setFiltroFuncionSelect(getFiltroFuncionSelectAnterior());
        setCodigoFuncionSelect(getCodigoFuncionSelectAnterior());
        setNombreFuncionSelect(getNombreFuncionSelectAnterior());
        //      setFiltroFuncionSelectModificado(false);
        //      setCodigoFuncionSelectModificado(false);
        //      setNombreFuncionSelectModificado(false);
        for (CampoBusqueda campo : getCamposBusqueda().values()) {
            campo.setValor(campo.getValorAnterior());
        }
    }

    private void storeMaster() {
        Bitacora.trace(getClass(), "storeMaster", "Clave=" + getColumnaMaestro());
        Bitacora.trace(getClass(), "storeMaster", "Valor=" + getIdentificacionMaestro());
        setColumnaMaestroAnterior(getColumnaMaestro());
        setIdentificacionMaestroAnterior(getIdentificacionMaestro());
    }

    private void restoreMaster() {
        Bitacora.trace(getClass(), "restoreMaster", "Clave=" + getColumnaMaestroAnterior());
        Bitacora.trace(getClass(), "restoreMaster", "valor=" + getIdentificacionMaestroAnterior());
        setColumnaMaestro(getColumnaMaestroAnterior());
        setIdentificacionMaestro(getIdentificacionMaestroAnterior());
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos correspondientes a validaciones">
    public boolean esFilaAmaestrable(RowKey rowKey, String referencia) {
        if (isNotRowAvailable(rowKey)) {
            return false;
        }
        if (StringUtils.isBlank(referencia)) {
            return false;
        }
        return true;
    }

    public boolean esFilaAutorizada(RowKey rowKey, long funcion) {
        Bitacora.trace(getClass(), "esFilaAutorizada", rowKey, funcion);
        boolean es = true;
        try {
            if (isRowAvailable(rowKey)) {
                setCursorRow(rowKey); /* throws SQLException */
                if (getCachedRowSet().rowDeleted() || getCachedRowSet().rowUpdated()
                        || getCachedRowSet().rowInserted()) { /* throws SQLException */
                    TLC.getBitacora().error(CBM.PROCESS_ROW_EXCEPTION_3);
                    es = false;
                }
                if (isLoteConCambios()) { /*(isFuncionInsertEjecutada() || isFuncionUpdateEjecutada() || isFuncionDeleteEjecutada())*/
                    TLC.getBitacora().error(CBM.PROCESS_ROW_EXCEPTION_4);
                    es = false;
                }
                if (TLC.getControlador().esFuncionAutorizada(funcion)) {
                    es &= esFilaRecursoAutorizado(rowKey, funcion);
                } else {
                    TLC.getBitacora().error(CBM.PROCESS_ROW_EXCEPTION_1);
                    es = false;
                }
            } else {
                TLC.getBitacora().warn(CBM.PROCESS_NONE);
                es = false;
            }
        } catch (SQLException ex) {
            TLC.getBitacora().fatal(ex);
            es = false;
        }
        return es;
    }

    public boolean esFilaRecursoActivo(RowKey rowKey, long funcion) {
        Bitacora.trace(getClass(), "esFilaRecursoActivo", rowKey, funcion);
        if (isNotRowAvailable(rowKey)) {
            return false;
        }
        if (isRecursoDesactivable()) {
            Boolean inactivo = getRecursoDesactivableDataProvider().getEsRecursoInactivo(rowKey);
            if (BitUtils.valueOf(inactivo)) {
                TLC.getBitacora().error(CBM.RECURSO_INACTIVO, getEtiquetaRecurso(rowKey));
                return false;
            }
        }
        return true;
    }

    public boolean esFilaRecursoAutorizado(RowKey rowKey, long funcion) {
        Bitacora.trace(getClass(), "esFilaRecursoAutorizado", rowKey, funcion);
        return esFilaRecursoPropio(rowKey, funcion)
                && (segmentoIgualPropietario() || esFilaSegmentoAutorizado(rowKey, funcion));
    }

    private boolean segmentoIgualPropietario() {
        if (isRecursoPersonalizable() && isRecursoSegmentable()) {
            String cpr = getRecursoPersonalizableDataProvider().getColumnaPropietarioRecurso();
            String csr = getRecursoSegmentableDataProvider().getColumnaSegmentoRecurso();
            return cpr.equals(csr);
        }
        return false;
    }

    public boolean esFilaRecursoPropio(RowKey rowKey, long funcion) {
        Bitacora.trace(getClass(), "esFilaRecursoPropio", rowKey, funcion);
        if (isNotRowAvailable(rowKey)) {
            return false;
        }
        if (isRecursoPersonalizable()) {
            Long propietario = getRecursoPersonalizableDataProvider().getPropietarioRecurso(rowKey);
            if (TLC.getControlador().esPropietarioRecurso(propietario, funcion)) {
                return true;
            }
            TLC.getBitacora().error(CBM.USUARIO_NO_PROPIETARIO, getEtiquetaRecurso(rowKey));
            return false;
        }
        return true;
    }

    public boolean esFilaSegmentoAutorizado(RowKey rowKey, long funcion) {
        Bitacora.trace(getClass(), "esFilaSegmentoAutorizado", rowKey, funcion);
        if (isNotRowAvailable(rowKey)) {
            return false;
        }
        if (isRecursoSegmentable()) {
            Long segmento = getRecursoSegmentableDataProvider().getSegmentoRecurso(rowKey);
            if (TLC.getControlador().esSegmentoAutorizado(segmento, funcion)) {
                return true;
            }
            TLC.getBitacora().error(CBM.SEGMENTO_NO_AUTORIZADO, getEtiquetaRecurso(rowKey));
            return false;
        }
        return true;
    }

    public boolean esLoteValido() throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "esLoteValido");
        getFilasConflictivas().clear();
        filasProcesadasPorConfirmar = 0;
        boolean ok = true;
        Collection filas = getFilasProcesadas().values();
        if (filas.isEmpty()) {
            // la lista de filas procesadas no incluye las filas eliminadas,
            // por lo tanto seria valido hacer commit aun cuando este vacia
            // ok = isFuncionDeleteEjecutada();
            // if (!ok)
            // TLC.getBitacora().warn(CBM.NO_CHANGES_TO_COMMIT);
        } else {
            Iterator iterator = filas.iterator();
            while (iterator.hasNext()) {
                RowKey rowKey = (RowKey) iterator.next();
                ok &= esFilaValida(rowKey, true);
            }
        }
        return ok;
    }

    public boolean esFilaValida(RowKey rowKey) throws ExcepcionAplicacion {
        return esFilaValida(rowKey, true);
    }

    private boolean esFilaValida(RowKey rowKey, boolean cursor) throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "esFilaValida", rowKey, String.valueOf(cursor));
        if (isNotRowAvailable(rowKey)) {
            return false;
        }
        try {
            long funcion = -1L;
            int status = SyncResolver.NO_ROW_CONFLICT;
            int tipoError = 3; /* OJO con la constante, 3 -> fila con uno o mas errores, todos conocidos */
            boolean ejecutada = false;
            boolean autorizada = false;
            String comando;
            String mensaje;
            if (cursor) {
                setCursorRow(rowKey); /* throws TableCursorVetoException */
            }
            if (getCachedRowSet().rowInserted()) { /* throws SQLException */
                funcion = getFuncionInsert();
                status = SyncResolver.INSERT_ROW_CONFLICT;
                ejecutada = true; /* isFuncionInsertEjecutada(); */
                autorizada = isFuncionInsertAutorizada();
            } else {
                if (getCachedRowSet().rowUpdated()) { /* throws SQLException */
                    funcion = getFuncionUpdate();
                    status = SyncResolver.UPDATE_ROW_CONFLICT;
                    ejecutada = true; /* isFuncionUpdateEjecutada(); */
                    autorizada = isFuncionUpdateAutorizada();
                }
            }
            boolean es = true;
            if (ejecutada) {
                filasProcesadasPorConfirmar++;
                if (autorizada) {
                    es = esFilaValida(rowKey, funcion); /* check */
                    if (es) {
                        Bitacora.trace(CBM.CHECK_CHANGES_1, getEtiquetaRecurso(rowKey));
                    } else {
                        comando = DBUtils.getTransactionLabel(status);
                        mensaje = tipoError + TLC.getBitacora().error(CBM.CHECK_CHANGES_EXCEPTION_2, comando,
                                getEtiquetaRecurso(rowKey));
                        getFilasConflictivas().put(rowKey.getRowId(), mensaje);
                    }
                } else {
                    comando = DBUtils.getTransactionLabel(status);
                    mensaje = tipoError + TLC.getBitacora().error(CBM.CHECK_CHANGES_EXCEPTION_2, comando,
                            getEtiquetaRecurso(rowKey));
                    getFilasConflictivas().put(rowKey.getRowId(), mensaje);
                }
            } else {
                Bitacora.trace(CBM.CHECK_CHANGES_2, getEtiquetaRecurso(rowKey));
            }
            return es;
        } catch (IllegalArgumentException | SQLException | DataProviderException ex) {
            TLC.getBitacora().fatal(ex);
            throw new ExcepcionAplicacion(ex);
        }
    }

    protected boolean esFilaValida(RowKey rowKey, long funcion) {
        Bitacora.trace(getClass(), "esFilaValida", rowKey, funcion);
        return rowChecker == null ? isRowAvailable(rowKey) : rowChecker.isValidRow(rowKey);
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos correspondientes a preCommitRow">
    protected void preCommitChanges() throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "preCommitChanges");
        if (getFilasProcesadas().size() > 0) {
            Collection filas = getFilasProcesadas().values();
            Iterator iterator = filas.iterator();
            while (iterator.hasNext()) {
                RowKey rowKey = (RowKey) iterator.next();
                preCommitRow(rowKey, true);
            }
        }
        if (getFilasRemovidas().size() > 0) {
            Collection filas = getFilasRemovidas().values();
            Iterator iterator = filas.iterator();
            while (iterator.hasNext()) {
                RowKey rowKey = (RowKey) iterator.next();
                preCommitRow(rowKey, false);
            }
        }
    }

    protected void preCommitRow(RowKey rowKey) throws ExcepcionAplicacion {
        preCommitRow(rowKey, true);
    }

    protected void preCommitRow(RowKey rowKey, boolean cursor) throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "preCommitRow", rowKey, String.valueOf(cursor));
        try {
            long funcion = -1L;
            boolean ejecutada = false;
            if (cursor) {
                setCursorRow(rowKey); /* throws TableCursorVetoException */
                if (getCachedRowSet().rowInserted()) { /* throws SQLException */
                    funcion = getFuncionInsert();
                    ejecutada = true; /* isFuncionInsertEjecutada(); */
                    if (isRecursoIdentificable()) {
                        Long identificacion = getRecursoIdentificableDataProvider()
                                .getIdentificacionRecurso(rowKey);
                        if (identificacion == null || identificacion == 0) {
                            identificacion = LongUtils.getNewId();
                            getRecursoIdentificableDataProvider().setIdentificacionRecurso(rowKey, identificacion);
                        }
                        if (isRecursoCodificable()) {
                            String codigo = getRecursoCodificableDataProvider().getCodigoRecurso(rowKey);
                            if (StringUtils.isBlank(codigo)) {
                                codigo = identificacion.toString();
                                getRecursoCodificableDataProvider().setCodigoRecurso(rowKey, codigo);
                            }
                        }
                    }
                    if (isRecursoEnumerable() && isRecursoCodificable()) {
                        String codigo = getRecursoCodificableDataProvider().getCodigoRecurso(rowKey);
                        if (StringUtils.isBlank(codigo)) {
                            Integer numero = getRecursoEnumerableDataProvider().getNumeroRecurso(rowKey);
                            if (numero != null) {
                                codigo = numero.toString();
                                getRecursoCodificableDataProvider().setCodigoRecurso(rowKey, codigo);
                            }
                        }
                    }
                } else {
                    if (getCachedRowSet().rowUpdated()) { /* throws SQLException */
                        funcion = getFuncionUpdate();
                        ejecutada = true; /* isFuncionUpdateEjecutada(); */
                    } else {
                        if (getCachedRowSet().rowDeleted()) { /* throws SQLException */
                            funcion = getFuncionDelete();
                            ejecutada = true; /* isFuncionDeleteEjecutada(); */
                        }
                    }
                }
            } else {
                funcion = getFuncionDelete();
                ejecutada = true; /* isFuncionDeleteEjecutada(); */
            }
            if (ejecutada && funcion > 0) {
                preCommitRow(rowKey, funcion);
            } else {
                Bitacora.trace(CBM.CHECK_CHANGES_2, getEtiquetaRecurso(rowKey));
            }
        } catch (IllegalArgumentException | SQLException | DataProviderException ex) {
            TLC.getBitacora().fatal(ex);
            throw new ExcepcionAplicacion(ex);
        }
    }

    protected void preCommitRow(RowKey rowKey, long funcion) {
        Bitacora.trace(getClass(), "preCommitRow", rowKey, funcion);
        //      FieldKey[] fields = getFieldKeys();
        //      for (int i = 0; i < fields.length; i++) {
        //          Object obj = getValue(fields[i]);
        //          String value = "NULL";
        //          if (obj != null) {
        //              value = getValue(fields[i]).toString();
        //          }
        //          Bitacora.trace(fields[i].getDisplayName() + " = " + value);
        //      }
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos correspondientes a posCommitRow">
    protected void posCommitChanges() throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "posCommitChanges");
        if (getFilasProcesadas().size() > 0) {
            Collection filas = getFilasProcesadas().values();
            Iterator iterator = filas.iterator();
            while (iterator.hasNext()) {
                RowKey rowKey = (RowKey) iterator.next();
                posCommitRow(rowKey, true);
            }
        }
    }

    protected void posCommitRow(RowKey rowKey) throws ExcepcionAplicacion {
        posCommitRow(rowKey, true);
    }

    protected void posCommitRow(RowKey rowKey, boolean cursor) throws ExcepcionAplicacion {
        Bitacora.trace(getClass(), "posCommitRow", rowKey, String.valueOf(cursor));
        try {
            long funcion = -1L;
            boolean ejecutada = false;
            if (cursor) {
                setCursorRow(rowKey); /* throws TableCursorVetoException */
                if (isFuncionInsertEjecutada()) {
                    funcion = getFuncionInsert();
                    ejecutada = true; /* isFuncionInsertEjecutada(); */
                } else if (isFuncionUpdateEjecutada()) {
                    funcion = getFuncionUpdate();
                    ejecutada = true; /* isFuncionUpdateEjecutada(); */
                }
            }
            if (ejecutada && funcion > 0) {
                posCommitRow(rowKey, funcion);
            }
        } catch (IllegalArgumentException | DataProviderException ex) {
            TLC.getBitacora().fatal(ex);
            throw new ExcepcionAplicacion(ex);
        }
    }

    protected void posCommitRow(RowKey rowKey, long funcion) {
        Bitacora.trace(getClass(), "posCommitRow", rowKey, funcion);
        //      FieldKey[] fields = getFieldKeys();
        //      for (int i = 0; i < fields.length; i++) {
        //          Object obj = getValue(fields[i]);
        //          String value = "NULL";
        //          if (obj != null) {
        //              value = getValue(fields[i]).toString();
        //          }
        //          Bitacora.trace(fields[i].getDisplayName() + " = " + value);
        //      }
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos correspondientes a setValue">
    //  /**
    //   * {@inheritDoc}
    //   */
    //    @Override
    //    public void setValue(String fieldId, Object value) throws DataProviderException {
    //        Object object = getSqlObject(fieldId, value);
    //        super.setValue(fieldId, object);
    //    }
    //
    //  /**
    //   * {@inheritDoc}
    //   */
    //    @Override
    //    public void setValue(String fieldId, RowKey row, Object value) throws DataProviderException {
    //        Object object = getSqlObject(fieldId, value);
    //        super.setValue(fieldId, row, object);
    //    }
    //
    //  /**
    //   * {@inheritDoc}
    //   */
    //  @Override
    //  public void setValue(FieldKey fieldKey, Object value) throws DataProviderException {
    //      Object object = getSqlObject(fieldKey, value);
    //      super.setValue(fieldKey, object);
    //  }
    //
    /**
     * {@inheritDoc}
     */
    @Override
    public void setValue(FieldKey fieldKey, RowKey row, Object value) throws DataProviderException {
        Bitacora.trace(getClass(), "setValue", fieldKey, row, value);
        Object object = getSqlObject(fieldKey, value);
        String columna = fieldKey.getDisplayName();
        if ((isFuncionInsertEjecutada() && isColumnaInsertable(columna))
                || (isFuncionUpdateEjecutada() && isColumnaModificable(columna))) {
            super.setValue(fieldKey, row, object);
        } else {
            Bitacora.trace("IllegalStateException @ "
                    + Bitacora.getTextoMetodo(getClass(), "setValue", fieldKey, row, value));
        }
    }

    private static Calendar calendar = Calendar.getInstance();

    private Object getSqlObject(FieldKey fieldKey, Object value) {
        if (value == null) {
            return null;
        }
        String fieldId = fieldKey.getFieldId();
        int type = getSqlColumnType(fieldId);
        boolean nullable = isNullableColumn(fieldId);
        if (nullable && value instanceof String && StringUtils.isBlank((String) value)) {
            return null;
        }
        Object object = value;
        Bitacora.trace(fieldId + " (" + type + ", " + nullable + ") = (" + object.getClass().getSimpleName() + ") "
                + object);
        switch (type) {
        case java.sql.Types.BIT:
        case java.sql.Types.BOOLEAN:
            object = BitUtils.toBoolean(value);
            break;
        case java.sql.Types.TINYINT:
            object = NumUtils.toByte(value);
            break;
        case java.sql.Types.SMALLINT:
            object = NumUtils.toShort(value);
            break;
        case java.sql.Types.INTEGER:
            object = NumUtils.toInteger(value);
            break;
        case java.sql.Types.BIGINT:
            object = NumUtils.toLong(value);
            break;
        case java.sql.Types.REAL:
            object = NumUtils.toFloat(value);
            break;
        case java.sql.Types.DOUBLE:
        case java.sql.Types.FLOAT:
            object = NumUtils.toDouble(value);
            break;
        case java.sql.Types.DECIMAL:
        case java.sql.Types.NUMERIC:
            object = NumUtils.toBigDecimal(value);
            break;
        case java.sql.Types.DATE:
            object = TimeUtils.toDate(value);
            break;
        case java.sql.Types.TIME:
            object = TimeUtils.toTime(value);
            break;
        case java.sql.Types.TIMESTAMP:
            object = TimeUtils.toTimestamp(value);
            break;
        default:
            break;
        }
        Bitacora.trace(fieldId + " (" + type + ", " + nullable + ") = (" + object.getClass().getSimpleName() + ") "
                + object);
        return object;
    }

    private int getSqlColumnType(String fieldId) {
        try {
            ResultSetMetaData rsmd = getCachedRowSet().getMetaData();
            int numberOfColumns = rsmd.getColumnCount();
            for (int i = 1; i <= numberOfColumns; i++) {
                if (rsmd.getColumnName(i).equalsIgnoreCase(fieldId)) {
                    return rsmd.getColumnType(i);
                }
            }
        } catch (Exception ex) {
            TLC.getBitacora().fatal(ex);
        }
        return java.sql.Types.OTHER;
    }

    private boolean isNullableColumn(String fieldId) {
        try {
            ResultSetMetaData rsmd = getCachedRowSet().getMetaData();
            int numberOfColumns = rsmd.getColumnCount();
            for (int i = 1; i <= numberOfColumns; i++) {
                if (rsmd.getColumnName(i).equalsIgnoreCase(fieldId)) {
                    if (rsmd.isNullable(i) == ResultSetMetaData.columnNullable) {
                        return true;
                    } else {
                        return false;
                    }
                }
            }
        } catch (Exception ex) {
            TLC.getBitacora().fatal(ex);
        }
        return false;
    }

    public boolean isColumnaDisponible(String fieldId) {
        try {
            ResultSetMetaData rsmd = getCachedRowSet().getMetaData();
            int numberOfColumns = rsmd.getColumnCount();
            for (int i = 1; i <= numberOfColumns; i++) {
                if (rsmd.getColumnName(i).equalsIgnoreCase(fieldId)) {
                    return true;
                }
            }
        } catch (Exception ex) {
            TLC.getBitacora().fatal(ex);
        }
        return false;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos correspondientes a funciones get">
    public String getFuncionGetIndicadorInactivo() {
        return null;
    }

    public String getParametroFuncionGetIndicadorInactivo() {
        return null;
    }

    public String getFuncionGetPropietario() {
        return null;
    }

    public String getParametroFuncionGetPropietario() {
        return null;
    }

    public String getFuncionGetSegmento() {
        return null;
    }

    public String getParametroFuncionGetSegmento() {
        return null;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos set maestro, indicador inactivo, propietario y segmento">
    public void setMaestro(RowKey rowKey) {
        String columna = getColumnaMaestro();
        if (isRowAvailable(rowKey) && StringUtils.isNotBlank(columna)) {
            //          Bitacora.trace(getClass(), "setMaestro", columna, rowKey);
            Object maestro = getValue(columna, rowKey);
            if (maestro == null) {
                maestro = getIdentificacionMaestro();
                if (maestro != null) {
                    Bitacora.trace(getClass(), "setMaestro", columna, rowKey, maestro);
                    setValue(columna, rowKey, maestro);
                }
            }
        }
    }

    public void setIndicadorInactivo(RowKey rowKey) {
        if (isRowAvailable(rowKey) && isRecursoDesactivable()) {
            //          Bitacora.trace(getClass(), "setIndicadorInactivo", rowKey);
            Boolean indicador = getRecursoDesactivableDataProvider().getEsRecursoInactivo(rowKey);
            if (indicador == null) {
                indicador = false;
                Bitacora.trace(getClass(), "setIndicadorInactivo", rowKey, indicador);
                getRecursoDesactivableDataProvider().setEsRecursoInactivo(rowKey, indicador);
            }
            // <editor-fold defaultstate="collapsed">
            //          String funcion = getFuncionGetIndicadorInactivo();
            //          String parametro = getParametroFuncionGetIndicadorInactivo();
            //          if (StringUtils.isNotBlank(funcion) && StringUtils.isNotBlank(parametro)) {
            //              Object argumento = getValue(parametro, rowKey);
            //              if (argumento != null) {
            //                  Object objeto = execute(funcion, argumento);
            //                  indicador = BitUtils.toBoolean(objeto);
            //                  Bitacora.trace(getClass(), "setIndicadorInactivo", rowKey, indicador);
            //                  getRecursoDesactivableDataProvider().setEsRecursoInactivo(rowKey, indicador);
            //              }
            //          }
            // </editor-fold>
        }
    }

    public void setPropietario(RowKey rowKey) {
        if (isRowAvailable(rowKey) && isRecursoPersonalizable()) {
            //          Bitacora.trace(getClass(), "setPropietario", rowKey);
            Long propietario = getRecursoPersonalizableDataProvider().getPropietarioRecurso(rowKey);
            if (propietario == null) {
                propietario = TLC.getUsuarioActual().getIdUsuario();
                Bitacora.trace(getClass(), "setPropietario", rowKey, propietario);
                getRecursoPersonalizableDataProvider().setPropietarioRecurso(rowKey, propietario);
            }
            // <editor-fold defaultstate="collapsed">
            //          String funcion = getFuncionGetPropietario();
            //          String parametro = getParametroFuncionGetPropietario();
            //          if (StringUtils.isNotBlank(funcion) && StringUtils.isNotBlank(parametro)) {
            //              Object argumento = getValue(parametro, rowKey);
            //              if (argumento != null) {
            //                  Object objeto = execute(funcion, argumento);
            //                  propietario = NumUtils.toLong(objeto);
            //                  Bitacora.trace(getClass(), "setPropietario", rowKey, propietario);
            //                  getRecursoPersonalizableDataProvider().setPropietarioRecurso(rowKey, propietario);
            //              }
            //          }
            // </editor-fold>
        }
    }
    //
    // <editor-fold defaultstate="collapsed">
    //  public void setSegmento(RowKey rowKey) {
    //      if (isRowAvailable(rowKey) && isRecursoSegmentable()) {
    //          Bitacora.trace(getClass(), "setSegmento", rowKey);
    //          String funcion = getFuncionGetSegmento();
    //          String parametro = getParametroFuncionGetSegmento();
    //          if (StringUtils.isNotBlank(funcion) && StringUtils.isNotBlank(parametro)) {
    //              String maestro = "{master}";
    //              if (funcion.contains(maestro) || parametro.contains(maestro)) {
    //                  String tabla = getTablaMaestro();
    //                  if (StringUtils.isBlank(tabla)) {
    //                      return;
    //                  }
    //                  funcion = funcion.replace(maestro, tabla);
    //                  parametro = getColumnaMaestro();
    //                  if (StringUtils.isBlank(parametro)) {
    //                      return;
    //                  }
    //              }
    //              Object argumento = getValue(parametro, rowKey);
    //              if (argumento != null) {
    //                  Object objeto = execute(funcion, argumento);
    //                  Long segmento = NumUtils.toLong(objeto);
    //                  Bitacora.trace(getClass(), "setSegmento", rowKey, segmento);
    //                  getRecursoSegmentableDataProvider().setSegmentoRecurso(rowKey, segmento);
    //              }
    //          }
    //      }
    //  }
    // </editor-fold>
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos execute y get procedure">
    protected Object execute(String procedure, Object argumento) { // throws SQLException
        Bitacora.trace(getClass(), "execute", procedure, argumento);
        if (StringUtils.isNotBlank(procedure) && argumento != null) {
            try {
                if (TLC.getAgenteSql().isStoredProcedure(procedure)) {
                    Object[] args = new Object[] { argumento };
                    Object resultado = TLC.getAgenteSql().executeProcedure(procedure, args);
                    if (resultado instanceof ResultSet) {
                        ResultSet resultSet = (ResultSet) resultado;
                        if (resultSet.next()) {
                            return resultSet.getObject(1);
                        }
                        //                  } else if (resultado instanceof Number) {
                        //                      return resultado;
                    }
                    return resultado;
                }
            } catch (SQLException ex) {
                String localizedMessage = DBUtils.getProperErrorMessage(ex.getLocalizedMessage());
                TLC.getBitacora().error(localizedMessage);
                return ex;
            }
        }
        return null;
    }

    protected String getBeforeAppendingProcedure() {
        String tablaDestino = getTablaDestino();
        String tablaMaestro = getTablaMaestro();
        return DB.getBeforeAppendingProcedure(tablaDestino, tablaMaestro);
    }

    protected String getBeforeEditingProcedure() {
        String tablaDestino = getTablaDestino();
        return DB.getBeforeEditingProcedure(tablaDestino);
    }

    protected String getBeforeRemovingProcedure() {
        String tablaDestino = getTablaDestino();
        return DB.getBeforeRemovingProcedure(tablaDestino);
    }

    protected String getBeforeAppendingProcedureDefaultErrorMessage() {
        return null;
    }

    protected String getBeforeEditingProcedureDefaultErrorMessage() {
        return null;
    }

    protected String getBeforeRemovingProcedureDefaultErrorMessage() {
        return null;
    }
    // </editor-fold>

}