You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2006/08/26 20:53:20 UTC

svn commit: r437207 - in /tapestry/tapestry5/tapestry-core/trunk/src: main/java/org/apache/tapestry/internal/ main/java/org/apache/tapestry/internal/model/ main/java/org/apache/tapestry/internal/services/ main/java/org/apache/tapestry/internal/structur...

Author: hlship
Date: Sat Aug 26 11:53:19 2006
New Revision: 437207

URL: http://svn.apache.org/viewvc?rev=437207&view=rev
Log:
Minimal page rendering now works.

Added:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/LifecycleEvent.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/RuntimeMessages.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/runtime/
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/runtime/LifecycleEventTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/runtime/
    tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/runtime/RuntimeStrings.properties
Modified:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ClasspathResource.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/model/MutableComponentModelImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformerImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/ComponentModel.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/MutableComponentModel.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/ComponentLifecycle.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ClasspathResource.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ClasspathResource.java?rev=437207&r1=437206&r2=437207&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ClasspathResource.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ClasspathResource.java Sat Aug 26 11:53:19 2006
@@ -33,6 +33,11 @@
 
     private URL _url;
 
+    public ClasspathResource(String path)
+    {
+        this(Thread.currentThread().getContextClassLoader(), path);
+    }
+
     public ClasspathResource(ClassLoader classLoader, String path)
     {
         _classLoader = classLoader;

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/model/MutableComponentModelImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/model/MutableComponentModelImpl.java?rev=437207&r1=437206&r2=437207&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/model/MutableComponentModelImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/model/MutableComponentModelImpl.java Sat Aug 26 11:53:19 2006
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry.internal.model;
 
+import org.apache.commons.logging.Log;
 import org.apache.tapestry.Resource;
 import org.apache.tapestry.model.MutableComponentModel;
 
@@ -24,27 +25,32 @@
  */
 public final class MutableComponentModelImpl implements MutableComponentModel
 {
-    private Resource _baseResource;
+    private final Resource _baseResource;
 
-    private String _componentClassName;
+    private final String _componentClassName;
 
-    public Resource getBaseResource()
+    private final Log _log;
+
+    public MutableComponentModelImpl(String componentClassName, Log log, Resource baseResource)
     {
-        return _baseResource;
+        _componentClassName = componentClassName;
+        _log = log;
+        _baseResource = baseResource;
     }
 
-    public void setBaseResource(Resource baseResource)
+    public Log getLog()
     {
-        _baseResource = baseResource;
+        return _log;
     }
 
-    public String getComponentClassName()
+    public Resource getBaseResource()
     {
-        return _componentClassName;
+        return _baseResource;
     }
 
-    public void setComponentClassName(String componentClassName)
+    public String getComponentClassName()
     {
-        _componentClassName = componentClassName;
+        return _componentClassName;
     }
+
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformerImpl.java?rev=437207&r1=437206&r2=437207&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformerImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformerImpl.java Sat Aug 26 11:53:19 2006
@@ -14,22 +14,26 @@
 
 package org.apache.tapestry.internal.services;
 
-import static org.apache.tapestry.util.CollectionFactory.newMap;
-
 import java.util.Map;
 
 import javassist.CtClass;
 import javassist.NotFoundException;
 
+import org.apache.commons.logging.Log;
+import org.apache.tapestry.Resource;
 import org.apache.tapestry.annotations.ComponentClass;
 import org.apache.tapestry.events.InvalidationEvent;
 import org.apache.tapestry.events.InvalidationListener;
+import org.apache.tapestry.internal.ClasspathResource;
 import org.apache.tapestry.internal.annotations.Concurrent;
 import org.apache.tapestry.internal.model.MutableComponentModelImpl;
+import org.apache.tapestry.ioc.LogSource;
 import org.apache.tapestry.model.ComponentModel;
 import org.apache.tapestry.model.MutableComponentModel;
 import org.apache.tapestry.services.ComponentClassTransformWorker;
 
+import static org.apache.tapestry.util.CollectionFactory.newMap;
+
 /**
  * Implementation of {@link org.apache.tapestry.internal.services.ComponentClassTransformer}.
  * 
@@ -46,13 +50,17 @@
 
     private final ComponentClassTransformWorker _workerChain;
 
+    private final LogSource _logSource;
+
     /**
      * @param workerChain
      *            the ordered list of class transform works as a chain of command instance
      */
-    public ComponentClassTransformerImpl(ComponentClassTransformWorker workerChain)
+    public ComponentClassTransformerImpl(ComponentClassTransformWorker workerChain,
+            LogSource logSource)
     {
         _workerChain = workerChain;
+        _logSource = logSource;
     }
 
     /**
@@ -103,9 +111,10 @@
         // TODO: child class model should start as deep copy of parent model?
         // Or have pointer to parent model? Or something.
 
-        MutableComponentModel model = new MutableComponentModelImpl();
-        
-        model.setComponentClassName(classname);
+        Log log = _logSource.getLog(classname);
+        Resource baseResource = new ClasspathResource(classname.replace(".", "/") + ".class");
+
+        MutableComponentModel model = new MutableComponentModelImpl(classname, log, baseResource);
 
         _workerChain.transform(transformation, model);
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java?rev=437207&r1=437206&r2=437207&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java Sat Aug 26 11:53:19 2006
@@ -15,6 +15,7 @@
 package org.apache.tapestry.internal.services;
 
 import org.apache.commons.logging.Log;
+import org.apache.tapestry.ioc.LogSource;
 import org.apache.tapestry.ioc.OrderedConfiguration;
 import org.apache.tapestry.ioc.annotations.Contribute;
 import org.apache.tapestry.ioc.annotations.Id;
@@ -55,9 +56,11 @@
 
     public ComponentClassTransformer buildComponentClassTransformer(
             @InjectService("tapestry.ComponentClassTransformWorker")
-            ComponentClassTransformWorker workerChain)
+            ComponentClassTransformWorker workerChain, @InjectService("tapestry.ioc.LogSource")
+            LogSource logSource)
     {
-        ComponentClassTransformerImpl transformer = new ComponentClassTransformerImpl(workerChain);
+        ComponentClassTransformerImpl transformer = new ComponentClassTransformerImpl(workerChain,
+                logSource);
 
         _componentInstantiatorSource.addInvalidationListener(transformer);
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java?rev=437207&r1=437206&r2=437207&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java Sat Aug 26 11:53:19 2006
@@ -23,6 +23,7 @@
 import org.apache.tapestry.internal.services.Instantiator;
 import org.apache.tapestry.model.ComponentModel;
 import org.apache.tapestry.runtime.ComponentLifecycle;
+import org.apache.tapestry.runtime.LifecycleEvent;
 import org.apache.tapestry.runtime.RenderCommand;
 import org.apache.tapestry.runtime.RenderQueue;
 
@@ -137,6 +138,11 @@
         return _id;
     }
 
+    private LifecycleEvent<Boolean> newEvent(boolean defaultValue)
+    {
+        return new LifecycleEvent<Boolean>(_componentModel.getLog(), Boolean.class, defaultValue);
+    }
+
     // NOTE: May want to investigate lazy creation of these.
 
     // This is the state machine for rendering an individual component.
@@ -146,9 +152,11 @@
         @SuppressNullCheck
         public void render(MarkupWriter writer, RenderQueue queue)
         {
-            boolean render = _component.beforeRender(writer);
+            LifecycleEvent<Boolean> event = newEvent(true);
+
+            _component.beforeRender(writer, event);
 
-            queue.addFirst(render ? _renderTag : _afterRender);
+            queue.addFirst(event.getResult() ? _renderTag : _afterRender);
         }
     };
 
@@ -157,11 +165,13 @@
         @SuppressNullCheck
         public void render(MarkupWriter writer, RenderQueue queue)
         {
-            boolean render = _component.renderTag(writer);
+            LifecycleEvent<Boolean> event = newEvent(true);
 
-            if (render)
+            _component.renderTag(writer, event);
+
+            if (event.getResult())
             {
-                // Push this deepeset: after rendering the template
+                // Push this deepest: after rendering the template
                 // (including the render body directive), we want to
                 // give the component a chance to render its close tag.
 
@@ -187,9 +197,11 @@
         @SuppressNullCheck
         public void render(MarkupWriter writer, RenderQueue queue)
         {
-            boolean rerender = _component.renderCloseTag(writer);
+            LifecycleEvent<Boolean> event = newEvent(false);
+
+            _component.renderCloseTag(writer, event);
 
-            queue.addFirst(rerender ? _renderTag : _afterRender);
+            queue.addFirst(event.getResult() ? _renderTag : _afterRender);
         }
     };
 
@@ -198,9 +210,11 @@
         @SuppressNullCheck
         public void render(MarkupWriter writer, RenderQueue queue)
         {
-            boolean rerender = _component.renderCloseTag(writer);
+            LifecycleEvent<Boolean> event = newEvent(false);
+
+            _component.renderCloseTag(writer, event);
 
-            if (rerender)
+            if (event.getResult())
                 queue.addFirst(_beforeRender);
         }
     };

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/ComponentModel.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/ComponentModel.java?rev=437207&r1=437206&r2=437207&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/ComponentModel.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/ComponentModel.java Sat Aug 26 11:53:19 2006
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry.model;
 
+import org.apache.commons.logging.Log;
 import org.apache.tapestry.Resource;
 
 /**
@@ -36,4 +37,7 @@
      * @return
      */
     Resource getBaseResource();
+
+    /** Returns object that will be used to log warnings and errors related to this component. */
+    Log getLog();
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/MutableComponentModel.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/MutableComponentModel.java?rev=437207&r1=437206&r2=437207&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/MutableComponentModel.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/model/MutableComponentModel.java Sat Aug 26 11:53:19 2006
@@ -14,8 +14,6 @@
 
 package org.apache.tapestry.model;
 
-import org.apache.tapestry.Resource;
-
 /**
  * Mutable version of {@link org.apache.tapestry.model.ComponentModel} used during the
  * transformation phase.
@@ -24,7 +22,5 @@
  */
 public interface MutableComponentModel extends ComponentModel
 {
-    void setBaseResource(Resource resource);
-    
-    void setComponentClassName(String className);
+
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/ComponentLifecycle.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/ComponentLifecycle.java?rev=437207&r1=437206&r2=437207&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/ComponentLifecycle.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/ComponentLifecycle.java Sat Aug 26 11:53:19 2006
@@ -39,44 +39,44 @@
 
     /**
      * Invoked before rendering a component (or its template).
-     * 
-     * @return true to procede to {@link #renderTag(MarkupWriter)}, false to skip to
-     *         {@link #afterRender(MarkupWriter)}.
+     * <p>
+     * Set event result to true to procede to {@link #renderTag(MarkupWriter)}, or false to skip to
+     * {@link #afterRender(MarkupWriter)}.
      */
-    boolean beforeRender(MarkupWriter writer);
+    void beforeRender(MarkupWriter writer, LifecycleEvent<Boolean> event);
 
     /**
      * Invoked to allow a component to render its tag (start tag and attributes).
-     * 
-     * @return true to render the component's template (eventually invoking
-     *         {@link #beforeRenderBody(MarkupWriter)}, false to skip to
-     *         {@link #afterRender(MarkupWriter)}.
+     * <p>
+     * Set event result to true to render the component's template (eventually invoking
+     * {@link #beforeRenderBody(MarkupWriter)}, false to skip to {@link #afterRender(MarkupWriter)}.
      */
-    boolean renderTag(MarkupWriter writer);
+    void renderTag(MarkupWriter writer, LifecycleEvent<Boolean> event);
 
     /**
      * Invoked just before rendering the body of component.
-     * 
-     * @return true to render the body before advancing to {@link #renderCloseTag(MarkupWriter)},
-     *         or false to skip the body and advance directly to
-     *         {@link #renderCloseTag(MarkupWriter)}.
+     * <p>
+     * Set event result to true to render the body before advancing to
+     * {@link #renderCloseTag(MarkupWriter)}, or false to skip the body and advance directly to
+     * {@link #renderCloseTag(MarkupWriter)}.
      */
-    boolean beforeRenderBody(MarkupWriter writer);
+    void beforeRenderBody(MarkupWriter writer, LifecycleEvent<Boolean> event);
 
     /**
      * Renders the close tag. Decides whether to render the the tag (and its template and/or body)
      * again.
-     * 
-     * @return true to return to {@link #renderTag(MarkupWriter)}, or false to advance to
-     *         {@link #afterRender(MarkupWriter)}.
+     * <p>
+     * Set event result to true to return to {@link #renderTag(MarkupWriter)}, or false to advance
+     * to {@link #afterRender(MarkupWriter)}.
      */
-    boolean renderCloseTag(MarkupWriter writer);
+    void renderCloseTag(MarkupWriter writer, LifecycleEvent<Boolean> event);
 
     /**
      * Generally used to perform final cleanup of the component after rendering.
-     * 
-     * @return true to re-render the component, returning to {@link #beforeRender(MarkupWriter)},
-     *         or false to indicate that rendering of the component is complete.
+     * <p>
+     * Set event result to true to re-render the component, returning to
+     * {@link #beforeRender(MarkupWriter)}, or false to indicate that rendering of the component is
+     * complete.
      */
-    boolean afterRender(MarkupWriter writer);
+    void afterRender(MarkupWriter writer, LifecycleEvent<Boolean> event);
 }

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/LifecycleEvent.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/LifecycleEvent.java?rev=437207&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/LifecycleEvent.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/LifecycleEvent.java Sat Aug 26 11:53:19 2006
@@ -0,0 +1,89 @@
+// Copyright 2006 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.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.runtime;
+
+import org.apache.commons.logging.Log;
+import org.apache.tapestry.internal.annotations.SuppressNullCheck;
+
+/**
+ * Event object passed into a lifecycle method. Each component class forms a chain of command around
+ * annotated methods corresponding to the particular lifecycle method. The chain of command executes
+ * until a particular result is specified (via the return value of one of the annotated methods),
+ * which terminates the chain (potentially skipping some of the method invocations).
+ * 
+ * @author Howard M. Lewis Ship
+ */
+public final class LifecycleEvent<T>
+{
+    private final Log _log;
+
+    private final Class<T> _expectedType;
+
+    private boolean _abort;
+
+    private T _result;
+
+    public LifecycleEvent(Log log, Class<T> expectedType, T defaultResult)
+    {
+        _log = log;
+        _expectedType = expectedType;
+        _result = defaultResult;
+    }
+
+    /**
+     * Returns true if a result value has been stored into the event. This is used to skip lifecycle
+     * annotated methods after a definitive return value has been supplied.
+     * 
+     * @return
+     */
+    public boolean getAbort()
+    {
+        return _abort;
+    }
+
+    public T getResult()
+    {
+        return _result;
+    }
+
+    /**
+     * Stores a result obtained from a method. If the provided result is null, nothing happens. If
+     * the provided result is not of the correct type (remember: generics is a compiler illusion, so
+     * there's no guarantee that code actually returns) then an error is logged. Otherwise, the
+     * result is stored, and {@link #getAbort() abort flag} is set.
+     * 
+     * @param result
+     *            the provided result, or null if the method did not provide a result
+     * @param methodDescription
+     *            describes the method invoked, which returned the value
+     */
+    @SuppressNullCheck
+    public void storeResult(T result, String methodDescription)
+    {
+        if (result == null)
+            return;
+
+        // TODO: IllegalStateException if _abort is true?
+
+        if (!_expectedType.isInstance(result))
+        {
+            _log.error(RuntimeMessages.wrongEventResultType(methodDescription, _expectedType));
+            return;
+        }
+
+        _result = result;
+        _abort = true;
+    }
+}

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/RuntimeMessages.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/RuntimeMessages.java?rev=437207&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/RuntimeMessages.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/RuntimeMessages.java Sat Aug 26 11:53:19 2006
@@ -0,0 +1,28 @@
+// Copyright 2006 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.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.runtime;
+
+import org.apache.tapestry.Messages;
+import org.apache.tapestry.internal.MessagesImpl;
+
+final class RuntimeMessages
+{
+    private static final Messages MESSAGES = MessagesImpl.forClass(RuntimeMessages.class);
+
+    static String wrongEventResultType(String method, Class expectedType)
+    {
+        return MESSAGES.format("wrong-event-result-type", method, expectedType.getName());
+    }
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml?rev=437207&r1=437206&r2=437207&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml Sat Aug 26 11:53:19 2006
@@ -31,6 +31,7 @@
       <package name="org.apache.tapestry.ioc.services"/>
       <package name="org.apache.tapestry.services"/>
       <package name="org.apache.tapestry.util"/>
+      <package name="org.apache.tapestry.runtime"/>
     </packages>
   </test>
 </suite>

Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/runtime/LifecycleEventTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/runtime/LifecycleEventTest.java?rev=437207&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/runtime/LifecycleEventTest.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/runtime/LifecycleEventTest.java Sat Aug 26 11:53:19 2006
@@ -0,0 +1,97 @@
+// Copyright 2006 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.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.runtime;
+
+import org.apache.commons.logging.Log;
+import org.apache.tapestry.internal.test.InternalBaseTestCase;
+import org.testng.annotations.Test;
+
+import static org.easymock.EasyMock.contains;
+
+/**
+ * @author Howard M. Lewis Ship
+ */
+public class LifecycleEventTest extends InternalBaseTestCase
+{
+    @Test
+    public void default_result_is_retained()
+    {
+        Log log = newLog();
+
+        replay();
+
+        LifecycleEvent<Integer> event = new LifecycleEvent<Integer>(log, Integer.class, 99);
+
+        assertEquals(false, event.getAbort());
+        assertEquals(99, (int) event.getResult());
+
+        verify();
+    }
+
+    @Test
+    public void actual_result_overrides_default()
+    {
+        Log log = newLog();
+
+        replay();
+
+        LifecycleEvent<Integer> event = new LifecycleEvent<Integer>(log, Integer.class, 99);
+
+        event.storeResult(88, "some method");
+
+        assertEquals(true, event.getAbort());
+        assertEquals(88, (int) event.getResult());
+
+        verify();
+    }
+
+    @Test
+    public void null_result_value_is_ignored()
+    {
+        Log log = newLog();
+
+        replay();
+
+        LifecycleEvent<Integer> event = new LifecycleEvent<Integer>(log, Integer.class, 99);
+
+        event.storeResult(null, "{some method}");
+
+        assertEquals(false, event.getAbort());
+        assertEquals(99, (int) event.getResult());
+
+        verify();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void result_type_is_checked()
+    {
+        Log log = newLog();
+
+        log
+                .error(contains("Return value of method {some method} is not compatible with the expected return type of java.lang.Integer."));
+
+        replay();
+
+        LifecycleEvent event = new LifecycleEvent<Integer>(log, Integer.class, 99);
+
+        event.storeResult("88", "{some method}");
+
+        assertEquals(false, event.getAbort());
+        assertEquals(new Integer(99), event.getResult());
+
+        verify();
+    }
+}

Added: tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/runtime/RuntimeStrings.properties
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/runtime/RuntimeStrings.properties?rev=437207&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/runtime/RuntimeStrings.properties (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/runtime/RuntimeStrings.properties Sat Aug 26 11:53:19 2006
@@ -0,0 +1,18 @@
+# Copyright 2006 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.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+wrong-event-result-type=Return value of method %s is not compatible with the expected return type of %s. \
+  The value has been ignored. \
+  Further lifecycle methods may be invoked, which is likely to cause incorrect application behavior. \
+  You should change the method to return the correct type. 
\ No newline at end of file