ips1ap101.lib.core.web.app.GestorPaginaActualizacion.java Source code

Java tutorial

Introduction

Here is the source code for ips1ap101.lib.core.web.app.GestorPaginaActualizacion.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 mas informacin.
 *
 */
package ips1ap101.lib.core.web.app;

import com.sun.data.provider.DataProviderException;
import com.sun.data.provider.RowKey;
import com.sun.webui.jsf.model.Option;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.SQLException;
import java.util.Map;
import ips1ap101.lib.base.BaseBundle;
import ips1ap101.lib.base.bundle.BundleWebui;
import ips1ap101.lib.base.constant.CBM;
import ips1ap101.lib.base.entity.enumeration.OperadorComEnumeration;
import ips1ap101.lib.base.util.NumUtils;
import ips1ap101.lib.core.app.Bitacora;
import ips1ap101.lib.core.app.CampoBusqueda;
import ips1ap101.lib.core.app.ExcepcionAplicacion;
import ips1ap101.lib.core.app.FiltroBusqueda;
import ips1ap101.lib.core.app.TLC;
import ips1ap101.lib.core.constant.Global;
import ips1ap101.lib.core.db.xdp.RecursoCachedRowSetDataProvider;
import ips1ap101.lib.core.db.xdp.RecursoCodificableDataProvider;
import ips1ap101.lib.core.db.xdp.RecursoConsultableDataProvider;
import ips1ap101.lib.core.db.xdp.RecursoEnumerableDataProvider;
import ips1ap101.lib.core.db.xdp.RecursoIdentificableDataProvider;
import ips1ap101.lib.core.db.xdp.RecursoNombrableDataProvider;
import ips1ap101.lib.core.db.xdp.RecursoSegmentableDataProvider;
import ips1ap101.lib.core.enumeration.EnumOpcionAbrirVentana;
import ips1ap101.lib.core.enumeration.EnumSeveridadMensaje;
import ips1ap101.lib.core.util.ClassX;
import ips1ap101.lib.core.util.JS;
import ips1ap101.lib.core.util.STP;
import ips1ap101.lib.core.util.TypeValuePair;
import org.apache.commons.lang.StringUtils;

/**
 * @author Jorge Campins
 */
public class GestorPaginaActualizacion extends GestorPaginaBasica {

    public static GestorPaginaActualizacion newInstance() {
        Class<?> clase = GestorPaginaActualizacion.class;
        String subclase = ClassX.get().subclassName(clase, "page_delegate");
        Object instance = ClassX.get().newInstance(clase, subclase);
        return (GestorPaginaActualizacion) instance;
    }

    public static GestorPaginaActualizacion newInstance(PaginaActualizacion pagina) {
        Class<?> clase = GestorPaginaActualizacion.class;
        TypeValuePair parametro = new TypeValuePair(PaginaActualizacion.class, pagina);
        String subclase = ClassX.get().subclassName(clase, "page_delegate");
        Object instance = ClassX.get().newInstance(clase, subclase, parametro);
        return (GestorPaginaActualizacion) instance;
    }

    public GestorPaginaActualizacion() {
        super();
    }

    public GestorPaginaActualizacion(PaginaActualizacion pagina) {
        super(pagina);
    }

    private static final int LIMITE_FILAS_FUNCION_SELECT = 500;

    // <editor-fold defaultstate="collapsed" desc="propiedades estandar de la pagina de actualizacion">
    /**
     * Getter para propiedad paginaActualizacion.
     *
     * @return Valor de la propiedad paginaActualizacion.
     */
    protected PaginaActualizacion getPaginaActualizacion() {
        return getPaginaBasica() instanceof PaginaActualizacion ? (PaginaActualizacion) getPaginaBasica() : null;
    }

    /**
     * Getter para propiedad paginaActualizacionConAccionMultiple.
     *
     * @return Valor de la propiedad paginaActualizacionConAccionMultiple.
     */
    protected PaginaActualizacionConAccionMultiple getPaginaActualizacionConAccionMultiple() {
        return getPaginaBasica() instanceof PaginaActualizacionConAccionMultiple
                ? (PaginaActualizacionConAccionMultiple) getPaginaBasica()
                : null;
    }

    /**
     * Getter para propiedad paginaActualizacionConEdicionMultiple.
     *
     * @return Valor de la propiedad paginaActualizacionConEdicionMultiple.
     */
    protected PaginaActualizacionConEdicionMultiple getPaginaActualizacionConEdicionMultiple() {
        return getPaginaBasica() instanceof PaginaActualizacionConEdicionMultiple
                ? (PaginaActualizacionConEdicionMultiple) getPaginaBasica()
                : null;
    }

    /**
     * Getter para propiedad paginaConsultaConFiltro.
     *
     * @return Valor de la propiedad paginaConsultaConFiltro.
     */
    protected PaginaConsultaConFiltro getPaginaConsultaConFiltro() {
        return getPaginaBasica() instanceof PaginaConsultaConFiltro ? (PaginaConsultaConFiltro) getPaginaBasica()
                : null;
    }

    /**
     * Getter para propiedad paginaConsultaConMaestro.
     *
     * @return Valor de la propiedad paginaConsultaConMaestro.
     */
    protected PaginaConsultaConMaestro getPaginaConsultaConMaestro() {
        return getPaginaBasica() instanceof PaginaConsultaConMaestro ? (PaginaConsultaConMaestro) getPaginaBasica()
                : null;
    }

    public boolean isPaginaConsultaConMaestro() {
        if (designing) {
            return true;
        }
        return getPaginaBasica() instanceof PaginaConsultaConMaestro;
    }

    public boolean isPaginaConsultaConArbol() {
        if (designing) {
            return true;
        }
        return getPaginaBasica() instanceof PaginaConsultaConArbol;
    }

    public boolean isPaginaConsultaConTabla() {
        if (designing) {
            return true;
        }
        return getPaginaBasica() instanceof PaginaConsultaConTabla;
    }

    public boolean isPaginaConsultaConFiltro() {
        if (designing) {
            return true;
        }
        return getPaginaBasica() instanceof PaginaConsultaConFiltro;
    }

    public boolean isPaginaConsultaSinFiltro() {
        return !isPaginaConsultaConFiltro();
    }

    protected boolean isPaginaActualizacionConAccionMultiple() {
        return getPaginaBasica() instanceof PaginaActualizacionConAccionMultiple;
    }

    protected boolean isPaginaActualizacionConEdicionMultiple() {
        return getPaginaBasica() instanceof PaginaActualizacionConEdicionMultiple;
    }

    protected RecursoIdentificableDataProvider getRecursoIdentificableDataProvider() {
        return getPaginaActualizacion().getRecursoDataProvider().getRecursoIdentificableDataProvider();
    }

    protected RecursoIdentificableDataProvider getRecursoMaestroIdentificableDataProvider() {
        return isPaginaConsultaConMaestro()
                ? getPaginaConsultaConMaestro().getRecursoMaestroDataProvider()
                        .getRecursoIdentificableDataProvider()
                : null;
    }

    protected RecursoEnumerableDataProvider getRecursoMaestroEnumerableDataProvider() {
        return isPaginaConsultaConMaestro()
                ? getPaginaConsultaConMaestro().getRecursoMaestroDataProvider().getRecursoEnumerableDataProvider()
                : null;
    }

    protected RecursoCodificableDataProvider getRecursoCodificableDataProvider() {
        return getPaginaActualizacion().getRecursoDataProvider().getRecursoCodificableDataProvider();
    }

    protected RecursoNombrableDataProvider getRecursoNombrableDataProvider() {
        return getPaginaActualizacion().getRecursoDataProvider().getRecursoNombrableDataProvider();
    }

    protected RecursoSegmentableDataProvider getRecursoSegmentableDataProvider() {
        return getPaginaActualizacion().getRecursoDataProvider().getRecursoSegmentableDataProvider();
    }

    protected RecursoConsultableDataProvider getRecursoConsultableDataProvider() {
        return getPaginaActualizacion().getRecursoDataProvider().getRecursoConsultableDataProvider();
    }

    protected RecursoConsultableDataProvider getRecursoMaestroConsultableDataProvider() {
        return isPaginaConsultaConMaestro()
                ? getPaginaConsultaConMaestro().getRecursoMaestroDataProvider().getRecursoConsultableDataProvider()
                : null;
    }

    protected String getRecursoDataProviderDataSourceName() {
        return getPaginaActualizacion().getRecursoDataProvider().getCachedRowSet().getDataSourceName();
    }

    protected String getRecursoMaestroDataProviderDataSourceName() {
        return getPaginaConsultaConMaestro().getRecursoMaestroDataProvider().getCachedRowSet().getDataSourceName();
    }

    protected boolean isConsultaInsert() {
        if (designing) {
            return false;
        }
        return getPaginaActualizacion().getRecursoDataProvider().isConsultaInsertDisponible();
    }

    protected boolean isConsultaAnteriorDisponible() {
        if (designing) {
            return true;
        }
        return getPaginaActualizacion().getRecursoDataProvider().isConsultaAnteriorDisponible();
    }

    protected boolean isConsultaValida() {
        if (designing) {
            return true;
        }
        track("isConsultaValida");
        boolean ok = !isRestauracion()
                && getPaginaActualizacion().getRecursoDataProvider().isFuncionSelectAutorizada();
        if (ok) {
            long f1 = getPaginaActualizacion().getRecursoDataProvider().getFuncionSelect();
            long f2 = getPaginaActualizacion().getFuncionConsultarRecurso();
            trace("funcion-actual=" + f1 + ", funcion-anterior=" + f2);
            ok = f1 == f2;
        }
        if (ok) {
            long v1 = getPaginaActualizacion().getRecursoDataProvider().getVersionComandoSelect();
            long v2 = getPaginaActualizacion().getContextoSesion().getVersionComandoSelectPagina();
            trace("version-actual=" + v1 + ", version-anterior=" + v2);
            ok = v1 == v2;
        }
        if (ok && isReinicio()) {
            String c1 = StringUtils
                    .trimToNull(getPaginaActualizacion().getRecursoDataProvider().getConsultaBusqueda());
            String c2 = StringUtils
                    .trimToNull(getPaginaActualizacion().getContextoPeticion().getConsultaBusqueda());
            trace("consulta-actual=" + c1 + ", consulta-anterior=" + c2);
            ok = c1 == null ? c2 == null : c1.equals(c2);
        }
        if (ok && isReinicio()) {
            String c1 = StringUtils
                    .trimToNull(getPaginaActualizacion().getRecursoDataProvider().getCriteriosBusqueda());
            String c2 = StringUtils
                    .trimToNull(getPaginaActualizacion().getContextoPeticion().getCriteriosBusqueda());
            trace("criterio-actual=" + c1 + ", criterio-anterior=" + c2);
            ok = c1 == null ? c2 == null : c1.equals(c2);
        }
        if (ok) {
            //          String c1 = getColumnaIdentificacionRecursoMaestro();
            String c1 = getPaginaActualizacion().getRecursoDataProvider().getColumnaMaestro();
            String c2 = getPaginaActualizacion().getContextoSesion().getColumnaIdentificacionRecursoMaestroPagina();
            trace("maestro-actual=" + c1 + ", maestro-anterior=" + c2);
            ok = c1 == null ? c2 == null : c1.equals(c2);
        }
        if (ok) {
            //          Long i1 = getIdentificacionRecursoMaestro();
            Long i1 = getPaginaActualizacion().getRecursoDataProvider().getIdentificacionMaestro();
            Long i2 = getPaginaActualizacion().getContextoSesion().getIdentificacionRecursoMaestroPagina();
            trace("maestro-actual=" + i1 + ", maestro-anterior=" + i2);
            ok = i1 == null ? i2 == null : i1.equals(i2);
        }
        return ok;
    }

    protected boolean isConsultaInvalida() {
        return !isConsultaValida();
    }

    protected Long getIdentificacionRecursoActual() {
        if (designing) {
            return null;
        }
        Long valor = null;
        try {
            if (getPaginaActualizacion().getRecursoDataProvider().isRecursoIdentificable()) {
                RowKey rowKey = getCurrentRowKey();
                if (getPaginaActualizacion().getRecursoDataProvider().isRowAvailable(rowKey)) {
                    valor = getRecursoIdentificableDataProvider().getIdentificacionRecurso(rowKey);
                }
            }
        } catch (Exception ex) {
            handle(ex);
        } finally {
            return valor;
        }
    }

    protected Long getIdentificacionRecursoEscogido() {
        if (designing) {
            return null;
        }
        Long valor = null;
        try {
            if (getPaginaActualizacion().getRecursoDataProvider().isRecursoIdentificable()) {
                if (getPaginaActualizacion().getRecursoDataProvider().isFilaEscogidaDisponible()) {
                    RowKey rowKey = getPaginaActualizacion().getRecursoDataProvider().getFilaEscogida();
                    valor = getRecursoIdentificableDataProvider().getIdentificacionRecurso(rowKey);
                }
            }
        } catch (Exception ex) {
            handle(ex);
        } finally {
            return valor;
        }
    }

    protected String getColumnaIdentificacionRecurso() {
        if (designing) {
            return null;
        }
        String columna = null;
        if (getPaginaActualizacion().getRecursoDataProvider().isRecursoIdentificable()) {
            columna = getRecursoIdentificableDataProvider().getColumnaIdentificacionRecurso();
        }
        return columna;
    }

    protected String getColumnaIdentificacionRecursoMaestro() {
        if (designing) {
            return null;
        }
        String columna = null;
        RecursoCachedRowSetDataProvider recursoMaestroDataProvider;
        if (isPaginaConsultaConMaestro()) {
            columna = getPaginaConsultaConMaestro().getColumnaIdentificacionRecursoMaestro();
            if (StringUtils.isBlank(columna)) {
                recursoMaestroDataProvider = getPaginaConsultaConMaestro().getRecursoMaestroDataProvider();
                if (recursoMaestroDataProvider == null) {
                } else if (recursoMaestroDataProvider.isRecursoIdentificable()) {
                    columna = getRecursoMaestroIdentificableDataProvider().getColumnaIdentificacionRecurso();
                } else if (recursoMaestroDataProvider.isRecursoEnumerable()) {
                    columna = getRecursoMaestroEnumerableDataProvider().getColumnaNumeroRecurso();
                }
            }
        }
        return columna;
    }

    protected Long getIdentificacionRecursoMaestro() {
        if (designing) {
            return null;
        }
        Long valor = null;
        RecursoCachedRowSetDataProvider recursoMaestroDataProvider;
        RowKey rowKey;
        try {
            if (isPaginaConsultaConMaestro()) {
                recursoMaestroDataProvider = getPaginaConsultaConMaestro().getRecursoMaestroDataProvider();
                if (recursoMaestroDataProvider == null) {
                } else if (recursoMaestroDataProvider.isFilaEscogidaDisponible()) {
                    rowKey = recursoMaestroDataProvider.getFilaEscogida();
                    if (rowKey == null) {
                    } else if (recursoMaestroDataProvider.isRecursoIdentificable()) {
                        valor = getRecursoMaestroIdentificableDataProvider().getIdentificacionRecurso(rowKey);
                    } else if (recursoMaestroDataProvider.isRecursoEnumerable()) {
                        valor = NumUtils.toLong(getRecursoMaestroEnumerableDataProvider().getNumeroRecurso(rowKey));
                    }
                }
            }
        } catch (Exception ex) {
            handle(ex);
        } finally {
            return valor;
        }
    }

    public String getDenominacionFilaMaestro() {
        if (designing) {
            return null;
        }
        return isPaginaConsultaConMaestro()
                ? getPaginaConsultaConMaestro().getRecursoMaestroDataProvider().getDenominacionFilaEscogida()
                : null;
    }

    public RowKey getCurrentRowKey() {
        if (designing) {
            return null;
        }
        return getPaginaActualizacion().getRecursoDataProvider().getCursorRow();
    }

    public String getIdentificacionFila() {
        if (designing) {
            return null;
        }
        RowKey rowKey = getCurrentRowKey();
        return getPaginaActualizacion().getRecursoDataProvider().isRowAvailable(rowKey)
                ? String.valueOf(Integer.parseInt(rowKey.getRowId()) + 1)
                : null;
    }

    public boolean isFuncionSelectHabilitada() {
        if (designing) {
            return true;
        }
        return (getPaginaActualizacion().getFuncionConsultarRecurso() > 0
                && getPaginaActualizacion().getRecursoDataProvider().isFuncionSelectHabilitada());
    }

    public boolean isFuncionSelectInhabilitada() {
        return !isFuncionSelectHabilitada();
    }

    public boolean isFuncionInsertHabilitada() {
        if (designing) {
            return true;
        }
        return (getPaginaActualizacion().getFuncionCrearRecurso() > 0
                && getPaginaActualizacion().getRecursoDataProvider().isFuncionInsertHabilitada());
    }

    public boolean isFuncionInsertInhabilitada() {
        return !isFuncionInsertHabilitada();
    }

    public boolean isFuncionUpdateHabilitada() {
        if (designing) {
            return true;
        }
        return (getPaginaActualizacion().getFuncionModificarRecurso() > 0
                && getPaginaActualizacion().getRecursoDataProvider().isFuncionUpdateHabilitada()
                && isEdicionMultiFuncionInhabilitada());
    }

    public boolean isFuncionUpdateInhabilitada() {
        return !isFuncionUpdateHabilitada();
    }

    public boolean isFuncionDeleteHabilitada() {
        if (designing) {
            return true;
        }
        return (getPaginaActualizacion().getFuncionEliminarRecurso() > 0
                && getPaginaActualizacion().getRecursoDataProvider().isFuncionDeleteHabilitada());
    }

    public boolean isFuncionDeleteInhabilitada() {
        return !isFuncionDeleteHabilitada();
    }

    public boolean isFuncionCheckChangesHabilitada() {
        if (designing) {
            return true;
        }
        return (isFilaDisponible()
                && getPaginaActualizacion().getRecursoDataProvider().esFilaProcesada(getCurrentRowKey()));
    }

    public boolean isFuncionCheckChangesInhabilitada() {
        return !isFuncionCheckChangesHabilitada();
    }

    public boolean isFuncionCancelUpdateHabilitada() {
        if (designing) {
            return true;
        }
        return (isFilaDisponible()
                && getPaginaActualizacion().getRecursoDataProvider().esFilaProcesada(getCurrentRowKey()));
    }

    public boolean isFuncionCancelUpdateInhabilitada() {
        return !isFuncionCancelUpdateHabilitada();
    }

    public boolean isFuncionCommitHabilitada() {
        if (designing) {
            return true;
        }
        return isLoteConCambios();
    }

    public boolean isFuncionCommitInhabilitada() {
        return !isFuncionCommitHabilitada();
    }

    public boolean isFuncionRevertHabilitada() {
        if (designing) {
            return true;
        }
        return isLoteConCambios();
    }

    public boolean isFuncionRevertInhabilitada() {
        return !isFuncionRevertHabilitada();
    }

    public boolean isFuncionExecuteHabilitada() {
        if (designing) {
            return true;
        }
        return isAccionMultiFuncionHabilitada()
                && getPaginaActualizacion().getRecursoDataProvider().isFuncionBusinessProcessHabilitada();
    }

    public boolean isFuncionExecuteInhabilitada() {
        return !isFuncionExecuteHabilitada();
    }

    public boolean isFuncionRefreshHabilitada() {
        if (designing) {
            return true;
        }
        return (getPaginaActualizacion().getRecursoDataProvider().isFuncionSelectEjecutada()
                && getPaginaActualizacion().getRecursoDataProvider().isFuncionSelectHabilitada());
    }

    public boolean isFuncionRefreshInhabilitada() {
        return !isFuncionRefreshHabilitada();
    }

    public boolean isFuncionRequeryHabilitada() {
        if (designing) {
            return true;
        }
        return isFuncionSelectHabilitada() && isConsultaAnteriorDisponible() && isConsultaInsert();
    }

    public boolean isFuncionRequeryInhabilitada() {
        return !isFuncionRequeryHabilitada();
    }

    public boolean isFuncionRestoreFilterHabilitada() {
        if (designing) {
            return true;
        }
        return isFuncionSelectHabilitada() && isConsultaAnteriorDisponible();
    }

    public boolean isFuncionRestoreFilterInhabilitada() {
        return !isFuncionRestoreFilterHabilitada();
    }

    public boolean isFuncionReturnHabilitada() {
        if (designing) {
            return true;
        }
        return (isFilaDisponible() && isValorRetornoRecursoDisponible()
                && getPaginaActualizacion().getRecursoDataProvider().isLoteSinCambios());
    }

    public boolean isFuncionReturnInhabilitada() {
        return !isFuncionReturnHabilitada();
    }

    public boolean isFuncionReturnFilaEscogidaHabilitada() {
        if (designing) {
            return true;
        }
        return (isFilaEscogidaDisponible() && isValorRetornoRecursoDisponible()
                && getPaginaActualizacion().getRecursoDataProvider().isLoteSinCambios());
    }

    public boolean isFuncionReturnFilaEscogidaInhabilitada() {
        return !isFuncionReturnFilaEscogidaHabilitada();
    }

    public boolean isFuncionReturnVisible() {
        if (designing) {
            return true;
        }
        return getPaginaActualizacion().getContextoSesion().getOpcionCampoRetorno() != null;
    }

    public boolean isFuncionReturnInvisible() {
        return !isFuncionReturnVisible();
    }

    public boolean isFuncionPickItemHabilitada() {
        return true;
    }

    public boolean isFuncionPickItemInhabilitada() {
        return !isFuncionPickItemHabilitada();
    }

    public boolean isFuncionOpenLinkHabilitada() {
        if (designing) {
            return true;
        }
        return isFilaEscogidaDisponible() && isLoteSinCambios();
    }

    public boolean isFuncionOpenLinkInhabilitada() {
        return !isFuncionOpenLinkHabilitada();
    }

    public boolean isFilaAmaestrable(String referencia) {
        if (designing) {
            return true;
        }
        return getPaginaActualizacion().getRecursoDataProvider().esFilaAmaestrable(getCurrentRowKey(), referencia);
    }

    public boolean isFilaDisponible() {
        if (designing) {
            return true;
        }
        return getPaginaActualizacion().getRecursoDataProvider().isRowAvailable(getCurrentRowKey());
    }

    public boolean isFilaNoDisponible() {
        if (designing) {
            return true; /* OJO: para que muestre el correspondiente grid de la P2 */
        }
        return !isFilaDisponible();
    }

    public boolean isFilaEscogida() {
        if (designing) {
            return false; /* OJO: para que las filas de la tabla no aparezcan todas resaltadas */
        }
        return getPaginaActualizacion().getRecursoDataProvider().esFilaEscogida(getCurrentRowKey());
    }

    public boolean isFilaEscogidaDisponible() {
        if (designing) {
            return true;
        }
        return (getPaginaActualizacion().getRecursoDataProvider()
                .isRowAvailable(getPaginaActualizacion().getRecursoDataProvider().getFilaEscogida()));
    }

    public boolean isFilaEscogidaNoDisponible() {
        return !isFilaEscogidaDisponible();
    }

    public boolean isFilaCreada() { /* 14/08/2007 "Fila procesada por FuncionCrearRecurso" */
        if (designing) {
            return true;
        }
        return (getPaginaActualizacion().getRecursoDataProvider().esFilaProcesada(getCurrentRowKey())
                && getPaginaActualizacion().getRecursoDataProvider().isFuncionInsertEjecutada()
                && getPaginaActualizacion().getRecursoDataProvider().getFuncionInsert() == getPaginaActualizacion()
                        .getFuncionCrearRecurso());
    }

    public boolean isFilaNoCreada() { /* 14/08/2007 "Fila no procesada por FuncionCrearRecurso" */
        return !isFilaCreada();
    }

    public boolean isFilaModificada() { /* 14/08/2007 "Fila procesada por FuncionModificarRecurso" */
        if (designing) {
            return true;
        }
        return (getPaginaActualizacion().getRecursoDataProvider().esFilaProcesada(getCurrentRowKey())
                && getPaginaActualizacion().getRecursoDataProvider().isFuncionUpdateEjecutada()
                && getPaginaActualizacion().getRecursoDataProvider().getFuncionUpdate() == getPaginaActualizacion()
                        .getFuncionModificarRecurso());
    }

    public boolean isFilaNoModificada() { /* 14/08/2007 "Fila no procesada por FuncionModificarRecurso" */
        return !isFilaModificada();
    }

    public boolean isFilaProcesada() {
        if (designing) {
            return true;
        }
        // 19/06/2007 a partir de hoy significa "Fila procesada por FuncionCrearRecurso o FuncionModificarRecurso"
        if (getPaginaActualizacion().getRecursoDataProvider().esFilaProcesada(getCurrentRowKey())) {
            if (getPaginaActualizacion().getRecursoDataProvider().isFuncionInsertEjecutada()) {
                return (getPaginaActualizacion().getRecursoDataProvider()
                        .getFuncionInsert() == getPaginaActualizacion().getFuncionCrearRecurso());
            }
            if (getPaginaActualizacion().getRecursoDataProvider().isFuncionUpdateEjecutada()) {
                return (getPaginaActualizacion().getRecursoDataProvider()
                        .getFuncionUpdate() == getPaginaActualizacion().getFuncionModificarRecurso());
            }
        }
        return false;
    }

    public boolean isFilaNoProcesada() {
        return !isFilaProcesada();
    }

    public boolean isFilaDisponibleProcesada() {
        return isFilaDisponible() && isFilaProcesada();
    }

    public boolean isFilaDisponibleNoProcesada() {
        return isFilaDisponible() && isFilaNoProcesada();
    }

