    001    // Copyright 2006, 2007, 2008, 2009, 2010 The 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
    015    package org.apache.tapestry5.internal.services;
    016
    017    import java.io.IOException;
    018
    019    import org.apache.tapestry5.TrackableComponentEventCallback;
    020    import org.apache.tapestry5.internal.structure.ComponentPageElement;
    021    import org.apache.tapestry5.internal.structure.Page;
    022    import org.apache.tapestry5.ioc.annotations.Primary;
    023    import org.apache.tapestry5.ioc.internal.util.TapestryException;
    024    import org.apache.tapestry5.services.ComponentEventRequestHandler;
    025    import org.apache.tapestry5.services.ComponentEventRequestParameters;
    026    import org.apache.tapestry5.services.ComponentEventResultProcessor;
    027    import org.apache.tapestry5.services.Environment;
    028    import org.apache.tapestry5.services.Response;
    029    import org.apache.tapestry5.services.Traditional;
    030
    031    @SuppressWarnings("unchecked")
    032    public class ComponentEventRequestHandlerImpl implements ComponentEventRequestHandler
    033    {
    034        private final ComponentEventResultProcessor resultProcessor;
    035
    036        private final RequestPageCache cache;
    037
    038        private final Response response;
    039
    040        private final PageActivator pageActivator;
    041
    042        private final ActionRenderResponseGenerator generator;
    043
    044        private final Environment environment;
    045
    046        public ComponentEventRequestHandlerImpl(@Traditional
    047        @Primary
    048        ComponentEventResultProcessor resultProcessor,
    049
    050        RequestPageCache cache, Response response,
    051
    052        PageActivator pageActivator,
    053
    054        ActionRenderResponseGenerator generator, Environment environment)
    055        {
    056            this.resultProcessor = resultProcessor;
    057            this.cache = cache;
    058            this.response = response;
    059            this.pageActivator = pageActivator;
    060            this.generator = generator;
    061            this.environment = environment;
    062        }
    063
    064        public void handle(ComponentEventRequestParameters parameters) throws IOException
    065        {
    066            Page activePage = cache.get(parameters.getActivePageName());
    067
    068            if (pageActivator.activatePage(activePage.getRootElement().getComponentResources(), parameters
    069                    .getPageActivationContext(), resultProcessor))
    070                return;
    071
    072            Page containerPage = cache.get(parameters.getContainingPageName());
    073
    074            TrackableComponentEventCallback callback = new ComponentResultProcessorWrapper(resultProcessor);
    075
    076            environment.push(ComponentEventResultProcessor.class, resultProcessor);
    077            environment.push(TrackableComponentEventCallback.class, callback);
    078
    079            ComponentPageElement element = containerPage.getComponentElementByNestedId(parameters.getNestedComponentId());
    080
    081            boolean handled = element
    082                    .triggerContextEvent(parameters.getEventType(), parameters.getEventContext(), callback);
    083
    084            if (!handled)
    085                throw new TapestryException(ServicesMessages.eventNotHandled(element, parameters.getEventType()), element,
    086                        null);
    087
    088            environment.pop(TrackableComponentEventCallback.class);
    089            environment.pop(ComponentEventResultProcessor.class);
    090
    091            if (callback.isAborted())
    092            {
    093                callback.rethrow();
    094                return;
    095            }
    096
    097            if (!response.isCommitted())
    098                generator.generateResponse(activePage);
    099        }
    100    }