/** * */ package org.appfuse.webapp.client.application.base.place; import java.util.logging.Logger; import org.appfuse.webapp.client.application.ApplicationProxyFactory; import com.google.gwt.place.shared.Place; import com.google.gwt.place.shared.PlaceTokenizer; import com.google.gwt.place.shared.Prefix; import com.google.web.bindery.requestfactory.shared.EntityProxy; import com.google.web.bindery.requestfactory.shared.RequestFactory; /** * @author ivangsa * */ public class EntitySearchPlace extends Place { private static final String PREFIX = "l"; private final Class<? extends EntityProxy> proxyClass; private Object searchCriteria; private int firstResult = 0; private int maxResults = 25; /** * @param proxyType */ public EntitySearchPlace(Class<? extends EntityProxy> proxyClass) { this.proxyClass = proxyClass; this.searchCriteria = null; } /** * @param proxyType * @param searchCriteria */ public EntitySearchPlace(Class<? extends EntityProxy> proxyClass, Object searchCriteria) { super(); this.proxyClass = proxyClass; this.searchCriteria = searchCriteria; } /** * @param proxyClass * @param searchCriteria * @param firstResult * @param maxResults */ public EntitySearchPlace(Class<? extends EntityProxy> proxyClass, int firstResult, int maxResults, Object searchCriteria) { super(); this.proxyClass = proxyClass; this.firstResult = firstResult; this.maxResults = maxResults; this.searchCriteria = searchCriteria; } public Class<? extends EntityProxy> getProxyClass() { return proxyClass; } public Object getSearchCriteria() { return searchCriteria; } public int getFirstResult() { return firstResult; } public void setSearchCriteria(Object searchCriteria) { this.searchCriteria = searchCriteria; } public void setFirstResult(int firstResult) { this.firstResult = firstResult; } public int getMaxResults() { return maxResults; } public void setMaxResults(int maxResults) { this.maxResults = maxResults; } /** * Tokenizer. */ @Prefix(PREFIX) public static class Tokenizer implements PlaceTokenizer<EntitySearchPlace> { protected final Logger logger = Logger.getLogger(getClass().getName()); private static final String SEPARATOR = "!"; private final ApplicationProxyFactory proxyFactory; private final RequestFactory requests; /** * @param proxyFactory */ public Tokenizer(ApplicationProxyFactory proxyFactory, RequestFactory requests) { super(); this.proxyFactory = proxyFactory; this.requests = requests; } public EntitySearchPlace getPlace(String token) { logger.fine("Slicing token: " + token); String tokens[] = token.split(SEPARATOR); Class<? extends EntityProxy> proxyType = requests.getProxyClass(tokens[0]); Object searchCriteria = null; int firstResult = 0; int maxResults = 0; if (tokens.length > 2) { firstResult = parseInt(tokens[1]); maxResults = parseInt(tokens[2]); } if (tokens.length > 3) { Class<? extends Object> searchCriteriaClass = proxyFactory.getSearchCriteriaTypeForProxy(proxyType); searchCriteria = proxyFactory.deserialize(searchCriteriaClass, tokens[3]); } return new EntitySearchPlace(proxyType, firstResult, maxResults, searchCriteria); } public String getToken(EntitySearchPlace place) { StringBuilder sb = new StringBuilder(); sb.append(requests.getHistoryToken(place.getProxyClass())); sb.append(SEPARATOR); sb.append(place.getFirstResult()); sb.append(SEPARATOR); sb.append(place.getMaxResults()); if (place.getSearchCriteria() != null) { sb.append(SEPARATOR); sb.append(proxyFactory.serialize(place.getSearchCriteria())); } return sb.toString(); } public String getFullHistoryToken(EntitySearchPlace place) { return PREFIX + ":" + getToken(place); } private int parseInt(String text) { try { return Integer.parseInt(text); } catch (NumberFormatException e) { return 0; } } } }