    public boolean isFilaConCambios() {
        if (designing) {
            return true;
        }
        try {
            return (getPaginaActualizacion().getRecursoDataProvider().getCachedRowSet().rowInserted()
                    || getPaginaActualizacion().getRecursoDataProvider().getCachedRowSet().rowUpdated()
                    || getPaginaActualizacion().getRecursoDataProvider().getCachedRowSet().rowDeleted());
        } catch (Exception ex) {
            handle(ex);
        }
        return false;
    }

    public boolean isFilaSinCambios() {
        if (designing) {
            return true;
        }
        return !isFilaConCambios();
    }

    public boolean isLoteConCambios() {
        if (designing) {
            return true;
        }
        return getPaginaActualizacion().getRecursoDataProvider().isLoteConCambios();
    }

    public boolean isLoteSinCambios() {
        if (designing) {
            return true;
        }
        return !isLoteConCambios();
    }

    public boolean isLoteConFilas() {
        if (designing) {
            return true;
        }
        return getPaginaActualizacion().getRecursoDataProvider().isLoteConFilas();
    }

    public boolean isLoteSinFilas() {
        if (designing) {
            return true;
        }
        return !isLoteConFilas();
    }

    //  public boolean isLoteConFilasEliminadas() {
    //      if (designing) {
    //          return true;
    //      }
    //      return getPaginaActualizacion().getRecursoDataProvider().isLoteConFilasEliminadas();
    //  }
    //
    //  public boolean isLoteSinFilasEliminadas() {
    //      return !isLoteConFilasEliminadas();
    //  }
    //
    public boolean isParametroFuncionConsultarAutorizado(String parametro) {
        long funcion = getPaginaActualizacion().getFuncionConsultarRecurso();
        return TLC.getControlador().esParametroAutorizado(parametro, funcion);
    }

    public boolean isParametroFuncionConsultarNoAutorizado(String parametro) {
        return !isParametroFuncionConsultarAutorizado(parametro);
    }

    public boolean isParametroFuncionCrearAutorizado(String parametro) {
        long funcion = getPaginaActualizacion().getFuncionCrearRecurso();
        return TLC.getControlador().esParametroAutorizado(parametro, funcion);
    }

    public boolean isParametroFuncionCrearNoAutorizado(String parametro) {
        return !isParametroFuncionCrearAutorizado(parametro);
    }

    public boolean isParametroFuncionModificarAutorizado(String parametro) {
        long funcion = getPaginaActualizacion().getFuncionModificarRecurso();
        return TLC.getControlador().esParametroAutorizado(parametro, funcion);
    }

    public boolean isParametroFuncionModificarNoAutorizado(String parametro) {
        return !isParametroFuncionModificarAutorizado(parametro);
    }

    public boolean isLecturaAutorizada(String parametro) {
        return isParametroFuncionConsultarAutorizado(parametro);
    }

    public boolean isLecturaNoAutorizada(String parametro) {
        return !isLecturaAutorizada(parametro);
    }

    public boolean isEscrituraAutorizada(String parametro) {
        return isFilaCreada() ? isParametroFuncionCrearAutorizado(parametro)
                : isFilaModificada() ? isParametroFuncionModificarAutorizado(parametro) : false;
    }

    public boolean isEscrituraNoAutorizada(String parametro) {
        return !isEscrituraAutorizada(parametro);
    }

    /**
     * Conserva el valor de la propiedad nuevaPosicionCursor.
     */
    private boolean nuevaPosicionCursor = false;

    /**
     * Getter para propiedad nuevaPosicionCursor.
     *
     * @return Valor de la propiedad nuevaPosicionCursor.
     */
    public boolean isNuevaPosicionCursor() {
        return nuevaPosicionCursor;
    }

    /**
     * Setter para propiedad nuevaPosicionCursor.
     *
     * @param b Nuevo valor de la propiedad nuevaPosicionCursor.
     */
    public void setNuevaPosicionCursor(boolean b) {
        nuevaPosicionCursor = b;
    }

    @Override
    public boolean isMensajeDisponible() {
        return super.isMensajeDisponible() && isFilaDisponible();
    }

    public String getMensajeCambiosPorConfirmar() {
        if (designing) {
            return getDesignTimeString("getMensajeCambiosPorConfirmar");
        }
        return getPaginaActualizacion().getRecursoDataProvider().getMensajeCambiosPorConfirmar();
    }

    public String getMensajeCambiosPorDescartar() {
        if (designing) {
            return getDesignTimeString("getMensajeCambiosPorDescartar");
        }
        return getPaginaActualizacion().getRecursoDataProvider().getMensajeCambiosPorDescartar();
    }

    public String getMensajeFilaNoDisponible() {
        if (designing) {
            return getDesignTimeString("getMensajeFilaNoDisponible");
        }
        String mensaje1 = getPaginaActualizacion().getRecursoDataProvider().getMensajeCambiosPorConfirmar();
        String mensaje2 = getMensaje();
        String mensaje3 = Bitacora.getTextoMensaje(CBM.NO_CHANGES_TO_COMMIT);
        return mensaje1 == null ? mensaje2 == null ? mensaje3 : mensaje2 : mensaje1;
    }

    /**
     * Conserva el valor de la propiedad peticionInsert.
     */
    private boolean peticionInsert = false;

    /**
     * Getter para propiedad peticionInsert.
     *
     * @return Valor de la propiedad peticionInsert.
     */
    public boolean isPeticionInsert() {
        return peticionInsert;
    }

    /**
     * Setter para propiedad peticionInsert.
     *
     * @param b Nuevo valor de la propiedad peticionInsert.
     */
    public void setPeticionInsert(boolean b) {
        peticionInsert = b;
    }

    /**
     * Conserva el valor de la propiedad reposicionPendiente.
     */
    private boolean reposicionPendiente = false;

    /**
     * Getter para propiedad reposicionPendiente.
     *
     * @return Valor de la propiedad reposicionPendiente.
     */
    public boolean isReposicionPendiente() {
        return reposicionPendiente;
    }

    /**
     * Setter para propiedad reposicionPendiente.
     *
     * @param b Nuevo valor de la propiedad reposicionPendiente.
     */
    public void setReposicionPendiente(boolean b) {
        reposicionPendiente = b;
    }

    /**
     * Conserva el valor de la propiedad consultaPendiente.
     */
    private boolean consultaPendiente = false;

    /**
     * Getter para propiedad consultaPendiente.
     *
     * @return Valor de la propiedad consultaPendiente.
     */
    public boolean isConsultaPendiente() {
        return consultaPendiente;
    }

    /**
     * Setter para propiedad consultaPendiente.
     *
     * @param b Nuevo valor de la propiedad consultaPendiente.
     */
    public void setConsultaPendiente(boolean b) {
        consultaPendiente = b;
    }

    /**
     * Conserva el valor de la propiedad iniciacionPendiente.
     */
    private boolean iniciacionPendiente = false;

    /**
     * Getter para propiedad iniciacionPendiente.
     *
     * @return Valor de la propiedad iniciacionPendiente.
     */
    public boolean isIniciacionPendiente() {
        return iniciacionPendiente;
    }

    /**
     * Setter para propiedad iniciacionPendiente.
     *
     * @param b Nuevo valor de la propiedad iniciacionPendiente.
     */
    public void setIniciacionPendiente(boolean b) {
        iniciacionPendiente = b;
    }

    /**
     * Conserva el valor de la propiedad readOnlyProcessing.
     */
    private boolean readOnlyProcessing = false;

    /**
     * Getter para propiedad readOnlyProcessing.
     *
     * @return Valor de la propiedad readOnlyProcessing.
     */
    public boolean isReadOnlyProcessing() {
        return readOnlyProcessing;
    }

    /**
     * Setter para propiedad readOnlyProcessing.
     *
     * @param b Nuevo valor de la propiedad readOnlyProcessing.
     */
    public void setReadOnlyProcessing(boolean b) {
        readOnlyProcessing = b;
    }

    public String getTituloConsulta() {
        if (designing) {
            return getDesignTimeString("getTituloConsulta");
        }
        String titulo = getPaginaActualizacion().getRecursoDataProvider().getNombreDominioRecurso();
        if (isPaginaConsultaConMaestro()) {
            String detalle = getPaginaConsultaConMaestro().getEtiquetaClaseDetalle();
            String maestro = getPaginaConsultaConMaestro().getEtiquetaClaseMaestro();
            if (StringUtils.isNotBlank(detalle)) {
                String etiqueta = detalle.trim();
                if (StringUtils.isNotBlank(maestro)) {
                    etiqueta += " " + maestro.trim();
                }
                titulo = getPaginaConsultaConMaestro().getRecursoMaestroDataProvider()
                        .getDenominacionFilaEscogida(etiqueta);
            }
        } else if (isPaginaConsultaConArbol() || isPaginaConsultaConTabla()) {
            String detalle = getPaginaActualizacion().getEtiquetaClaseDetalle();
            if (StringUtils.isNotBlank(detalle)) {
                titulo = detalle.trim();
            }
        } else {
            String detalle = getPaginaActualizacion().getEtiquetaClaseDetalle();
            if (StringUtils.isNotBlank(detalle)) {
                //              String etiqueta = detalle.trim();
                //              titulo = getPaginaActualizacion().getRecursoDataProvider().getDenominacionFilaEscogida(etiqueta);
                titulo = detalle.trim();
            }
        }
        return titulo;
    }

    @Override
    protected String getToolTipHipervinculoMigasPan() {
        if (designing) {
            return null;
        }
        //      if (getPaginaActualizacion().getRecursoDataProvider().isFilaEscogidaDisponible()) {
        //          return getPaginaActualizacion().getRecursoDataProvider().getDenominacionFilaEscogida();
        //      } else {
        //          return getTituloConsulta();
        //      }
        return getTituloConsulta();
    }

    @Override
    protected String getMensajePeticionPorOmision() {
        return getMensajeCambiosPorConfirmar();
    }

    public String getValorRetornoRecursoActual() {
        if (designing) {
            return null;
        }
        return getValorRetornoRecurso(getCurrentRowKey());
    }

    public void setValorRetornoRecursoActual(String valor) {
        track("setValorRetornoRecursoActual", "valor=" + valor);
    }

    public String getValorRetornoRecursoEscogido() {
        if (designing) {
            return null;
        }
        return getValorRetornoRecurso(getPaginaActualizacion().getRecursoDataProvider().getFilaEscogida());
    }

    public void setValorRetornoRecursoEscogido(String valor) {
        track("setValorRetornoRecursoEscogido", "valor=" + valor);
    }

    protected String getValorRetornoRecurso(RowKey rowKey) {
        if (designing) {
            return null;
        }
        track("getValorRetornoRecurso", "RowKey=" + rowKey);
        String valor = null;
        try {
            if (getPaginaActualizacion().getRecursoDataProvider().isNotRowAvailable(rowKey)) {
                return null;
            }
            String opcion = getPaginaActualizacion().getContextoSesion().getOpcionCampoRetorno();
            if (StringUtils.isBlank(opcion)) { // anteriormente opcion Blank era equivalente a BUSCAR_ID
                return null;
            }
            EnumOpcionAbrirVentana opcionAbrirVentana = EnumOpcionAbrirVentana.enumValueOf(opcion);
            String dominioRecurso = getPaginaActualizacion().getRecursoDataProvider().getDominioSelect() + "";
            String dominioRetorno = getPaginaActualizacion().getContextoSesion().getDominioRetorno();
            boolean identificable = getPaginaActualizacion().getRecursoDataProvider().isRecursoIdentificable();
            boolean codificable = getPaginaActualizacion().getRecursoDataProvider().isRecursoCodificable();
            //          if (StringUtils.isBlank(opcion) || EnumOpcionAbrirVentana.BUSCAR_ID.equals(opcionAbrirVentana)) {
            if (EnumOpcionAbrirVentana.BUSCAR_ID.equals(opcionAbrirVentana)) {
                if (dominioRecurso.equals(dominioRetorno)) {
                    if (identificable) {
                        valor = STP
                                .getString(getRecursoIdentificableDataProvider().getIdentificacionRecurso(rowKey));
                    }
                    getPaginaActualizacion().getContextoSesion().setValorRetorno(opcion, dominioRetorno, valor);
                }
            } else if (EnumOpcionAbrirVentana.BUSCAR_CODIGO.equals(opcionAbrirVentana)) {
                if (dominioRecurso.equals(dominioRetorno)) {
                    if (codificable) {
                        valor = getRecursoCodificableDataProvider().getCodigoRecurso(rowKey);
                    } else if (identificable) {
                        valor = Global.PREFIJO_STRING_ID_RECURSO
                                + getRecursoIdentificableDataProvider().getIdentificacionRecurso(rowKey);
                    }
                    getPaginaActualizacion().getContextoSesion().setValorRetorno(opcion, dominioRetorno, valor);
                }
            } else if (dominioRetorno == null || dominioRecurso.equals(dominioRetorno)) {
                if (getPaginaActualizacion().getRecursoDataProvider().isColumnaDisponible(opcion)) {
                    Object obj = getPaginaActualizacion().getRecursoDataProvider().getValue(opcion, rowKey);
                    valor = obj instanceof Long ? Global.PREFIJO_STRING_ID_RECURSO + obj : STP.getString(obj);
                    getPaginaActualizacion().getContextoSesion().setValorRetorno(opcion, dominioRetorno, valor);
                } else if (dominioRetorno != null) {
                    getPaginaActualizacion().getContextoSesion().setValorRetorno(opcion, dominioRetorno, null);
                }
            }
            valor = getPaginaActualizacion().getContextoSesion().getValorRetorno(opcion, dominioRetorno);
        } catch (Exception ex) {
            Bitacora.logTrace(ex);
        }
        return valor;
    }

