/* Ara - capture species and specimen data
*
* Copyright (C) 2009 INBio (Instituto Nacional de Biodiversidad)
*
* 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.facade.reports.impl;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import org.inbio.ara.facade.reports.*;
import javax.ejb.Stateless;
import org.inbio.ara.dto.reports.DwcCategoryDTO;
import org.inbio.ara.dto.reports.DwcCategoryDTOFactory;
import org.inbio.ara.dto.reports.DwcElementDTO;
import org.inbio.ara.dto.reports.DwcElementDTOFactory;
import org.inbio.ara.dto.reports.PlicElementDTO;
import org.inbio.ara.dto.reports.PlicElementDTOFactory;
import org.inbio.ara.eao.reports.DarwinCore14EAOLocal;
import org.inbio.ara.eao.reports.DwcCategoryEAOLocal;
import org.inbio.ara.eao.reports.DwcElementEAOLocal;
import org.inbio.ara.eao.reports.DwcSnapshotEAOJDBCLocal;
import org.inbio.ara.eao.reports.DwcSnapshotEAOLocal;
import org.inbio.ara.eao.reports.PlicElementEAOLocal;
import org.inbio.ara.eao.reports.PlicSnapshotEAOJDBCLocal;
import org.inbio.ara.eao.reports.PlicSnapshotEAOLocal;
import org.inbio.ara.eao.reports.PlinianCoreFlatEAOLocal;
import org.inbio.ara.persistence.reports.DwcCategory;
import org.inbio.ara.persistence.reports.DwcElement;
import org.inbio.ara.persistence.reports.PlicElement;
import org.inbio.ara.util.QueryNode;
/**
*
* @author esmata
*/
@Stateless
public class ReportsFacadeImpl implements ReportsFacadeRemote {
//Injections
@EJB
private DwcElementEAOLocal dwcElementEAOImpl;
@EJB
private DwcCategoryEAOLocal dwcCategoryEAOImpl;
@EJB
private DarwinCore14EAOLocal darwinCore14EAOImpl;
@EJB
private PlinianCoreFlatEAOLocal plinianCoreFlatEAOImpl;
@EJB
private DwcSnapshotEAOLocal dwcSnapshotEAOImpl;
@EJB
private PlicSnapshotEAOLocal plicSnapshotEAOImpl;
@EJB
private DwcSnapshotEAOJDBCLocal dwcSnapshotEAOJDBCImpl;// = new DwcSnapshotEAOJDBCImpl();
@EJB
private PlicSnapshotEAOJDBCLocal plicSnapshotEAOJDBCImpl;
@EJB
private PlicElementEAOLocal plicElementEAOLocal;
//DTO's factories
DwcElementDTOFactory dwcElementDTOFactory = new DwcElementDTOFactory();
DwcCategoryDTOFactory dwcCategoryDTOFactory = new DwcCategoryDTOFactory();
PlicElementDTOFactory plicElementDTOFactory = new PlicElementDTOFactory();
//Method to retrive the elements of darwin core
public List<DwcElementDTO> findDwCElements() {
return dwcElementDTOFactory.createDTOList
(dwcElementEAOImpl.findAll(DwcElement.class));
}
//Method to retrive the elements of darwin core
public List<PlicElementDTO> findPlicElements() {
return plicElementDTOFactory.createDTOList
(plicElementEAOLocal.findAll(PlicElement.class));
}
public DwcCategoryDTO findDwcCategoryById(Long id){
return dwcCategoryDTOFactory.createDTO
(dwcCategoryEAOImpl.findById(DwcCategory.class, id));
}
public DwcElementDTO findDwcElementById(Long id){
return dwcElementDTOFactory.createDTO
(dwcElementEAOImpl.findById(DwcElement.class, id));
}
/**
* Metodo que realiza el snapshot darwin core primario, el cual será
* utilizado para los reportes y para crear snapshots personalizados
*/
public boolean reloadDarwinCoreTable(String dbSchema){
return darwinCore14EAOImpl.reloadDarwinCoreTable(dbSchema);
}
/**
* Metodo que realiza el snapshot plinian core primario, el cual será
* utilizado para los reportes y para crear snapshots personalizados
*/
public boolean reloadPlinianCoreTable(String dbSchema){
return plinianCoreFlatEAOImpl.reloadPlinianCoreTable(dbSchema);
}
/**
* Metodo encargado de generar el snapshot Darwin Core con la información
* indicada del sistema
* @param user usuario para la conexion jdbc con postgres
* @param pass contraseña para el usuario para la conexion jdbc
* @return "success" = everything ok, "fail" = something wrong
*/
public boolean makeDcwSnapshotNative(LinkedList<QueryNode>
qnlist,LinkedList<String> elist, String dbSchema){
try{
//Delete all snapshot entries
dwcSnapshotEAOImpl.truncateDwcSnapshot(dbSchema);
}
catch(Exception e){return false;}
//Generate the query string
String q = makeQueryStringPostgres(qnlist,elist, dbSchema);
//Generate snapshot with the query
boolean result = dwcSnapshotEAOImpl.DcwSnapshotAllPostgresql(q);
if (result)
return true;
else
return false;
}
/**
* Metodo encargado de generar el snapshot Plinian Core con la información
* indicada del sistema
* @param user usuario para la conexion jdbc con postgres
* @param pass contraseña para el usuario para la conexion jdbc
* @return "success" = everything ok, "fail" = something wrong
*/
public boolean makePlicSnapshotNative(LinkedList<QueryNode>
qnlist,LinkedList<String> elist, String dbSchema){
try{
//Delete all snapshot entries
plicSnapshotEAOImpl.truncatePlicSnapshot(dbSchema);
}
catch(Exception e){return false;}
//Generate the query string
String q = makeQueryStringPostgresPlic(qnlist,elist, dbSchema);
//Generate snapshot with the query
boolean result = plicSnapshotEAOImpl.PlicSnapshotAllPostgresql(q);
if (result)
return true;
else
return false;
}
/**
* Metodo que exporta el contenido de la tabla dwc_snapshot en un archivo
* destino
* @param file = archivo destino
* @return
*/
public boolean export(File f, String dataSource, String dbSchema) {
if (f == null) {
return false;
} else {
return this.dwcSnapshotEAOJDBCImpl.writeDwcSnapshotToFile(f,dataSource, dbSchema);
}
}
/**
* Metodo que exporta el contenido de la tabla dwc_snapshot en un archivo
* destino
* @param file = archivo destino
* @return
*/
//TODO
public boolean exportToPlic(File f, String dbSchema, String dataSource) {
if (f == null) {
return false;
} else {
return this.plicSnapshotEAOJDBCImpl.writePlicSnapshotToFile(f, dbSchema, dataSource);
}
}
/**
* Get all dwc elements as String in lower case
* @return
*/
public LinkedList<String> getAllElementsDwc(){
List<DwcElementDTO> elements = findDwCElements();
LinkedList<String> result = new LinkedList();
for(DwcElementDTO element:elements){
String e = element.getElementName().toLowerCase();
result.add(e);
}
return result;
}
/**
* Get all dwc elements as String in lower case
* @return
*/
public LinkedList<String> getAllElementsPlic(){
List<PlicElementDTO> elements = findPlicElements();
LinkedList<String> result = new LinkedList();
for(PlicElementDTO element:elements){
String e = element.getElementName().toLowerCase();
result.add(e);
}
return result;
}
/**
* Generate the PostgreSQL select String for darwin core snapshot
* @param llqn lista de nodos para la consulta
* @param lls lista de elementos darwin core
* @return la consulta en postgres notation
*/
private String makeQueryStringPostgres(LinkedList<QueryNode> llqn,
LinkedList<String> lls, String dbSchema) {
//Construyecto el insert
String jpqlQuery = "insert into "+dbSchema+".dwc_snapshot (";
int llsSize = lls.size();
for(int i = 0;i<llsSize;i++){
String element = lls.get(i).toLowerCase();
if(element.equals("order")){element="orders";}
else if(element.equals("class")||element.equals("class1")){element="\"class\"";}
else if(element.equals("family")){element="\"family\"";}
if(i==(llsSize-1)) //Si es el ultimo, no debe llevar coma (,)
jpqlQuery+=element+") ";
else
jpqlQuery+=element+",";
}
//Construyendo el select
jpqlQuery+="select ";
for(int i = 0;i<llsSize;i++){
String element = lls.get(i).toLowerCase();
String eAux = lls.get(i).toLowerCase();
if(eAux.equals("order")){eAux="orders";element="orders";}
else if(eAux.equals("class")){eAux="\"class\"";}
else if(eAux.equals("class1")){eAux="\"class\"";element="class";}
else if(eAux.equals("family")){eAux="\"family\"";}
if(i==(llsSize-1)) //Si es el ultimo, no debe llevar coma (,)
jpqlQuery+="dwc."+element+" as "+eAux+" ";
else
jpqlQuery+="dwc."+element+" as "+eAux+",";
}
//Construyecto el from
jpqlQuery+="from "+dbSchema+".darwin_core_1_4 dwc ";
if (llqn.isEmpty()){ //si no hay criterio de búsqueda
return jpqlQuery+" order by dwc.globaluniqueidentifier;";
}
else{
//Construyecto el where
jpqlQuery+="where ";
QueryNode qn = llqn.getFirst();
jpqlQuery += "lower(dwc." + qn.getDwcElement() + ")";
jpqlQuery += " " + qn.getComparator() + " ";
if (qn.getComparator().equals("like")) {
jpqlQuery += "'%" + qn.getUserEntry().toLowerCase() + "%'";
} else {
jpqlQuery += "'" + qn.getUserEntry().toLowerCase() + "'";
}
for (int i = 1; i < llqn.size(); i++) {
qn = llqn.get(i);
jpqlQuery += " " + qn.getLogicalOperator() + " ";
jpqlQuery += "lower(dwc." + qn.getDwcElement() + ")";
jpqlQuery += " " + qn.getComparator() + " ";
if (qn.getComparator().equals("like")) {
jpqlQuery += "'%" + qn.getUserEntry().toLowerCase() + "%'";
} else {
jpqlQuery += "'" + qn.getUserEntry().toLowerCase() + "'";
}
}
return jpqlQuery+" order by dwc.globaluniqueidentifier;";
}
}
/**
* Generate the PostgreSQL select String for plinian core snapshot
* @param llqn lista de nodos para la consulta
* @param lls lista de elementos plinian core
* @return la consulta en postgres notation
*/
private String makeQueryStringPostgresPlic(LinkedList<QueryNode> llqn,
LinkedList<String> lls, String dbSchema) {
//Construyecto el insert
String jpqlQuery = "insert into "+dbSchema+".plic_snapshot (";
int llsSize = lls.size();
for(int i = 0;i<llsSize;i++){
String element = lls.get(i).toLowerCase();
if(i==(llsSize-1)) //Si es el ultimo, no debe llevar coma (,)
jpqlQuery+=element+") ";
else
jpqlQuery+=element+",";
}
//Construyendo el select
jpqlQuery+="select ";
for(int i = 0;i<llsSize;i++){
String element = lls.get(i).toLowerCase();
String eAux = lls.get(i).toLowerCase();
if(i==(llsSize-1)) //Si es el ultimo, no debe llevar coma (,)
jpqlQuery+="plic."+element+" as "+eAux+" ";
else
jpqlQuery+="plic."+element+" as "+eAux+",";
}
//Construyecto el from
jpqlQuery+="from "+dbSchema+".plinian_core_flat plic ";
if (llqn.isEmpty()){ //si no hay criterio de búsqueda
//System.out.println(jpqlQuery+" order by plic.globaluniqueidentifier;");
return jpqlQuery+" order by plic.globaluniqueidentifier;";
}
else{
//Construyecto el where
jpqlQuery+="where ";
QueryNode qn = llqn.getFirst();
jpqlQuery += "lower(plic." + qn.getDwcElement() + ")";
jpqlQuery += " " + qn.getComparator() + " ";
if (qn.getComparator().equals("like")) {
jpqlQuery += "'%" + qn.getUserEntry().toLowerCase() + "%'";
} else {
jpqlQuery += "'" + qn.getUserEntry().toLowerCase() + "'";
}
for (int i = 1; i < llqn.size(); i++) {
qn = llqn.get(i);
jpqlQuery += " " + qn.getLogicalOperator() + " ";
jpqlQuery += "lower(plic." + qn.getDwcElement() + ")";
jpqlQuery += " " + qn.getComparator() + " ";
if (qn.getComparator().equals("like")) {
jpqlQuery += "'%" + qn.getUserEntry().toLowerCase() + "%'";
} else {
jpqlQuery += "'" + qn.getUserEntry().toLowerCase() + "'";
}
}
//System.out.println(jpqlQuery+" order by plic.globaluniqueidentifier;");
return jpqlQuery+" order by plic.globaluniqueidentifier;";
}
}
}