//$Id: HotelSearchingAction.java,v 1.20 2007/06/27 00:06:49 gavin Exp $
package org.jboss.seam.example.booking;
import java.util.List;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.security.Restrict;
@Stateful
@Name("hotelSearch")
@Scope(ScopeType.SESSION)
@Restrict("#{identity.loggedIn}")
public class HotelSearchingAction implements HotelSearching
{
@PersistenceContext
private EntityManager em;
private String searchString;
private int pageSize = 10;
private int page=0;
@DataModel
private List<Hotel> hotels;
public void find()
{
page = 0;
queryHotels();
}
public void nextPage()
{
page++;
queryHotels();
}
private void queryHotels()
{
hotels = em.createQuery("select h from Hotel h where lower(h.name) like :search or lower(h.city) like :search or lower(h.zip) like :search or lower(h.address) like :search")
.setParameter( "search", getSearchPattern() )
.setMaxResults(pageSize)
.setFirstResult( page * pageSize )
.getResultList();
}
private String getSearchPattern()
{
return searchString==null ? "%" : searchString.toLowerCase().replace('*', '%') + '%';
}
public boolean isNextPageAvailable()
{
return hotels!=null && hotels.size()==pageSize;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public String getSearchString()
{
return searchString;
}
public void setSearchString(String searchString)
{
this.searchString = searchString;
}
public void handleSearchStringChange(ValueChangeEvent e) {
page = 0;
setSearchString( (String) e.getNewValue() );
queryHotels();
}
public List<SelectItem> getCities() {
return em.createQuery("select distinct new javax.faces.model.SelectItem(h.city) from Hotel h where lower(h.city) like :search order by h.city")
.setParameter("search", getSearchPattern())
.getResultList();
}
public void handlePageSizeChange(ValueChangeEvent e) {
page=0;
setPageSize( (Integer) e.getNewValue() );
queryHotels();
}
@Remove
public void destroy() {}
}