    private boolean isValorRetornoRecursoDisponible() {
        String opcion = getPaginaActualizacion().getContextoSesion().getOpcionCampoRetorno();
        if (StringUtils.isBlank(opcion)) {
            return false;
        }
        EnumOpcionAbrirVentana opcionAbrirVentana = EnumOpcionAbrirVentana.enumValueOf(opcion);
        String dominioRecurso = getPaginaActualizacion().getRecursoDataProvider().getDominioSelect() + "";
        String dominioRetorno = getPaginaActualizacion().getContextoSesion().getDominioRetorno();
        boolean identificable = getPaginaActualizacion().getRecursoDataProvider().isRecursoIdentificable();
        boolean codificable = getPaginaActualizacion().getRecursoDataProvider().isRecursoCodificable();
        if (EnumOpcionAbrirVentana.BUSCAR_ID.equals(opcionAbrirVentana)) {
            return dominioRecurso.equals(dominioRetorno) && identificable;
        }
        if (EnumOpcionAbrirVentana.BUSCAR_CODIGO.equals(opcionAbrirVentana)) {
            return dominioRecurso.equals(dominioRetorno) && (codificable || identificable);
        }
        return getPaginaActualizacion().getRecursoDataProvider().isColumnaDisponible(opcion);
    }
    // </editor-fold>

    @Override
    protected void autorizar() {
        track("autorizar");
        long funcion = getPaginaActualizacion().getFuncionConsultarRecurso();
        paginaAutorizada = funcion == -1L || TLC.getControlador().esFuncionAutorizada(funcion);
    }

    @Override
    public void iniciar() {
        super.iniciar();
        iniciarDataProvider();
        setReposicionPendiente(true);
        //      setConsultaPendiente(isRestauracion());
        setConsultaPendiente(false);
        setPeticionProcesada(false);
        setPeticionInsert(false);
    }

    private void iniciarDataProvider() {
        long funcion = getPaginaActualizacion().getFuncionConsultarRecurso();
        int limite = getLimiteFilasFuncionSelect();
        String tabla = null;
        try {
            getPaginaActualizacion().getRecursoDataProvider().setFuncionSelect(funcion);
        } catch (ExcepcionAplicacion ex) {
            handle(ex);
        }
        getPaginaActualizacion().getRecursoDataProvider().setLimiteFilasFuncionSelect(limite);
        if (isPaginaConsultaConMaestro()) {
            tabla = getPaginaConsultaConMaestro().getRecursoMaestroDataProvider().getTablaDestino();
        }
        getPaginaActualizacion().getRecursoDataProvider().setTablaMaestro(tabla);
    }

    private int getLimiteFilasFuncionSelect() {
        String dominio = getPaginaActualizacion().getRecursoDataProvider().getCodigoDominioRecurso();
        String string = BaseBundle.getLimiteFilasFuncionSelect(dominio);
        int limite = StringUtils.isNotBlank(string) && StringUtils.isNumeric(string) ? Integer.valueOf(string) : -1;
        return limite < 0 ? LIMITE_FILAS_FUNCION_SELECT : limite;
    }

    @Override
    public void preprocesar() { /* no se ejecuta si al apenas abrir la pagina se hace click en un link con url */
        super.preprocesar();
        inicializarFunciones(true);
        reposicionar(); /* no es necesario si es PaginaConsultaConTabla  */
    }

    @Override
    public void prepresentar() {
        track("prepresentar");
        setIniciacionPendiente(false);
        String cb1 = getPaginaActualizacion().getContextoPeticion().getConsultaBusqueda();
        String cb2 = getPaginaActualizacion().getContextoPeticion().getCriteriosBusqueda();
        boolean consultaInsert = isConsultaInsert();
        boolean consultaValida = !consultaInsert && isConsultaValida();
        boolean reinicioFiltro = isReinicio() && (cb1 != null || cb2 != null);
        //      trace();
        //      trace("consultaInsert=" + consultaInsert);
        //      trace("consultaValida=" + consultaValida);
        //      trace("reinicioFiltro=" + reinicioFiltro);
        if (consultaInsert && isRetruque()) {
            retrucarAgregar();
        } else if (consultaValida && isRetruque()) {
            retrucar();
        } else if (reinicioFiltro || isConsultaPendiente() || isPaginaConsultaConMaestro()
                || isPaginaConsultaSinFiltro()) {
            inquirir();
        } else if (consultaValida && getPaginaActualizacion().getRecursoDataProvider().isLoteSinCambios()) {
            continuar();
        } else if (consultaValida && getPaginaActualizacion().getRecursoDataProvider().isLoteConCambios()) {
            refrescar();
        } else if (getPaginaActualizacion().getRecursoDataProvider().getLimiteFilasFuncionSelect() > 0) {
            iniciarConsulta();
        } else {
            inquirir();
        }
        if (isPaginaConsultaConMaestro()) {
            getPaginaConsultaConMaestro().getRecursoMaestroDataProvider().restoreFilaEscogida();
        }
        boolean consultaSinFilas = isFuncionRefreshHabilitada() && isFilaNoDisponible();
        if (consultaSinFilas) {
            TLC.getBitacora().warn(CBM.SELECT_ROW_EMPTY_SET);
        }
        posprepresentar();
    }

    private void trace() {
        track("trace@GestorPaginaActualizacion");
        trace("isRecursion=" + isRecursion());
        trace("isReinicio=" + isReinicio());
        trace("isRestauracion=" + isRestauracion());
        trace("isRetorno=" + isRetorno());
        trace("isRetruque=" + isRetruque());
        trace("isConsultaPendiente=" + isConsultaPendiente());
        trace("isPaginaConsultaConMaestro=" + isPaginaConsultaConMaestro());
        trace("isPaginaConsultaSinFiltro=" + isPaginaConsultaSinFiltro());
        trace("isLoteSinCambios=" + getPaginaActualizacion().getRecursoDataProvider().isLoteSinCambios());
        trace("isLoteConCambios=" + getPaginaActualizacion().getRecursoDataProvider().isLoteConCambios());
        trace("getLimiteFilasFuncionSelect="
                + getPaginaActualizacion().getRecursoDataProvider().getLimiteFilasFuncionSelect());
    }

    // <editor-fold defaultstate="collapsed">
    //  private boolean isConsultaConLimiteConFiltroSinMaestro() {
    //      return !isConsultaPendiente() &&
    //              getPaginaActualizacion().getRecursoDataProvider().getLimiteFilasFuncionSelect() != 0 &&
    //              isPaginaConsultaConFiltro() && !isPaginaConsultaConMaestro();
    //  }
    // </editor-fold>
    protected void retrucarAgregar() {
        track("retrucarAgregar");
        if (isConsultaPendiente()) {
            consultar();
        } else if (getPaginaActualizacion().getRecursoDataProvider().isLoteSinCambios()) {
            TLC.getBitacora().info(BundleWebui.getString("filtro_solo_filas_agregadas"));
        }
        continuar();
    }

    protected void retrucar() {
        track("retrucar");
        if (isConsultaPendiente()) {
            consultar();
        }
        continuar();
    }

    protected void continuar() {
        track("continuar");
        // OJO: reposicionar() y cursorSet(0) no son necesarios si es PaginaConsultaConTabla, pero no hacen dao
        if (isReposicionPendiente()) {
            reposicionar();
        } else {
            cursorSet(0); /* OJO con la constante: reposicionar [+ cursorNext [+ cursorFirst]] */
        }
    }

    protected void iniciarConsulta() {
        track("iniciarConsulta");
        if (isReinicio()) {
            String cb1 = getPaginaActualizacion().getContextoPeticion().getConsultaBusqueda();
            String cb2 = getPaginaActualizacion().getContextoPeticion().getCriteriosBusqueda();
            getPaginaActualizacion().getRecursoDataProvider().setConsultaBusqueda(cb1);
            getPaginaActualizacion().getRecursoDataProvider().setCriteriosBusqueda(cb2);
        }
        try {
            //          getPaginaActualizacion().getRecursoDataProvider().setFuncionSelect(getPaginaActualizacion().getFuncionConsultarRecurso());
            getPaginaActualizacion().getRecursoDataProvider().setComandoEmptyCachedRowSet();
            getPaginaActualizacion().getRecursoDataProvider().setFiltroEscondido(false);
            TLC.getBitacora().warn(CBM.SELECT_SET_SEARCH_CRITERIA,
                    getPaginaActualizacion().getRecursoDataProvider().getLimiteFilasFuncionSelect());
        } catch (ExcepcionAplicacion ex) {
            Bitacora.logError(ex);
            inquirir();
        }
    }

    protected void inquirir() {
        track("inquirir");
        consultar();
        if (getPaginaActualizacion().getRecursoDataProvider().isFuncionSelectAutorizada()) {
            inicializarFunciones(true);
            setIniciacionPendiente(true);
            getPaginaActualizacion().posconsultar();
            //          if (isRetruque() || isPaginaConsultaSinFiltro()) {
            //          } else {
            //              getPaginaActualizacion().getRecursoDataProvider().setFiltroEscondido(true);
            //          }
        }
    }

    // <editor-fold defaultstate="collapsed" desc="metodos estandar para consultar">
    protected void consultar() {
        track("consultar");
        setConsultaPendiente(true);
        if (isReinicio()) {
            String cb1 = getPaginaActualizacion().getContextoPeticion().getConsultaBusqueda();
            String cb2 = getPaginaActualizacion().getContextoPeticion().getCriteriosBusqueda();
            getPaginaActualizacion().getRecursoDataProvider().setConsultaBusqueda(cb1);
            getPaginaActualizacion().getRecursoDataProvider().setCriteriosBusqueda(cb2);
            consultarPorIdentificacionRecurso();
            if (isConsultaPendiente()) {
                consultarMaestroPorIdentificacionRecursoMaestro();
            }
        }
        if (isConsultaPendiente()) {
            getPaginaActualizacion().consultar();
            if (isConsultaInsert()) {
            } else {
                getPaginaActualizacion().getRecursoDataProvider().storeQuery();
                if (isPaginaConsultaConFiltro()) {
                    if (isPaginaConsultaConMaestro()) {
                        getPaginaActualizacion().getRecursoDataProvider().setFiltroEscondido(true);
                    } else {
                        boolean consultaSinFilas = isFuncionRefreshHabilitada() && isFilaNoDisponible();
                        getPaginaActualizacion().getRecursoDataProvider().setFiltroEscondido(!consultaSinFilas);
                    }
                }
            }
        }
        if (isConsultaPendiente()) {
            release(); /* OJO: realmente hay que retornar un rowset vacio? */
        } else {
            if (getPaginaActualizacion().getRecursoDataProvider().isFuncionSelectAutorizada()) {
                setVersionComandoSelectPagina();
                setMaestroPagina();
                setNuevaPosicionCursor(true);
            } else {
                release(); /* OJO: realmente hay que retornar un rowset vacio? */
            }
        }
        descartarFormulariosVirtuales();
    }

    protected void consultarPorIdentificacionRecurso() {
        // consulta y posiciona el cursor utilizando la identificacion del recurso
        track("consultarPorIdentificacionRecurso");
        if (getPaginaActualizacion().getRecursoDataProvider().isRecursoIdentificable()) {
            String clave = getRecursoIdentificableDataProvider().getColumnaIdentificacionRecurso();
            Long valor = getPaginaActualizacion().getContextoPeticion().getIdentificacionRecurso();
            // trace(clave + "=" + valor);
            if (valor != null) {
                RowKey rowKey = getRowRecurso(clave, valor);
                if (rowKey != null) {
                    posicionar(rowKey);
                    setConsultaPendiente(false);
                    if (isPaginaConsultaConMaestro()) {
                        consultarMaestroPorColumnaIdentificacionRecursoMaestro();
                    }
                }
            }
        }
    }

