001 // Copyright 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.TapestryMarkers;
019 import org.apache.tapestry5.ioc.Invokable;
020 import org.apache.tapestry5.ioc.OperationTracker;
021 import org.apache.tapestry5.runtime.Event;
022 import org.slf4j.Logger;
023
024 @SuppressWarnings("all")
025 public class EventImpl implements Event
026 {
027 private boolean aborted;
028
029 private String methodDescription;
030
031 private final ComponentEventCallback handler;
032
033 private final Logger logger;
034
035 private final boolean debugEnabled;
036
037 protected final OperationTracker tracker;
038
039 /**
040 * @param handler informed of return values from methods, deems when the event is aborted
041 * @param logger used to log method invocations
042 * @param tracker
043 */
044 public EventImpl(ComponentEventCallback handler, Logger logger, OperationTracker tracker)
045 {
046 this.tracker = tracker;
047 assert handler != null;
048 this.handler = handler;
049 this.logger = logger;
050
051 // TAP5-471: Thousands of calls to isDebugEnabled() do add up
052 debugEnabled = logger.isDebugEnabled();
053 }
054
055 public boolean isAborted()
056 {
057 return aborted;
058 }
059
060 public void setMethodDescription(String methodDescription)
061 {
062 if (debugEnabled)
063 logger.debug(TapestryMarkers.EVENT_HANDLER_METHOD, "Invoking: " + methodDescription);
064
065 this.methodDescription = methodDescription;
066 }
067
068 @SuppressWarnings("unchecked")
069 public boolean storeResult(final Object result)
070 {
071 // Given that this method is *only* invoked from code
072 // that is generated at runtime and proven to be correct,
073 // this should never, ever happen. But what the hell,
074 // let's check anyway.
075
076 if (aborted)
077 {
078 throw new IllegalStateException(ServicesMessages.componentEventIsAborted(methodDescription));
079 }
080
081
082 if (result != null)
083 {
084 boolean handleResult =
085 tracker.invoke(String.format("Handling result from method %s.", methodDescription), new Invokable<Boolean>()
086 {
087 public Boolean invoke()
088 {
089 return handler.handleResult(result);
090 }
091 });
092
093 aborted |= handleResult;
094 }
095
096 return aborted;
097 }
098
099 protected String getMethodDescription()
100 {
101 return methodDescription;
102 }
103 }