package info.ozkan.vipera.views.administrator;
import info.ozkan.vipera.business.administrator.AdministratorFacade;
import info.ozkan.vipera.business.administrator.AdministratorManagerResult;
import info.ozkan.vipera.common.EmailValidator;
import info.ozkan.vipera.entities.Administrator;
import info.ozkan.vipera.entities.Authorize;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
/**
* Yöneticiler ekranı
*
* @author Ömer Özkan
*
*/
@Named("administrators")
@Scope("session")
public class AdministratorsBean implements Serializable {
/**
* Hesap silme mesajı deseni
*/
private static final String DELETING_SUCCESS_MSG_PATTERN =
"%s sistemden silinmiştir!";
/**
* Silme başarılı
*/
private static final String DELETING_SUCCESS = "Silme başarılı!";
/**
* silme başarısız mesajı
*/
private static final String DELETING_FAIL_MESSAGE =
"Yöneticiler kendilerini silemezler lütfen başka bir yönetici ile silme işlemi yapınız!";
/**
* silme başarısız
*/
private static final String DELETING_FAIL = "Silme başarısız!";
/**
* ekleme başarısız mesajı
*/
private static final String ADDING_FAIL_DETAIL =
"Yönetici eklenemedi lütfen kullanıcı adı ve eposta alanlarının benzersiz olduğundan emin olun!";
/**
* ekleme başarısız
*/
private static final String ADDING_FAIL = "Yönetici ekleme başarısız!";
/**
* ekleme başarılı mesaj deseni
*/
private static final String ADDING_SUCCESS_DETAIL_PATTERN =
"Yeni yönetici %s (%s) sisteme eklenmiştir!";
/**
* ekleme başarılı
*/
private static final String ADDING_SUCCESS = "Ekleme başarılı!";
/**
* Güncelleme başarılı
*/
private static final String UPDATE_SUCCESS = "Güncelleme başarılı!";
/**
* güncelleme başarısız mesajı
*/
private static final String UPDATE_FAIL_DETAIL =
"Kullanıcı adı ve eposta alanları benzersiz olmalıdır. Lütfen kontrol ediniz!";
/**
* güncelleme başarısız
*/
private static final String UPDATE_FAIL = "Güncelleme başarısız!";
/**
* eposta geçersiz mesaji
*/
private static final String EMAIL_INVALID_DETAIL =
"Lütfen girdiğiniz eposta adresini kontrol edin!";
/**
* eposta adresi geçersiz
*/
private static final String EMAIL_INVALID = "Eposta adresi geçersiz!";
/**
* Logger
*/
private static final Logger LOGGER = LoggerFactory
.getLogger(AdministratorsBean.class);
/**
* Serial
*/
private static final long serialVersionUID = 7128479501306753780L;
/**
* Yeni eklenecek yönetici
*/
private Administrator newAdministrator = new Administrator();
/**
* Veri modeli
*/
private AdministratorModel model;
/**
* Seçilen yönetici
*/
private Administrator selectedAdmin;
/**
* Parola
*/
private String password;
/**
* parola tekrarı
*/
private String password2;
/**
* Üye aktifliği
*/
private boolean enabled;
/**
* Yeni yöneticinin üyelik aktifliği
*/
private boolean newAdminAuth = true;
/**
* business object
*/
@Inject
private AdministratorFacade administratorFacade;
/**
* Facescontext
*/
private FacesContext context;
/**
* Yöneticileri sistemden yükler
*/
public void loadData() {
if (model == null) {
initializeModel();
}
}
/**
* Güncelleme işlemi
*/
public void update() {
context = FacesContext.getCurrentInstance();
setPasswordForUpdate();
setAuthorizationForUpdate();
final boolean updateAdmin = checkEmailForUpdate();
if (updateAdmin) {
updateAdmin();
}
initializeModel();
}
/**
* ekleme işlemi
*/
public void add() {
context = FacesContext.getCurrentInstance();
setAuthorizationForAdding();
final boolean addAdmin = checkNewAdminEmail();
if (addAdmin) {
addNewAdmin();
}
initializeModel();
}
/**
* silme işlemi
*/
public void delete() {
context = FacesContext.getCurrentInstance();
final Administrator currentUser = AdminSessionBean.getAdministrator();
if (selectedAdmin.equals(currentUser)) {
createErrorMessage(DELETING_FAIL, DELETING_FAIL_MESSAGE);
} else {
deleteAdministrator(currentUser);
}
}
/**
* yönetici siler
*
* @param currentUser
*/
private void deleteAdministrator(final Administrator currentUser) {
administratorFacade.delete(selectedAdmin);
final String detail =
String.format(DELETING_SUCCESS_MSG_PATTERN,
selectedAdmin.getUsername());
createSuccessMessage(DELETING_SUCCESS, detail);
LOGGER.info("The admin {} has been deleted by {}!", selectedAdmin,
currentUser);
initializeModel();
}
/**
* yeni bir yönetici ekler
*/
private void addNewAdmin() {
final AdministratorManagerResult result =
administratorFacade.add(newAdministrator);
if (result.isSuccess()) {
final String detail =
String.format(ADDING_SUCCESS_DETAIL_PATTERN,
newAdministrator.getUsername(),
newAdministrator.getName());
createSuccessMessage(ADDING_SUCCESS, detail);
LOGGER.info("The new administrator {} has added to system!",
newAdministrator);
newAdministrator = new Administrator();
newAdminAuth = true;
} else {
createErrorMessage(ADDING_FAIL, ADDING_FAIL_DETAIL);
}
}
/**
* yeni yöneticinin eposta adresini kontrol eder
*
* @return
*/
private boolean checkNewAdminEmail() {
boolean addAdmin = true;
if (!emailValid(newAdministrator.getEmail())) {
addAdmin = false;
createErrorMessage(EMAIL_INVALID, EMAIL_INVALID_DETAIL);
}
return addAdmin;
}
/**
* yeni yöneticinin hesap aktifliğini tanımlar
*/
private void setAuthorizationForAdding() {
if (newAdminAuth) {
newAdministrator.setEnabled(Authorize.ENABLE);
} else {
newAdministrator.setEnabled(Authorize.DISABLE);
}
}
/**
* yöneticiyi günceller
*/
private void updateAdmin() {
final AdministratorManagerResult result =
administratorFacade.update(selectedAdmin);
if (result.isSuccess()) {
createSuccessMessage(UPDATE_SUCCESS, UPDATE_SUCCESS);
LOGGER.info("The administrator {} has been updated!", selectedAdmin);
} else {
createErrorMessage(UPDATE_FAIL, UPDATE_FAIL_DETAIL);
}
}
/**
* güncelleme işlemi için eposta adresini kontrol eder
*
* @return
*/
private boolean checkEmailForUpdate() {
boolean updateAdmin = true;
context = FacesContext.getCurrentInstance();
if (!emailValid(selectedAdmin.getEmail())) {
updateAdmin = false;
createErrorMessage(EMAIL_INVALID, EMAIL_INVALID_DETAIL);
}
return updateAdmin;
}
/**
* güncellenecek yöneticinin hesap aktivitesini tanımlar
*/
private void setAuthorizationForUpdate() {
if (enabled) {
selectedAdmin.setEnabled(Authorize.ENABLE);
} else {
selectedAdmin.setEnabled(Authorize.DISABLE);
}
}
/**
* güncellenecek yöneticinin parolasını tanımlar
*/
private void setPasswordForUpdate() {
if (!password.isEmpty()) {
selectedAdmin.setPassword(password);
}
}
/**
* @return the model
*/
public AdministratorModel getModel() {
return model;
}
/**
* @param model
* the model to set
*/
public void setModel(final AdministratorModel model) {
this.model = model;
}
/**
* @return the selectedAdmin
*/
public Administrator getSelectedAdmin() {
return selectedAdmin;
}
/**
* @param selectedAdmin
* the selectedAdmin to set
*/
public void setSelectedAdmin(final Administrator selectedAdmin) {
this.selectedAdmin = selectedAdmin;
final Authorize authorize = selectedAdmin.getEnabled();
this.enabled = authorize.equals(Authorize.ENABLE) ? true : false;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param password
* the password to set
*/
public void setPassword(final String password) {
this.password = password;
}
/**
* @return the password2
*/
public String getPassword2() {
return password2;
}
/**
* @param password2
* the password2 to set
*/
public void setPassword2(final String password2) {
this.password2 = password2;
}
/**
* @return the enabled
*/
public boolean isEnabled() {
return enabled;
}
/**
* @param enabled
* the enabled to set
*/
public void setEnabled(final boolean enabled) {
this.enabled = enabled;
}
/**
* @return the newAdminAuth
*/
public boolean isNewAdminAuth() {
return newAdminAuth;
}
/**
* @param newAdminAuth
* the newAdminAuth to set
*/
public void setNewAdminAuth(final boolean newAdminAuth) {
this.newAdminAuth = newAdminAuth;
}
/**
* @return the newAdministrator
*/
public Administrator getNewAdministrator() {
return newAdministrator;
}
/**
* Modeli ilklendirir
*/
private void initializeModel() {
final AdministratorManagerResult result = administratorFacade.getAll();
final List<Administrator> dataList = result.getAdministrators();
model = new AdministratorModel(createMapFromList(dataList), dataList);
}
/**
* Model için Listeden Map üretir
*
* @param dataList
* @return
*/
private Map<Long, Administrator> createMapFromList(
final List<Administrator> dataList) {
final Map<Long, Administrator> map = new HashMap<Long, Administrator>();
for (final Administrator admin : dataList) {
map.put(admin.getId(), admin);
}
return map;
}
/**
* bilgi mesajı üretir
*
* @param summary
* @param detail
*/
private void
createSuccessMessage(final String summary, final String detail) {
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
summary, detail));
}
/**
* hata mesajı üretir
*
* @param summary
* @param detail
*/
private void createErrorMessage(final String summary, final String detail) {
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
summary, detail));
}
/**
* eposta adresinin geçerliliğini kontrol eder
*
* @param email
* @return
*/
private boolean emailValid(final String email) {
return EmailValidator.isValid(email);
}
}