package info.ozkan.vipera.doctorviews.healthdata;
import info.ozkan.vipera.business.healthdata.HealthDataFacade;
import info.ozkan.vipera.business.healthdata.HealthDataFieldFacade;
import info.ozkan.vipera.business.healthdata.HealthDataFieldResult;
import info.ozkan.vipera.business.healthdata.HealthDataResult;
import info.ozkan.vipera.business.healthdata.HealthDataSearchFilter;
import info.ozkan.vipera.entities.HealthData;
import info.ozkan.vipera.entities.HealthDataField;
import info.ozkan.vipera.entities.HealthDataValue;
import info.ozkan.vipera.entities.Patient;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.LineChartSeries;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
/**
* Birden fazla alanı bar grafiği olarak gösteren ekran
*
* @author Ömer Özkan
*
*/
@Named("healthDataChart")
@Scope("session")
public class HealthDataChartBean {
/**
* LOGGER
*/
private static final Logger LOGGER = LoggerFactory
.getLogger(HealthDataChartBean.class);
/**
* grafik oluşturuldu mesajı
*/
private static final String MSG_CHART_CREATED = "Grafik oluşturuldu!";
/**
* Veri bulunamadı mesajı
*/
private static final String MSG_DATA_NOT_FOUND = "Veri bulunamadı!";
/**
* boş string
*/
private static final String EMPTY = "";
/**
* alan seç mesajı
*/
private static final String MSG_SELECT_FIELD =
"Lütfen en az bir tane alan seçiniz!";
/**
* Hasta seç mesajı
*/
private static final String MSG_SELECT_PATIENT =
"Lütfen bir hasta seçiniz!";
/**
* Hasta
*/
private Patient patient;
/**
* başlangıç tarihi
*/
private Date startDate;
/**
* bitiş tarihi
*/
private Date endDate;
/**
* alanlar
*/
private List<HealthDataField> fields;
/**
* seçilen alanlar
*/
private List<String> selectedFields;
/**
* chart
*/
private CartesianChartModel lineChartModel;
/**
* chart render edilsin mi
*/
private boolean renderChart = false;
/***
* alan işlemleri için işletme nesnesi
*/
@Inject
private HealthDataFieldFacade healthDataFieldFacade;
/**
* veriler için işletme nesnesi
*/
@Inject
private HealthDataFacade healthDataFacade;
/**
* sayfayı ilklendirir
*/
@PostConstruct
public void setUp() {
final HealthDataFieldResult result = healthDataFieldFacade.getFields();
fields = result.getHealthDataFields();
}
/**
* grafiği gösterir
*/
public void show() {
final FacesContext context = FacesContext.getCurrentInstance();
boolean canDraw = true;
if (patient == null) {
context.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_ERROR, MSG_SELECT_PATIENT, EMPTY));
canDraw = false;
}
if (selectedFields.size() == 0) {
context.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_ERROR, MSG_SELECT_FIELD, EMPTY));
canDraw = false;
}
if (canDraw) {
drawChart(context);
}
}
/**
* verileri hesaplar ve grafiği çizer
*
* @param context
*/
private void drawChart(final FacesContext context) {
final HealthDataSearchFilter filter = createSearchFilter();
final HealthDataResult result = healthDataFacade.find(filter);
final List<HealthData> datas = result.getHealthDataList();
if (datas.size() == 0) {
context.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_INFO, MSG_DATA_NOT_FOUND, EMPTY));
} else {
createChart(datas);
context.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_INFO, MSG_CHART_CREATED, EMPTY));
LOGGER.info("The chart drawed with {} values and {} fields",
datas.size(), selectedFields.size());
}
}
/**
* arama filtresi oluşturur
*
* @return
*/
private HealthDataSearchFilter createSearchFilter() {
final HealthDataSearchFilter filter = new HealthDataSearchFilter();
filter.setPatient(patient);
filter.setStartDate(startDate);
filter.setEndDate(endDate);
return filter;
}
/**
* grafik oluşturur
*
* @param datas
*/
private void createChart(final List<HealthData> datas) {
final CartesianChartModel model = new CartesianChartModel();
for (final String fieldName : selectedFields) {
final HealthDataField field =
healthDataFieldFacade.getField(fieldName);
final LineChartSeries series = new LineChartSeries();
series.setLabel(field.getTitle());
for (final HealthData data : datas) {
if (data.exist(field)) {
final HealthDataValue value = data.getValue(field);
final Long id = data.getId();
series.set(id, value.getValue());
}
}
model.addSeries(series);
}
lineChartModel = model;
configureChart();
}
/**
* grafiği yapılandırır
*/
private void configureChart() {
renderChart = true;
}
/**
* Seçilen hastayı tanımlar
*
* @param patient
*/
public void selectPatient(final Patient patient) {
this.patient = patient;
}
/**
* @return the patient
*/
public Patient getPatient() {
return patient;
}
/**
* @param patient
* the patient to set
*/
public void setPatient(final Patient patient) {
this.patient = patient;
}
/**
* @return the startDate
*/
public Date getStartDate() {
return startDate;
}
/**
* @param startDate
* the startDate to set
*/
public void setStartDate(final Date startDate) {
this.startDate = startDate;
}
/**
* @return the endDate
*/
public Date getEndDate() {
return endDate;
}
/**
* @param endDate
* the endDate to set
*/
public void setEndDate(final Date endDate) {
this.endDate = endDate;
}
/**
* @return the fields
*/
public List<HealthDataField> getFields() {
return fields;
}
/**
* @param fields
* the fields to set
*/
public void setFields(final List<HealthDataField> fields) {
this.fields = fields;
}
/**
* @return the selectedFields
*/
public List<String> getSelectedFields() {
return selectedFields;
}
/**
* @param selectedFields
* the selectedFields to set
*/
public void setSelectedFields(final List<String> selectedFields) {
this.selectedFields = selectedFields;
}
/**
* @return the lineChartModel
*/
public CartesianChartModel getLineChartModel() {
return lineChartModel;
}
/**
* @param lineChartModel
* the lineChartModel to set
*/
public void setLineChartModel(final CartesianChartModel lineChartModel) {
this.lineChartModel = lineChartModel;
}
/**
* @return the renderChart
*/
public boolean isRenderChart() {
return renderChart;
}
/**
* @param renderChart
* the renderChart to set
*/
public void setRenderChart(final boolean renderChart) {
this.renderChart = renderChart;
}
}