    protected RowKey getRowRecurso(String clave, Object valor) {
        track("getRow", clave + "=" + valor);
        RowKey rowKey = null;
        try {
            if (getPaginaActualizacion().getRecursoDataProvider().isRecursoConsultable()) {
                //              FiltroBusqueda filtroBusqueda = new FiltroBusqueda(getRecursoDataProviderDataSourceName());
                FiltroBusqueda filtroBusqueda = new FiltroBusqueda();
                filtroBusqueda.addCriterio(clave, valor);
                //              long funcion = getPaginaActualizacion().getFuncionConsultarRecurso();
                //              getPaginaActualizacion().getRecursoDataProvider().setFuncionSelect(funcion);
                getRecursoConsultableDataProvider().ejecutarFuncionSelect(filtroBusqueda);
                if (getPaginaActualizacion().getRecursoDataProvider().cursorFirst()) {
                    rowKey = getPaginaActualizacion().getRecursoDataProvider().getCursorRow();
                }
            }
        } catch (ExcepcionAplicacion | DataProviderException ex) {
            rowKey = null;
        }
        return getPaginaActualizacion().getRecursoDataProvider().isRowAvailable(rowKey) ? rowKey : null;
    }

    protected void consultarMaestroPorIdentificacionRecursoMaestro() {
        track("consultarMaestroPorIdentificacionRecursoMaestro");
        if (isPaginaConsultaConMaestro()) {
            Long valor = getPaginaActualizacion().getContextoPeticion().getIdentificacionRecursoMaestro();
            String clave = null;
            if (valor == null) {
            } else if (getPaginaConsultaConMaestro().getRecursoMaestroDataProvider().isRecursoIdentificable()) {
                clave = getRecursoMaestroIdentificableDataProvider().getColumnaIdentificacionRecurso();
            } else if (getPaginaConsultaConMaestro().getRecursoMaestroDataProvider().isRecursoEnumerable()) {
                clave = getRecursoMaestroEnumerableDataProvider().getColumnaNumeroRecurso();
            }
            if (StringUtils.isNotBlank(clave)) {
                getRowMaestro(clave, valor);
            }
        }
    }

    protected void consultarMaestroPorColumnaIdentificacionRecursoMaestro() {
        track("consultarMaestroPorColumnaIdentificacionRecursoMaestro");
        if (isPaginaConsultaConMaestro()) {
            String columna = getPaginaConsultaConMaestro().getColumnaIdentificacionRecursoMaestro();
            Object valor = StringUtils.isBlank(columna) ? null
                    : getPaginaActualizacion().getRecursoDataProvider().getValue(columna);
            String clave = null;
            if (valor == null) {
            } else if (getPaginaConsultaConMaestro().getRecursoMaestroDataProvider().isRecursoIdentificable()) {
                clave = getRecursoMaestroIdentificableDataProvider().getColumnaIdentificacionRecurso();
            } else if (getPaginaConsultaConMaestro().getRecursoMaestroDataProvider().isRecursoEnumerable()) {
                clave = getRecursoMaestroEnumerableDataProvider().getColumnaNumeroRecurso();
            }
            if (StringUtils.isNotBlank(clave)) {
                getRowMaestro(clave, valor);
            }
        }

    }

    protected RowKey getRowMaestro(String clave, Object valor) {
        track("getRowMaestro", clave + "=" + valor);
        RowKey rowKey = null;
        if (isPaginaConsultaConMaestro()) {
            try {
                if (getPaginaConsultaConMaestro().getRecursoMaestroDataProvider().isRecursoConsultable()) {
                    //                  FiltroBusqueda filtroBusqueda = new FiltroBusqueda(getRecursoMaestroDataProviderDataSourceName());
                    FiltroBusqueda filtroBusqueda = new FiltroBusqueda();
                    filtroBusqueda.addCriterio(clave, valor);
                    //                  long funcion = getRecursoMaestroConsultableDataProvider().getFuncionConsultarRecurso();
                    //                  getPaginaConsultaConMaestro().getRecursoMaestroDataProvider().setFuncionSelect(funcion);
                    getRecursoMaestroConsultableDataProvider().ejecutarFuncionSelect(filtroBusqueda);
                    if (getPaginaConsultaConMaestro().getRecursoMaestroDataProvider().cursorFirst()) {
                        rowKey = getPaginaActualizacion().getRecursoDataProvider().getCursorRow();
                    }
                }
            } catch (ExcepcionAplicacion | DataProviderException ex) {
                rowKey = null;
            }
        }
        return getPaginaConsultaConMaestro().getRecursoMaestroDataProvider().isRowAvailable(rowKey) ? rowKey : null;
    }

    protected void setVersionComandoSelectPagina() {
        long version = getPaginaActualizacion().getRecursoDataProvider().getVersionComandoSelect();
        getPaginaActualizacion().getContextoSesion().setVersionComandoSelectPagina(version);
    }

    protected void setMaestroPagina() {
        String c = isPaginaConsultaConMaestro() ? getColumnaIdentificacionRecursoMaestro() : null;
        Long irm = isPaginaConsultaConMaestro() ? getIdentificacionRecursoMaestro() : null;
        getPaginaActualizacion().getContextoSesion().setColumnaIdentificacionRecursoMaestroPagina(c);
        getPaginaActualizacion().getContextoSesion().setIdentificacionRecursoMaestroPagina(irm);
    }

