public class EntityLinkTransformer implements PageRenderLinkTransformer{ @Override public PageRenderRequestParameters decodePageRenderRequest(Request request) { if(StringUtils.isNotEmpty(request.getPath())) { CachedCategory category; Product product; if ((category = cache.getCategory(request.getPath())) != null) { if(StringUtil.isNotEmpty(category.getTemplate())){ return new PageRenderRequestParameters(category.getTemplate(), new EmptyEventContext(), false); } return new PageRenderRequestParameters("CategoryPage", new CategoryEvent(category, elasticSearchService.search(category, request)), false); } else if ((product = catalogService.findProductByURI(request.getPath())) != null) { return new PageRenderRequestParameters("ProductPage", new ProductEvent(product), false); } else if("/search".equals(request.getPath())){ String q = request.getParameter("q"); return new PageRenderRequestParameters("SearchPage", new SearchEvent(q, elasticSearchService.search(q, request)), false); } } return null; }
public class CategoryPage extends BaseCatalogPage { private CachedCategory category; @Inject private Request request; Object onActivate(EventContext eventContext) { if(eventContext instanceof CategoryEvent) { CategoryEvent event = (CategoryEvent) eventContext; category = event.getCachedCategory(); setSearchRequestFuture(event.getSearchRequest()); } return null; } public abstract class BaseCatalogPage { private static final SearchRequest NULL_REQUEST = new SearchRequest(){ @Override public Map<String, String> getSortModel() { return Collections.emptyMap(); } }; protected static final Future<SearchRequest> NULL_FUTURE_REQUEST = new Future<SearchRequest>() { @Override public boolean cancel(boolean mayInterruptIfRunning) { return false; } @Override public boolean isCancelled() { return false; } @Override public boolean isDone() { return true; } @Override public SearchRequest get() throws InterruptedException, ExecutionException { return NULL_REQUEST; } @Override public SearchRequest get(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return NULL_REQUEST; } }; @ActivationRequestParameter private int page; @ActivationRequestParameter private String direction; @ActivationRequestParameter private String sort; private CachedProduct[] products; private Future<SearchRequest> searchRequestFuture = NULL_FUTURE_REQUEST; public class FacetFilter { public void onFilter(@RequestParameter(value = "direction", allowBlank = true) String direction, @RequestParameter(value = "sort", allowBlank = true) String sort, @RequestParameter(value = "q", allowBlank = true) String q, @RequestParameter("uri") String uri) throws IOException { Request request = this.request; if (StringUtils.isNotEmpty(uri)) { StringBuilder sb = new StringBuilder(uri).append('?'); SortOrder order = SortOrder.ASC.name().equals(direction) ? SortOrder.ASC : SortOrder.DESC; MutableBoolean addSort = new MutableBoolean(false); Category category; if("/search".equals(uri)) { sb.append("q").append('=').append(q).append('&'); for(SearchFacet searchFacet : searchFacetDao.readAllSearchFacets()){ build(request, sb, sort, addSort, searchFacet); } redirect(request, response, sb, sort, order, addSort); } else if ((category = catalogService.findCategoryByURI(uri)) != null) { for(CategorySearchFacet categorySearchFacet : category.getSearchFacets()){ build(request, sb, sort, addSort, categorySearchFacet.getSearchFacet()); } redirect(request, response, sb, sort, order, addSort); } } } private void redirect(Request request, Response response, StringBuilder sb, String sort, SortOrder order, MutableBoolean addSort) throws IOException { String page; if((page = request.getParameter("page")) != null){ sb.append("page").append('=').append(page).append('&'); } if(addSort.getValue() || "fullName".equals(sort)){ sb.append("sort").append('=').append(sort).append('&').append("direction").append('=').append(order.name()); } else { sb.deleteCharAt(sb.length() - 1); } response.sendRedirect(sb.toString()); } When the the Request is Posted it is looking for properties on the FacetFilter that are only relevant if it were to render an html result -----Original Message----- From: Thiago H de Paula Figueiredo <thiag...@gmail.com> To: Tapestry users <users@tapestry.apache.org> Sent: Tue, Sep 27, 2016 9:12 am Subject: Re: Problem with POST requests Hi! Could you please post the code of your component and the page? I'm having a hard time understanding your scenario from your description. Are you using a component or page as code that will upload something to ElasticSearch when it is requested but not sending any response back to the browser? On Sun, 25 Sep 2016 09:56:24 -0300, <rapidtransit...@aol.com> wrote: > I'm using Elasticsearch, my first implementation involved processing a > user request (verifying that there facet filters are valid) in the > request chain and then sending a redirect short circuiting the request > pipeline. Now here's the problem. I moved the processing into a > component to make it more modular and way less fragile. The problem is > the actual search/facet filter happens during the GET request and it is > injected into the EventContext and when they hit the page the request > result is assigned in the onActivate event. The problem is on the POST > request the page components are still looking for those values as if it > was trying to render the template. I just did a workaround and made a > NullSearchRequest value but it just seems like a hacky workaround and I > keep having to check if a value is null for properties that are never > called on that are never used in a POST request. Anyone know a good > work around? > > Sent from AOL Mobile Mail -- Thiago H. de Paula Figueiredo Tapestry, Java and Hibernate consultant and developer http://machina.com.br --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org