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