package info.ozkan.vipera.views.healthdata; import info.ozkan.vipera.business.healthdata.HealthDataFieldFacade; import info.ozkan.vipera.business.healthdata.HealthDataFieldResult; import info.ozkan.vipera.entities.HealthDataField; import info.ozkan.vipera.jsf.FacesMessage2; import java.io.Serializable; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.inject.Inject; import javax.inject.Named; import org.springframework.context.annotation.Scope; /** * Hasta alanları ile ilgili işlemlerin yapılabildiği ekranın Bean sınıfı * * @author Ömer Özkan * */ @Named("healthDataFields") @Scope("session") public class HealthDataFieldsBean implements Serializable { /** * Serial */ private static final long serialVersionUID = 7947972699865779552L; /** * Limit tutarsız hata mesajı */ private static final String LIMIT_ERROR_MSG = "Alt limit üst limitten daha büyük olamaz! Lütfen kontrol ediniz!"; /** * Limit hatası */ private static final String LIMIT_ERROR = "Alt/Üst Limit Hatası"; /** * Silme işlemi başarılı mesaj detay deseni */ private static final String DELETING_SUCCESS_MSG_DETAIL_PATTERN = "%s silindi!"; /** * Silme işlemi başarılı mesajı */ private static final String DELETING_SUCCESS_MSG = "Silme işlemi başarılı!"; /** * Silme işlemi başarısız mesaj detay deseni */ private static final String DELETING_FAIL_MSG_DETAIL = "Silme işlemi gerçekleştirilemedi. Alan daha önce bir başkası tarafından silinmiş olabilir"; /** * Silme işlemi başarısız mesajı */ private static final String DELETING_FAIL_MSG = "Silme işlemi başarısız"; /** * ekleme başaırsız hata mesajı */ private static final String ADDING_FAIL_MSG = "Ekleme Başarısız!"; /** * Yeni alan eklendi detay mesajı deseni */ private static final String NEW_FIELD_ADDED_MSG_DETAIL_PATTERN = "%s sisteme eklendi!"; /** * yeni alan eklendi mesajı */ private static final String NEW_FIELD_ADDED_MSG = "Yeni alan eklendi!"; /** * alan adı benzersiz olmalıdır hata mesajı */ private static final String NON_UNIQUE_FIELD_NAME = "Alan adı benzersiz olmalıdır."; /** * güncelleme başarısız hata emsajı */ private static final String UPDATE_UNSUCCESS_MSG = "Güncelleme Başarısız!"; /** * güncelelme başarılı mesaj detayı deseni */ private static final String UPDATE_SUCCESS_MSG_DETAIL_PATTERN = "%s güncellendi!"; /** * Güncelleme başarılı hata mesajı */ private static final String UPDATE_SUCCESS_MSG = "Güncelleme Başarılı!"; /** * Güncelenecek alanın klonu */ private HealthDataField updatedFieldClone; /** * Seçilen alan */ private HealthDataField selectedField; /** * Yeni alan (eklenecek olan alan) */ private HealthDataField newField = new HealthDataField(); /** * Primefaces tarafından zorunlu kılınan interface'in implementasyonu model * sınıfı */ private HealthDataFieldModel model; /** * İşletme katmanı */ @Inject private HealthDataFieldFacade healthDataFieldFacade; /** * Verilerin yüklenmesini sağlar */ public void loadData() { if (model == null) { initializeModel(); } } /** * model nesnesini ilklendirir */ private void initializeModel() { final HealthDataFieldResult result = healthDataFieldFacade.getFields(); final List<HealthDataField> dataList = result.getHealthDataFields(); model = new HealthDataFieldModel(createMapFromList(dataList), dataList); } /** * Bir liste den map türetir * * @param list * @return */ private Map<String, HealthDataField> createMapFromList( final List<HealthDataField> list) { final Map<String, HealthDataField> fields = new HashMap<String, HealthDataField>(); for (int i = 0; i < list.size(); i++) { final HealthDataField field = list.get(i); fields.put(field.getName(), field); } return fields; } /** * Güncelleme işlemi yapar */ public void update() { final FacesContext context = FacesContext.getCurrentInstance(); final HealthDataField field = updatedFieldClone; final boolean updateField = checkLimits(field, context); if (updateField) { updateField(context); } } /** * Alanın güncel halini sisteme kaydeder * * @param context */ private void updateField(final FacesContext context) { selectedField = updatedFieldClone; final HealthDataFieldResult result = healthDataFieldFacade.update(selectedField); if (result.isSuccess()) { final String detail = String.format(UPDATE_SUCCESS_MSG_DETAIL_PATTERN, getSelectedField().getTitle()); createInfoMessage(context, UPDATE_SUCCESS_MSG, detail); initializeModel(); } else { createErrorMessage(context, UPDATE_UNSUCCESS_MSG, NON_UNIQUE_FIELD_NAME); } } /** * Alt limitin üst limitten küçük olup olmadığın kontrol eder * * @param field * @param context * @return */ private boolean checkLimits(final HealthDataField field, final FacesContext context) { boolean isValid = true; final Double upperLimit = field.getUpperLimit(); final Double lowerLimit = field.getLowerLimit(); if (upperLimit.compareTo(lowerLimit) < 0) { createErrorMessage(context, LIMIT_ERROR, LIMIT_ERROR_MSG); isValid = false; } return isValid; } /** * Yeni bir alan ekleme kaydet butonu */ public void addNew() { final FacesContext context = FacesContext.getCurrentInstance(); final boolean addNew = checkLimits(newField, context); if (addNew) { addField(context); } } /** * Veritabanına yeni bir alan ekler * * @param context */ private void addField(final FacesContext context) { final HealthDataFieldResult result = healthDataFieldFacade.add(newField); if (result.isSuccess()) { final String detail = String.format(NEW_FIELD_ADDED_MSG_DETAIL_PATTERN, newField.getTitle()); createInfoMessage(context, NEW_FIELD_ADDED_MSG, detail); updateFieldsForScreen(); } else { createErrorMessage(context, ADDING_FAIL_MSG, NON_UNIQUE_FIELD_NAME); } } /** * Silme işlemi gerçekleştirir */ public void delete() { final FacesContext context = FacesContext.getCurrentInstance(); final HealthDataFieldResult result = healthDataFieldFacade.remove(updatedFieldClone); if (result.isSuccess()) { final String detail = String.format(DELETING_SUCCESS_MSG_DETAIL_PATTERN, updatedFieldClone.getTitle()); createInfoMessage(context, DELETING_SUCCESS_MSG, detail); updateFieldsForScreen(); } else { createErrorMessage(context, DELETING_FAIL_MSG, DELETING_FAIL_MSG_DETAIL); } } /** * Hata mesajı oluşturur * * @param context * context * @param summary * özet * @param detail * detay */ private void createErrorMessage(final FacesContext context, final String summary, final String detail) { context.addMessage(null, new FacesMessage2(FacesMessage.SEVERITY_ERROR, summary, detail)); } /** * Info mesajı oluşturur * * @param context * context * @param summary * özet * @param detail * detay */ private void createInfoMessage(final FacesContext context, final String summary, final String detail) { context.addMessage(null, new FacesMessage2(FacesMessage.SEVERITY_INFO, summary, detail)); } /** * model sınıfını yeniler */ private void updateFieldsForScreen() { initializeModel(); newField = new HealthDataField(); updatedFieldClone = new HealthDataField(); } /** * @return the model */ public HealthDataFieldModel getModel() { return model; } /** * @param healthDataFieldFacade * the healthDataFieldFacade to set */ public void setHealthDataFieldFacade( final HealthDataFieldFacade healthDataFieldFacade) { this.healthDataFieldFacade = healthDataFieldFacade; } /** * @return the newField */ public HealthDataField getNewField() { return newField; } /** * @param newField * the newField to set */ public void setNewField(final HealthDataField newField) { this.newField = newField; } /** * @return the selectedField */ public HealthDataField getSelectedField() { return updatedFieldClone; } /** * @param selectedField * the selectedField to set */ public void setSelectedField(final HealthDataField selectedField) { this.selectedField = selectedField; try { updatedFieldClone = (HealthDataField) selectedField.clone(); } catch (final CloneNotSupportedException e) { // never throw new AssertionError(e); } } }