/*
* Ara - Capture Species and Specimen Data
*
* Copyright © 2009 INBio (Instituto Nacional de Biodiversidad).
* Heredia, Costa Rica.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.inbio.ara.inventory;
import com.sun.rave.web.ui.appbase.AbstractSessionBean;
import com.sun.webui.jsf.model.Option;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.FacesException;
import org.inbio.ara.dto.inventory.IdentificationDTO;
import org.inbio.ara.dto.inventory.IdentificationStatusDTO;
import org.inbio.ara.dto.inventory.IdentificationTypeDTO;
import org.inbio.ara.dto.inventory.PersonDTO;
import org.inbio.ara.dto.inventory.TaxonDTO;
import org.inbio.ara.dto.inventory.TaxonomicalRangeDTO;
import org.inbio.ara.facade.inventory.InventoryFacadeRemote;
import org.inbio.ara.facade.search.SearchFacadeRemote;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Set;
import org.inbio.ara.AraSessionBean;
import org.inbio.ara.util.AddRemoveList;
import org.inbio.ara.util.PaginationControllerRemix;
import org.inbio.ara.util.PaginationCoreInterface;
/**
* <p>Session scope data bean for your application. Create properties
* here to represent cached data that should be made available across
* multiple HTTP requests for an individual user.</p>
*
* <p>An instance of this class will be created for you automatically,
* the first time your application evaluates a value binding expression
* or method binding expression that references a managed bean using
* this class.</p>
*
* @version IdentificationSessionBean.java
* @version Created on 17/08/2009, 03:39:33 PM
* @author asanabria
*/
public class IdentificationSessionBean extends AbstractSessionBean implements Serializable, PaginationCoreInterface {
// <editor-fold defaultstate="collapsed" desc="Managed Component Definition">
/**
* <p>Automatically managed component initialization. <strong>WARNING:</strong>
* This method is automatically generated, so any user-specified code inserted
* here is subject to being replaced.</p>
*/
private void _init() throws Exception {
}
// </editor-fold>
//Injections
@EJB
private InventoryFacadeRemote inventoryFacade;
@EJB
private SearchFacadeRemote searchFacade;
//Objeto que controla la paginacion de la informacion de passport
private PaginationControllerRemix pagination = null;
//Value binding para los drop downs
private Long INVALID_VALUE_ID = new Long(-1);
//Entero que indica la cantidad de elementos que el usuario desea mostrar en los resultados
private int quantity = 10; //Por defecto se mostraran 10 elementos
//Bandera para saber si se activo el panel de busqueda avanzada
private boolean advancedSearch = false;
//Bandera para saber si se activo el panel de reidentificacion
private boolean reIdentify = false;
//Bandera para indicarle al paginador que trabaje en modo busqueda avanzada
private boolean queryMode = false;
//Bandera para indicarle al paginador que trabaje en modo busqueda simple
private boolean queryModeSimple = false;
private boolean resetReidentification = false;
//Specimen DTO seleccionado por el usuario para editar
private IdentificationDTO currentIdentificationDTO = new IdentificationDTO();
//SpecimenDTO que sera convertido en entidad y sera persistido
private IdentificationDTO queryIdentificationDTO = new IdentificationDTO();
//String que indica la consulta del usuario en la busqueda simple
private String consultaSimple = new String("");
//Objetos para los AddRemoveList
private AddRemoveList arTaxonList = new AddRemoveList();
//Variable para el addRemove de Taxones
private AddRemoveList arIdentifierList = new AddRemoveList();
// Elementos para soportar la lista de barcodes a agregar.
private Long[] specimenBarcodeSelected = new Long[0];
private Option[] specimenBarcodeList = new Option[0];
private String specimenBarcode = new String("");
private List<IdentificationDTO> selectedIdentifications = null;
/**
* <p>Construct a new session data bean instance.</p>
*/
public IdentificationSessionBean() {
}
/**
* <p>This method is called when this bean is initially added to
* session scope. Typically, this occurs as a result of evaluating
* a value binding or method binding expression, which utilizes the
* managed bean facility to instantiate this bean and store it into
* session scope.</p>
*
* <p>You may customize this method to initialize and cache data values
* or resources that are required for the lifetime of a particular
* user session.</p>
*/
@Override
public void init() {
// Perform initializations inherited from our superclass
super.init();
// Perform application initialization that must complete
// *before* managed components are initialized
// TODO - add your own initialiation code here
// <editor-fold defaultstate="collapsed" desc="Managed Component Initialization">
// Initialize automatically managed components
// *Note* - this logic should NOT be modified
try {
_init();
} catch (Exception e) {
log("IdentificationSessionBean Initialization Failure", e);
throw e instanceof FacesException ? (FacesException) e : new FacesException(e);
}
// </editor-fold>
// Perform application initialization that must complete
// *after* managed components are initialized
// TODO - add your own initialization code here
}
/**
* <p>This method is called when the session containing it is about to be
* passivated. Typically, this occurs in a distributed servlet container
* when the session is about to be transferred to a different
* container instance, after which the <code>activate()</code> method
* will be called to indicate that the transfer is complete.</p>
*
* <p>You may customize this method to release references to session data
* or resources that can not be serialized with the session itself.</p>
*/
@Override
public void passivate() {
}
/**
* <p>This method is called when the session containing it was
* reactivated.</p>
*
* <p>You may customize this method to reacquire references to session
* data or resources that could not be serialized with the
* session itself.</p>
*/
@Override
public void activate() {
}
/**
* <p>This method is called when this bean is removed from
* session scope. Typically, this occurs as a result of
* the session timing out or being terminated by the application.</p>
*
* <p>You may customize this method to clean up resources allocated
* during the execution of the <code>init()</code> method, or
* at any later time during the lifetime of the application.</p>
*/
@Override
public void destroy() {
}
/**
* Inicializar el data provider de especimenes
*/
public void initDataProvider() {
long inicioT = System.currentTimeMillis();
long finalT;
//int cantidad = inventoryFacade.countIdentifications().intValue();
//finalT = System.currentTimeMillis();
//System.out.println("Tiempo de despues de inventoryFacade.countIdentifications().intValue() = "+(finalT-inicioT));
//finalT=inicioT;
//this.setPagination(new PaginationControllerRemix(inventoryFacade.countIdentifications(getAraSessionBean().getGlobalCollectionId()).intValue(), getQuantity(), this));
this.setPagination(new PaginationControllerRemix(countAllIdentification().intValue(), getQuantity(), this));
finalT = System.currentTimeMillis();
//System.out.println("Tiempo de despues de this.setPagination) = "+(finalT-inicioT));
finalT=inicioT;
this.getPagination().firstResults();
finalT = System.currentTimeMillis();
//System.out.println("Tiempo de despues de getPagination().firstResults()) = "+(finalT-inicioT));
finalT=inicioT;
}
/**
* <p>Return a reference to the scoped data bean.</p>
*
* @return reference to the scoped data bean
*/
protected AraSessionBean getAraSessionBean() {
return (AraSessionBean) getBean("AraSessionBean");
}
/**
* La idea de este metodo es poder preguntar si determinado protocolo esta activado o no
* para una determinada colleccion
* @param collectionId
* @param protocolAtributeId
* @param value corresponde a alguno de los valores posibles para saber si el protocolo esta
* "activado" o "desactivado"
* @return
*/
public boolean matchCollectionProtocol(Long collectionId, Long protocolAtributeId, String value) {
return this.inventoryFacade.matchCollectionProtocol(collectionId, protocolAtributeId, value);
}
public InventoryFacadeRemote getInventoryFacade() {
return inventoryFacade;
}
public void setInventoryFacade(InventoryFacadeRemote inventoryFacade) {
this.inventoryFacade = inventoryFacade;
}
public boolean isAdvancedSearch() {
return advancedSearch;
}
public void setAdvancedSearch(boolean advancedSearch) {
this.advancedSearch = advancedSearch;
}
public boolean isReIdentify() {
return reIdentify;
}
public void setReIdentify(boolean reIdentify) {
this.reIdentify = reIdentify;
}
public IdentificationDTO getCurrentIdentificationDTO() {
return currentIdentificationDTO;
}
public void setCurrentIdentificationDTO(IdentificationDTO currentIdentificationDTO) {
this.currentIdentificationDTO = currentIdentificationDTO;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public IdentificationDTO getQueryIdentificationDTO() {
return queryIdentificationDTO;
}
public void setQueryIdentificationDTO(IdentificationDTO queryIdentificationDTO) {
this.queryIdentificationDTO = queryIdentificationDTO;
}
/**
* @return the queryModeSimple
*/
public boolean isQueryModeSimple() {
return queryModeSimple;
}
/**
* @param queryModeSimple the queryModeSimple to set
*/
public void setQueryModeSimple(boolean queryModeSimple) {
this.queryModeSimple = queryModeSimple;
}
/**
* @return the consultaSimple
*/
public String getConsultaSimple() {
return consultaSimple;
}
/**
* @param consultaSimple the consultaSimple to set
*/
public void setConsultaSimple(String consultaSimple) {
this.consultaSimple = consultaSimple;
}
/**
* @return the queryMode
*/
public boolean isQueryMode() {
return queryMode;
}
/**
* @param queryMode the queryMode to set
*/
public void setQueryMode(boolean queryMode) {
this.queryMode = queryMode;
}
public SearchFacadeRemote getSearchFacade() {
return searchFacade;
}
public void setSearchFacade(SearchFacadeRemote searchFacade) {
this.searchFacade = searchFacade;
}
public AddRemoveList getArIdentifierList() {
return arIdentifierList;
}
public void setArIdentifierList(AddRemoveList arIdentifierList) {
this.arIdentifierList = arIdentifierList;
}
public AddRemoveList getArTaxonList() {
return arTaxonList;
}
public void setArTaxonList(AddRemoveList arTaxonList) {
this.arTaxonList = arTaxonList;
}
public List<IdentificationTypeDTO> getIdentificationTypeList() {
return this.inventoryFacade.getAllIdentificationTypes();
}
public List<IdentificationStatusDTO> getIdentificationStatusList() {
return this.inventoryFacade.getAllIdentificationStatus();
}
public List<TaxonomicalRangeDTO> getTaxonomicalRangeList() {
return this.inventoryFacade.getAllTaxonomicalRage();
}
public List<PersonDTO> getIdentifiersList() {
return this.inventoryFacade.getAllIdentifiers();
}
public List<PersonDTO> getValidatorsList() {
return this.inventoryFacade.getAllValidators();
}
public List<TaxonDTO> getAllTaxonByTaxonomicalRange(Long taxonomicalRangeId) {
return this.inventoryFacade.getAllTaxonByTaxononimcalRange(taxonomicalRangeId, this.getAraSessionBean().getGlobalCollectionId(),
this.getAraSessionBean().getGlobalTaxonRangeCollection(), this.getAraSessionBean().getGlobalTaxonCollectionId());
}
public void reidentify(List<IdentificationDTO> selectedIdentifications) {
this.inventoryFacade.reIdentify(selectedIdentifications);
}
/**
* @return un String que contiene el detalle de la paginacion
*/
public String getQuantityTotal() {
int actualPage = this.getPagination().getActualPage();
int resultsPerPage = this.getPagination().getResultsPerPage();
int totalResults = this.getPagination().getTotalResults();
return " " + (actualPage + 1) + " - " + (actualPage + resultsPerPage) + " | " + totalResults + " ";
}
public Long countAllIdentification() {
return this.getInventoryFacade().countIdentifications(getAraSessionBean().getGlobalCollectionId());
}
/**
* Para evitar que retorne null al data provider del paginador
* @param l lista retornada para el paginador
* @return
*/
public List myReturn(List l) {
if (l == null) {
return new ArrayList<IdentificationDTO>();
} else if (l.get(0) == null) {
return new ArrayList<IdentificationDTO>();
} else {
return l;
}
}
public List getResults(int firstResult, int maxResults) {
long inicioT = System.currentTimeMillis();
long finalT;
Long collectionId = getAraSessionBean().getGlobalCollectionId();
//System.out.println("collectionId = "+collectionId);
List<IdentificationDTO> auxResult =
new ArrayList<IdentificationDTO>();
if (isQueryMode()) { //En caso de que sea busqueda avanzada
//System.out.println("*** ENTRA A BUSQUEDA AVANZADA ***");
//Set the collectionId into the DTO
//It is a mandatory filter
IdentificationDTO idto = queryIdentificationDTO;
idto.setCollectionId(collectionId);
try {
Set<Long> identificationResults = getSearchFacade().getIdentificationIds(idto);
//Integer count = ;
//i.longValue();
getPagination().setTotalResults(identificationResults.size());
//getPagination().setTotalResults(getSearchFacade().countIdentificationByCriteria(idto).intValue());
//finalT= System.currentTimeMillis();
//System.out.println("Tiempo al finalizar getResult = "+(finalT-inicioT));
return myReturn(searchFacade.searchIdentificationByCriteria(idto,
firstResult, maxResults, identificationResults));
} catch (Exception e) {
//finalT= System.currentTimeMillis();
//System.out.println("Tiempo al finalizar getResult = "+(finalT-inicioT));
return auxResult;
}
} else if (isQueryModeSimple()) { //En caso de que sea busqueda simple
//System.out.println("*** ENTRA A BUSQUEDA SIMPLE ***");
try {
getPagination().setTotalResults(getSearchFacade().countIdentificationByCriteria(consultaSimple).intValue());
//finalT= System.currentTimeMillis();
//System.out.println("Tiempo al finalizar getResult = "+(finalT-inicioT));
//inicioT = finalT;
return myReturn(searchFacade.searchIdentificationByCriteria(consultaSimple,
collectionId, firstResult, maxResults));
} catch (Exception e) {
//finalT= System.currentTimeMillis();
//System.out.println("Tiempo al finalizar getResult = "+(finalT-inicioT));
return auxResult;
}
} else { //Valores default
try {
//System.out.println("*** ENTRA A VALORES DEFAULT ***");
getPagination().setTotalResults(inventoryFacade.countIdentifications(getAraSessionBean().getGlobalCollectionId()).intValue());
// finalT= System.currentTimeMillis();
//System.out.println("Tiempo al finalizar getResult = "+(finalT-inicioT));
return myReturn(inventoryFacade.getAllIdentificationPaginated(firstResult,
maxResults, collectionId));
} catch (Exception e) {
//finalT= System.currentTimeMillis();
//System.out.println("Tiempo al finalizar getResult = "+(finalT-inicioT));
return auxResult;
}
}
}
/**
* @return the pagination
*/
public PaginationControllerRemix getPagination() {
return pagination;
}
/**
* @param pagination the pagination to set
*/
public void setPagination(PaginationControllerRemix pagination) {
this.pagination = pagination;
}
public Option[] getSpecimenBarcodeList() {
return specimenBarcodeList;
}
public void setSpecimenBarcodeList(Option[] specimenBarcodeList) {
this.specimenBarcodeList = specimenBarcodeList;
}
public Long[] getSpecimenBarcodeSelected() {
return specimenBarcodeSelected;
}
public void setSpecimenBarcodeSelected(Long[] specimenBarcodeSelected) {
this.specimenBarcodeSelected = specimenBarcodeSelected;
}
public String getSpecimenBarcode() {
return specimenBarcode;
}
public void setSpecimenBarcode(String specimenBarcode) {
this.specimenBarcode = specimenBarcode;
}
/**
* @return the selectedIdentifications
*/
public List<IdentificationDTO> getSelectedIdentifications() {
return selectedIdentifications;
}
/**
* @param selectedIdentifications the selectedIdentifications to set
*/
public void setSelectedIdentifications(List<IdentificationDTO> selectedIdentifications) {
this.selectedIdentifications = selectedIdentifications;
}
/**
* @return the resetReidentification
*/
public boolean isResetReidentification() {
return resetReidentification;
}
/**
* @param resetReidentification the resetReidentification to set
*/
public void setResetReidentification(boolean resetReidentification) {
this.resetReidentification = resetReidentification;
}
}