/** * Copyright (C) 2012 KRM Associates, Inc. healtheme@krminc.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.krminc.phr.web; import com.krminc.phr.dao.PersistenceService; import com.krminc.phr.domain.Exercise; import com.krminc.phr.domain.HealthRecord; import com.krminc.phr.domain.Visit; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.TemporalType; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * PHR Calendar * * @author cmccall * @author Daniel Shaw (dshaw.com) */ public class PHRCalendar { private Long healthRecordId; private HealthRecord healthRecord = null; final Logger logger = LoggerFactory.getLogger(PHRCalendar.class); private int year; private int month; // 1-12 public PHRCalendar() { // default constructor } public PHRCalendar(Long healthRecordId) { this.healthRecordId = healthRecordId; this.healthRecord = lookupHealthRecord(this.healthRecordId); // TODO: Is there a way we can do this without creating an object? DateTime now = new DateTime(); this.year = now.getYear(); this.month = now.getMonthOfYear(); } public PHRCalendar(Long healthRecordId, int year) { this.healthRecordId = healthRecordId; this.healthRecord = lookupHealthRecord(this.healthRecordId); this.year = year; } public PHRCalendar(Long healthRecordId, int year, int month) { this.healthRecordId = healthRecordId; this.healthRecord = lookupHealthRecord(this.healthRecordId); this.year = year; this.month = month; } private final HealthRecord lookupHealthRecord(Long healthRecordId) { PersistenceService persistenceSvc = PersistenceService.getInstance(); EntityManager em = persistenceSvc.getEntityManager(); try { return (HealthRecord) em.find(HealthRecord.class, healthRecordId); } catch (NoResultException ex) { logger.error("HealthRecord for id: {} does not exist.", healthRecordId, ex); return new HealthRecord(); // try { // persistenceSvc.beginTx(); // em.persist(user); // persistenceSvc.commitTx(); // } finally { // persistenceSvc.close(); // } } } public HealthRecord getHealthRecord() { return healthRecord; } public Long getHealthRecordId() { return healthRecordId; } public void setHealthRecordId(Long healthRecordId) { this.healthRecordId = healthRecordId; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public int getMonth() { return month; } public void setMonth(int month) { this.month = month; } public int getNextMonthsYear() { if (this.month >= 12) { return this.year+1; } else { return this.year; } } public int getNextMonthsMonth() { if (this.month >= 12) { return 1; } else { return this.month+1; } } public int getPrevMonthsYear() { if (this.month <= 1) { return this.year-1; } else { return this.year; } } public int getPrevMonthsMonth() { if (this.month <= 1) { return 12; } else { return this.month-1; } } public Map<Integer,List<Visit>> getVisits() { List<Visit> visits = Collections.EMPTY_LIST; Map<Integer,List<Visit>> visitsMap = new HashMap<Integer, List<Visit>>(); if ( this.healthRecordId == null || this.healthRecord.getHealthRecordId() == null) return visitsMap; EntityManager em = PersistenceService.getInstance().getEntityManager(); try { Calendar start = Calendar.getInstance(); start.set(year, month-1,1); Calendar end = Calendar.getInstance(); end.set(year, month-1, 31); // TODO: move query to Visit as NamedQuery. visits = em.createQuery("SELECT v FROM Visit v WHERE v.healthRecordId = :healthRecordId AND v.visitDate BETWEEN :start AND :end") .setParameter("healthRecordId", this.healthRecordId) .setParameter("start", start, TemporalType.DATE) .setParameter("end", end, TemporalType.DATE) .getResultList(); } finally { PersistenceService.getInstance().close(); } for(Visit v : visits) { int visitDate = v.getVisitDate().getDate(); if (!visitsMap.containsKey(visitDate)) { ArrayList<Visit> visitList = new ArrayList<Visit>(); visitList.add(v); visitsMap.put(visitDate, visitList); } else { visitsMap.get(visitDate).add(v); } } return visitsMap; } public Map<Integer,List<Exercise>> getExercises() { List<Exercise> exercises = Collections.EMPTY_LIST; Map<Integer,List<Exercise>> exercisesMap = new HashMap<Integer, List<Exercise>>(); if ( this.healthRecordId == null || this.healthRecord.getHealthRecordId() == null) return exercisesMap; EntityManager em = PersistenceService.getInstance().getEntityManager(); try { Calendar start = Calendar.getInstance(); start.set(year, month-1,1); Calendar end = Calendar.getInstance(); end.set(year, month-1, 31); // TODO: move query to Exercise as NamedQuery. exercises = em.createQuery("SELECT v FROM Exercise v WHERE v.healthRecordId = :healthRecordId AND v.exerciseDate BETWEEN :start AND :end") .setParameter("healthRecordId", this.healthRecordId) .setParameter("start", start, TemporalType.DATE) .setParameter("end", end, TemporalType.DATE) .getResultList(); } finally { PersistenceService.getInstance().close(); } for(Exercise v : exercises) { int exerciseDate = v.getExerciseDate().getDate(); if (!exercisesMap.containsKey(exerciseDate)) { ArrayList<Exercise> exerciseList = new ArrayList<Exercise>(); exerciseList.add(v); exercisesMap.put(exerciseDate, exerciseList); } else { exercisesMap.get(exerciseDate).add(v); } } return exercisesMap; } }