/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.inbio.commons.dublincore.facade.ara.impl;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import org.inbio.commons.dublincore.dto.DublinCoreDTO;
import org.inbio.commons.dublincore.dto.ElementTypeDTO;
import org.inbio.commons.dublincore.dto.ara.InterfaceDublinCoreDTO;
import org.inbio.commons.dublincore.dto.ara.ReferenceDTO;
import org.inbio.commons.dublincore.eao.ara.DublinCoreDescriptionEAOLocal;
import org.inbio.commons.dublincore.eao.ara.DublinCoreElementEAOLocal;
import org.inbio.commons.dublincore.facade.ara.DublinCoreFacadeRemote;
import org.inbio.commons.dublincore.manager.impl.DublinCoreMetadataManagerImpl;
import org.inbio.commons.dublincore.model.DublinCoreDescription;
import org.inbio.commons.dublincore.model.DublinCoreElement;
import org.inbio.commons.dublincore.model.DublinCoreElementEnum;
import org.inbio.commons.dublincore.model.ResourceTypeEnum;
import org.inbio.commons.dublincore.persistence.ara.DublinCoreDescriptionJPA;
import org.inbio.commons.dublincore.persistence.ara.DublinCoreElementJPA;
/**
*
* @author gsulca
*/
//@Stateless
@Stateless(name="DublinCoreFacadeImpl")
public class DublinCoreFacadeImpl extends DublinCoreMetadataManagerImpl implements DublinCoreFacadeRemote{
@EJB(beanName="DublinCoreElementEAOImpl")
DublinCoreElementEAOLocal dublinCoreElementDAOImpl;
@EJB(beanName="DublinCoreDescriptionEAOImpl")
DublinCoreDescriptionEAOLocal dublinCoreDescriptionDAOImpl;
@PostConstruct
public void DublinCoreFacadeImpl()
{
super.setDublinCoreDescriptionDAOImpl(dublinCoreDescriptionDAOImpl);
super.setDublinCoreElementDAOImpl(dublinCoreElementDAOImpl);
}
public Long countSimpleSearch(String query) {
Integer quantity = new Integer(unstructeredReferenceQuery(splitQuery(query)).size());
return quantity.longValue();
}
private Set<Integer> unstructeredReferenceQuery(String[] parts)
{
Set<Integer> list = new HashSet();
List<Integer> ids = null;
for (int i = 0; i < parts.length; i++)
{
//try to cast it
try
{
//find by title
ids = dublinCoreElementDAOImpl.findByValue(DublinCoreElementEnum.TITLE.getId(),parts[i]);
if(ids != null && !ids.isEmpty())
list.addAll(ids);
//find by creator
ids = dublinCoreElementDAOImpl.findByValue(DublinCoreElementEnum.CREATOR.getId(),parts[i]);;
if(ids != null && !ids.isEmpty())
list.addAll(ids);
//find by date
ids = dublinCoreElementDAOImpl.findByValue(DublinCoreElementEnum.DATE.getId(),parts[i]);
if(ids != null && !ids.isEmpty())
list.addAll(ids);
//find by animal code
ids = dublinCoreElementDAOImpl.findByValue(DublinCoreElementEnum.IDENTIFIER.getId(),parts[i]);
if(ids != null && !ids.isEmpty())
list.addAll(ids);
}
catch(Exception e){}
}
return list;
}
public List<DublinCoreDTO> getReferenceSimpleSearch(String query, int firstResult, int maxResult) {
Set<Integer> resourceIds = unstructeredReferenceQuery(splitQuery(query));
List<DublinCoreDTO> result = new ArrayList();
for(Integer resourceId: resourceIds)
{
result.add(this.getMetadataByResourceKey(resourceId.toString()));
}
System.out.println("Mata: "+result.size()+" Lista de entidades ");
System.out.println("Mata: "+resourceIds.size()+" Lista de identificadores ");
System.out.println(" ------- o -------");
return result;
}
@Deprecated //use findAllDublinCorePaginated
public List<DublinCoreDTO> getAllDublinCorePaginated(int firstResult, int maxResult) {
List<DublinCoreDTO> result = new ArrayList();
List<DublinCoreDescription> allReferences = new ArrayList();
allReferences = dublinCoreDescriptionDAOImpl.findAllPaginated(ResourceTypeEnum.REFERENCE.getId(), firstResult, maxResult);
for(DublinCoreDescription referenceEntity: allReferences)
{
result.add(this.getMetadataByResourceKey(referenceEntity.getResourceId().toString()));
}
return result;
}
public List<DublinCoreDTO> findAllDublinCorePaginated(int resourceTypeId, int firstResult, int maxResult) {
List<DublinCoreDTO> result = new ArrayList();
List<DublinCoreDescription> allReferences = new ArrayList();
allReferences = dublinCoreDescriptionDAOImpl.findAllPaginated(resourceTypeId, firstResult, maxResult);
for(DublinCoreDescription referenceEntity: allReferences)
{
result.add(this.getMetadataByResourceKey(referenceEntity.getResourceId().toString()));
}
return result;
}
/**
* Split the query
* @param query
* @return
*/
private String[] splitQuery(String query)
{
if(query == null || query.length() == 0)
return null;
return query.split(" ");
}
public List<DublinCoreDTO> getDublinCoreAdvancedSearch(DublinCoreDTO dublinCoreDTO, int firstResult, int maxResult) {
Set<Integer> resourceIds = getDublinCoreByCriteria(dublinCoreDTO);
//Retrieve entities
List<DublinCoreDTO> result = new ArrayList();
for(Integer resourceId: resourceIds)
{
result.add(this.getMetadataByResourceKey(resourceId.toString()));
}
//return updateSementalDTOListValues(sementalDTOFactory.createDTOList(list));
return result;
}
public Long countDublinCoreAdvancedSearch(DublinCoreDTO dublinCoreDTO) {
Integer quantity = new Integer(getDublinCoreByCriteria(dublinCoreDTO).size());
return quantity.longValue();
}
/**
* Use this method for sementals advance search:
* getElementsByCriteria: title, creator, identifier, date
* @param dublinCoreDTO
* @return Set<Integer>
*/
public Set<Integer> getDublinCoreByCriteria(DublinCoreDTO dublinCoreDTO)
{
Set<Integer> ids = new HashSet();
boolean firstTime = true;
List<Integer> query = new ArrayList<Integer>();
//find by title
if(dublinCoreDTO.getElementValues("title") != null)
{
query = dublinCoreElementDAOImpl.findByValue(DublinCoreElementEnum.TITLE.getId(),
dublinCoreDTO.getElementValues("title").get(0).getValue());
if(query != null && !query.isEmpty())
{
ids.addAll(query);
firstTime = false;
}
}
//find by creator
if(dublinCoreDTO.getElementValues("creator") != null)
{
query = dublinCoreElementDAOImpl.findByValue(DublinCoreElementEnum.CREATOR.getId(),
dublinCoreDTO.getElementValues("creator").get(0).getValue());
if(query != null && !query.isEmpty())
{
if(firstTime)
{
ids.addAll(query);
firstTime = false;
}
else
ids.retainAll(query);
}
}
//find by identifier
if(dublinCoreDTO.getElementValues("identifier") != null)
{
query = dublinCoreElementDAOImpl.findByValue(DublinCoreElementEnum.IDENTIFIER.getId(),
dublinCoreDTO.getElementValues("identifier").get(0).getValue());
if(query != null && !query.isEmpty())
{
if(firstTime)
{
ids.addAll(query);
firstTime = false;
}
else
ids.retainAll(query);
}
}
//find by date
if(dublinCoreDTO.getElementValues("date") != null)
{
query = dublinCoreElementDAOImpl.findByValue(DublinCoreElementEnum.DATE.getId(),
dublinCoreDTO.getElementValues("date").get(0).getValue());
if(query != null && !query.isEmpty())
{
if(firstTime)
{
ids.addAll(query);
firstTime = false;
}
else
ids.retainAll(query);
}
}
return ids;
}
public List<ReferenceDTO> dublinCoreDTOsToReferenceDTOs (List<DublinCoreDTO> list)
{
List<ReferenceDTO> result = new ArrayList();
for(DublinCoreDTO element: list)
{
result.add(dublinCoreDTOToReferenceDTO(element));
}
return result;
}
public ReferenceDTO dublinCoreDTOToReferenceDTO (DublinCoreDTO element)
{
ReferenceDTO result = new ReferenceDTO();
result.setKey(element.getKey());
/*If title exist*/
if(element.getElementValues("title") != null && element.getElementValues("title").size() > 0)
{
result.setTitle(element.getElementValues("title").get(0).getValue());
}
/*If creator exist*/
if(element.getElementValues("creator") != null && element.getElementValues("creator").size() > 0)
{
String creators = "";
for(ElementTypeDTO creatorName: element.getElementValues("creator"))
{
creators += creatorName.getValue()+", ";
}
result.setCreator(creators);
}
/*If date exist*/
if(element.getElementValues("date") != null && element.getElementValues("date").size() > 0)
{
result.setDate(element.getElementValues("date").get(0).getValue());
}
/*If identifier exist*/
if(element.getElementValues("identifier") != null && element.getElementValues("identifier").size() > 0)
{
result.setIdentifier(element.getElementValues("identifier").get(0).getValue());
}
return result;
}
public List<ReferenceDTO> dublinCoreDTOsToFullReferenceDTOs (List<DublinCoreDTO> list)
{
List<ReferenceDTO> result = new ArrayList();
for(DublinCoreDTO element: list)
{
result.add(dublinCoreDTOToFullReferenceDTO(element));
}
return result;
}
public ReferenceDTO dublinCoreDTOToFullReferenceDTO (DublinCoreDTO element)
{
ReferenceDTO result = new ReferenceDTO();
result.setKey(element.getKey());
/*If title exist*/
if(element.getElementValues("title") != null)
{
String titles = "";
for(ElementTypeDTO titlesName: element.getElementValues("title"))
{
titles += titlesName.getValue()+"; ";
}
result.setTitle(titles);
}
/*If creator exist*/
if(element.getElementValues("creator") != null)
{
String creators = "";
for(ElementTypeDTO creatorName: element.getElementValues("creator"))
{
creators += creatorName.getValue()+"; ";
}
result.setCreator(creators);
}
/*If date exist*/
if(element.getElementValues("date") != null)
{
String dates = "";
for(ElementTypeDTO dateName: element.getElementValues("date"))
{
dates += dateName.getValue()+"; ";
}
result.setDate(dates);
}
/*If identifier exist*/
if(element.getElementValues("identifier") != null)
{
String identifiers = "";
for(ElementTypeDTO identifierName: element.getElementValues("identifier"))
{
identifiers += identifierName.getValue()+"; ";
}
result.setIdentifier(identifiers);
}
return result;
}
public Long countResourceByTypeId(int typeId) {
return dublinCoreDescriptionDAOImpl.countResourceByTypeId(typeId);
}
public void saveDublinCore(InterfaceDublinCoreDTO interfaceDublinCoreDTO) {
DublinCoreDescriptionJPA dublinCoreDescriptionJPA = saveDublinCoreDescription(interfaceDublinCoreDTO);
saveDublinCoreElements(dublinCoreDescriptionJPA.getResourceId(), interfaceDublinCoreDTO);
}
public DublinCoreDescriptionJPA saveDublinCoreDescription(InterfaceDublinCoreDTO interfaceDublinCoreDTO)
{
DublinCoreDescriptionJPA dublinCoreDescriptionJPA = new DublinCoreDescriptionJPA();
dublinCoreDescriptionJPA.setDescription(interfaceDublinCoreDTO.getResourceTypeDescription());
dublinCoreDescriptionJPA.setResourceTypeId(interfaceDublinCoreDTO.getResourceTypeId().intValue());
dublinCoreDescriptionJPA.setCreatedBy(interfaceDublinCoreDTO.getUserName());
dublinCoreDescriptionJPA.setCreationDate(new GregorianCalendar());
dublinCoreDescriptionJPA.setLastModificationBy(interfaceDublinCoreDTO.getUserName());
dublinCoreDescriptionJPA.setLastModificationDate(new GregorianCalendar());
dublinCoreDescriptionDAOImpl.create(dublinCoreDescriptionJPA);
return dublinCoreDescriptionJPA;
}
public void saveDublinCoreElements(Integer resourceId, InterfaceDublinCoreDTO interfaceDublinCoreDTO)
{
String[] elements = null;
//luego los fors y las persistencias
if(interfaceDublinCoreDTO.getTitle() != null)
{
elements = interfaceDublinCoreDTO.getTitle().split(";");
for(int i = 0; i < elements.length; i++)
fillAndPersistDublinCoreelement(DublinCoreElementEnum.TITLE.getId(),elements[i],interfaceDublinCoreDTO,resourceId);
}
elements = null;
if(interfaceDublinCoreDTO.getCreator() != null)
{
elements = interfaceDublinCoreDTO.getCreator().split(";");
for(int i = 0; i < elements.length; i++)
fillAndPersistDublinCoreelement(DublinCoreElementEnum.CREATOR.getId(),elements[i],interfaceDublinCoreDTO,resourceId);
}
elements = null;
if(interfaceDublinCoreDTO.getSubject() != null)
{
elements = interfaceDublinCoreDTO.getSubject().split(";");
for(int i = 0; i < elements.length; i++)
fillAndPersistDublinCoreelement(DublinCoreElementEnum.SUBJECT.getId(),elements[i],interfaceDublinCoreDTO,resourceId);
}
elements = null;
if(interfaceDublinCoreDTO.getDescription() != null)
{
elements = interfaceDublinCoreDTO.getDescription().split(";");
for(int i = 0; i < elements.length; i++)
fillAndPersistDublinCoreelement(DublinCoreElementEnum.DESCRIPTION.getId(),elements[i],interfaceDublinCoreDTO,resourceId);
}
elements = null;
if(interfaceDublinCoreDTO.getPublisher() != null)
{
elements = interfaceDublinCoreDTO.getPublisher().split(";");
for(int i = 0; i < elements.length; i++)
fillAndPersistDublinCoreelement(DublinCoreElementEnum.PUBLISHER.getId(),elements[i],interfaceDublinCoreDTO,resourceId);
}
elements = null;
if(interfaceDublinCoreDTO.getContributor() != null)
{
elements = interfaceDublinCoreDTO.getContributor().split(";");
for(int i = 0; i < elements.length; i++)
fillAndPersistDublinCoreelement(DublinCoreElementEnum.CONTRIBUTOR.getId(),elements[i],interfaceDublinCoreDTO,resourceId);
}
elements = null;
if(interfaceDublinCoreDTO.getDate() != null)
{
elements = interfaceDublinCoreDTO.getDate().split(";");
for(int i = 0; i < elements.length; i++)
fillAndPersistDublinCoreelement(DublinCoreElementEnum.DATE.getId(),elements[i],interfaceDublinCoreDTO,resourceId);
}
elements = null;
if(interfaceDublinCoreDTO.getType() != null)
{
elements = interfaceDublinCoreDTO.getType().split(";");
for(int i = 0; i < elements.length; i++)
fillAndPersistDublinCoreelement(DublinCoreElementEnum.TYPE.getId(),elements[i],interfaceDublinCoreDTO,resourceId);
}
elements = null;
if(interfaceDublinCoreDTO.getFormat() != null)
{
elements = interfaceDublinCoreDTO.getFormat().split(";");
for(int i = 0; i < elements.length; i++)
fillAndPersistDublinCoreelement(DublinCoreElementEnum.FORMAT.getId(),elements[i],interfaceDublinCoreDTO,resourceId);
}
elements = null;
if(interfaceDublinCoreDTO.getIdentifier() != null)
{
elements = interfaceDublinCoreDTO.getIdentifier().split(";");
for(int i = 0; i < elements.length; i++)
fillAndPersistDublinCoreelement(DublinCoreElementEnum.IDENTIFIER.getId(),elements[i],interfaceDublinCoreDTO,resourceId);
}
elements = null;
if(interfaceDublinCoreDTO.getSource() != null)
{
elements = interfaceDublinCoreDTO.getSource().split(";");
for(int i = 0; i < elements.length; i++)
fillAndPersistDublinCoreelement(DublinCoreElementEnum.SOURCE.getId(),elements[i],interfaceDublinCoreDTO,resourceId);
}
elements = null;
if(interfaceDublinCoreDTO.getLanguage() != null)
{
elements = interfaceDublinCoreDTO.getLanguage().split(";");
for(int i = 0; i < elements.length; i++)
fillAndPersistDublinCoreelement(DublinCoreElementEnum.LANGUAGE.getId(),elements[i],interfaceDublinCoreDTO,resourceId);
}
elements = null;
if(interfaceDublinCoreDTO.getRelation() != null)
{
elements = interfaceDublinCoreDTO.getRelation().split(";");
for(int i = 0; i < elements.length; i++)
fillAndPersistDublinCoreelement(DublinCoreElementEnum.RELATION.getId(),elements[i],interfaceDublinCoreDTO,resourceId);
}
elements = null;
if(interfaceDublinCoreDTO.getCoverage() != null)
{
elements = interfaceDublinCoreDTO.getCoverage().split(";");
for(int i = 0; i < elements.length; i++)
fillAndPersistDublinCoreelement(DublinCoreElementEnum.COVERAGE.getId(),elements[i],interfaceDublinCoreDTO,resourceId);
}
elements = null;
if(interfaceDublinCoreDTO.getRights() != null)
{
elements = interfaceDublinCoreDTO.getRights().split(";");
for(int i = 0; i < elements.length; i++)
fillAndPersistDublinCoreelement(DublinCoreElementEnum.RIGHTS.getId(),elements[i],interfaceDublinCoreDTO,resourceId);
}
}
private void fillAndPersistDublinCoreelement(int dbElementEnumId, String value,
InterfaceDublinCoreDTO interfaceDublinCoreDTO,
Integer resourceId)
{
if(!value.equals("") && !value.trim().equals("") && !value.equals(";"))
{
DublinCoreElementJPA dublinCoreElementJPA = new DublinCoreElementJPA();
dublinCoreElementJPA.setCreatedBy(interfaceDublinCoreDTO.getUserName());
dublinCoreElementJPA.setCreationDate(new GregorianCalendar());
dublinCoreElementJPA.setLastModificationBy(interfaceDublinCoreDTO.getUserName());
dublinCoreElementJPA.setLastModificationDate(new GregorianCalendar());
dublinCoreElementJPA.setDublinCoreElementId(dbElementEnumId);
dublinCoreElementJPA.setLanguage(null);
dublinCoreElementJPA.setResourceId(resourceId);
dublinCoreElementJPA.setValue(value);
dublinCoreElementDAOImpl.create(dublinCoreElementJPA);
}
}
public void updateDublinCore(InterfaceDublinCoreDTO interfaceDublinCoreDTO) {
DublinCoreDescription dcd = dublinCoreDescriptionDAOImpl.findById(interfaceDublinCoreDTO.getResourceId().intValue());
//update the values
dcd.setResourceTypeId(interfaceDublinCoreDTO.getResourceTypeId().intValue());
dcd.setDescription(interfaceDublinCoreDTO.getResourceTypeDescription());
List<DublinCoreElement> listDBE = dublinCoreElementDAOImpl.findAllByResourceId(interfaceDublinCoreDTO.getResourceId().intValue());
for (DublinCoreElement dublinCoreElement : listDBE) {
dublinCoreElementDAOImpl.delete(dublinCoreElement);
}
saveDublinCoreElements(interfaceDublinCoreDTO.getResourceId().intValue(), interfaceDublinCoreDTO);
}
public InterfaceDublinCoreDTO findInterfaceDublincoreById(Long resourceId) {
InterfaceDublinCoreDTO interfaceDublinCoreDTO = new InterfaceDublinCoreDTO();
DublinCoreDescription dublinCoreDescription =
dublinCoreDescriptionDAOImpl.findById(resourceId.intValue());
if(dublinCoreDescription != null)
{
interfaceDublinCoreDTO.setResourceId(resourceId);
interfaceDublinCoreDTO.setResourceTypeId(new Long(dublinCoreDescription.getResourceTypeId()));
interfaceDublinCoreDTO.setResourceTypeDescription(dublinCoreDescription.getDescription());
List<DublinCoreElement> listDCElement;
listDCElement = dublinCoreElementDAOImpl.findAllByResourceIdAndDCElementId(resourceId.intValue(), DublinCoreElementEnum.TITLE.getId());
interfaceDublinCoreDTO.setTitle(groupDBElementString(listDCElement));
listDCElement = null;
listDCElement = dublinCoreElementDAOImpl.findAllByResourceIdAndDCElementId(resourceId.intValue(), DublinCoreElementEnum.CREATOR.getId());
interfaceDublinCoreDTO.setCreator(groupDBElementString(listDCElement));
listDCElement = null;
listDCElement = dublinCoreElementDAOImpl.findAllByResourceIdAndDCElementId(resourceId.intValue(), DublinCoreElementEnum.SUBJECT.getId());
interfaceDublinCoreDTO.setSubject(groupDBElementString(listDCElement));
listDCElement = null;
listDCElement = dublinCoreElementDAOImpl.findAllByResourceIdAndDCElementId(resourceId.intValue(), DublinCoreElementEnum.DESCRIPTION.getId());
interfaceDublinCoreDTO.setDescription(groupDBElementString(listDCElement));
listDCElement = null;
listDCElement = dublinCoreElementDAOImpl.findAllByResourceIdAndDCElementId(resourceId.intValue(), DublinCoreElementEnum.PUBLISHER.getId());
interfaceDublinCoreDTO.setPublisher(groupDBElementString(listDCElement));
listDCElement = null;
listDCElement = dublinCoreElementDAOImpl.findAllByResourceIdAndDCElementId(resourceId.intValue(), DublinCoreElementEnum.CONTRIBUTOR.getId());
interfaceDublinCoreDTO.setContributor(groupDBElementString(listDCElement));
listDCElement = null;
listDCElement = dublinCoreElementDAOImpl.findAllByResourceIdAndDCElementId(resourceId.intValue(), DublinCoreElementEnum.DATE.getId());
interfaceDublinCoreDTO.setDate(groupDBElementString(listDCElement));
listDCElement = null;
listDCElement = dublinCoreElementDAOImpl.findAllByResourceIdAndDCElementId(resourceId.intValue(), DublinCoreElementEnum.TYPE.getId());
interfaceDublinCoreDTO.setType(groupDBElementString(listDCElement));
listDCElement = null;
listDCElement = dublinCoreElementDAOImpl.findAllByResourceIdAndDCElementId(resourceId.intValue(), DublinCoreElementEnum.FORMAT.getId());
interfaceDublinCoreDTO.setFormat(groupDBElementString(listDCElement));
listDCElement = null;
listDCElement = dublinCoreElementDAOImpl.findAllByResourceIdAndDCElementId(resourceId.intValue(), DublinCoreElementEnum.IDENTIFIER.getId());
interfaceDublinCoreDTO.setIdentifier(groupDBElementString(listDCElement));
listDCElement = null;
listDCElement = dublinCoreElementDAOImpl.findAllByResourceIdAndDCElementId(resourceId.intValue(), DublinCoreElementEnum.SOURCE.getId());
interfaceDublinCoreDTO.setSource(groupDBElementString(listDCElement));
listDCElement = null;
listDCElement = dublinCoreElementDAOImpl.findAllByResourceIdAndDCElementId(resourceId.intValue(), DublinCoreElementEnum.LANGUAGE.getId());
interfaceDublinCoreDTO.setLanguage(groupDBElementString(listDCElement));
listDCElement = null;
listDCElement = dublinCoreElementDAOImpl.findAllByResourceIdAndDCElementId(resourceId.intValue(), DublinCoreElementEnum.RELATION.getId());
interfaceDublinCoreDTO.setRelation(groupDBElementString(listDCElement));
listDCElement = null;
listDCElement = dublinCoreElementDAOImpl.findAllByResourceIdAndDCElementId(resourceId.intValue(), DublinCoreElementEnum.COVERAGE.getId());
interfaceDublinCoreDTO.setCoverage(groupDBElementString(listDCElement));
listDCElement = null;
listDCElement = dublinCoreElementDAOImpl.findAllByResourceIdAndDCElementId(resourceId.intValue(), DublinCoreElementEnum.RIGHTS.getId());
interfaceDublinCoreDTO.setRights(groupDBElementString(listDCElement));
return interfaceDublinCoreDTO;
}
else
return interfaceDublinCoreDTO;
}
private String groupDBElementString(List<DublinCoreElement> listDCElement)
{
String text = "";
for (DublinCoreElement dublinCoreElement : listDCElement)
text += dublinCoreElement.getValue() + ";";
return text;
}
}