    001    // Copyright 2006, 2007, 2008, 2010, 2011 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 org.apache.tapestry5.ComponentEventCallback;
    018    import org.apache.tapestry5.EventContext;
    019    import org.apache.tapestry5.internal.structure.ComponentPageElementResources;
    020    import org.apache.tapestry5.runtime.ComponentEvent;
    021    import org.slf4j.Logger;
    022
    023    public class ComponentEventImpl extends EventImpl implements ComponentEvent
    024    {
    025        private final String eventType;
    026
    027        private final String originatingComponentId;
    028
    029        private final EventContext context;
    030
    031        private final ComponentPageElementResources elementResources;
    032
    033        /**
    034         * @param eventType
    035         *            non blank string used to identify the type of event that was triggered
    036         * @param originatingComponentId
    037         *            the id of the component that triggered the event
    038         * @param context
    039         *            provides access to parameter values
    040         * @param handler
    041         *            invoked when a non-null return value is obtained from an event handler method
    042         * @param elementResources
    043         *            provides access to common resources and services
    044         * @param logger
    045         *            used to log method invocations
    046         */
    047        public ComponentEventImpl(String eventType, String originatingComponentId, EventContext context,
    048                ComponentEventCallback handler, ComponentPageElementResources elementResources, Logger logger)
    049        {
    050            super(handler, logger, elementResources);
    051
    052            this.eventType = eventType;
    053            this.originatingComponentId = originatingComponentId;
    054            this.elementResources = elementResources;
    055            this.context = context;
    056        }
    057
    058        @Override
    059        public String toString()
    060        {
    061            return String.format("ComponentEvent[%s from %s]", eventType, originatingComponentId.length() == 0 ? "(self)"
    062                    : originatingComponentId);
    063        }
    064
    065        public boolean matches(String eventType, String componentId, int parameterCount)
    066        {
    067            if (isAborted())
    068                return false;
    069
    070            return this.eventType.equalsIgnoreCase(eventType) && context.getCount() >= parameterCount
    071                    && (originatingComponentId.equalsIgnoreCase(componentId) || componentId.equals(""));
    072        }
    073
    074        @SuppressWarnings("unchecked")
    075        public Object coerceContext(int index, String desiredTypeName)
    076        {
    077            if (index >= context.getCount())
    078                throw new IllegalArgumentException(ServicesMessages.contextIndexOutOfRange(getMethodDescription()));
    079            try
    080            {
    081                Class desiredType = elementResources.toClass(desiredTypeName);
    082
    083                return context.get(desiredType, index);
    084            }
    085            catch (Exception ex)
    086            {
    087                throw new IllegalArgumentException(ServicesMessages.exceptionInMethodParameter(getMethodDescription(),
    088                        index, ex), ex);
    089            }
    090        }
    091
    092        public Object[] getContext()
    093        {
    094            int count = context.getCount();
    095
    096            Object[] result = new Object[count];
    097
    098            for (int i = 0; i < count; i++)
    099                result[i] = context.get(Object.class, i);
    100
    101            return result;
    102        }
    103
    104        public EventContext getEventContext()
    105        {
    106            return context;
    107        }
    108    }