package hirondelle.fish.main.search;
import static hirondelle.web4j.database.DynamicSql.AND;
import static hirondelle.web4j.database.DynamicSql.DESC;
import static hirondelle.web4j.database.DynamicSql.WHERE;
import static hirondelle.web4j.util.Consts.NEW_LINE;
import hirondelle.fish.main.resto.Resto;
import hirondelle.web4j.action.ActionTemplateSearch;
import hirondelle.web4j.action.ResponsePage;
import hirondelle.web4j.database.Db;
import hirondelle.web4j.database.DynamicSql;
import hirondelle.web4j.database.SqlId;
import hirondelle.web4j.model.AppException;
import hirondelle.web4j.model.ModelCtorException;
import hirondelle.web4j.model.ModelFromRequest;
import hirondelle.web4j.request.RequestParameter;
import hirondelle.web4j.request.RequestParser;
import hirondelle.web4j.util.Util;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
public final class RestoSearchAction extends ActionTemplateSearch {
public RestoSearchAction(RequestParser aRequestParser){
super(FORWARD, aRequestParser);
}
public static final RequestParameter STARTS_WITH = RequestParameter.withLengthCheck("Starts With");
public static final RequestParameter REVERSE_SORT = RequestParameter.withRegexCheck("Reverse Sort", "(true)");
public static final RequestParameter MIN_PRICE = RequestParameter.withLengthCheck("Minimum Price");
public static final RequestParameter MAX_PRICE = RequestParameter.withLengthCheck("Maximum Price");
public static final RequestParameter ORDER_BY = RequestParameter.withLengthCheck("Order By");
public static final SqlId RESTO_DYNAMIC_SEARCH = new SqlId("RESTO_DYNAMIC_SEARCH");
protected void validateUserInput() throws AppException {
try {
ModelFromRequest builder = new ModelFromRequest(getRequestParser());
fCriteria = builder.build(RestoSearchCriteria.class, STARTS_WITH, MIN_PRICE, MAX_PRICE, ORDER_BY, REVERSE_SORT);
}
catch (ModelCtorException ex){
addError(ex);
}
}
protected void listSearchResults() throws AppException {
List restos = Db.search(Resto.class, RESTO_DYNAMIC_SEARCH, getCriteria(), getParams());
if ( restos.isEmpty() ){
addMessage("No Results.");
}
else {
addToRequest(ITEMS_FOR_LISTING, restos);
}
}
private static final ResponsePage FORWARD = new ResponsePage("Search", "view.jsp", RestoSearchAction.class);
private RestoSearchCriteria fCriteria;
private static final String NAME_LIKE = "Name Like ?" + NEW_LINE;
private static final String PRICE_RANGE = "Price >= ? AND Price <= ?" + NEW_LINE;
private static final Logger fLogger = Util.getLogger(RestoSearchAction.class);
private DynamicSql getCriteria() throws ModelCtorException {
StringBuilder result = new StringBuilder(WHERE + NEW_LINE);
boolean hasAddedFirstCriterion = false;
if( Util.textHasContent(fCriteria.getStartsWith()) ) {
result.append(NAME_LIKE);
hasAddedFirstCriterion = true;
}
if( fCriteria.getMinPrice() != null ){
if( hasAddedFirstCriterion ){
result.append(AND);
}
result.append(PRICE_RANGE);
}
result.append(DynamicSql.ORDER_BY + fCriteria.getOrderBy());
if (fCriteria.isReverseOrder()) {
result.append(DESC);
}
fLogger.fine("Dynamic SQL criteria: " + result);
return new DynamicSql(result);
}
private Object[] getParams(){
List<Object> result = new ArrayList<Object>();
if( Util.textHasContent(fCriteria.getStartsWith()) ){
result.add(fCriteria.getStartsWith());
}
if ( fCriteria.getMinPrice() != null ) {
result.add( fCriteria.getMinPrice() );
result.add( fCriteria.getMaxPrice() );
}
return result.toArray();
}
}