    protected boolean release() {
        track("release");
        setConsultaPendiente(false);
        boolean ok = false;
        try {
            getPaginaActualizacion().getRecursoDataProvider().release();
            ok = true;
        } catch (SQLException ex) {
            handle(ex);
        } finally {
            return ok;
        }
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos estandar para posicionar/reposicionar">
    public boolean reposicionar() {
        RowKey rowKey = getPaginaActualizacion().getRecursoDataProvider().getFilaEscogida();
        return posicionar(rowKey);
    }

    public boolean posicionar(
            Long identificacion) { /* posiciona el cursor utilizando la identificacion del recurso */
        track("posicionar", "identificacion=" + identificacion);
        RowKey rowKey = null;
        if (getPaginaActualizacion().getRecursoDataProvider().isRecursoIdentificable()) {
            String clave = getRecursoIdentificableDataProvider().getColumnaIdentificacionRecurso();
            Long valor = identificacion;
            // trace(clave + "=" + valor);
            if (valor != null && getPaginaActualizacion().getRecursoDataProvider().isLoteConFilas()) {
                rowKey = getPaginaActualizacion().getRecursoDataProvider().findFirst(clave, valor);
            }
        }
        return posicionar(rowKey);
    }

    public boolean posicionar(String codigo) { /* posiciona el cursor utilizando el codigo del recurso */
        track("posicionar", "codigo=" + codigo);
        RowKey rowKey = null;
        if (getPaginaActualizacion().getRecursoDataProvider().isRecursoCodificable()) {
            String clave = getRecursoCodificableDataProvider().getColumnaCodigoRecurso();
            String valor = codigo;
            // trace(clave + "=" + valor);
            if (valor != null && getPaginaActualizacion().getRecursoDataProvider().isLoteConFilas()) {
                rowKey = getPaginaActualizacion().getRecursoDataProvider().findFirst(clave, valor);
            }
        }
        return posicionar(rowKey);
    }

    protected boolean posicionar(RowKey rowKey) {
        track("posicionar", "RowKey=" + rowKey);
        setReposicionPendiente(false);
        boolean ok = false;
        try {
            if (getPaginaActualizacion().getRecursoDataProvider().isRowAvailable(rowKey)) {
                getPaginaActualizacion().getRecursoDataProvider().setCursorRow(rowKey);
                getPaginaActualizacion().getRecursoDataProvider().setFilaEscogida(rowKey);
                ok = true;
            }
        } catch (Exception ex) {
            handle(ex);
        } finally {
            return ok;
        }
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos estandar para obtener el filtro de busqueda">
    public FiltroBusqueda getFiltroBusquedaFuncionSelect() {
        Long filtro = getPaginaActualizacion().getRecursoDataProvider().getFiltroFuncionSelect();
        return getFiltroBusqueda(filtro, null, null, null);
    }

    public FiltroBusqueda getFiltroBusqueda(Long filtro) {
        return getFiltroBusqueda(filtro, null, null, null);
    }

    public FiltroBusqueda getFiltroBusqueda(Long filtro, String codigo, String nombre) {
        return getFiltroBusqueda(filtro, codigo, nombre, null);
    }

    public FiltroBusqueda getFiltroBusqueda(Long filtro, Long segmento) {
        return getFiltroBusqueda(filtro, null, null, segmento);
    }

    public FiltroBusqueda getFiltroBusqueda(Long filtro, String codigo, String nombre, Long segmento) {
        track("getFiltroBusqueda", "filtro=" + filtro, "codigo=" + codigo, "nombre=" + nombre,
                "segmento=" + segmento);
        getPaginaActualizacion().getRecursoDataProvider().setFiltroFuncionSelect(null);
        getPaginaActualizacion().getRecursoDataProvider().setCodigoFuncionSelect(null);
        getPaginaActualizacion().getRecursoDataProvider().setNombreFuncionSelect(null);
        getPaginaActualizacion().getRecursoDataProvider().setSegmentoFuncionSelect(null);
        FiltroBusqueda filtroBusqueda;
        if (filtro == null) {
            //          filtroBusqueda = new FiltroBusqueda(getRecursoDataProviderDataSourceName());
            filtroBusqueda = new FiltroBusqueda();
        } else {
            //          filtroBusqueda = new FiltroBusqueda(getRecursoDataProviderDataSourceName(), filtro);
            filtroBusqueda = new FiltroBusqueda(filtro);
        }
        if (StringUtils.isNotBlank(codigo)
                && getPaginaActualizacion().getRecursoDataProvider().isRecursoCodificable()) {
            filtroBusqueda.addCriterio(getRecursoCodificableDataProvider().getColumnaCodigoRecurso(),
                    getOperadorCom(codigo), getValorComparacion(codigo));
        }
        if (StringUtils.isNotBlank(nombre)
                && getPaginaActualizacion().getRecursoDataProvider().isRecursoNombrable()) {
            filtroBusqueda.addCriterio(getRecursoNombrableDataProvider().getColumnaNombreRecurso(),
                    getOperadorCom(nombre), getValorComparacion(nombre));
        }
        if (segmento != null && getPaginaActualizacion().getRecursoDataProvider().isRecursoSegmentable()) {
            filtroBusqueda.addCriterio(getRecursoSegmentableDataProvider().getColumnaSegmentoRecurso(),
                    OperadorComEnumeration.ES_IGUAL, segmento);
        }
        Map<String, CampoBusqueda> camposBusqueda = getPaginaActualizacion().getRecursoDataProvider()
                .getCamposBusqueda();
        for (CampoBusqueda campoBusqueda : camposBusqueda.values()) {
            filtroBusqueda.addCriterio(campoBusqueda.toCriterioBusqueda());
        }
        String columna;
        Long maestro;
        if (isPaginaConsultaConMaestro()) {
            columna = getColumnaIdentificacionRecursoMaestro();
            maestro = getIdentificacionRecursoMaestro();
        } else {
            columna = null;
            maestro = null;
        }
        if (StringUtils.isNotBlank(columna)) {
            if (maestro == null) {
                filtroBusqueda.addCriterio(columna, true); /* OJO: rowset de filas SIN maestro? */
            } else {
                filtroBusqueda.addCriterio(columna, OperadorComEnumeration.ES_IGUAL, maestro);
            }
        }
        getPaginaActualizacion().getRecursoDataProvider().setFiltroFuncionSelect(filtro);
        getPaginaActualizacion().getRecursoDataProvider().setCodigoFuncionSelect(codigo);
        getPaginaActualizacion().getRecursoDataProvider().setNombreFuncionSelect(nombre);
        getPaginaActualizacion().getRecursoDataProvider().setSegmentoFuncionSelect(segmento);
        getPaginaActualizacion().getRecursoDataProvider().setColumnaMaestro(columna);
        getPaginaActualizacion().getRecursoDataProvider().setIdentificacionMaestro(maestro);
        return filtroBusqueda;
    }

    private OperadorComEnumeration getOperadorCom(String string) {
        String not = "-";
        String any = TLC.getInterpreteSql().getLikeString();
        return StringUtils.isBlank(string) ? OperadorComEnumeration.ES_NULO
                : string.startsWith(not + any) && string.endsWith(any) ? OperadorComEnumeration.NO_CONTIENE
                        : string.startsWith(not + any) ? OperadorComEnumeration.NO_TERMINA_EN
                                : string.startsWith(not) && string.endsWith(any)
                                        ? OperadorComEnumeration.NO_COMIENZA_POR
                                        : string.startsWith(not) ? OperadorComEnumeration.NO_ES_IGUAL
                                                : string.startsWith(any) && string.endsWith(any)
                                                        ? OperadorComEnumeration.CONTIENE
                                                        : string.startsWith(any) ? OperadorComEnumeration.TERMINA_EN
                                                                : string.endsWith(any)
                                                                        ? OperadorComEnumeration.COMIENZA_POR
                                                                        : OperadorComEnumeration.ES_IGUAL;
    }

    private String getValorComparacion(String string) {
        String not = "-";
        String any = TLC.getInterpreteSql().getLikeString();
        String valor = StringUtils.trimToNull(string);
        int endIndex = valor == null ? 0 : valor.length() - 1;
        valor = valor == null ? null // ES_NULO
                : valor.startsWith(not + any) && valor.endsWith(any) ? valor.substring(2, endIndex) // NO_CONTIENE
                        : valor.startsWith(not + any) ? valor.substring(2) // NO_TERMINA_EN
                                : valor.startsWith(not) && valor.endsWith(any) ? valor.substring(1, endIndex) // NO_COMIENZA_POR
                                        : valor.startsWith(not) ? valor.substring(1) // NO_ES_IGUAL
                                                : valor.startsWith(any) && valor.endsWith(any)
                                                        ? valor.substring(1, endIndex) // CONTIENE
                                                        : valor.startsWith(any) ? valor.substring(1) // TERMINA_EN
                                                                : valor.endsWith(any) ? valor.substring(0, endIndex) // COMIENZA_POR
                                                                        : valor; // ES_IGUAL
        /*
         *
         */
        valor = StringUtils.trimToNull(valor);
        return valor == null ? null : valor.replace('/' + not + '/', not).replace('/' + any + '/', any);
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos estandar para agregar">
    protected boolean appendRow(long funcion) throws ExcepcionAplicacion {
        track("appendRow", "funcion=" + funcion);
        if (getPaginaActualizacion().getRecursoDataProvider().isFuncionInsertEjecutada()) {
        } else {
            descartarFormulariosVirtuales();
        }
        setPeticionInsert(true);
        try {
            getPaginaActualizacion().getRecursoDataProvider().setFuncionInsert(funcion);
            RowKey rowKey = getPaginaActualizacion().getRecursoDataProvider().appendRow();
            getPaginaActualizacion().getRecursoDataProvider().setCursorRow(rowKey);
            getPaginaActualizacion().getRecursoDataProvider().setFilaEscogida(rowKey);
            setNuevaPosicionCursor(true);
            if (isPaginaConsultaConMaestro()) {
                setMaestro();
            } else {
                getPaginaActualizacion().getRecursoDataProvider().setMaestro(rowKey);
            }
            getPaginaActualizacion().getRecursoDataProvider().setIndicadorInactivo(rowKey);
            getPaginaActualizacion().getRecursoDataProvider().setPropietario(rowKey);
            //          getPaginaActualizacion().getRecursoDataProvider().setSegmento(rowKey);
            boolean legal = esFilaLegal(rowKey, funcion);
            if (!legal) {
                getPaginaActualizacion().getRecursoDataProvider().removeRow(rowKey);
            }
            return legal;
        } catch (ExcepcionAplicacion | DataProviderException ex) {
            throw ex instanceof ExcepcionAplicacion ? (ExcepcionAplicacion) ex : new ExcepcionAplicacion(ex);
        }
    }

    private void setMaestro() {
        Bitacora.trace(getClass(), "setMaestro");
        String columna = getColumnaIdentificacionRecursoMaestro();
        Long maestro = getIdentificacionRecursoMaestro();
        if (StringUtils.isNotBlank(columna) && maestro != null) {
            getPaginaActualizacion().getRecursoDataProvider().setValue(columna, maestro);
        }
    }

    private boolean esFilaLegal(RowKey rowKey, long funcion) { // fila Disponible, Activa y Autorizada
        // la autorizacion podria fallar si el maestro tambien es propietario y/o segmento
        Bitacora.trace(getClass(), "esFilaLegal", rowKey, funcion);
        return getPaginaActualizacion().getRecursoDataProvider().isRowAvailable(rowKey)
                && getPaginaActualizacion().getRecursoDataProvider().esFilaRecursoAutorizado(rowKey, funcion);
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos estandar para el manejo de la tabla (inicializarFunciones...)">
    public void inicializarFunciones() {
        inicializarFunciones(false);
    }

    public void inicializarFunciones(boolean nohandle) {
        track("inicializarFunciones", "nohandle=" + nohandle);
        EnumSeveridadMensaje severidad = TLC.getBitacora().getSeveridadMinima();
        if (nohandle) {
            TLC.getBitacora().setSeveridadMinima(EnumSeveridadMensaje.FATAL);
        }
        try {
            if (getPaginaActualizacion().getRecursoDataProvider().getFuncionInsert() < 0
                    && getPaginaActualizacion().getFuncionCrearRecurso() > 0) {
                getPaginaActualizacion().getRecursoDataProvider()
                        .setFuncionInsert(getPaginaActualizacion().getFuncionCrearRecurso());
            }
        } catch (ExcepcionAplicacion ex) {
            if (!nohandle) {
                handle(ex);
            }
        }
        try {
            if (getPaginaActualizacion().getRecursoDataProvider().getFuncionUpdate() < 0
                    && getPaginaActualizacion().getFuncionModificarRecurso() > 0) {
                getPaginaActualizacion().getRecursoDataProvider()
                        .setFuncionUpdate(getPaginaActualizacion().getFuncionModificarRecurso());
            }
        } catch (ExcepcionAplicacion ex) {
            if (!nohandle) {
                handle(ex);
            }
        }
        try {
            if (getPaginaActualizacion().getRecursoDataProvider().getFuncionDelete() < 0
                    && getPaginaActualizacion().getFuncionEliminarRecurso() > 0) {
                getPaginaActualizacion().getRecursoDataProvider()
                        .setFuncionDelete(getPaginaActualizacion().getFuncionEliminarRecurso());
            }
        } catch (ExcepcionAplicacion ex) {
            if (!nohandle) {
                handle(ex);
            }
        }
        TLC.getBitacora().setSeveridadMinima(severidad);
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos estandar para ejecutar las acciones de la pagina de actualizacion">
    public boolean irAlPrimero() {
        track("irAlPrimero");
        return cursorSet(1); /* OJO con la constante: cursorFirst */
    }

    public boolean irAlAnterior() {
        track("irAlAnterior");
        return cursorSet(2); /* OJO con la constante: cursorPrevious */
    }

    public boolean irAlSiguiente() {
        track("irAlSiguiente");
        return cursorSet(3); /* OJO con la constante: cursorNext */
    }

    public boolean irAlUltimo() {
        track("irAlUltimo");
        return cursorSet(4); /* OJO con la constante: cursorLast */
    }

    public boolean refrescar() {
        track("refrescar");
        return refresh();
    }

    public boolean reconsultar() {
        track("reconsultar");
        return requery();
    }

    public boolean agregar() {
        return agregar(getPaginaActualizacion().getFuncionCrearRecurso());
    }

    public boolean agregar(long funcion) {
        track("agregar", "funcion=" + funcion);
        try {
            return appendRow(funcion);
        } catch (Exception ex) {
            handle(ex);
        }
        return false;
    }

    public boolean editar() {
        return editar(getFuncionEdicionSeleccionada());
    }

    public boolean editar(long funcion) {
        track("editar", "funcion=" + funcion);
        try {
            if (isFilaEscogidaDisponible()) {
                RowKey rowKey = getPaginaActualizacion().getRecursoDataProvider().getFilaEscogida();
                getPaginaActualizacion().getRecursoDataProvider().setFuncionUpdate(funcion);
                getPaginaActualizacion().getRecursoDataProvider().editRow(rowKey);
                descartarFormulariosVirtuales();
                return true;
            }
            TLC.getBitacora().warn(CBM.UPDATE_NONE);
        } catch (Exception ex) {
            handle(ex);
        }
        return false;
    }

    public boolean eliminar() {
        return eliminar(getPaginaActualizacion().getFuncionEliminarRecurso());
    }

    public boolean eliminar(long funcion) {
        track("eliminar", "funcion=" + funcion);
        try {
            if (isFilaEscogidaDisponible()) {
                RowKey rowKey = getPaginaActualizacion().getRecursoDataProvider().getFilaEscogida();
                getPaginaActualizacion().getRecursoDataProvider().setFuncionDelete(funcion);
                getPaginaActualizacion().getRecursoDataProvider().removeRow(rowKey);
                descartarFormulariosVirtuales();
                return true;
            }
            TLC.getBitacora().warn(CBM.DELETE_NONE);
        } catch (ExcepcionAplicacion | DataProviderException ex) {
            handle(ex);
        }
        return false;
    }

    public boolean aplicar() {
        track("aplicar");
        if (getPaginaActualizacion().getRecursoDataProvider().getFilasProcesadas().isEmpty()) {
            return true;
        }
        try {
            return getPaginaActualizacion().getRecursoDataProvider().esLoteValido();
        } catch (ExcepcionAplicacion ex) {
            return false;
        }
    }

    public boolean deshacer() {
        track("deshacer");
        try {
            if (isFilaEscogidaDisponible()) {
                RowKey rowKey = getPaginaActualizacion().getRecursoDataProvider().getFilaEscogida();
                getPaginaActualizacion().getRecursoDataProvider().undoRow(rowKey);
                descartarFormulariosVirtuales();
                cursorSet(0); /* OJO con la constante: reposicionar [+ cursorNext [+ cursorFirst]] */
                return true;
            }
            TLC.getBitacora().warn(CBM.UNDO_CHANGES_NONE);
        } catch (Exception ex) {
            handle(ex);
        }
        return false;
    }

    public boolean confirmar() {
        track("confirmar");
        try {
            getPaginaActualizacion().getRecursoDataProvider().commitChanges();
            refresh();
            TLC.getBitacora().info(CBM.COMMIT_CHANGES_OK);
            return true;
        } catch (Exception ex) {
            handle(ex);
        }
        return false;
    }

    public boolean descartar() {
        track("descartar");
        try {
            getPaginaActualizacion().getRecursoDataProvider().revertChanges();
            refresh();
            TLC.getBitacora().info(CBM.REVERT_CHANGES_OK);
            return true;
        } catch (Exception ex) {
            handle(ex);
        }
        return false;
    }

    public boolean procesar() {
        return procesar(getFuncionAccionSeleccionada());
    }

    public boolean procesar(long funcion) {
        track("procesar", "funcion=" + funcion);
        try {
            if (isFilaEscogidaDisponible()) {
                RowKey rowKey = getPaginaActualizacion().getRecursoDataProvider().getFilaEscogida();
                getPaginaActualizacion().getRecursoDataProvider().setFuncionBusinessProcess(funcion);
                getPaginaActualizacion().getRecursoDataProvider().processRow(rowKey, funcion);
                refresh(); /* descartarFormulariosVirtuales(); */
                return true;
            }
            TLC.getBitacora().warn(CBM.PROCESS_NONE);
        } catch (Exception ex) {
            handle(ex);
        }
        return false;
    }

    public boolean procesar(RowProcessor processor) {
        track("procesar", processor);
        try {
            if (isFilaEscogidaDisponible()) {
                RowKey rowKey = getPaginaActualizacion().getRecursoDataProvider().getFilaEscogida();
                TLC.getBitacora().hint(CBM.CHECK_CHANGES_1,
                        getPaginaActualizacion().getRecursoDataProvider().getEtiquetaRecurso(rowKey));
                processor.processRow(rowKey);
                //              TLC.getBitacora().info(CBM.PROCESS_EXECUTION_END, "");
                refresh(); /* descartarFormulariosVirtuales(); */
                return true;
            }
            TLC.getBitacora().warn(CBM.PROCESS_NONE);
        } catch (Exception ex) {
            handle(ex);
        }
        return false;
    }

    public boolean procesar(String metodo) {
        track("procesar", metodo);
        try {
            if (isFilaEscogidaDisponible()) {
                Object object = getPaginaActualizacion();
                Method method = getPaginaActualizacion().getClass().getMethod(metodo, new Class[] { RowKey.class });
                RowKey rowKey = getPaginaActualizacion().getRecursoDataProvider().getFilaEscogida();
                TLC.getBitacora().hint(CBM.CHECK_CHANGES_1,
                        getPaginaActualizacion().getRecursoDataProvider().getEtiquetaRecurso(rowKey));
                method.invoke(object, rowKey);
                TLC.getBitacora().info(CBM.PROCESS_EXECUTION_END, metodo);
                refresh(); /* descartarFormulariosVirtuales(); */
                return true;
            }
            TLC.getBitacora().warn(CBM.PROCESS_NONE);
        } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
                | InvocationTargetException ex) {
            handle(ex);
        }
        return false;
    }

    public boolean retornar() {
        //      track("retornar");
        //      HttpServletRequest request = (HttpServletRequest) getPaginaActualizacion().getFacesContext().getExternalContext().getRequest();
        //      HttpSession session = request.getSession(false);
        //      session.invalidate();
        return true;
    }

    public String getNombreClaseRecursoMaestroPagina(String nombrePorOmision) {
        String nombreClaseRecurso = getPaginaActualizacion().getContextoPeticion().getNombreClaseRecursoMaestro();
        if (StringUtils.isNotBlank(nombreClaseRecurso)) {
            getPaginaActualizacion().getContextoSesion().setClaseRecursoMaestroPagina(nombreClaseRecurso);
            return nombreClaseRecurso;
        }
        nombreClaseRecurso = getPaginaActualizacion().getContextoSesion().getClaseRecursoMaestroPagina();
        return StringUtils.defaultIfBlank(nombreClaseRecurso, StringUtils.trimToEmpty(nombrePorOmision));
    }

    public boolean vincular() {
        String nombreClaseRecurso = getPaginaActualizacion().getRecursoDataProvider().getNombreClaseRecurso();
        getPaginaActualizacion().getContextoPeticion().setNombreClaseRecursoMaestro(nombreClaseRecurso);
        return vincular(2); /* OJO con la constante: valida que el lote no tenga cambios */
    }

    public boolean vincular(int validacion) {
        return vincular(validacion, false);
    }

    //  public boolean vincular(boolean remover) {
    //      return vincular(2, remover); /* OJO con la constante: valida que el lote no tenga cambios */
    //  }
    //
    public boolean vincular(int validacion, boolean remover) {
        return vincular(validacion, remover, 0); /* OJO con la constante: usa la fila actual */
    }

    protected boolean vincular(int validacion, boolean remover, int origen) {
        track("vincular", "validacion=" + validacion, "remover=" + remover, "origen=" + origen);
        descartarFormulariosVirtuales();
        //      boolean ok = setIdentificacionRecursoPagina(validacion, origen);
        boolean ok;
        boolean filaDisponible = setIdentificacionRecursoPagina(origen);
        switch (validacion) {
        case 1: /* OJO con la constante /* valida que la fila no tenga cambios */
            ok = filaDisponible ? isFilaSinCambios() : false;
            break;
        case 2: /* OJO con la constante /* valida que el lote no tenga cambios */
            ok = isLoteSinCambios();
            break;
        case 3: /* OJO con la constante /* valida que el lote no tenga cambios */
            filaDisponible = true; /* no importa si no hay fila disponible */
            ok = isLoteSinCambios(); /* con tal que el lote no tenga cambios */
            break;
        default: /* solo valida que la fila este disponible */
            ok = filaDisponible;
            break;
        }
        if (filaDisponible) {
            if (ok) {
                removerHipervinculo(remover);
            } else {
                TLC.getBitacora().error(CBM.HYPERLINK_EXCEPTION_1);
            }
        } else {
            TLC.getBitacora().error(CBM.PROCESS_NONE);
        }
        return filaDisponible && ok;
    }

    protected String accionVincular(String vinculo, int validacion, boolean remover, int origen) {
        return StringUtils.isNotBlank(vinculo) && vincular(validacion, remover, origen) ? vinculo : null;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos estandar para obtener el script de los botones de la pagina de actualizacion">
    public String getScriptIrAlPrimero() {
        //      track("getScriptIrAlPrimero");
        return null;
    }

    public String getScriptIrAlAnterior() {
        //      track("getScriptIrAlAnterior");
        return null;
    }

    public String getScriptIrAlSiguiente() {
        //      track("getScriptIrAlSiguiente");
        return null;
    }

    public String getScriptIrAlUltimo() {
        //      track("getScriptIrAlUltimo");
        return null;
    }

    public String getScriptRepaginar() {
        //      track("getScriptRepaginar");
        return null;
    }

    public String getScriptRefrescar() {
        //      track("getScriptRefrescar");
        return null;
    }

    public String getScriptReconsultar() {
        //      track("getScriptReconsultar");
        return null;
    }

    public String getScriptAgregar() {
        //      track("getScriptAgregar");
        return null;
    }

    public String getScriptEditar() {
        track("getScriptEditar");
        String table = null;
        String message1 = null;
        String message2 = null;
        String script = JS.getConfirmDialogJavaScript(table, message1, message2);
        return script;
    }

    public String getScriptEliminar() {
        track("getScriptEliminar");
        String table = null;
        String message1 = null;
        //      String message2 = Bitacora.getTextoMensaje(CBM.DELETE_CONFIRM_MESSAGE);
        String message2 = null;
        String script = JS.getConfirmDialogJavaScript(table, message1, message2);
        return script;
    }

    public String getScriptAplicar() {
        //      track("getScriptAplicar");
        return null;
    }

    public String getScriptDeshacer() {
        track("getScriptDeshacer");
        String table = null;
        String message1 = null;
        String message2 = null;
        String script = JS.getConfirmDialogJavaScript(table, message1, message2);
        return script;
    }

    public String getScriptConfirmar() {
        track("getScriptConfirmar");
        String message1 = null; /* getMensajeCambiosPorConfirmar(); */
        String script = JS.getConfirmDialogJavaScript(message1, true);
        return script;
    }

    public String getScriptDescartar() {
        track("getScriptDescartar");
        String message1 = getMensajeCambiosPorDescartar();
        String script = JS.getConfirmDialogJavaScript(message1, true);
        return script;
    }

    public String getScriptProcesar() {
        track("getScriptProcesar");
        String message1 = Bitacora.getTextoMensaje(CBM.PROCESS_CONFIRM_MESSAGE);
        String script = JS.getConfirmDialogJavaScript(message1, true);
        return script;
    }

    public String getScriptRetornar() {
        if (designing) {
            return null;
        }
        track("getScriptRetornar");
        String campo = getPaginaActualizacion().getContextoSesion().getCampoAccionRetorno();
        String valor = null; /* getSessionCookie(); */
        String boton = getPaginaActualizacion().getContextoSesion().getBotonAccionRetorno();
        String script = JS.getCloseWindowJavaScript(campo, valor, boton);
        //Bitacora.trace(script);
        return script;
    }

    public String getScriptRetornarRecursoActual() {
        if (designing || isFuncionReturnInhabilitada()) {
            return null;
        }
        track("getScriptRetornarRecursoActual");
        String campo = getPaginaActualizacion().getContextoSesion().getCampoAccionRetorno();
        String valor = campo == null ? null : getValorRetornoRecursoActual();
        String boton = getPaginaActualizacion().getContextoSesion().getBotonAccionRetorno();
        String script = JS.getCloseWindowJavaScript(campo, valor, boton);
        //Bitacora.trace(script);
        return script;
    }

    public String getScriptRetornarRecursoEscogido() {
        if (designing || isFuncionReturnInhabilitada() || isFuncionReturnFilaEscogidaInhabilitada()) {
            return null;
        }
        track("getScriptRetornarRecursoEscogido");
        String campo = getPaginaActualizacion().getContextoSesion().getCampoAccionRetorno();
        String valor = campo == null ? null : getValorRetornoRecursoEscogido();
        String boton = getPaginaActualizacion().getContextoSesion().getBotonAccionRetorno();
        String script = JS.getCloseWindowJavaScript(campo, valor, boton);
        //Bitacora.trace(script);
        return script;
    }

    public String getScriptAbrirVentana(String urx) {
        return getScriptAbrirVentana(urx, 0); /* OJO con la constante: usa la fila actual */
    }

    public String getScriptAbrirVentana(String urx, int origen) {
        Long recurso;
        switch (origen) {
        case 1: /* OJO con la constante: usa la fila escogida */
            recurso = getIdentificacionRecursoEscogido();
            break;
        default: /* usa la fila actual */
            recurso = getIdentificacionRecursoActual();
            break;
        }
        return recurso == null ? null : getScriptAbrirVentana(urx, recurso);
    }

    public String getScriptAbrirVentanaVerDetalle(String urx) {
        return getScriptAbrirVentanaVerDetalle(urx, 0); /* OJO con la constante: usa la fila actual */
    }

    public String getScriptAbrirVentanaVerDetalle(String urx, int origen) {
        Long recurso;
        switch (origen) {
        case 1: /* OJO con la constante: usa la fila escogida */
            recurso = getIdentificacionRecursoEscogido();
            break;
        default: /* usa la fila actual */
            recurso = getIdentificacionRecursoActual();
            break;
        }
        return recurso == null ? null : getScriptAbrirVentanaVerDetalle(urx, recurso);
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos estandar para obtener el url de la imagen los botones de la pagina de actualizacion">
    public String getUrlImagenIrAlPrimero() {
        return "/resources/pagination_first.gif";
    }

    public String getUrlImagenIrAlAnterior() {
        return "/resources/pagination_prev.gif";
    }

    public String getUrlImagenIrAlSiguiente() {
        return "/resources/pagination_next.gif";
    }

    public String getUrlImagenIrAlUltimo() {
        return "/resources/pagination_last.gif";
    }

    public String getUrlImagenRepaginar() {
        return "/resources/repaginate24.gif";
    }

    public String getUrlImagenRefrescar() {
        return isBotonesAccionSinImagen() ? null : "/resources/refresh24.gif";
    }

    public String getUrlImagenAgregar() {
        return isBotonesAccionSinImagen() ? null : "/resources/add24.gif";
    }

    public String getUrlImagenEditar() {
        return isBotonesAccionSinImagen() ? null : "/resources/edit24.gif";
    }

    public String getUrlImagenDeshacer() {
        return isBotonesAccionSinImagen() ? null : "/resources/undo24.gif";
    }

    public String getUrlImagenEliminar() {
        return isBotonesAccionSinImagen() ? null : "/resources/delete24.gif";
    }

    public String getUrlImagenAplicar() {
        return isBotonesAccionSinImagen() ? null : "/resources/apply24.gif";
    }

    public String getUrlImagenConfirmar() {
        return isBotonesAccionSinImagen() ? null : "/resources/save24.gif";
    }

    public String getUrlImagenDescartar() {
        return isBotonesAccionSinImagen() ? null : "/resources/discard24.gif";
    }

    public String getUrlImagenRetornar() {
        //      return isBotonesAccionSinImagen() ? null : "/resources/return24.gif";
        return "/resources/return.gif";
    }

    public String getUrlImagenDetallar() {
        return "/resources/detail.gif";
    }

    public String getUrlImagenProcesar() {
        return "/resources/run.gif";
    }

    public String getUrlImagenEscoger() {
        return "/resources/pick.gif";
    }

    @Override
    public String getUrlImagenAbrirVinculo() {
        if (designing) {
            return "/resources/open_link_enabled.gif";
        }
        if (isFuncionOpenLinkInhabilitada()) {
            return "/resources/open_link_disabled.gif";
        } else {
            return "/resources/open_link_enabled.gif";
        }
    }

    public String getUrlImagenAbrirVentanaVerDetalles() {
        return "/resources/detail.gif";
    }

    public String getUrlImagenFilaProcesada() {
        if (designing) {
            return "/resources/ok_small.gif";
        }
        if (getPaginaActualizacion().getRecursoDataProvider().esFilaProcesada(getCurrentRowKey())) {
            if (getPaginaActualizacion().getRecursoDataProvider().esFilaConflictiva(getCurrentRowKey())) {
                return getUrlImagenFilaConflictiva();
            } else {
                return "/resources/ok_small.gif";
            }
        }
        return "/resources/ok_dimmed.gif";
    }

    protected String getUrlImagenFilaConflictiva() {
        if (designing) {
            return "/resources/failed_small.gif";
        }
        String clave = getCurrentRowKey().getRowId();
        String valor = (String) getPaginaActualizacion().getRecursoDataProvider().getFilasConflictivas().get(clave);
        if (valor != null) {
            int severidad = Integer.parseInt(valor.substring(0, 1));
            if (severidad == 0) {
                return "/resources/unknown_small.gif";
            }
            //          switch (severidad) {
            //              case 0: /* OJO con la constante: 0 -> fila "ignorada" (no se sabe si tiene o no errores) */
            //                  return "/resources/unknown_small.gif";
            //              case 1: /* OJO con la constante: 1 -> fila con un error desconocido */
            //                  break;
            //              case 2: /* OJO con la constante: 2 -> fila con un error conocido */
            //                  break;
            //              case 3: /* OJO con la constante: 3 -> fila con uno o mas errores, todos conocidos */
            //                  break;
            //              default:
            //                  break;
            //              }
        }
        return "/resources/failed_small.gif";
    }

    public String getUrlImagenMaestroFilaProcesada() {
        if (designing) {
            return "/resources/ok_small.gif";
        }
        return getPaginaActualizacion().getRecursoDataProvider().esFilaProcesada(getCurrentRowKey())
                ? "/resources/ok_small.gif"
                : "/resources/ok_dimmed.gif";
    }

    public String getUrlImagenSeveridadMensajeFilaNoDisponible() {
        return "/resources/info_medium.gif";
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos estandar para obtener el toolTip de los botones de la pagina de actualizacion">
    public String getToolTipImagenFilaProcesada() {
        if (designing) {
            return null;
        }
        if (getPaginaActualizacion().getRecursoDataProvider().esFilaProcesada(getCurrentRowKey())) {
            if (getPaginaActualizacion().getRecursoDataProvider().esFilaConflictiva(getCurrentRowKey())) {
                return getToolTipImagenFilaConflictiva();
            } else {
                return BundleWebui.getString("imagenFilaProcesada.toolTip");
            }
        }
        return getToolTipImagenFilaNoProcesada();
    }

    protected String getToolTipImagenFilaNoProcesada() {
        return null;
    }

    protected String getToolTipImagenFilaConflictiva() {
        if (designing) {
            return null;
        }
        String clave = getCurrentRowKey().getRowId();
        String valor = (String) getPaginaActualizacion().getRecursoDataProvider().getFilasConflictivas().get(clave);
        return valor == null ? null : valor.substring(1);
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos estndar para establecer la identificacion del recurso (comentados)">
    //  protected boolean setIdentificacionRecursoPagina() {
    //      return setIdentificacionRecursoPagina(0); /* OJO con la constante: no valida nada */
    //  }
    //  protected boolean setIdentificacionRecursoPagina(int validacion) {
    //      return setIdentificacionRecursoPagina(validacion, 0); /* OJO con la constante: usa la fila actual */
    //  }
    //  protected boolean setIdentificacionRecursoPagina(int validacion, int origen) {
    //      track("setIdentificacionRecursoPagina", "validacion=" + validacion, "origen=" + origen);
    //      RowKey rowKey = null;
    //      switch (origen) {
    //          case 1:  /* OJO con la constante: usa la fila escogida */
    //              rowKey = getPaginaActualizacion().getRecursoDataProvider().getFilaEscogida();
    //              break;
    //          default: /* usa la fila actual */
    //              rowKey = getCurrentRowKey();
    //              break;
    //      }
    //      return setIdentificacionRecursoPagina(validacion, rowKey);
    //  }
    //  protected boolean setIdentificacionRecursoPagina(int validacion, RowKey rowKey) {
    //      boolean ok = false;
    //      Long valor = null;
    //      try {
    //          if (rowKey != null) {
    //              if (getPaginaActualizacion().getRecursoDataProvider().isRowAvailable(rowKey)) {
    //                  getPaginaActualizacion().getRecursoDataProvider().setCursorRow(rowKey);
    //                  if (getPaginaActualizacion().getRecursoDataProvider().isRecursoIdentificable()) {
    //                      valor = getRecursoIdentificableDataProvider().getIdentificacionRecurso(rowKey);
    //                  }
    //                  switch (validacion) {
    //                      case 1:  /* OJO con la constante: valida que la fila no tenga cambios */
    //                          ok = isFilaSinCambios();
    //                          break;
    //                      case 2:  /* OJO con la constante: valida que el lote no tenga cambios */
    //                          ok = isLoteSinCambios();
    //                          break;
    //                      default: /* no valida nada! */
    //                          ok = true;
    //                          break;
    //                  }
    //              } else {
    //                  rowKey = null;
    //              }
    //          }
    //      } catch (Exception ex) {
    //          rowKey = null;
    //          valor = null;
    //          handle(ex);
    //      }
    //      getPaginaActualizacion().getRecursoDataProvider().setFilaEscogida(rowKey);
    //      getPaginaActualizacion().getContextoPeticion().setIdentificacionRecurso(valor);
    //      return ok;
    //  }
    // </editor-fold>
    //
    // <editor-fold defaultstate="collapsed" desc="metodos estandar para establecer la identificacion del recurso">
    protected boolean setIdentificacionRecursoPagina() {
        return setIdentificacionRecursoPagina(0); /* OJO con la constante: usa la fila actual */
    }

    protected boolean setIdentificacionRecursoPagina(int origen) {
        track("setIdentificacionRecursoPagina", "origen=" + origen);
        RowKey rowKey;
        switch (origen) {
        case 1: /* OJO con la constante: usa la fila escogida */
            rowKey = getPaginaActualizacion().getRecursoDataProvider().getFilaEscogida();
            break;
        default: /* usa la fila actual */
            rowKey = getCurrentRowKey();
            break;
        }
        return setIdentificacionRecursoPagina(rowKey);
    }

    protected boolean setIdentificacionRecursoPagina(RowKey rowKey) {
        Long valor = null;
        if (rowKey != null) {
            try {
                if (getPaginaActualizacion().getRecursoDataProvider().isRowAvailable(rowKey)) {
                    getPaginaActualizacion().getRecursoDataProvider().setCursorRow(rowKey);
                    if (getPaginaActualizacion().getRecursoDataProvider().isRecursoIdentificable()) {
                        valor = getRecursoIdentificableDataProvider().getIdentificacionRecurso(rowKey);
                    }
                } else {
                    rowKey = null;
                }
            } catch (Exception ex) {
                rowKey = null;
                valor = null;
                handle(ex);
            }
        }
        getPaginaActualizacion().getRecursoDataProvider().setFilaEscogida(rowKey);
        getPaginaActualizacion().getContextoPeticion().setIdentificacionRecurso(valor);
        return rowKey != null;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos estandar para establecer la posicion del cursor">
    protected boolean cursorSet(int posicion) {
        return cursorSet(posicion, false);
    }

    protected boolean cursorSet(int posicion, boolean circular) {
        track("cursorSet", "posicion=" + posicion, "circular=" + circular);
        boolean ok = false;
        boolean reposicion = false;
        try {
            switch (posicion) {
            case 1:
                ok = getPaginaActualizacion().getRecursoDataProvider().cursorFirst();
                break;
            case 2:
                ok = getPaginaActualizacion().getRecursoDataProvider().cursorPrevious();
                if (!ok && circular) {
                    ok = getPaginaActualizacion().getRecursoDataProvider().cursorLast();
                }
                break;
            case 3:
                ok = getPaginaActualizacion().getRecursoDataProvider().cursorNext();
                if (!ok && circular) {
                    ok = getPaginaActualizacion().getRecursoDataProvider().cursorFirst();
                }
                break;
            case 4:
                ok = getPaginaActualizacion().getRecursoDataProvider().cursorLast();
                break;
            default:
                ok = reposicionar();
                reposicion = ok;
                if (!ok) {
                    ok = getPaginaActualizacion().getRecursoDataProvider().cursorNext();
                }
                if (!ok) {
                    ok = getPaginaActualizacion().getRecursoDataProvider().cursorFirst();
                }
                break;
            }
            if (ok && !reposicion) {
                RowKey rowKey = getPaginaActualizacion().getRecursoDataProvider().getCursorRow();
                getPaginaActualizacion().getRecursoDataProvider().setFilaEscogida(rowKey);
            }
        } catch (Exception ex) {
            handle(ex);
        } finally {
            if (!reposicion) {
                setNuevaPosicionCursor(ok);
            }
            return ok;
        }
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos estandar para el refresh de la pagina de actualizacion">
    protected boolean refresh() {
        track("refresh");
        if (isReadOnlyProcessing()) {
            return true;
        }
        boolean ok = false;
        try {
            getPaginaActualizacion().getRecursoDataProvider().refresh();
            getPaginaActualizacion().posrefrescar();
            descartarFormulariosVirtuales();
            ok = getPaginaActualizacion().getRecursoDataProvider().isFilaEscogidaDisponible();
            // OJO: cursorSet(1) no es necesario si es PaginaConsultaConArbol  PaginaConsultaConTabla, pero no hace dao
            ok = ok || cursorSet(1); /* OJO con la constante: cursorFirst */
        } catch (Exception ex) {
            handle(ex);
        }
        setNuevaPosicionCursor(ok);
        return ok;
    }

    protected boolean requery() {
        track("requery");
        //      if (isReadOnlyProcessing()) {
        //          return true;
        //      }
        boolean ok = false;
        try {
            getPaginaActualizacion().getRecursoDataProvider().restoreQuery();
            getPaginaActualizacion().posconsultar();
            descartarFormulariosVirtuales();
            ok = getPaginaActualizacion().getRecursoDataProvider().isFilaEscogidaDisponible();
            // OJO: cursorSet(1) no es necesario si es PaginaConsultaConArbol  PaginaConsultaConTabla, pero no hace dao
            ok = ok || cursorSet(1); /* OJO con la constante: cursorFirst */
            setVersionComandoSelectPagina();
            setMaestroPagina();
        } catch (Exception ex) {
            handle(ex);
        }
        setNuevaPosicionCursor(ok);
        return ok;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos estandar para el manejo de multiples funciones de accion">
    public boolean isAccionMultiFuncion() {
        if (designing) {
            return true;
        }
        if (isPaginaActualizacionConAccionMultiple()) {
            Option[] items = getPaginaActualizacionConAccionMultiple().getOpcionesListaFuncionAccion();
            return items != null && items.length > 1;
        }
        return false;
    }

    public boolean isAccionMultiFuncionHabilitada() {
        if (designing) {
            return true;
        }
        return isAccionMultiFuncion() && isFilaDisponible() && isLoteSinCambios();
    }

    public boolean isAccionMultiFuncionInhabilitada() {
        if (designing) {
            return true;
        }
        return !isAccionMultiFuncionHabilitada();
    }

    public Long getFuncionAccionSeleccionada() {
        if (designing) {
            return null;
        }
        return getPaginaActualizacion().getRecursoDataProvider().getFuncionBusinessProcess();
    }

    public void setFuncionAccionSeleccionada(Long funcionAccionSeleccionada) {
        Long funcionProcesarRecurso = getFuncionProcesarRecurso(funcionAccionSeleccionada);
        long funcion = funcionProcesarRecurso == null ? -1L : funcionProcesarRecurso;
        try {
            getPaginaActualizacion().getRecursoDataProvider().setFuncionBusinessProcess(funcion);
        } catch (ExcepcionAplicacion ex) {
            handle(ex);
        }
    }

    public String getEtiquetaOpcionSeleccionadaListaFuncionAccion() {
        if (designing) {
            return null;
        }
        String label = isAccionMultiFuncion()
                ? STP.getToken(getEtiquetaOpcionSeleccionada(
                        getPaginaActualizacionConAccionMultiple().getListaFuncionAccion1()))
                : null; /* BundleWebui.getString("botonProcesar.text") */
        /**/
        return StringUtils.defaultIfBlank(label, getI18n().getEtiquetaSeleccioneUnaOpcionListaFuncionAccion());
    }

    private Long getFuncionProcesarRecurso(Long funcion) {
        Option opcion = null;
        if (isAccionMultiFuncion()) {
            opcion = getOpcionListaDesplegable(funcion,
                    getPaginaActualizacionConAccionMultiple().getListaFuncionAccion1());
        }
        //      return opcion == null ? getPaginaActualizacion().getFuncionModificarRecurso() : funcion;
        return opcion == null ? null : funcion;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="metodos estandar para el manejo de multiples funciones de edicion">
    public boolean isEdicionMultiFuncion() {
        if (designing) {
            return true;
        }
        if (isPaginaActualizacionConEdicionMultiple()) {
            Option[] items = getPaginaActualizacionConEdicionMultiple().getOpcionesListaFuncionEdicion();
            return items != null && items.length > 1;
        }
        return false;
    }

    public boolean isEdicionMultiFuncionHabilitada() {
        if (designing) {
            return true;
        }
        return isEdicionMultiFuncion() && isFilaDisponible() && isLoteSinCambios();
    }

    public boolean isEdicionMultiFuncionInhabilitada() {
        if (designing) {
            return true;
        }
        return !isEdicionMultiFuncionHabilitada();
    }

    private Long funcionEdicionSeleccionada = null;

    public Long getFuncionEdicionSeleccionada() {
        if (designing) {
            return null;
        }
        if (getPaginaActualizacion().getRecursoDataProvider().isFuncionUpdateEjecutada()) {
            return getPaginaActualizacion().getRecursoDataProvider().getFuncionUpdate();
        }
        if (isEdicionMultiFuncion()) {
            return funcionEdicionSeleccionada;
        }
        //      return getPaginaActualizacion().getRecursoDataProvider().getFuncionUpdate();
        return getPaginaActualizacion().getRecursoDataProvider().isFuncionUpdateAutorizada()
                ? getPaginaActualizacion().getRecursoDataProvider().getFuncionUpdate()
                : getPaginaActualizacion().getFuncionModificarRecurso();
    }

    public void setFuncionEdicionSeleccionada(Long funcion) {
        Long funcionEditarRecurso = getFuncionEditarRecurso(funcion);
        if (funcionEditarRecurso != null) {
            funcionEdicionSeleccionada = funcionEditarRecurso;
            editar(funcionEditarRecurso);
        }
    }

    public String getEtiquetaOpcionSeleccionadaListaFuncionEdicion() {
        if (designing) {
            return null;
        }
        String label = isEdicionMultiFuncion()
                ? STP.getToken(getEtiquetaOpcionSeleccionada(
                        getPaginaActualizacionConEdicionMultiple().getListaFuncionEdicion1()))
                : BundleWebui.getString("botonEditar.text");
        /**/
        return StringUtils.defaultIfBlank(label, getI18n().getEtiquetaSeleccioneUnaOpcionListaFuncionEdicion());
    }

    private Long getFuncionEditarRecurso(Long funcion) {
        Option opcion = null;
        if (isEdicionMultiFuncion()) {
            opcion = getOpcionListaDesplegable(funcion,
                    getPaginaActualizacionConEdicionMultiple().getListaFuncionEdicion1());
        }
        //      return opcion == null ? getPaginaActualizacion().getFuncionModificarRecurso() : funcion;
        return opcion == null ? null : funcion;
    }
    // </editor-fold>
}