package info.ozkan.vipera.dao.device; import info.ozkan.vipera.business.device.DeviceManagerResult; import info.ozkan.vipera.business.device.DeviceManagerSearchFilter; import info.ozkan.vipera.business.device.DeviceManagerStatus; import info.ozkan.vipera.entities.Device; import info.ozkan.vipera.entities.Patient; import java.util.ArrayList; import java.util.List; import javax.inject.Named; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * {@link DeviceDao} arayüzünün implementasyonu * * @author Ömer Özkan * */ @Named("deviceDao") public class DeviceDaoImpl implements DeviceDao { /** * Cihaz arama JQL sorgusu */ private static final String JQL_FIND_DEVICE = "from Device d where d.apiKey = :apiKey AND d.apiPassword = :apiPassword"; /** * LOGGER */ private static final Logger LOGGER = LoggerFactory .getLogger(DeviceDaoImpl.class); /** * EntityManager */ private EntityManager em; public DeviceManagerResult add(final Device device) { final Patient patient; patient = getPatient(device); device.setPatient(patient); em.persist(device); final DeviceManagerResult result = createSuccessResult(); result.setDevice(device); return result; } private Patient getPatient(final Device device) { final Patient patient = device.getPatient(); return em.find(Patient.class, patient.getId()); } public DeviceManagerResult find(final DeviceManagerSearchFilter filter) { final Query query = filterToCriteriaQuery(filter); final List<Device> devices = query.getResultList(); final DeviceManagerResult result = createSuccessResult(); result.setDevices(devices); return result; } /** * Filtreden CriteriaQuery nesnesi üretir * * @param filter * @return */ private Query filterToCriteriaQuery(final DeviceManagerSearchFilter filter) { final CriteriaBuilder cb = em.getCriteriaBuilder(); final CriteriaQuery<Device> criteriaQuery = cb.createQuery(Device.class); final Root<Device> root = criteriaQuery.from(Device.class); final List<Predicate> predicates = new ArrayList<Predicate>(); final String apiKey = filter.getApiKey(); final Patient patient = filter.getPatient(); if (patient != null) { predicates.add(cb.equal(root.get("patient"), patient)); } if (apiKey != null && !apiKey.isEmpty()) { final String pattern = '%' + apiKey + '%'; predicates.add(cb.like(root.<String> get("apiKey"), pattern)); } final Predicate[] array = predicates.toArray(new Predicate[0]); criteriaQuery.select(root).where(array); final Query query = em.createQuery(criteriaQuery); return query; } /** * Başarılı mesajı içeren {@link DeviceManagerResult} nesnesi üretir * * @return */ private DeviceManagerResult createSuccessResult() { final DeviceManagerResult result = new DeviceManagerResult(); result.setStatus(DeviceManagerStatus.SUCCESS); return result; } /** * @param entityManager * the entityManager to set */ @PersistenceContext public void setEntityManager(final EntityManager entityManager) { em = entityManager; } public DeviceManagerResult delete(final Long deviceId) { final Device device = em.find(Device.class, deviceId); LOGGER.info("The device {} has been deleted", device.getApiKey()); em.remove(device); return createSuccessResult(); } public Device getById(final Long id) { return em.find(Device.class, id); } public DeviceManagerResult update(final Device device) { em.merge(device); final DeviceManagerResult result = createSuccessResult(); result.setDevice(device); return result; } public DeviceManagerResult findDevice(final String apiKey, final String apiPassword) { DeviceManagerResult result; final Query query = em.createQuery(JQL_FIND_DEVICE); query.setParameter("apiKey", apiKey); query.setParameter("apiPassword", apiPassword); final List<Device> resultList = query.getResultList(); if (resultList.size() == 0) { result = new DeviceManagerResult(); result.setStatus(DeviceManagerStatus.NOT_FOUND); } else { result = createSuccessResult(); result.setDevice(resultList.get(0)); } return result; } }