/** * 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.api.service; import com.krminc.phr.api.converter.HealthRecordConverter; import com.krminc.phr.api.service.clinical.*; import com.krminc.phr.api.vitals.service.*; import com.krminc.phr.core.VitalConfig; import com.krminc.phr.dao.PersistenceService; import com.krminc.phr.domain.Address; import com.krminc.phr.domain.HealthRecord; import com.krminc.phr.domain.User; import com.krminc.phr.domain.vitals.Height; import com.krminc.phr.domain.vitals.Weight; import com.krminc.phr.core.AppConfig; import com.krminc.phr.core.UserConfig; import com.krminc.phr.domain.*; import com.sun.jersey.api.core.ResourceContext; import java.net.URI; import java.text.DateFormat; import javax.ws.rs.Path; import javax.ws.rs.GET; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.UriInfo; import javax.ws.rs.WebApplicationException; import javax.persistence.NoResultException; import javax.persistence.EntityManager; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import javax.ws.rs.PathParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Health Record API RESTful resource class. * * @author cmccall * @author Daniel Shaw (dshaw.com) */ public class HealthRecordResource { final Logger logger = LoggerFactory.getLogger(HealthRecordResource.class); @Context protected UriInfo uriInfo; @Context protected ResourceContext resourceContext; @Context protected SecurityContext securityContext; protected Long id; public HealthRecordResource() { } public void setId(Long id) { this.id = id; } /** * Get method for retrieving an instance of HealthRecord identified by id in XML format. * * @return an instance of HealthRecordConverter */ @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) public HealthRecordConverter get() { PersistenceService persistenceSvc = PersistenceService.getInstance(); try { persistenceSvc.beginTx(); return new HealthRecordConverter(getEntity(), uriInfo.getAbsolutePath(), Api.DEFAULT_EXPAND_LEVEL); } finally { PersistenceService.getInstance().close(); } } //Removed PUT and DELETE options from API /** * Returns an instance of HealthRecord identified by id. * * @param id identifier for the entity * @return an instance of HealthRecord */ protected HealthRecord getEntity() { EntityManager em = PersistenceService.getInstance().getEntityManager(); try { return (HealthRecord) em.find(HealthRecord.class, id); //return (HealthRecord) em.createQuery("SELECT e FROM HealthRecord e where e.recId = :recId").setParameter("recId", id).getSingleResult(); } catch (NoResultException ex) { throw new WebApplicationException( new Throwable("Resource for " + uriInfo.getAbsolutePath() + " does not exist."), Response.Status.NOT_FOUND ); } } /** * Updates entity using data from newEntity. * * @param entity the entity to update * @param newEntity the entity containing the new data * @return the updated entity */ protected HealthRecord updateEntity(HealthRecord entity, HealthRecord newEntity) { EntityManager em = PersistenceService.getInstance().getEntityManager(); User user = entity.getUser(); User userNew = newEntity.getUser(); entity = em.merge(newEntity); if (user != null && !user.equals(userNew)) { user.getHealthRecords().remove(entity); } if (userNew != null && !userNew.equals(user)) { userNew.getHealthRecords().add(entity); } return entity; } //custom resources @Path("image/") @GET @Produces("image/jpeg") public Response getImage() { PersistenceService persistenceSvc = PersistenceService.getInstance(); byte[] image = null; final String staticDirectory = "./static/images/avatars/"; final String maleAvatar = "default_avatar_male_126x126.jpg"; final String femaleAvatar = "default_avatar_female_126x126.jpg"; User user = null; HealthRecord hr = null; //logger.error("Attempting to serve user image!"); try { persistenceSvc.beginTx(); hr = getEntity(); user = hr.getUser(); image = user.getUserImage(); } finally { persistenceSvc.close(); } if (image != null && image.length > 0) { return Response.ok(image, "image/jpeg").build(); } else { try { URI location = null; if (user != null) { if (hr.getGender().equalsIgnoreCase("F")) { location = new URI(staticDirectory + femaleAvatar); } else { location = new URI(staticDirectory + maleAvatar); } } //logger.error("location: " + location.toString()); return Response.seeOther(location).build(); } catch (Exception ex) { logger.error("Error building image path"); return Response.serverError().build(); } } } /** * Get method for retrieving Patient info identified by id in JSON format. * * @return an JSONObject */ @Path("info/") @GET @Produces({ MediaType.APPLICATION_JSON }) public JSONObject getPatientInfo() { HealthRecord hr = null; JSONObject jSONObject = new JSONObject(); PersistenceService persistenceSvc = PersistenceService.getInstance(); try { persistenceSvc.beginTx(); hr = getEntity(); jSONObject.put("name", hr.getUser().getFullName()); jSONObject.put("gender", hr.getFullGender()); jSONObject.put("age", hr.getAge()); } catch (JSONException ex) { } finally { PersistenceService.getInstance().close(); } return jSONObject; } /** * Get method for retrieving Patient info identified by id in JSON format. * * @return an JSONObject of gender, DOB, marriage status, blood type, organ donor status, first/middle/last name, telephone numbers, and address */ @Path("profile/") @GET @Produces({ MediaType.APPLICATION_JSON }) public JSONObject getPatientProfile() { HealthRecord hr = null; User usr = null; Address adrs = null; JSONObject jSONObject = new JSONObject(); PersistenceService persistenceSvc = PersistenceService.getInstance(); try { persistenceSvc.beginTx(); hr = getEntity(); usr = hr.getUser(); adrs = usr.getAddresses().get(0); jSONObject.put("firstName",usr.getFirstName()); jSONObject.put("middleName", usr.getMiddleName()); jSONObject.put("lastName", usr.getLastName()); jSONObject.put("gender", hr.getFullGender()); jSONObject.put("dateOfBirth", hr.getDateOfBirthString()); jSONObject.put("maritalStatus", hr.getMaritalStatus()); jSONObject.put("email", usr.getEmail()); jSONObject.put("faxNum", usr.getFaxnum()); jSONObject.put("telnumHome", usr.getTelnumHome()); jSONObject.put("telnumMobile", usr.getTelnumMobile()); jSONObject.put("telnumWork", usr.getTelnumWork()); jSONObject.put("address1", adrs.getAddress1()); jSONObject.put("address2", adrs.getAddress2()); jSONObject.put("address3", adrs.getAddress3()); jSONObject.put("city", adrs.getCity()); jSONObject.put("state", adrs.getState()); jSONObject.put("zip", adrs.getZip()); } catch (JSONException ex) { } finally { PersistenceService.getInstance().close(); } return jSONObject; } /** * Get method for retrieving Patient info identified by id in JSON format. * * @return an JSONObject of gender, DOB, marriage status, blood type, organ donor status, first/middle/last name, telephone numbers, and address */ @Path("account/") @GET @Produces({ MediaType.APPLICATION_JSON }) public JSONObject getUserAccount() { HealthRecord hr = null; User usr = null; JSONObject jSONObject = new JSONObject(); PersistenceService persistenceSvc = PersistenceService.getInstance(); try { persistenceSvc.beginTx(); hr = getEntity(); usr = hr.getUser(); //username, last login, number of logins, preferred name, date account created, and email address jSONObject.put("username",usr.getUsername()); jSONObject.put("lastLogin", usr.getLastLogin()); jSONObject.put("numLogins", usr.getTotalLogin()); jSONObject.put("preferredName", usr.getPreferredName()); jSONObject.put("dateCreated", usr.getDateCreated()); jSONObject.put("email", usr.getEmail()); } catch (JSONException ex) { } finally { PersistenceService.getInstance().close(); } return jSONObject; } /** * Get method for retrieving Patient info identified by id in JSON format. * * @return an JSONObject of gender, DOB, marriage status, blood type, organ donor status, first/middle/last name, telephone numbers, and address */ @Path("preferences/") @GET @Produces({ MediaType.APPLICATION_JSON }) public JSONObject getPreferences() { HealthRecord hr = null; JSONObject jSONObject = new JSONObject(); PersistenceService persistenceSvc = PersistenceService.getInstance(); try { persistenceSvc.beginTx(); hr = getEntity(); UserPreferences pref = hr.getPreferences(); String careNotebookString = ""; if (pref != null) { careNotebookString = pref.getShowCarenotebookString(); } jSONObject.put("careNotebook", careNotebookString); } catch (JSONException ex) { } finally { PersistenceService.getInstance().close(); } return jSONObject; } //get list of those with access to a health record @Path("access/") @GET @Produces({ MediaType.APPLICATION_JSON }) public JSONObject getUsersWithAccess() { HealthRecord hr = null; JSONObject jSONObject = new JSONObject(); PersistenceService persistenceSvc = PersistenceService.getInstance(); try { persistenceSvc.beginTx(); hr = getEntity(); List<String> names = new ArrayList<String>(); List<String> emails = new ArrayList<String>(); List<String> phones = new ArrayList<String>(); List<String> faxes = new ArrayList<String>(); List<Long> ids = new ArrayList<Long>(); List<User> users = hr.getUserList(); for (User u : users) { if (u.getUserId() != getAuthenticatedUser().getUserId()) { //keep self out of access list ids.add(u.getUserId()); names.add(u.getFullName()); emails.add(u.getEmail()); faxes.add(u.getFaxnum()); String phone = (u.getTelnumWork() == null)? u.getTelnumMobile() : u.getTelnumWork(); phones.add(phone); } } if (!ids.isEmpty()) { jSONObject.put("users", names); jSONObject.put("ids", ids); jSONObject.put("phones", phones); jSONObject.put("faxes", faxes); jSONObject.put("emails", emails); } } catch (JSONException ex) { } finally { PersistenceService.getInstance().close(); } return jSONObject; } //remove access to a healthrecord @Path("removeAccess/{userId}") @GET @Produces({ MediaType.APPLICATION_JSON }) public JSONObject removeAccess( @PathParam("userId") Long userId ) { HealthRecord localHR = getEntity(); Long healthRecordIdToRemove = localHR.getHealthRecordId(); JSONObject jsonResult = new JSONObject(); Boolean returnType = false; if (healthRecordIdToRemove != null) { PersistenceService persistenceSvc = PersistenceService.getInstance(); try { if (! securityContext.isUserInRole(UserConfig.ROLE_PATIENT)) throw new Exception("Not in patient role for removing access"); EntityManager em = PersistenceService.getInstance().getEntityManager(); User userToDisallow = null; User removingUser = null; try { persistenceSvc.beginTx(); //get user userToDisallow = getUserById(userId); removingUser = getAuthenticatedUser(); //TODO check we are owner of HR //if HR owner == removingUser //find the correct hr List<HealthRecord> healthRecords = userToDisallow.getHealthRecords(); boolean shouldRemove = false; HealthRecord toRemove = null; //make sure we aren't removing ourself if (removingUser.getUserId().compareTo(userId) == 0) { shouldRemove = false; logger.debug("Preventing self-removal attempt id1 {} id2 {}", userToDisallow.getUserId(), userId); } else { for (HealthRecord hr : healthRecords) { //prepare to remove link if (healthRecordIdToRemove.compareTo(hr.getHealthRecordId()) == 0) { toRemove = hr; logger.debug("Ready to remove healthRecord {} from user {}", hr, userToDisallow); shouldRemove = true; } } if ( toRemove == null) { logger.error("Unable to find matching hr to remove"); } } if (shouldRemove) { healthRecords.remove(toRemove); userToDisallow.setHealthRecords(healthRecords); em.flush(); persistenceSvc.commitTx(); returnType = true; } else { returnType = false; persistenceSvc.rollbackTx(); } } catch (NoResultException ex) { logger.error("Unable to find remove access for HRID: {}", healthRecordIdToRemove); returnType = false; } } catch (Exception ex) { logger.error("removeAccess encountered exception: {}", ex); returnType = false; } finally { persistenceSvc.close(); } } else { returnType = false; } try { jsonResult.put("status", returnType); } catch (JSONException ex) { throw new WebApplicationException(Response.Status.PRECONDITION_FAILED); } return jsonResult; } @Path("checkRequests/") @GET @Produces({ MediaType.APPLICATION_JSON }) public JSONObject getHealthRecordRequests() { JSONObject jSONObject = new JSONObject(); List<HealthrecordRequest> requests = new ArrayList<HealthrecordRequest>(); boolean foundRequests = false; List<String> requestingUsers = new ArrayList<String>(); List<Integer> requestIds = new ArrayList<Integer>(); PersistenceService persistenceSvc = PersistenceService.getInstance(); try { EntityManager em = PersistenceService.getInstance().getEntityManager(); persistenceSvc.beginTx(); Long healthRecordId = getEntity().getHealthRecordId(); try { requests = em.createNamedQuery("HealthrecordRequest.findByRecIdRequested") .setParameter("recIdRequested", healthRecordId) .getResultList(); if (!requests.isEmpty()) foundRequests = true; } catch (NoResultException ex) { foundRequests = false; logger.error("No requests found for HealthrecordRequest.findByRecIdRequested: {}", ex); } if (foundRequests) { for (HealthrecordRequest request : requests) { try { User u = (User) em.createNamedQuery("User.findByUserId") .setParameter("userId", request.getUserIdRequestor()) .setMaxResults(1) .getSingleResult(); if (u != null) { requestingUsers.add(u.getFullName()); requestIds.add(request.getRequestId()); } } catch (NoResultException ex) { logger.error("Unable to find a user who requested hrid access"); } } } } catch (Exception ex) { foundRequests = false; } finally { persistenceSvc.close(); } try { jSONObject.put("requests", foundRequests); if (foundRequests) { if (!requestingUsers.isEmpty()) jSONObject.put("users", requestingUsers); if (!requestIds.isEmpty()) jSONObject.put("ids", requestIds); } } catch (JSONException ex) { logger.error( "Error creating checkRequests JSONObject", ex); } return jSONObject; } //approve request to access a health record @Path("approveRequest/{requestId}") @GET @Produces({ MediaType.APPLICATION_JSON }) public JSONObject approveRequest( @PathParam("requestId") Integer requestId ) { JSONObject jSONObject = new JSONObject(); //Add the link to hr->user linkage table PersistenceService persistenceSvc = PersistenceService.getInstance(); EntityManager em = persistenceSvc.getEntityManager(); String approvalRequest = new String(); try { if (! securityContext.isUserInRole(UserConfig.ROLE_PATIENT)) throw new Exception("Not in patient role for approval request"); persistenceSvc.beginTx(); HealthrecordRequest approvedRequest = em.find(HealthrecordRequest.class, requestId); //ensure we are linking a request that is of our own record if (approvedRequest.getRecIdRequested() == getEntity().getHealthRecordId()) { //find the user we are giving access to hr for User approvedUser = em.find( User.class, new Long(approvedRequest.getUserIdRequestor()) ); //find the hrid we want to give access to HealthRecord approvedRecord = em.find( HealthRecord.class, new Long(approvedRequest.getRecIdRequested()) ); //add the healthrecord to user object List<HealthRecord> currentRecords = approvedUser.getHealthRecords(); currentRecords.add(approvedRecord); approvedUser.setHealthRecords(currentRecords); //delete the request now that it is satisfied em.remove(approvedRequest); } persistenceSvc.commitTx(); approvalRequest = "success"; } catch (Exception ex) { logger.error("Exception encountered processing approval request: {}", ex); approvalRequest = "error"; } finally { persistenceSvc.close(); } try { jSONObject.put("status", approvalRequest); } catch (JSONException ex) { logger.error( "Error creating approveRequest JSONObject", ex); } return jSONObject; } //deny request to access a health record @Path("denyRequest/{requestId}") @GET @Produces({ MediaType.APPLICATION_JSON }) public JSONObject denyRequest( @PathParam("requestId") Integer requestId ) { JSONObject jSONObject = new JSONObject(); PersistenceService persistenceSvc = PersistenceService.getInstance(); EntityManager em = persistenceSvc.getEntityManager(); String denyRequest = new String(); try { if (! securityContext.isUserInRole(UserConfig.ROLE_PATIENT)) throw new Exception("Not in patient role for denial request"); persistenceSvc.beginTx(); HealthrecordRequest toDelete = em.find(HealthrecordRequest.class, requestId); //ensure we are deleting a request that is of our own record if (toDelete.getRecIdRequested() == getEntity().getHealthRecordId()) { em.remove(toDelete); } persistenceSvc.commitTx(); denyRequest = "success"; } catch (Exception ex) { logger.error("Exception encountered processing approval request: {}", ex); denyRequest = "error"; } finally { persistenceSvc.close(); } try { jSONObject.put("status", denyRequest); } catch (JSONException ex) { logger.error( "Error creating denyRequest JSONObject", ex); } return jSONObject; } /** * Get method for retrieving Patient health stats identified by id in JSON format. * * @return an JSONObject */ //TODO implement stats healthRecordId-based namedQueries in height+weight classes @Path("stats/") @GET @Produces({ MediaType.APPLICATION_JSON }) public JSONObject getPatientStats() { JSONObject jSONObject = new JSONObject(); PersistenceService persistenceSvc = PersistenceService.getInstance(); Weight latestWeight = null; Height latestHeight = null; Boolean calculateBMI = true; try { EntityManager em = PersistenceService.getInstance().getEntityManager(); persistenceSvc.beginTx(); Long healthRecordId = getEntity().getHealthRecordId(); try { latestHeight = (Height)em.createNamedQuery("Height.getLatestByHealthRecordId") .setParameter("healthRecordId", healthRecordId) .setMaxResults(1) .getSingleResult(); } catch (NoResultException ex) { calculateBMI = false; } try { latestWeight = (Weight)em.createNamedQuery("Weight.getLatestByHealthRecordId") .setParameter("healthRecordId", healthRecordId) .setMaxResults(1) .getSingleResult(); } catch (NoResultException ex) { calculateBMI = false; } } catch (Exception ex) { calculateBMI = false; } finally { PersistenceService.getInstance().close(); } double bmi = 0; if (calculateBMI) { int inches = 1; //avoid div by 0 double pounds = 0; try { inches = (latestHeight.getFeet() * 12) + latestHeight.getInches(); } catch(Exception ex) { inches = 1; } try { if (latestWeight.getUnit().equalsIgnoreCase("lbs")) { pounds = latestWeight.getWeight().intValue(); } else if (latestWeight.getUnit().equalsIgnoreCase("kgs")) { //convert kgs to pounds pounds = latestWeight.getWeight().doubleValue() * 2.20462262; } else { throw new Exception(); } } catch(Exception ex) { pounds = 0; } if (inches>0 && pounds>0) { //bmi formula http://www.whathealth.com/bmi/formula.html bmi = pounds * 703; bmi = bmi / (inches * inches); } } try { if (bmi>0) { DecimalFormat twoDForm = new DecimalFormat("#.##"); jSONObject.put("bmi", Double.valueOf(twoDForm.format(bmi))); } } catch (JSONException ex) { logger.warn( "Error creating BMI JSONObject", ex); } try { if (latestWeight != null) { jSONObject.put("weight", latestWeight.getWeight().toString().concat(" ").concat(latestWeight.getUnit().toLowerCase())); DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); jSONObject.put("weightDate", df.format(latestWeight.getObservedDate())); } } catch (JSONException ex) { logger.warn( "Error creating Weight JSONObject", ex); } try { if (latestHeight != null) { String strHeight = latestHeight.getFeet().toString().concat("' "); if (latestHeight.getInches() > 0) { strHeight = strHeight.concat(latestHeight.getInches().toString().concat("\"")); } jSONObject.put("height", strHeight); DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); jSONObject.put("heightDate", df.format(latestHeight.getObservedDate())); } } catch (JSONException ex) { logger.warn( "Error creating Height JSONObject", ex); } return jSONObject; } //CLINICAL Data Item Mappings /** * Returns a dynamic instance of CcrDocumentsResource used for entity navigation. * * @return an instance of CcrDocumentsResource */ @Path("clinical/ccrs/") public CcrDocumentsResource getCcrDocumentsResource() { CcrDocumentsResource resource = resourceContext.getResource(CcrDocumentsResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of CcrProblemsResource used for entity navigation. * * @return an instance of CcrProblemsResource */ @Path("clinical/medicalevents/") public CcrProblemsResource getCcrProblemsResource() { CcrProblemsResource resource = resourceContext.getResource(CcrProblemsResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of CcrAlertsResource used for entity navigation. * * @return an instance of CcrAlertsResource */ @Path("clinical/allergies/") public CcrAlertsResource getCcrAlertsResource() { CcrAlertsResource resource = resourceContext.getResource(CcrAlertsResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of CcrImmunizationsResource used for entity navigation. * * @return an instance of CcrImmunizationsResource */ @Path("clinical/immunizations/") public CcrImmunizationsResource getCcrImmunizationsResource() { CcrImmunizationsResource resource = resourceContext.getResource(CcrImmunizationsResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of CcrMedicationsResource used for entity navigation. * * @return an instance of CcrMedicationsResource */ @Path("clinical/medications/") public CcrMedicationsResource getCcrMedicationsResource() { CcrMedicationsResource resource = resourceContext.getResource(CcrMedicationsResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of CcrResultsResource used for entity navigation. * * @return an instance of CcrResultsResource */ @Path("clinical/results/") public CcrResultsResource getCcrResultsResource() { CcrResultsResource resource = resourceContext.getResource(CcrResultsResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of CcrResultsResource used for entity navigation. * * @return an instance of CcrResultsResource */ @Path("clinical/results/{resultId}/resultTests/") public CcrResultTestsResource getCcrResultTestsResource(@PathParam("resultId") Long resultId) { CcrResultTestsResource resource = resourceContext.getResource(CcrResultTestsResource.class); resource.setHealthRecordId(id); CcrResultResource result = resourceContext.getResource(CcrResultResource.class); result.setId(resultId); resource.setCcrResultResource(result); return resource; } /** * Returns a dynamic instance of CcrVitalSignResultsResource used for entity navigation. * * @return an instance of CcrVitalSignResultsResource */ @Path("clinical/vitals/") public CcrVitalSignResultsResource getCcrVitalSignResultsResource() { CcrVitalSignResultsResource resource = resourceContext.getResource(CcrVitalSignResultsResource.class); resource.setHealthRecordId(id); return resource; } @Path("clinical/vitals/{vitalType: .{2,3}?}/") public CcrVitalSignTestsResource getCcrVitalSignTestsResource(@PathParam("vitalType") String vitalType) { CcrVitalSignTestsResource resource = resourceContext.getResource(CcrVitalSignTestsResource.class); resource.setHealthRecordId(id); //translate vital type path param to DB param if (vitalType.equalsIgnoreCase("bp")) { vitalType = VitalConfig.VITAL_BLOODPRESSURE; } else if (vitalType.equalsIgnoreCase("bs")) { vitalType = VitalConfig.VITAL_GLUCOSE; //no clinical BS -- this is a lab } else if (vitalType.equalsIgnoreCase("bt")) { vitalType = VitalConfig.VITAL_TEMPERATURE; } else if (vitalType.equalsIgnoreCase("bw")) { vitalType = VitalConfig.VITAL_WEIGHT; } else if (vitalType.equalsIgnoreCase("hr")) { vitalType = VitalConfig.VITAL_PULSE; } else if (vitalType.equalsIgnoreCase("ht")) { vitalType = VitalConfig.VITAL_HEIGHT; } else if (vitalType.equalsIgnoreCase("pn")) { vitalType = VitalConfig.VITAL_PAIN; } else if (vitalType.equalsIgnoreCase("pf")) { vitalType = VitalConfig.VITAL_PEAKFLOW; } else if (vitalType.equalsIgnoreCase("bmi")) { vitalType = VitalConfig.VITAL_BMI; } else { vitalType = "NONMATCHED"; } resource.setVitalType(vitalType); return resource; } /** * Returns a dynamic instance of AddressesResource used for entity navigation. * * @return an instance of AddressesResource */ // TODO: Fix addresses resources. @Path("addresses/") public AddressesResource getAddressesResource() { AddressesResource resource = resourceContext.getResource(AddressesResource.class); //resource.setParent(getEntity().getUser()); return resource; } /** * Returns a dynamic instance of AllergiesResource used for entity navigation. * * @return an instance of AllergiesResource */ @Path("allergies/") public AllergiesResource getAllergiesResource() { AllergiesResource resource = resourceContext.getResource(AllergiesResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of ImmunizationsResource used for entity navigation. * * @return an instance of ImmunizationsResource */ @Path("immunizations/") public ImmunizationsResource getImmunizationsResource() { ImmunizationsResource resource = resourceContext.getResource(ImmunizationsResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of MedicationsResource used for entity navigation. * * @return an instance of MedicationsResource */ @Path("medications/") public MedicationsResource getMedicationsResource() { MedicationsResource resource = resourceContext.getResource(MedicationsResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of MedicalEventsResource used for entity navigation. * * @return an instance of MedicalEventsResource */ @Path("medicalevents/") public MedicalEventsResource getMedicalEventsResource() { MedicalEventsResource resource = resourceContext.getResource(MedicalEventsResource.class); resource.setHealthRecordId(id); return resource; } /** * @return a dynamic instance of RecordIdentifiersResource used for entity navigation. */ @Path("recordidentifiers/") public RecordIdentifiersResource getRecordIdentifiersResource() { RecordIdentifiersResource resource = resourceContext.getResource(RecordIdentifiersResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of VisitsResource used for entity navigation. * * @return an instance of VisitsResource */ @Path("visits/") public VisitsResource getVisitsResource() { VisitsResource resource = resourceContext.getResource(VisitsResource.class); resource.setHealthRecordId(id); return resource; } @Path("exercises/") public ExercisesResource getExercisesResource() { ExercisesResource resource = resourceContext.getResource(ExercisesResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of BloodPressuresResource. * * @return an instance of BloodPressuresResource */ @Path("vitals/bloodpressure/") public BloodPressuresResource getBloodPressuresResource() { BloodPressuresResource resource = resourceContext.getResource(BloodPressuresResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of BloodSugarsResource. * * @return an instance of BloodSugarsResource */ @Path("vitals/bloodsugar/") public BloodSugarsResource getBloodSugarResource() { BloodSugarsResource resource = resourceContext.getResource(BloodSugarsResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of HeartRatesResource. * * @return an instance of HeartRatesResource */ @Path("vitals/heartrate/") public HeartRatesResource getHeartRatesResource() { HeartRatesResource resource = resourceContext.getResource(HeartRatesResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of PainsResource. * * @return an instance of PainsResource */ @Path("vitals/pain/") public PainsResource getPainsResource() { PainsResource resource = resourceContext.getResource(PainsResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of PeakFlowsResource. * * @return an instance of PeakFlowsResource */ @Path("vitals/peakflow/") public PeakFlowsResource getPeakFlowsResource() { PeakFlowsResource resource = resourceContext.getResource(PeakFlowsResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of PulseOximetriesResource. * * @return an instance of PulseOximetriesResource */ @Path("vitals/temperature/") public TemperaturesResource getTemperaturesResource() { TemperaturesResource resource = resourceContext.getResource(TemperaturesResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of WeightsResource. * * @return an instance of WeightsResource */ @Path("vitals/weight/") public WeightsResource getWeightsResource() { WeightsResource resource = resourceContext.getResource(WeightsResource.class); resource.setHealthRecordId(id); return resource; } /** * Returns a dynamic instance of HeightsResource. * * @return an instance of HeightsResource */ @Path("vitals/height/") public HeightsResource getHeightsResource() { HeightsResource resource = resourceContext.getResource(HeightsResource.class); resource.setHealthRecordId(id); return resource; } /** * @return a User. */ private User getUserById(Long userId) { PersistenceService persistenceSvc = PersistenceService.getInstance(); EntityManager em = persistenceSvc.getEntityManager(); try { // persistenceSvc.beginTx(); -- Transaction already exists in *some* callers. return (User) em.createNamedQuery("User.findByUserId") .setParameter("userId", userId) .getSingleResult(); } finally { PersistenceService.getInstance().close(); } } /** * @return a User. */ private User getAuthenticatedUser() { PersistenceService persistenceSvc = PersistenceService.getInstance(); EntityManager em = persistenceSvc.getEntityManager(); try { // persistenceSvc.beginTx(); -- Transaction already exists in *some* callers. return (User) em.createNamedQuery("User.findByUsername") .setParameter("username", securityContext.getUserPrincipal().getName()) .getSingleResult(); } finally { PersistenceService.getInstance().close(); } } }