    001// Copyright 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
    015package org.apache.tapestry5.internal.services;
    016
    017import java.io.IOException;
    018
    019import org.apache.tapestry5.*;
    020import org.apache.tapestry5.internal.EmptyEventContext;
    021import org.apache.tapestry5.ioc.annotations.Symbol;
    022import org.apache.tapestry5.services.ComponentEventResultProcessor;
    023import org.apache.tapestry5.services.HttpError;
    024import org.apache.tapestry5.services.MetaDataLocator;
    025import org.slf4j.Logger;
    026
    027import javax.servlet.http.HttpServletResponse;
    028
    029public class PageActivatorImpl implements PageActivator
    030{
    031    private final Logger logger;
    032
    033    private final MetaDataLocator metaDataLocator;
    034
    035    private final UnknownActivationContextHandler unknownActivationContextHandler;
    036
    037    public PageActivatorImpl(Logger logger, MetaDataLocator metaDataLocator,
    038                             UnknownActivationContextHandler unknownActivationContextHandler)
    039    {
    040        this.logger = logger;
    041        this.metaDataLocator = metaDataLocator;
    042        this.unknownActivationContextHandler = unknownActivationContextHandler;
    043    }
    044
    045    @SuppressWarnings("unchecked")
    046    public boolean activatePage(ComponentResources pageResources, EventContext activationContext,
    047            ComponentEventResultProcessor resultProcessor) throws IOException
    048    {
    049        TrackableComponentEventCallback callback = new ComponentResultProcessorWrapper(resultProcessor);
    050
    051        boolean handled = pageResources.triggerContextEvent(EventConstants.ACTIVATE, activationContext, callback);
    052
    053        boolean acceptEmpty = !pageResources.getComponentModel().handlesEvent(EventConstants.ACTIVATE) &&
    054                                activationContext.getCount() == 0;
    055
    056        boolean checkUnknown = metaDataLocator.findMeta(MetaDataConstants.UNKNOWN_ACTIVATION_CONTEXT_CHECK,
    057                                                        pageResources, Boolean.class);
    058
    059        if ( !handled && !acceptEmpty && checkUnknown &&
    060                !pageResources.getComponentModel().handleActivationEventContext())
    061        {
    062            logger.info("Page {} required an exact activation context, let's handle this", pageResources.getPageName());
    063            unknownActivationContextHandler.handleUnknownContext(pageResources, activationContext);
    064            return true;
    065        }
    066
    067        if (callback.isAborted())
    068        {
    069            callback.rethrow();
    070            return true;
    071        }
    072
    073        return false;
    074    }
    075
    076}