package org.jboss.tools.example.forgeable3.view; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.ejb.Stateful; import javax.enterprise.context.Conversation; import javax.enterprise.context.ConversationScoped; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import javax.inject.Inject; import javax.inject.Named; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContextType; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import org.jboss.tools.example.forgeable3.model.Actor; /** * Backing bean for Actor entities. *

* This class provides CRUD functionality for all Actor entities. It focuses * purely on Java EE 6 standards (e.g. @ConversationScoped for * state management, PersistenceContext for persistence, * CriteriaBuilder for searches) rather than introducing a CRUD framework or * custom base class. */ @Named @Stateful @ConversationScoped public class ActorBean implements Serializable { private static final long serialVersionUID = 1L; /* * Support creating and retrieving Actor entities */ private Long id; public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } private Actor actor; public Actor getActor() { return this.actor; } @Inject private Conversation conversation; @PersistenceContext(type = PersistenceContextType.EXTENDED) private EntityManager entityManager; public String create() { this.conversation.begin(); return "create?faces-redirect=true"; } public void retrieve() { if (FacesContext.getCurrentInstance().isPostback()) { return; } if (this.conversation.isTransient()) { this.conversation.begin(); } if (this.id == null) { this.actor = this.search; } else { this.actor = this.entityManager.find(Actor.class, getId()); } } /* * Support updating and deleting Actor entities */ public String update() { this.conversation.end(); try { if (this.id == null) { this.entityManager.persist(this.actor); return "search?faces-redirect=true"; } else { this.entityManager.merge(this.actor); return "view?faces-redirect=true&id=" + this.actor.getId(); } } catch( Exception e ) { FacesContext.getCurrentInstance().addMessage(null, new FacesMessage( e.getMessage() )); return null; } } public String delete() { this.conversation.end(); try { this.entityManager.remove(this.entityManager.find(Actor.class, getId())); this.entityManager.flush(); return "search?faces-redirect=true"; } catch( Exception e ) { FacesContext.getCurrentInstance().addMessage(null, new FacesMessage( e.getMessage() )); return null; } } /* * Support searching Actor entities with pagination */ private int page; private long count; private List pageItems; private Actor search = new Actor(); public int getPage() { return this.page; } public void setPage(int page) { this.page = page; } public int getPageSize() { return 10; } public Actor getSearch() { return this.search; } public void setSearch(Actor search) { this.search = search; } public void search() { this.page = 0; } public void paginate() { CriteriaBuilder builder = this.entityManager.getCriteriaBuilder(); // Populate this.count CriteriaQuery countCriteria = builder.createQuery(Long.class); Root root = countCriteria.from(Actor.class); countCriteria = countCriteria.select(builder.count(root)).where( getSearchPredicates(root)); this.count = this.entityManager.createQuery(countCriteria) .getSingleResult(); // Populate this.pageItems CriteriaQuery criteria = builder.createQuery(Actor.class); root = criteria.from(Actor.class); TypedQuery query = this.entityManager.createQuery(criteria .select(root).where(getSearchPredicates(root))); query.setFirstResult(this.page * getPageSize()).setMaxResults( getPageSize()); this.pageItems = query.getResultList(); } private Predicate[] getSearchPredicates(Root root) { CriteriaBuilder builder = this.entityManager.getCriteriaBuilder(); List predicatesList = new ArrayList(); String firstName = this.search.getFirstName(); if (firstName != null && !"".equals(firstName)) { predicatesList.add(builder.like(root.get("firstName"), '%' + firstName + '%')); } String lastName = this.search.getLastName(); if (lastName != null && !"".equals(lastName)) { predicatesList.add(builder.like(root.get("lastName"), '%' + lastName + '%')); } return predicatesList.toArray(new Predicate[predicatesList.size()]); } public List getPageItems() { return this.pageItems; } public long getCount() { return this.count; } /* * Support listing and POSTing back Actor entities (e.g. from inside an * HtmlSelectOneMenu) */ public List getAll() { CriteriaQuery criteria = this.entityManager .getCriteriaBuilder().createQuery(Actor.class); return this.entityManager.createQuery( criteria.select(criteria.from(Actor.class))).getResultList(); } public Converter getConverter() { return new Converter() { @Override public Object getAsObject(FacesContext context, UIComponent component, String value) { return ActorBean.this.entityManager.find(Actor.class, Long.valueOf(value)); } @Override public String getAsString(FacesContext context, UIComponent component, Object value) { if (value == null) { return ""; } return String.valueOf(((Actor) value).getId()); } }; } /* * Support adding children to bidirectional, one-to-many tables */ private Actor add = new Actor(); public Actor getAdd() { return this.add; } public Actor getAdded() { Actor added = this.add; this.add = new Actor(); return added; } }