001// Copyright 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
015package org.apache.tapestry5.services;
016
017import org.apache.tapestry5.EventContext;
018import org.apache.tapestry5.internal.TapestryInternalUtils;
019import org.apache.tapestry5.ioc.internal.util.InternalUtils;
020
021/**
022 * Encapsulates all the information that may be provided in a component event request URL.
023 */
024public final class ComponentEventRequestParameters
025{
026    private final String activePageName, containingPageName, nestedComponentId, eventType;
027    private final EventContext pageActivationContext, eventContext;
028
029    public ComponentEventRequestParameters(String activePageName, String containingPageName, String nestedComponentId,
030                                           String eventType, EventContext pageActivationContext,
031                                           EventContext eventContext)
032    {
033        assert InternalUtils.isNonBlank(activePageName);
034        assert InternalUtils.isNonBlank(containingPageName);
035        assert nestedComponentId != null;
036        assert InternalUtils.isNonBlank(eventType);
037        assert pageActivationContext != null;
038        assert eventContext != null;
039        this.activePageName = activePageName;
040        this.containingPageName = containingPageName;
041        this.nestedComponentId = nestedComponentId;
042        this.eventType = eventType;
043        this.pageActivationContext = pageActivationContext;
044        this.eventContext = eventContext;
045    }
046
047    @Override
048    public String toString()
049    {
050        return String.format("ComponentEventParameters[page=%s component=%s:%s event=%s]",
051                             activePageName,
052                             containingPageName, nestedComponentId,
053                             eventType);
054    }
055
056    // Implements equals() as a convienience for testing.
057
058    public boolean equals(Object o)
059    {
060        if (this == o) return true;
061        if (o == null || getClass() != o.getClass()) return false;
062
063        ComponentEventRequestParameters that = (ComponentEventRequestParameters) o;
064
065        if (!activePageName.equals(that.activePageName)) return false;
066        if (!containingPageName.equals(that.containingPageName)) return false;
067        if (!eventType.equals(that.eventType)) return false;
068        if (!nestedComponentId.equals(that.nestedComponentId)) return false;
069
070        if (!TapestryInternalUtils.isEqual(eventContext, that.eventContext)) return false;
071
072        return TapestryInternalUtils.isEqual(pageActivationContext, that.pageActivationContext);
073    }
074
075
076    /**
077     * The name of the active page which rendered the link.  This is usually, but not always, the page which contains
078     * the component.
079     * 
080     * @return {@link ComponentClassResolver#canonicalizePageName(String) canonicalized} page name
081     */
082    public String getActivePageName()
083    {
084        return activePageName;
085    }
086
087    /**
088     * The name of the page containing the component that was triggered. Usually this is the same as the active page,
089     * but because of {@link org.apache.tapestry5.Block} and similar constructs, a component from other than the active
090     * page may be rendered with the active page.
091     * 
092     * @return {@link ComponentClassResolver#canonicalizePageName(String) canonicalized} page name
093     */
094    public String getContainingPageName()
095    {
096        return containingPageName;
097    }
098
099    /**
100     * The path from the containing page down to the component in question. This may be the empty string if the action
101     * request is routed directly to the page rather than a component.
102     */
103    public String getNestedComponentId()
104    {
105        return nestedComponentId;
106    }
107
108    /**
109     * The type of event.  When not specified in the URL, a default type of "action" ({@link
110     * org.apache.tapestry5.EventConstants#ACTION}) is provided.
111     */
112    public String getEventType()
113    {
114        return eventType;
115    }
116
117    /**
118     * The activation context for the <em>active page</em>, possibly empty (but not null).
119     *
120     * @see org.apache.tapestry5.ComponentResourcesCommon#triggerContextEvent(String, org.apache.tapestry5.EventContext,
121     *      org.apache.tapestry5.ComponentEventCallback)
122     */
123    public EventContext getPageActivationContext()
124    {
125        return pageActivationContext;
126    }
127
128    /**
129     * The event context information passed in the URL.  Possibly empty (not not null).
130     *
131     * @see org.apache.tapestry5.ComponentResourcesCommon#triggerContextEvent(String, org.apache.tapestry5.EventContext,
132     *      org.apache.tapestry5.ComponentEventCallback)
133     */
134    public EventContext getEventContext()
135    {
136        return eventContext;
137    }
138}