package qa.qcri.aidr.trainer.api.service.impl;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.log4j.Logger;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import qa.qcri.aidr.common.exception.PropertyNotSetException;
import qa.qcri.aidr.dbmanager.dto.CollectionDTO;
import qa.qcri.aidr.dbmanager.dto.CustomUiTemplateDTO;
import qa.qcri.aidr.dbmanager.dto.ModelFamilyDTO;
import qa.qcri.aidr.dbmanager.dto.NominalAttributeDTO;
import qa.qcri.aidr.dbmanager.dto.NominalLabelDTO;
import qa.qcri.aidr.dbmanager.ejb.remote.facade.CollectionResourceFacade;
import qa.qcri.aidr.dbmanager.ejb.remote.facade.ModelFamilyResourceFacade;
import qa.qcri.aidr.dbmanager.entities.misc.Collection;
import qa.qcri.aidr.dbmanager.entities.model.ModelFamily;
import qa.qcri.aidr.trainer.api.service.CrisisService;
import qa.qcri.aidr.trainer.api.service.CustomUITemplateService;
import qa.qcri.aidr.trainer.api.store.CodeLookUp;
import qa.qcri.aidr.trainer.api.template.CrisisJsonModel;
import qa.qcri.aidr.trainer.api.template.CrisisJsonOutput;
import qa.qcri.aidr.trainer.api.template.CrisisNominalAttributeModel;
/**
* Created with IntelliJ IDEA.
* User: jilucas
* Date: 9/11/13
* Time: 2:33 PM
* To change this template use File | Settings | File Templates.
*/
@Service("crisisService")
@Transactional(readOnly = true)
public class CrisisServiceImpl implements CrisisService {
protected static Logger logger = Logger.getLogger(CrisisServiceImpl.class);
@Autowired
private CollectionResourceFacade remoteCollectionResourceEJB;
@Autowired
private ModelFamilyResourceFacade remoteModelFamilyResourceEJB;
@Autowired
private CustomUITemplateService customUITemplateService;
@Override
public CollectionDTO findByCrisisID(Long id) {
CollectionDTO collection = null;
try {
collection = remoteCollectionResourceEJB.getWithModelFamilyNominalAttributeByCrisisID(id); //To change body of implemented methods use File | Settings | File Templates.
} catch(Exception e) {
logger.error("Error in fetching : ", e);
}
return collection;
}
@Override
public List<CollectionDTO> findByCrisisCode(String crisisCode) {
try {
return remoteCollectionResourceEJB.findByCriteria("code", crisisCode);
}catch(Exception e){
logger.error("Exception while fetching collection for crisis="+crisisCode+"\t"+e.getStackTrace());
return null;
}
}
@Override
public CrisisJsonModel findByOptimizedCrisisID(Long id) throws PropertyNotSetException {
CollectionDTO crisis = remoteCollectionResourceEJB.getWithModelFamilyNominalAttributeByCrisisID(id);
CrisisJsonModel jsonOutput = new CrisisJsonOutput().crisisJsonModelGenerator(crisis);
List<CustomUiTemplateDTO> uiTemps = customUITemplateService.getCustomUiTemplateByCrisisWithType(id, CodeLookUp.CURATOR_NAME);
if (!uiTemps.isEmpty()) {
jsonOutput.setCuratorInfo(uiTemps.get(0).getTemplateValue());
}
return jsonOutput; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public List<Collection> findByCriteria(String columnName, Object value) {
return remoteCollectionResourceEJB.getAllByCriteria(Restrictions.eq(columnName,value));
}
/* @Override
public List<Collection> findByCriteria(String columnName, Long value) {
return crisisDao.findByCriteria(columnName,value); //To change body of implemented methods use File | Settings | File Templates.
}*/
@Override
public List findAllActiveCrisis() {
try {
return remoteCollectionResourceEJB.findAllCrisisIds();
} catch(Exception e) {
logger.error("Error in collection : ", e);
}
return null;
}
@Override
public List<CrisisNominalAttributeModel> getAllActiveCrisisNominalAttribute() {
List<CrisisNominalAttributeModel> crisisNominalAttributeModelList = new ArrayList<CrisisNominalAttributeModel>();
List<ModelFamily> modelFamilyList = remoteModelFamilyResourceEJB.getAllByCriteria(Restrictions.eq("isActive",true)) ;
Iterator<ModelFamily> iterator = modelFamilyList.iterator();
while (iterator.hasNext()) {
ModelFamily modelFamily = (ModelFamily)iterator.next();
Long crisisID = modelFamily.getCollection().getCrisisId();
Long attributeID = modelFamily.getNominalAttribute().getNominalAttributeId();
Collection crisis = modelFamily.getCollection();
if(crisis.isMicromapperEnabled())
{
CrisisNominalAttributeModel temp = new CrisisNominalAttributeModel(crisisID, attributeID);
if(!findDuplicate(crisisNominalAttributeModelList, temp)) {
crisisNominalAttributeModelList.add(temp);
}
}
}
return crisisNominalAttributeModelList;
}
private boolean findDuplicate(List<CrisisNominalAttributeModel> crisisNominalAttributeModelList, CrisisNominalAttributeModel crisisNominalAttributeModel){
boolean found = false;
Iterator<CrisisNominalAttributeModel> iterator = crisisNominalAttributeModelList.iterator();
while (iterator.hasNext()){
CrisisNominalAttributeModel cm = (CrisisNominalAttributeModel)iterator.next();
if(cm.getCririsID().equals(crisisNominalAttributeModel.getCririsID())){
if(cm.getNominalAttributeID().equals(crisisNominalAttributeModel.getNominalAttributeID())){
found = true;
}
}
}
return found;
}
@Override
public Set<NominalLabelDTO> getNominalLabelByCrisisID(Long crisisID, Long nominalAtrributeID){
Set<NominalLabelDTO> nominalLabels = null;
List<ModelFamilyDTO> families = this.findByCrisisID(crisisID).getModelFamiliesDTO();
for(ModelFamilyDTO family : families){
if(family.getNominalAttributeDTO().getNominalAttributeId().equals(nominalAtrributeID)){
NominalAttributeDTO nom = family.getNominalAttributeDTO();
nominalLabels = new HashSet<NominalLabelDTO>(nom.getNominalLabelsDTO());
}
}
return nominalLabels;
}
@Override
public List<CollectionDTO> findActiveCrisisInfo() {
try {
return remoteCollectionResourceEJB.findActiveCrisis();
}catch (PropertyNotSetException e) {
logger.error("PropertyNotSetException while fetching all active collections",e);
return null;
}
}
}