001// Copyright 2013 Apache Software Foundation 002// 003// Licensed under the Apache License, Version 2.0 (the "License"); 004// you may not use this file except in compliance with the License. 005// You may obtain a copy of the License at 006// 007// http://www.apache.org/licenses/LICENSE-2.0 008// 009// Unless required by applicable law or agreed to in writing, software 010// distributed under the License is distributed on an "AS IS" BASIS, 011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012// See the License for the specific language governing permissions and 013// limitations under the License. 014 015package org.apache.tapestry5.internal.services; 016 017import org.apache.tapestry5.internal.util.Holder; 018import org.apache.tapestry5.ioc.IOOperation; 019import org.apache.tapestry5.ioc.OperationTracker; 020import org.apache.tapestry5.services.*; 021 022import java.io.IOException; 023 024/** 025 * Uses {@link OperationTracker} to add an operation generally describing each request. 026 * 027 * @since 5.4 028 */ 029public class RequestOperationTracker implements ComponentRequestFilter 030{ 031 private final OperationTracker tracker; 032 033 private final Request request; 034 035 public RequestOperationTracker(OperationTracker tracker, Request request) 036 { 037 this.tracker = tracker; 038 this.request = request; 039 } 040 041 public void handleComponentEvent(final ComponentEventRequestParameters parameters, final ComponentRequestHandler handler) throws IOException 042 { 043 String componentId = parameters.getNestedComponentId().equals("") 044 ? parameters.getContainingPageName() 045 : parameters.getContainingPageName() + ":" + parameters.getNestedComponentId(); 046 047 tracker.perform(String.format("Handling %s '%s' component event request for %s.", 048 request.isXHR() ? "Ajax" : "traditional", 049 parameters.getEventType(), 050 componentId), 051 new IOOperation<Void>() 052 { 053 public Void perform() throws IOException 054 { 055 handler.handleComponentEvent(parameters); 056 057 return null; 058 } 059 }); 060 } 061 062 public void handlePageRender(final PageRenderRequestParameters parameters, final ComponentRequestHandler handler) throws IOException 063 { 064 final Holder<IOException> holder = Holder.create(); 065 066 tracker.run("Handling page render request for page " + parameters.getLogicalPageName(), 067 new Runnable() 068 { 069 public void run() 070 { 071 try 072 { 073 handler.handlePageRender(parameters); 074 } catch (IOException e) 075 { 076 holder.put(e); 077 } 078 } 079 } 080 ); 081 082 if (holder.hasValue()) 083 { 084 throw holder.get(); 085 } 086 } 087}