Java tutorial
/* * 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 javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.validator.ValidatorException; import ips1ap101.lib.base.bundle.BundleWebui; import ips1ap101.lib.base.constant.CBM; import ips1ap101.lib.base.entity.enumeration.TipoDatoParEnumeration; import ips1ap101.lib.base.util.BitUtils; import ips1ap101.lib.core.app.Bitacora; 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.util.STP; import org.apache.commons.lang.StringUtils; /** * @author Jorge Campins */ public class GestorBusquedaReferencia { public GestorBusquedaReferencia(RecursoCachedRowSetDataProvider recursoDataProvider, RecursoCachedRowSetDataProvider recursoReferenciadoDataProvider, String columnaIdentificacionRecursoReferenciado) { this.init(recursoDataProvider, recursoReferenciadoDataProvider, columnaIdentificacionRecursoReferenciado, true); } public GestorBusquedaReferencia(RecursoCachedRowSetDataProvider recursoDataProvider, RecursoCachedRowSetDataProvider recursoReferenciadoDataProvider, String columnaIdentificacionRecursoReferenciado, boolean funcionSelectEjecutable) { this.init(recursoDataProvider, recursoReferenciadoDataProvider, columnaIdentificacionRecursoReferenciado, funcionSelectEjecutable); } private void init(RecursoCachedRowSetDataProvider recursoDataProvider, RecursoCachedRowSetDataProvider recursoReferenciadoDataProvider, String columnaIdentificacionRecursoReferenciado, boolean funcionSelectEjecutable) { this.recursoDataProvider = recursoDataProvider; this.recursoReferenciadoDataProvider = recursoReferenciadoDataProvider; /* OJO: tiene que implementar RecursoIdentificableDataProvider */ this.recursoReferenciadoDataProvider.setSoloReferencia(true); this.columnaIdentificacionRecursoReferenciado = columnaIdentificacionRecursoReferenciado; this.funcionSelectEjecutable = funcionSelectEjecutable; this.filtroBusqueda = null; } /** * Conserva el valor de la propiedad recursoDataProvider. */ private RecursoCachedRowSetDataProvider recursoDataProvider; /** * Getter para propiedad recursoDataProvider. * * @return Valor de la propiedad recursoDataProvider. */ public RecursoCachedRowSetDataProvider getRecursoDataProvider() { return this.recursoDataProvider; } /** * Conserva el valor de la propiedad recursoReferenciadoDataProvider. */ private RecursoCachedRowSetDataProvider recursoReferenciadoDataProvider; /** * Getter para propiedad recursoReferenciadoDataProvider. * * @return Valor de la propiedad recursoReferenciadoDataProvider. */ public RecursoCachedRowSetDataProvider getRecursoReferenciadoDataProvider() { return this.recursoReferenciadoDataProvider; } /** * Conserva el valor de la propiedad columnaIdentificacionRecursoReferenciado. */ private String columnaIdentificacionRecursoReferenciado; /** * Getter para propiedad columnaIdentificacionRecursoReferenciado. * * @return Valor de la propiedad columnaIdentificacionRecursoReferenciado. */ private String getColumnaIdentificacionRecursoReferenciado() { return this.columnaIdentificacionRecursoReferenciado; } /** * Conserva el valor de la propiedad funcionSelectEjecutable. */ private boolean funcionSelectEjecutable = false; /** * Getter para propiedad funcionSelectEjecutable. * * @return Valor de la propiedad funcionSelectEjecutable. */ private boolean isFuncionSelectEjecutable() { return this.funcionSelectEjecutable; } /** * Conserva el valor de la propiedad nuevoFiltro. */ private boolean nuevoFiltro = false; /** * Getter para propiedad nuevoFiltro. * * @return Valor de la propiedad nuevoFiltro. */ private boolean isNuevoFiltro() { return this.nuevoFiltro; } /** * Setter para propiedad nuevoFiltro. * * @param nuevoFiltro Nuevo valor de la propiedad nuevoFiltro. */ private void setNuevoFiltro(boolean nuevoFiltro) { this.nuevoFiltro = nuevoFiltro; } /** * Conserva el valor de la propiedad filtroBusqueda. */ private FiltroBusqueda filtroBusqueda; /** * Getter para propiedad filtroBusqueda. * * @return Valor de la propiedad filtroBusqueda. */ public FiltroBusqueda getFiltroBusqueda() { return this.filtroBusqueda; } /** * Setter para propiedad filtroBusqueda. * * @param filtroBusqueda Nuevo valor de la propiedad filtroBusqueda. */ public void setFiltroBusqueda(FiltroBusqueda filtroBusqueda) { if (this.filtroBusqueda == null && filtroBusqueda == null) { this.nuevoFiltro = false; } else if (this.filtroBusqueda == null) { this.nuevoFiltro = true; } else { this.nuevoFiltro = !this.filtroBusqueda.equals(filtroBusqueda); } this.filtroBusqueda = filtroBusqueda; this.funcionSelectEjecutable = true; } public void validarCodigoRecursoReferenciado(FacesContext fc, UIComponent uic, Object o, RowKey currentRowKey) { this.validarCodigoRecursoReferenciado(fc, uic, o, currentRowKey, false); } public void validarCodigoRecursoReferenciado(FacesContext fc, UIComponent uic, Object o, RowKey currentRowKey, boolean flexible) { String string = STP.getString(o); boolean id = false; if ((string != null) && string.startsWith(Global.PREFIJO_STRING_ID_RECURSO)) { string = string.substring(1); id = true; } this.validarCodigoRecursoReferenciado(fc, uic, string, currentRowKey, flexible, id); } public void validarCodigoRecursoReferenciado(FacesContext fc, UIComponent uic, Object o, RowKey rk, boolean flexible, boolean id) { Bitacora.trace(this.getClass(), "validarCodigoRecursoReferenciado", uic.getId() + "=" + o, "rk=" + rk, "flex=" + flexible, "id=" + id); // int tipoError = 1; /* OJO con la constante, 1 -> fila con un error desconocido */ String columna = this.getColumnaIdentificacionRecursoReferenciado(); try { Long idViejo = (Long) this.getRecursoDataProvider().getValue(columna, rk); Long idNuevo = null; boolean esIgual = false; String string = STP.getString(o); if (StringUtils.isEmpty(string)) { esIgual = (idViejo == null) ? true : false; } else { String clave = null; Object valor = null; if (!id && this.getRecursoReferenciadoDataProvider().isRecursoCodificable()) { clave = this.getRecursoReferenciadoDataProvider().getRecursoCodificableDataProvider() .getColumnaCodigoRecurso(); valor = string; } else if (this.getRecursoReferenciadoDataProvider().isRecursoIdentificable()) { clave = this.getRecursoReferenciadoDataProvider().getRecursoIdentificableDataProvider() .getColumnaIdentificacionRecurso(); valor = STP.getObjeto(string, TipoDatoParEnumeration.ENTERO_GRANDE); /* Long.valueOf(string); */ if (valor == null) { // tipoError = 2; /* OJO con la constante, 2 -> fila con un error conocido */ throw new ExcepcionAplicacion(Bitacora.getTextoMensaje(CBM.CHECK_CHANGES_EXCEPTION_4, TipoDatoParEnumeration.ENTERO_GRANDE.getLabel())); } } else if (this.getRecursoReferenciadoDataProvider().isRecursoEnumerable()) { clave = this.getRecursoReferenciadoDataProvider().getRecursoEnumerableDataProvider() .getColumnaNumeroRecurso(); valor = STP.getObjeto(string, TipoDatoParEnumeration.ENTERO); /* Integer.valueOf(string); */ if (valor == null) { // tipoError = 2; /* OJO con la constante, 2 -> fila con un error conocido */ throw new ExcepcionAplicacion(Bitacora.getTextoMensaje(CBM.CHECK_CHANGES_EXCEPTION_4, TipoDatoParEnumeration.ENTERO.getLabel())); } } else { // tipoError = 2; /* OJO con la constante, 2 -> fila con un error conocido */ throw new ExcepcionAplicacion(Bitacora.getTextoMensaje(CBM.RECURSO_NO_REFERENCIABLE, "<" + columna + ">", string, "")); } RowKey rowKey = this.getRow(clave, valor); if (rowKey != null) { if (this.getRecursoReferenciadoDataProvider().isRecursoIdentificable()) { idNuevo = this.getRecursoReferenciadoDataProvider().getRecursoIdentificableDataProvider() .getIdentificacionRecurso(rowKey); } else if (this.getRecursoReferenciadoDataProvider().isRecursoEnumerable()) { idNuevo = Long.valueOf(this.getRecursoReferenciadoDataProvider() .getRecursoEnumerableDataProvider().getNumeroRecurso(rowKey)); } esIgual = idViejo == null ? false : idViejo.equals(idNuevo); if (!esIgual && !flexible && this.getRecursoReferenciadoDataProvider().isRecursoDesactivable()) { Boolean inactivo = this.getRecursoReferenciadoDataProvider() .getRecursoDesactivableDataProvider().getEsRecursoInactivo(rowKey); if (BitUtils.valueOf(inactivo)) { // tipoError = 2; /* OJO con la constante, 2 -> fila con un error conocido */ throw new ExcepcionAplicacion( Bitacora.getTextoMensaje(CBM.RECURSO_INACTIVO, "<" + columna + ">", string)); } } } else { // tipoError = 2; /* OJO con la constante, 2 -> fila con un error conocido */ throw new ExcepcionAplicacion(Bitacora.getTextoMensaje(CBM.RECURSO_NO_REFERENCIABLE, "<" + columna + ">", string, "")); } } if (!esIgual) { this.getRecursoDataProvider().setValue(columna, rk, idNuevo); } } catch (DataProviderException | ExcepcionAplicacion ex) { this.getRecursoDataProvider().setValue(columna, rk, null); if (ex instanceof ValidatorException) { throw (ValidatorException) ex; } else { FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, ex.getMessage(), null); // String mensaje = tipoError + ex.getMessage(); // this.getRecursoDataProvider().getFilasConflictivas().put(currentRowKey.getRowId(), mensaje); throw new ValidatorException(message); } } } public String getCodigoRecursoReferenciado(RowKey currentRowKey) { // Bitacora.trace(this.getClass(), "getCodigoRecursoReferenciado"); Bitacora.stack(); String codigo = null; try { // String clave = this.getRecursoReferenciadoDataProvider().getRecursoIdentificableDataProvider().getColumnaIdentificacionRecurso(); String clave = null; Long valor = (Long) this.getRecursoDataProvider() .getValue(this.getColumnaIdentificacionRecursoReferenciado(), currentRowKey); if (this.getRecursoReferenciadoDataProvider().isRecursoIdentificable()) { clave = this.getRecursoReferenciadoDataProvider().getRecursoIdentificableDataProvider() .getColumnaIdentificacionRecurso(); } else if (this.getRecursoReferenciadoDataProvider().isRecursoEnumerable()) { clave = this.getRecursoReferenciadoDataProvider().getRecursoEnumerableDataProvider() .getColumnaNumeroRecurso(); } if (clave != null && BitUtils.valueOf(valor)) { /* valor != null && valor != 0 */ RowKey rowKey = this.getRow(clave, valor); if (rowKey != null) { if (this.getRecursoReferenciadoDataProvider().isRecursoCodificable()) { codigo = this.getRecursoReferenciadoDataProvider().getRecursoCodificableDataProvider() .getCodigoRecurso(rowKey); } else { codigo = this.getRecursoReferenciadoDataProvider().getRecursoIdentificableDataProvider() .getIdentificacionRecurso(rowKey).toString(); } } } } catch (Exception ex) { TLC.getBitacora().fatal(ex); } return codigo; } public void setCodigoRecursoReferenciado(RowKey currentRowKey, String valor) { Bitacora.trace(this.getClass(), "setCodigoRecursoReferenciado", "valor=" + valor); if (StringUtils.isEmpty(valor)) { this.getRecursoDataProvider().setValue(this.getColumnaIdentificacionRecursoReferenciado(), currentRowKey, null); } } public String getNombreRecursoReferenciado(RowKey currentRowKey) { // Bitacora.trace(this.getClass(), "getNombreRecursoReferenciado"); Bitacora.stack(); String nombre = null; try { // String clave = this.getRecursoReferenciadoDataProvider().getRecursoIdentificableDataProvider().getColumnaIdentificacionRecurso(); String clave = null; Long valor = (Long) this.getRecursoDataProvider() .getValue(this.getColumnaIdentificacionRecursoReferenciado(), currentRowKey); if (this.getRecursoReferenciadoDataProvider().isRecursoIdentificable()) { clave = this.getRecursoReferenciadoDataProvider().getRecursoIdentificableDataProvider() .getColumnaIdentificacionRecurso(); } else if (this.getRecursoReferenciadoDataProvider().isRecursoEnumerable()) { clave = this.getRecursoReferenciadoDataProvider().getRecursoEnumerableDataProvider() .getColumnaNumeroRecurso(); } if (clave != null && BitUtils.valueOf(valor)) { /* valor != null && valor != 0 */ RowKey rowKey = this.getRow(clave, valor); if (rowKey != null) { if (this.getRecursoReferenciadoDataProvider().isRecursoNombrable()) { nombre = this.getRecursoReferenciadoDataProvider().getRecursoNombrableDataProvider() .getNombreRecurso(rowKey); } if (nombre == null) { nombre = BundleWebui.getStringToEmpty("string.recurso.sin.nombre"); } } } } catch (Exception ex) { TLC.getBitacora().fatal(ex); } return nombre; } public String getNombreRecursoReferenciado(RowKey currentRowKey, String columna) { Bitacora.trace(this.getClass(), "getNombreRecursoReferenciado"); String nombre = null; try { // String clave = this.getRecursoReferenciadoDataProvider().getRecursoIdentificableDataProvider().getColumnaIdentificacionRecurso(); String clave = null; Long valor = (Long) this.getRecursoDataProvider() .getValue(this.getColumnaIdentificacionRecursoReferenciado(), currentRowKey); if (this.getRecursoReferenciadoDataProvider().isRecursoIdentificable()) { clave = this.getRecursoReferenciadoDataProvider().getRecursoIdentificableDataProvider() .getColumnaIdentificacionRecurso(); } else if (this.getRecursoReferenciadoDataProvider().isRecursoEnumerable()) { clave = this.getRecursoReferenciadoDataProvider().getRecursoEnumerableDataProvider() .getColumnaNumeroRecurso(); } if (clave != null && BitUtils.valueOf(valor)) { /* valor != null && valor != 0 */ RowKey rowKey = this.getRow(clave, valor); if (rowKey != null) { nombre = STP.getString(this.getRecursoReferenciadoDataProvider().getValue(columna, rowKey)); if (nombre == null) { nombre = BundleWebui.getStringToEmpty("string.recurso.sin.nombre"); } } } } catch (Exception ex) { TLC.getBitacora().fatal(ex); } return nombre; } private RowKey getRow(String clave, Object valor) { Bitacora.trace(this.getClass(), "getRow", clave + "=" + valor, "fse=" + this.isFuncionSelectEjecutable(), "nf=" + this.isNuevoFiltro()); RowKey rowKey = null; try { if (this.getRecursoReferenciadoDataProvider().cursorFirst()) { if (this.isFuncionSelectEjecutable() && this.isNuevoFiltro()) { } else { rowKey = this.getRecursoReferenciadoDataProvider().findFirst(clave, valor); } } if (this.isFuncionSelectEjecutable() && rowKey == null) { this.getRecursoReferenciadoDataProvider().getRecursoConsultableDataProvider() .ejecutarFuncionSelect(this.getFilter(clave, valor)); this.setNuevoFiltro(false); if (this.getRecursoReferenciadoDataProvider().cursorFirst()) { rowKey = this.getRecursoReferenciadoDataProvider().getCursorRow(); } } if (this.getRecursoReferenciadoDataProvider().isRowAvailable(rowKey)) { this.getRecursoReferenciadoDataProvider().setCursorRow(rowKey); } } catch (DataProviderException | ExcepcionAplicacion ex) { rowKey = null; TLC.getBitacora().fatal(ex); } return this.getRecursoReferenciadoDataProvider().isRowAvailable(rowKey) ? rowKey : null; } private FiltroBusqueda getFilter(String clave, Object valor) { // FiltroBusqueda filtro = new FiltroBusqueda(this.getRecursoDataProvider().getCachedRowSet().getDataSourceName()); FiltroBusqueda filtro = new FiltroBusqueda(); filtro.addCriterio(clave, valor); filtro.addFiltro(this.getFiltroBusqueda()); return filtro; } }