/* * PatientView * * Copyright (c) Worth Solutions Limited 2004-2013 * * This file is part of PatientView. * * PatientView is free software: you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * PatientView is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License along with PatientView in a file * titled COPYING. If not, see <http://www.gnu.org/licenses/>. * * @package PatientView * @link http://www.patientview.org * @author PatientView <info@patientview.org> * @copyright Copyright (c) 2004-2013, Worth Solutions Limited * @license http://www.gnu.org/licenses/gpl-3.0.html The GNU General Public License V3.0 */ package org.patientview.radar.service.impl; import org.apache.commons.io.FileUtils; import org.jfree.chart.ChartFactory; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.CategoryLabelPositions; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.BarRenderer; import org.jfree.data.category.DefaultCategoryDataset; import org.patientview.model.Centre; import org.patientview.model.Clinician; import org.patientview.model.Country; import org.patientview.model.Ethnicity; import org.patientview.radar.dao.UserDao; import org.patientview.radar.dao.UtilityDao; import org.patientview.radar.model.Consultant; import org.patientview.radar.model.DiagnosisCode; import org.patientview.radar.model.Relative; import org.patientview.radar.model.filter.ConsultantFilter; import org.patientview.radar.service.UtilityManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.awt.Color; import java.awt.Font; import java.awt.GradientPaint; import java.io.File; import java.io.IOException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import java.util.Map; public class UtilityManagerImpl implements UtilityManager { private static final Logger LOGGER = LoggerFactory.getLogger(UtilityManagerImpl.class); private UtilityDao utilityDao; private String siteUrl; private String patientViewSiteUrl; private String patientViewSiteResultsUrl; private UserDao userDao; public String getFilePathAndName() { return filePathAndName; } public void setFilePathAndName(String filePathAndName) { this.filePathAndName = filePathAndName; } private String filePathAndName; public String getSiteUrl() { return siteUrl; } public String getPatientViewSiteUrl() { return patientViewSiteUrl; } public void setPatientViewSiteUrl(String patientViewSiteUrl) { this.patientViewSiteUrl = patientViewSiteUrl; } public String getPatientViewSiteResultsUrl() { return patientViewSiteResultsUrl; } public void setPatientViewSiteResultsUrl(String patientViewSiteResultsUrl) { this.patientViewSiteResultsUrl = patientViewSiteResultsUrl; } public void setSiteUrl(String siteUrl) { this.siteUrl = siteUrl; } public Centre getCentre(long id) { return utilityDao.getCentre(id); } public Centre getCentre(String unitcode) { return utilityDao.getCentre(unitcode); } public List<Centre> getCentres() { return utilityDao.getCentres(); } public List<Centre> getCentres(String nhsNo) { return utilityDao.getCentres(nhsNo); } public Consultant getConsultant(long id) { return utilityDao.getConsultant(id); } public List<Consultant> getConsultants() { return getConsultants(new ConsultantFilter(), 1, -1); } public List<Consultant> getConsultants(ConsultantFilter filter) { return getConsultants(filter, -1, -1); } public List<Consultant> getConsultants(ConsultantFilter filter, int page, int numberPerPage) { return utilityDao.getConsultants(filter, page, numberPerPage); } public List<Consultant> getConsultantsByCentre(Centre centre) { return utilityDao.getConsultantsByCentre(centre); } public void saveConsultant(Consultant consultant) throws Exception { utilityDao.saveConsultant(consultant); } public void deleteConsultant(Consultant consultant) throws Exception { utilityDao.deleteConsultant(consultant); } public Country getCountry(long id) { return utilityDao.getCountry(id); } public List<Country> getCountries() { return utilityDao.getCountries(); } public Ethnicity getEthnicityByCode(String ethnicityCode) { return utilityDao.getEthnicityByCode(ethnicityCode); } public List<Ethnicity> getEthnicities() { return utilityDao.getEthnicities(); } public Relative getRelative(long id) { return utilityDao.getRelative(id); } public List<Relative> getRelatives() { return utilityDao.getRelatives(); } public Map<Long, Integer> getPatientCountPerUnitByDiagnosisCode(DiagnosisCode diagnosisCode) { return utilityDao.getPatientCountPerUnitByDiagnosisCode(diagnosisCode); } public int getPatientCountByUnit(Centre centre) { return utilityDao.getPatientCountByUnit(centre); } public JFreeChart getPatientCountPerUnitChart() { // create dataset String srnsSeries = "SRNS"; String mpgnSeries = "MPGN"; DiagnosisCode srnsCode = new DiagnosisCode(); srnsCode.setId(DiagnosisCode.SRNS_ID); DiagnosisCode mpgnCode = new DiagnosisCode(); mpgnCode.setId(DiagnosisCode.MPGN_ID); Map<Long, Integer> srnsPatientCountMap = getPatientCountPerUnitByDiagnosisCode(srnsCode); Map<Long, Integer> mpgnPatientCountMap = getPatientCountPerUnitByDiagnosisCode(mpgnCode); java.util.List<Centre> centreList = getCentres(); DefaultCategoryDataset dataset = new DefaultCategoryDataset(); for (Centre centre : centreList) { String centreCategory = centre.getAbbreviation() != null ? centre.getAbbreviation() : centre.getName(); Integer srnsCount = srnsPatientCountMap.containsKey(centre.getId()) ? srnsPatientCountMap.get(centre.getId()) : null; if (srnsCount != null && srnsCount > 0) { dataset.addValue(srnsCount, srnsSeries, centreCategory); } Integer mpgnCount = mpgnPatientCountMap.containsKey(centre.getId()) ? mpgnPatientCountMap.get(centre.getId()) : null; if (mpgnCount != null && mpgnCount > 0) { dataset.addValue(mpgnCount, mpgnSeries, centreCategory); } } // create chart JFreeChart chart = ChartFactory.createBarChart( "Total number of registered patients by unit", // chart title "", // domain axis label "", // range axis label dataset, // data PlotOrientation.VERTICAL, // orientation true, // include legend true, // tooltips? false // URLs? ); // NOW DO SOME OPTIONAL CUSTOMISATION OF THE CHART... // set the background color for the chart... chart.setBackgroundPaint(Color.white); // get a reference to the plot for further customisation... CategoryPlot plot = chart.getCategoryPlot(); plot.setBackgroundPaint(Color.lightGray); plot.setDomainGridlinePaint(Color.white); plot.setDomainGridlinesVisible(true); plot.setRangeGridlinePaint(Color.white); // set the range axis to display integers only... final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); // disable bar outlines... BarRenderer renderer = (BarRenderer) plot.getRenderer(); DecimalFormat decimalformat1 = new DecimalFormat("##,###"); renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", decimalformat1)); renderer.setItemLabelsVisible(true); renderer.setBaseItemLabelsVisible(true); // set up gradient paints for series... GradientPaint gp0 = new GradientPaint( 0.0f, 0.0f, Color.blue, 0.0f, 0.0f, new Color(0, 0, 64) ); GradientPaint gp1 = new GradientPaint( 0.0f, 0.0f, Color.green, 0.0f, 0.0f, new Color(0, 64, 0) ); GradientPaint gp2 = new GradientPaint( 0.0f, 0.0f, Color.red, 0.0f, 0.0f, new Color(64, 0, 0) ); renderer.setSeriesPaint(0, gp0); renderer.setSeriesPaint(1, gp1); renderer.setSeriesPaint(2, gp2); CategoryAxis domainAxis = plot.getDomainAxis(); domainAxis.setLabelFont(new Font("Times New Roman", Font.PLAIN, 12)); domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 6.0)); // OPTIONAL CUSTOMISATION COMPLETED. return chart; } public String getUserName(String nhsNo) { return utilityDao.getUserName(nhsNo); } public String getUserName(Long id) { return utilityDao.getUserName(id); } private void writeConsultantToFile(List<Consultant> consultants) { File file = new File(getFilePathAndName()); List<String> list = new ArrayList<String>(); for (Consultant consultant : consultants) { list.add(consultant.getId() + "," +consultant.getFullName() + "," + consultant.getCentre().getId() + " : " + consultant.getCentre().getUnitCode()); } if (!list.isEmpty()) { try { FileUtils.writeLines(file, "UTF-8", list); } catch (IOException e) { LOGGER.error(e.getMessage()); LOGGER.debug(e.getMessage(), e); } } } public List<Clinician> getCliniciansByCentre(Centre centre) { return utilityDao.getClinicians(centre); } public UtilityDao getUtilityDao() { return utilityDao; } public void setUtilityDao(UtilityDao utilityDao) { this.utilityDao = utilityDao; } public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } }