package com.destinationradiodenver.mobileConsole.view;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.ejb.SessionContext;
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 com.destinationradiodenver.mobileStreaming.application.Streams;
import com.destinationradiodenver.mobileStreaming.web.entity.Encoder;
import com.destinationradiodenver.mobileStreaming.web.entity.Stream;
import com.destinationradiodenver.mobileStreaming.web.entity.Red5Server;
/**
* Backing bean for Stream entities.
* <p>
* This class provides CRUD functionality for all Stream entities. It focuses
* purely on Java EE 6 standards (e.g. <tt>@ConversationScoped</tt> for
* state management, <tt>PersistenceContext</tt> for persistence,
* <tt>CriteriaBuilder</tt> for searches) rather than introducing a CRUD framework or
* custom base class.
*/
@Named
@Stateful
@ConversationScoped
public class StreamBean implements Serializable
{
private static final long serialVersionUID = 1L;
/*
* Support creating and retrieving Stream entities
*/
private Long id;
public Long getId()
{
return this.id;
}
public void setId(Long id)
{
this.id = id;
}
private Stream stream;
public Stream getStream()
{
return this.stream;
}
public List<Encoder> getEncodersForStream(Long id){
TypedQuery<Encoder> tQ = entityManager.createQuery("select encoder from Encoder as encoder where encoder.stream.id is :id", Encoder.class)
.setParameter("id", id);
List<Encoder> list = tQ.getResultList();
if(list==null){
return new ArrayList<Encoder>();
}
return list;
}
@Inject
private Conversation conversation;
@Inject
private Streams streams;
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;
public boolean active;
public boolean isActive(){
return streams.contains(getStream());
}
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.stream = this.example;
}
else
{
this.stream = findById(getId());
}
}
public Stream findById(Long id)
{
return this.entityManager.find(Stream.class, id);
}
/*
* Support updating and deleting Stream entities
*/
public String update()
{
this.conversation.end();
try
{
if (this.id == null)
{
this.entityManager.persist(this.stream);
return "search?faces-redirect=true";
}
else
{
this.entityManager.merge(this.stream);
return "view?faces-redirect=true&id=" + this.stream.getId();
}
}
catch (Exception e)
{
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(e.getMessage()));
return null;
}
}
public String delete()
{
this.conversation.end();
try
{
this.entityManager.remove(findById(getId()));
this.entityManager.flush();
return "search?faces-redirect=true";
}
catch (Exception e)
{
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(e.getMessage()));
return null;
}
}
/*
* Support searching Stream entities with pagination
*/
private int page;
private long count;
private List<Stream> pageItems;
private Stream example = new Stream();
public int getPage()
{
return this.page;
}
public void setPage(int page)
{
this.page = page;
}
public int getPageSize()
{
return 10;
}
public Stream getExample()
{
return this.example;
}
public void setExample(Stream example)
{
this.example = example;
}
public void search()
{
this.page = 0;
}
public void paginate()
{
CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
// Populate this.count
CriteriaQuery<Long> countCriteria = builder.createQuery(Long.class);
Root<Stream> root = countCriteria.from(Stream.class);
countCriteria = countCriteria.select(builder.count(root)).where(getSearchPredicates(root));
this.count = this.entityManager.createQuery(countCriteria).getSingleResult();
// Populate this.pageItems
CriteriaQuery<Stream> criteria = builder.createQuery(Stream.class);
root = criteria.from(Stream.class);
TypedQuery<Stream> 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<Stream> root)
{
CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
List<Predicate> predicatesList = new ArrayList<Predicate>();
String friendlyName = this.example.getFriendlyName();
if (friendlyName != null && !"".equals(friendlyName))
{
predicatesList.add(builder.like(root.<String> get("friendlyName"), '%' + friendlyName + '%'));
}
String description = this.example.getDescription();
if (description != null && !"".equals(description))
{
predicatesList.add(builder.like(root.<String> get("description"), '%' + description + '%'));
}
String rtmpUri = this.example.getRtmpUri();
if (rtmpUri != null && !"".equals(rtmpUri))
{
predicatesList.add(builder.like(root.<String> get("rtmpUri"), '%' + rtmpUri + '%'));
}
Red5Server server = this.example.getServer();
if (server != null)
{
predicatesList.add(builder.equal(root.get("server"), server));
}
return predicatesList.toArray(new Predicate[predicatesList.size()]);
}
public List<Stream> getPageItems()
{
return this.pageItems;
}
public long getCount()
{
return this.count;
}
/*
* Support listing and POSTing back Stream entities (e.g. from inside an
* HtmlSelectOneMenu)
*/
public List<Stream> getAll()
{
CriteriaQuery<Stream> criteria = this.entityManager.getCriteriaBuilder().createQuery(Stream.class);
return this.entityManager.createQuery(criteria.select(criteria.from(Stream.class))).getResultList();
}
@Resource
private SessionContext sessionContext;
public Converter getConverter()
{
final StreamBean ejbProxy = this.sessionContext.getBusinessObject(StreamBean.class);
return new Converter()
{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value)
{
return ejbProxy.findById(Long.valueOf(value));
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value)
{
if (value == null)
{
return "";
}
return String.valueOf(((Stream) value).getId());
}
};
}
/*
* Support adding children to bidirectional, one-to-many tables
*/
private Stream add = new Stream();
public Stream getAdd()
{
return this.add;
}
public Stream getAdded()
{
Stream added = this.add;
this.add = new Stream();
return added;
}
}