/** * Implements operations for managing the nominal_attribute table of the aidr_predict DB * * @author Koushik */ package qa.qcri.aidr.dbmanager.ejb.remote.facade.imp; import java.util.ArrayList; import java.util.List; import java.math.BigInteger; import javax.ejb.Stateless; import javax.persistence.NoResultException; import javax.persistence.Query; import org.apache.log4j.Logger; import org.hibernate.Criteria; import org.hibernate.Hibernate; import org.hibernate.HibernateException; import org.hibernate.criterion.Restrictions; import qa.qcri.aidr.common.exception.PropertyNotSetException; import qa.qcri.aidr.dbmanager.dto.CrisisAttributesDTO; import qa.qcri.aidr.dbmanager.dto.NominalAttributeDTO; import qa.qcri.aidr.dbmanager.ejb.local.facade.impl.CoreDBServiceFacadeImp; import qa.qcri.aidr.dbmanager.ejb.remote.facade.NominalAttributeResourceFacade; import qa.qcri.aidr.dbmanager.entities.model.NominalAttribute; @Stateless(name = "NominalAttributeResourceFacadeImp") public class NominalAttributeResourceFacadeImp extends CoreDBServiceFacadeImp<NominalAttribute, Long> implements NominalAttributeResourceFacade { private static Logger logger = Logger.getLogger("db-manager-log"); public NominalAttributeResourceFacadeImp() { super(NominalAttribute.class); } @Override public NominalAttributeDTO addAttribute(NominalAttributeDTO attribute) throws PropertyNotSetException { try { NominalAttribute e = attribute.toEntity(); Long id = save(e); if (id != null) { NominalAttributeDTO savedEntity = this.getAttributeByID(id); return savedEntity; } else { return null; } } catch (HibernateException he) { logger.error("Hibernate exception on save Nominal Attribute. \n" + he.getStackTrace()); return null; } } @Override public NominalAttributeDTO editAttribute(NominalAttributeDTO attribute) throws PropertyNotSetException { try { if (attribute == null) { throw new RuntimeException("Missing data values"); } NominalAttribute nominalAttributeDB = getEntityManager().find(NominalAttribute.class, attribute.getNominalAttributeId()); if (nominalAttributeDB != null) { NominalAttribute mergedEntity = (NominalAttribute) merge(attribute.toEntity()); return new NominalAttributeDTO(mergedEntity); } else { return null; } } catch (HibernateException he) { logger.error("Hibernate exception on editing Nominal Attribute. \n" + he.getStackTrace()); return null; } } @Override public boolean deleteAttribute(Long attributeID) throws PropertyNotSetException { NominalAttribute attribute = getEntityManager().find(NominalAttribute.class, attributeID); if (attribute != null) { try { NominalAttribute managed = getEntityManager().merge(attribute); getEntityManager().remove(managed); } catch (HibernateException he) { logger.error("Error occured while removing Attribute with ID = " + attributeID + "\n" + he.getStackTrace()); return false; // exception occured } return true; //successfully deleted } else { return false; // attribute does not exist with the provided id. } } @Override public NominalAttributeDTO getAttributeByID(Long attributeID) throws PropertyNotSetException { NominalAttribute nominalAttribute = getById(attributeID); Hibernate.initialize(nominalAttribute.getNominalLabels()); //loading labels too return new NominalAttributeDTO(nominalAttribute); } @Override public List<NominalAttributeDTO> getAllAttributes() throws PropertyNotSetException { List<NominalAttributeDTO> nominalAttributeDTOList = new ArrayList<NominalAttributeDTO>(); List<NominalAttribute> nominalAttributeList = getAll(); for (NominalAttribute nominalAttribute : nominalAttributeList) { nominalAttributeDTOList.add(new NominalAttributeDTO(nominalAttribute)); } return nominalAttributeDTOList; } @Override public Long isAttributeExists(String attributeCode) throws PropertyNotSetException { Criteria criteria = getCurrentSession().createCriteria(NominalAttribute.class); criteria.add(Restrictions.eq("code", attributeCode)); NominalAttribute nominalAttribute = (NominalAttribute)criteria.uniqueResult(); return nominalAttribute != null ? nominalAttribute.getNominalAttributeId() : null; } //TODO: Native query used in this method should be translated into a criteria query. @Override @SuppressWarnings("unchecked") public List<CrisisAttributesDTO> getAllAttributesExceptCrisis(Long crisisID) throws PropertyNotSetException { List<CrisisAttributesDTO> attributesList = new ArrayList<>(); String sql = "SELECT na.nominalAttributeID, na.userID, na.name, na.description, na.code, " + " nl.nominalLabelID, nl.name AS lblName FROM nominal_attribute na \n" + " JOIN nominal_label nl ON na.nominalAttributeID = nl.nominalAttributeID \n" + " LEFT JOIN model_family mf ON na.nominalAttributeID = mf.nominalAttributeID \n" + " AND mf.crisisID = :crisisID WHERE mf.crisisID IS NULL"; try { Query query = em.createNativeQuery(sql); query.setParameter("crisisID", crisisID); List<Object[]> rows = query.getResultList(); CrisisAttributesDTO attribute; for (Object[] row : rows) { attribute = new CrisisAttributesDTO(); attribute.setNominalAttributeID(((BigInteger) row[0]).intValue()); attribute.setUserID(((BigInteger) row[1]).intValue()); attribute.setName((String) row[2]); attribute.setDescription((String) row[3]); attribute.setCode(((String) row[4])); attribute.setLabelID(((BigInteger) row[5]).intValue()); attribute.setLabelName(((String) row[6])); attributesList.add(attribute); } } catch (NoResultException e) { logger.warn("No result for crisisID : " + crisisID); } return attributesList; } }