package javaone.con3638.pfscaffolding.jsfs; import javaone.con3638.pfscaffolding.sbs.AbstractFacade; import javaone.con3638.pfscaffolding.jsfs.util.JsfUtil; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.faces.event.ActionEvent; import java.util.ResourceBundle; import javax.ejb.EJBException; /** * Represents an abstract shell of to be used as JSF Controller to be used in AJAX-enabled applications. No outcomes * will be generated from its methods since handling is designed to be done inside one page. */ public abstract class AbstractController<T> { private AbstractFacade<T> ejbFacade; private Class<T> itemClass; private T selected; private List<T> items; private enum PersistAction { CREATE, DELETE, UPDATE } public AbstractController() { } public AbstractController(Class<T> itemClass) { this.itemClass = itemClass; } protected AbstractFacade<T> getFacade() { return ejbFacade; } protected void setFacade(AbstractFacade<T> ejbFacade) { this.ejbFacade = ejbFacade; } public T getSelected() { return selected; } public void setSelected(T selected) { this.selected = selected; } protected void setEmbeddableKeys() { // Nothing to do if entity does not have any embeddable key. } ; protected void initializeEmbeddableKey() { // Nothing to do if entity does not have any embeddable key. } /** * Returns all items in a List object * * @return */ public List<T> getItems() { if (items == null) { items = this.ejbFacade.findAll(); } return items; } public void save(ActionEvent event) { String msg = ResourceBundle.getBundle("/MyBundle").getString(itemClass.getSimpleName() + "Updated"); persist(PersistAction.UPDATE, msg); } public void saveNew(ActionEvent event) { String msg = ResourceBundle.getBundle("/MyBundle").getString(itemClass.getSimpleName() + "Created"); persist(PersistAction.CREATE, msg); if (!isValidationFailed()) { items = null; // Invalidate list of items to trigger re-query. } } public void delete(ActionEvent event) { String msg = ResourceBundle.getBundle("/MyBundle").getString(itemClass.getSimpleName() + "Deleted"); persist(PersistAction.DELETE, msg); if (!isValidationFailed()) { selected = null; // Remove selection items = null; // Invalidate list of items to trigger re-query. } } private void persist(PersistAction persistAction, String successMessage) { if (selected != null) { this.setEmbeddableKeys(); try { if (persistAction != PersistAction.DELETE) { this.ejbFacade.edit(selected); } else { this.ejbFacade.remove(selected); } JsfUtil.addSuccessMessage(successMessage); } catch (EJBException ex) { String msg = ""; Throwable cause = JsfUtil.getRootCause(ex.getCause()); if (cause != null) { msg = cause.getLocalizedMessage(); } if (msg.length() > 0) { JsfUtil.addErrorMessage(msg); } else { JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/MyBundle").getString("PersistenceErrorOccured")); } } catch (Exception ex) { Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex); JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/MyBundle").getString("PersistenceErrorOccured")); } } } /** * Creates a new instance of an underlying entity and assigns it to Selected property. * * @return */ public T prepareCreate(ActionEvent event) { T newItem; try { newItem = itemClass.newInstance(); this.selected = newItem; initializeEmbeddableKey(); return newItem; } catch (InstantiationException ex) { Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex); } return null; } public boolean isValidationFailed() { return JsfUtil.isValidationFailed(); } }