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 }