You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2011/08/04 03:49:32 UTC

svn commit: r1153724 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry5/internal/services/ main/java/org/apache/tapestry5/internal/structure/ test/java/org/apache/tapestry5/integration/app1/ test/java/org/apache/tapestry5/...

Author: hlship
Date: Thu Aug  4 01:49:31 2011
New Revision: 1153724

URL: http://svn.apache.org/viewvc?rev=1153724&view=rev
Log:
Use the OperationTracker to identify the method which provides a result value for a render phase event or component event

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentEventImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EventImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/RenderPhaseEvent.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentEventImplTest.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentEventImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentEventImpl.java?rev=1153724&r1=1153723&r2=1153724&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentEventImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentEventImpl.java Thu Aug  4 01:49:31 2011
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007, 2008, 2010 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2010, 2011 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -47,7 +47,7 @@ public class ComponentEventImpl extends 
     public ComponentEventImpl(String eventType, String originatingComponentId, EventContext context,
             ComponentEventCallback handler, ComponentPageElementResources elementResources, Logger logger)
     {
-        super(handler, logger);
+        super(handler, logger, elementResources);
 
         this.eventType = eventType;
         this.originatingComponentId = originatingComponentId;

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EventImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EventImpl.java?rev=1153724&r1=1153723&r2=1153724&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EventImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EventImpl.java Thu Aug  4 01:49:31 2011
@@ -1,4 +1,4 @@
-// Copyright 2007, 2008, 2010 The Apache Software Foundation
+// Copyright 2007, 2008, 2010, 2011 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,6 +16,8 @@ package org.apache.tapestry5.internal.se
 
 import org.apache.tapestry5.ComponentEventCallback;
 import org.apache.tapestry5.TapestryMarkers;
+import org.apache.tapestry5.ioc.Invokable;
+import org.apache.tapestry5.ioc.OperationTracker;
 import org.apache.tapestry5.runtime.Event;
 import org.slf4j.Logger;
 
@@ -32,12 +34,16 @@ public class EventImpl implements Event
 
     private final boolean debugEnabled;
 
+    protected final OperationTracker tracker;
+
     /**
      * @param handler informed of return values from methods, deems when the event is aborted
      * @param logger  used to log method invocations
+     * @param tracker
      */
-    public EventImpl(ComponentEventCallback handler, Logger logger)
+    public EventImpl(ComponentEventCallback handler, Logger logger, OperationTracker tracker)
     {
+        this.tracker = tracker;
         assert handler != null;
         this.handler = handler;
         this.logger = logger;
@@ -60,7 +66,7 @@ public class EventImpl implements Event
     }
 
     @SuppressWarnings("unchecked")
-    public boolean storeResult(Object result)
+    public boolean storeResult(final Object result)
     {
         // Given that this method is *only* invoked from code
         // that is generated at runtime and proven to be correct,
@@ -68,11 +74,24 @@ public class EventImpl implements Event
         // let's check anyway.
 
         if (aborted)
+        {
             throw new IllegalStateException(ServicesMessages.componentEventIsAborted(methodDescription));
+        }
 
 
         if (result != null)
-            aborted |= handler.handleResult(result);
+        {
+            boolean handleResult =
+                    tracker.invoke(String.format("Handling result from method %s.", methodDescription), new Invokable<Boolean>()
+                    {
+                        public Boolean invoke()
+                        {
+                            return handler.handleResult(result);
+                        }
+                    });
+
+            aborted |= handleResult;
+        }
 
         return aborted;
     }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java?rev=1153724&r1=1153723&r2=1153724&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java Thu Aug  4 01:49:31 2011
@@ -433,7 +433,7 @@ public class ComponentPageElementImpl ex
 
         public void render(MarkupWriter writer, RenderQueue queue)
         {
-            rendering.set(false);
+            renderingValue.set(false);
 
             Element current = writer.getElement();
 
@@ -499,9 +499,9 @@ public class ComponentPageElementImpl ex
 
     private final Page page;
 
-    private final PerThreadValue<RenderPhaseEvent> renderEvent;
+    private final PerThreadValue<RenderPhaseEvent> renderPhaseEventValue;
 
-    private final PerThreadValue<Boolean> rendering;
+    private final PerThreadValue<Boolean> renderingValue;
 
     // should be okay since it's a shadow service object
     private final Request request;
@@ -562,8 +562,8 @@ public class ComponentPageElementImpl ex
 
         eventLogger = elementResources.getEventLogger(coreResources.getLogger());
 
-        renderEvent = elementResources.createPerThreadValue();
-        rendering = elementResources.createPerThreadValue();
+        renderPhaseEventValue = elementResources.createPerThreadValue();
+        renderingValue = elementResources.createPerThreadValue();
 
         page.addLifecycleListener(new PageLifecycleAdapter()
         {
@@ -975,7 +975,7 @@ public class ComponentPageElementImpl ex
 
     public boolean isRendering()
     {
-        return rendering.get(false);
+        return renderingValue.get(false);
     }
 
     /**
@@ -996,7 +996,7 @@ public class ComponentPageElementImpl ex
 
         // TODO: Check for recursive rendering.
 
-        rendering.set(true);
+        renderingValue.set(true);
 
         queue.startComponent(coreResources);
 
@@ -1263,7 +1263,7 @@ public class ComponentPageElementImpl ex
 
     protected RenderPhaseEvent createRenderEvent(RenderQueue queue)
     {
-        RenderPhaseEvent result = renderEvent.get();
+        RenderPhaseEvent result = renderPhaseEventValue.get();
 
         if (result != null)
             return result;
@@ -1272,9 +1272,9 @@ public class ComponentPageElementImpl ex
         // This assumes that the queue will not change during the current request,
         // which should be valid.
 
-        result = new RenderPhaseEvent(new RenderPhaseEventHandler(queue), eventLogger);
+        result = new RenderPhaseEvent(new RenderPhaseEventHandler(queue), eventLogger, elementResources);
 
-        renderEvent.set(result);
+        renderPhaseEventValue.set(result);
 
         return result;
     }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/RenderPhaseEvent.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/RenderPhaseEvent.java?rev=1153724&r1=1153723&r2=1153724&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/RenderPhaseEvent.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/RenderPhaseEvent.java Thu Aug  4 01:49:31 2011
@@ -1,4 +1,4 @@
-// Copyright 2010 The Apache Software Foundation
+// Copyright 2010, 2011 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -15,15 +15,16 @@
 package org.apache.tapestry5.internal.structure;
 
 import org.apache.tapestry5.internal.services.EventImpl;
+import org.apache.tapestry5.ioc.OperationTracker;
 import org.slf4j.Logger;
 
 public class RenderPhaseEvent extends EventImpl
 {
     private final RenderPhaseEventHandler handler;
 
-    public RenderPhaseEvent(RenderPhaseEventHandler handler, Logger logger)
+    public RenderPhaseEvent(RenderPhaseEventHandler handler, Logger logger, OperationTracker tracker)
     {
-        super(handler, logger);
+        super(handler, logger, tracker);
 
         this.handler = handler;
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java?rev=1153724&r1=1153723&r2=1153724&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java Thu Aug  4 01:49:31 2011
@@ -651,6 +651,7 @@ public class CoreBehaviorsTests extends 
         clickAndWait("link=bad");
         assertTextPresent(
                 "An unexpected application exception has occurred.",
+                "Handling result from method org.apache.tapestry5.integration.app1.pages.ReturnTypes.onActionFromBadReturnValue().",
                 "A component event handler method returned the value 20. Return type java.lang.Integer can not be handled.",
                 "context:ReturnTypes.tml, line 50");
         goBack();

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentEventImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentEventImplTest.java?rev=1153724&r1=1153723&r2=1153724&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentEventImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentEventImplTest.java Thu Aug  4 01:49:31 2011
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007, 2008, 2010 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2010, 2011 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -19,30 +19,34 @@ import org.apache.tapestry5.EventContext
 import org.apache.tapestry5.TapestryMarkers;
 import org.apache.tapestry5.internal.structure.ComponentPageElementResources;
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
-import org.apache.tapestry5.ioc.services.TypeCoercer;
+import org.apache.tapestry5.ioc.Invokable;
 import org.apache.tapestry5.runtime.ComponentEvent;
 import org.easymock.EasyMock;
-import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.isA;
+import org.easymock.IAnswer;
 import org.slf4j.Logger;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.isA;
+
 public class ComponentEventImplTest extends InternalBaseTestCase
 {
-    private TypeCoercer coercer;
 
-    @BeforeClass
-    public void setup_coercer()
+    private ComponentPageElementResources mockResources()
     {
-        coercer = getObject(TypeCoercer.class, null);
-    }
+        ComponentPageElementResources resources = newMock(ComponentPageElementResources.class);
 
-    @AfterClass
-    public void cleanup_coercer()
-    {
-        coercer = null;
+        expect(resources.invoke(EasyMock.isA(String.class), EasyMock.isA(Invokable.class))).andAnswer(new IAnswer<Object>()
+        {
+            public Object answer() throws Throwable
+            {
+                Invokable inv = (Invokable) EasyMock.getCurrentArguments()[1];
+
+                return inv.invoke();
+            }
+        });
+
+        return resources;
     }
 
     @Test
@@ -66,7 +70,9 @@ public class ComponentEventImplTest exte
         verify();
     }
 
-    /** @since 5.2.0 */
+    /**
+     * @since 5.2.0
+     */
     @Test
     public void no_match_one_event_is_aborted()
     {
@@ -74,6 +80,7 @@ public class ComponentEventImplTest exte
         EventContext context = mockEventContext();
         Logger logger = mockLogger();
         Object result = new Object();
+        ComponentPageElementResources resources = mockResources();
 
         train_isDebugEnabled(logger, false);
 
@@ -81,7 +88,7 @@ public class ComponentEventImplTest exte
 
         replay();
 
-        ComponentEvent event = new ComponentEventImpl("eventType", "someId", context, handler, null, logger);
+        ComponentEvent event = new ComponentEventImpl("eventType", "someId", context, handler, resources, logger);
 
         event.storeResult(result);
 
@@ -199,8 +206,7 @@ public class ComponentEventImplTest exte
         try
         {
             event.coerceContext(1, "java.lang.Integer");
-        }
-        catch (IllegalArgumentException ex)
+        } catch (IllegalArgumentException ex)
         {
             assertEquals(ex.getMessage(),
                     "Method foo.Bar.baz() has more parameters than there are context values for this component event.");
@@ -236,8 +242,7 @@ public class ComponentEventImplTest exte
         {
             event.coerceContext(0, "java.lang.Integer");
             unreachable();
-        }
-        catch (IllegalArgumentException ex)
+        } catch (IllegalArgumentException ex)
         {
             // Different JVMs will report the conversion error slightly differently,
             // so we don't try to check that part of the error message.
@@ -258,6 +263,8 @@ public class ComponentEventImplTest exte
         train_isDebugEnabled(logger, true);
         EasyMock.expectLastCall().atLeastOnce();
 
+        ComponentPageElementResources resources = mockResources();
+
         logger.debug(eq(TapestryMarkers.EVENT_HANDLER_METHOD), isA(String.class));
 
         ComponentEventCallback handler = mockComponentEventHandler();
@@ -266,7 +273,7 @@ public class ComponentEventImplTest exte
 
         replay();
 
-        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler, null, logger);
+        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler, resources, logger);
 
         event.setMethodDescription(methodDescription);
 
@@ -286,6 +293,7 @@ public class ComponentEventImplTest exte
         String methodDescription = "foo.Bar.baz()";
         ComponentEventCallback handler = mockComponentEventHandler();
         Logger logger = mockLogger();
+        ComponentPageElementResources resources = mockResources();
 
         train_isDebugEnabled(logger, true);
         logger.debug(eq(TapestryMarkers.EVENT_HANDLER_METHOD), isA(String.class));
@@ -294,7 +302,7 @@ public class ComponentEventImplTest exte
 
         replay();
 
-        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler, null, logger);
+        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler, resources, logger);
 
         event.setMethodDescription(methodDescription);
 
@@ -334,6 +342,7 @@ public class ComponentEventImplTest exte
         Object result = new Object();
         ComponentEventCallback handler = mockComponentEventHandler();
         Logger logger = mockLogger();
+        ComponentPageElementResources resources = mockResources();
 
         train_isDebugEnabled(logger, true);
         EasyMock.expectLastCall().atLeastOnce();
@@ -346,7 +355,7 @@ public class ComponentEventImplTest exte
 
         replay();
 
-        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler, null, logger);
+        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler, resources, logger);
 
         event.setMethodDescription("foo.Bar.baz()");
         event.storeResult(result);
@@ -356,8 +365,7 @@ public class ComponentEventImplTest exte
             event.setMethodDescription("foo.Bar.biff()");
             event.storeResult(null);
             unreachable();
-        }
-        catch (IllegalStateException ex)
+        } catch (IllegalStateException ex)
         {
             assertEquals(ex.getMessage(), ServicesMessages.componentEventIsAborted("foo.Bar.biff()"));
         }