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 2005/07/08 07:53:39 UTC
cvs commit: jakarta-tapestry/annotations/src/java/org/apache/tapestry/annotations MessageAnnotationWorker.java
hlship 2005/07/07 22:53:39
Modified: . status.xml
annotations/src/test/org/apache/tapestry/annotations
TestMessageAnnotationWorker.java
annotations/src/java/org/apache/tapestry/annotations
MessageAnnotationWorker.java
Added: annotations/src/test/org/apache/tapestry/annotations
MessagesTarget.java
Log:
TAPESTRY-379: @Message does not work with parameters
Revision Changes Path
1.152 +1 -0 jakarta-tapestry/status.xml
Index: status.xml
===================================================================
RCS file: /home/cvs/jakarta-tapestry/status.xml,v
retrieving revision 1.151
retrieving revision 1.152
diff -u -r1.151 -r1.152
--- status.xml 8 Jul 2005 02:00:45 -0000 1.151
+++ status.xml 8 Jul 2005 05:53:39 -0000 1.152
@@ -60,6 +60,7 @@
<action type="fix" dev="HLS" fixes-bug="TAPESTRY-355">Annotations bypass line precise exception reporting</action>
<action type="fix" dev="HLS" fixes-bug="TAPESTRY-378">Add @Documented annotation to the Tapestry annotations</action>
<action type="fix" dev="HLS" fixes-bug="TAPESTRY-372">Don't attempt to display source if no line number</action>
+ <action type="fix" dev="HLS" fixes-bug="TAPESTRY-370">@Message does not work with parameters</action>
</release>
<release version="4.0-beta-1" date="Jun 24 2005">
<action type="add" dev="HLS">Add InvokeListener component.</action>
1.3 +108 -9 jakarta-tapestry/annotations/src/test/org/apache/tapestry/annotations/TestMessageAnnotationWorker.java
Index: TestMessageAnnotationWorker.java
===================================================================
RCS file: /home/cvs/jakarta-tapestry/annotations/src/test/org/apache/tapestry/annotations/TestMessageAnnotationWorker.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TestMessageAnnotationWorker.java 2 Jul 2005 22:51:24 -0000 1.2
+++ TestMessageAnnotationWorker.java 8 Jul 2005 05:53:39 -0000 1.3
@@ -18,9 +18,18 @@
import java.lang.reflect.Modifier;
import org.apache.hivemind.ApplicationRuntimeException;
+import org.apache.hivemind.Messages;
+import org.apache.hivemind.impl.DefaultClassResolver;
import org.apache.hivemind.service.MethodSignature;
+import org.apache.hivemind.service.impl.ClassFactoryImpl;
+import org.apache.tapestry.enhance.EnhanceUtils;
import org.apache.tapestry.enhance.EnhancementOperation;
+import org.apache.tapestry.enhance.EnhancementOperationImpl;
+import org.apache.tapestry.services.ComponentConstructor;
+import org.apache.tapestry.spec.ComponentSpecification;
import org.apache.tapestry.spec.IComponentSpecification;
+import org.easymock.MockControl;
+import org.easymock.internal.ArrayMatcher;
public class TestMessageAnnotationWorker extends BaseAnnotationTestCase
{
@@ -36,26 +45,30 @@
public void testNoArgsMessage()
{
- attempt("noArgsMessage", "return getMessages().getMessage(\"no-args-message\");");
+ attempt("noArgsMessage", "{\n return getMessages().getMessage(\"no-args-message\");\n}\n");
}
public void testMessageWithSpecificKey()
{
- attempt("messageWithSpecificKey", "return getMessages().getMessage(\"message-key\");");
+ attempt(
+ "messageWithSpecificKey",
+ "{\n return getMessages().getMessage(\"message-key\");\n}\n");
}
public void testMessageWithParameters()
{
- attempt(
- "messageWithParameters",
- "return getMessages().format(\"message-with-parameters\", new java.lang.Object[] { $1, $2 });");
+ attempt("messageWithParameters", "{\n"
+ + " java.lang.Object[] params = new java.lang.Object[2];\n"
+ + " params[0] = $1;\n" + " params[1] = $2;\n"
+ + " return getMessages().format(\"message-with-parameters\", params);\n}\n");
}
public void testMessageWithPrimitiveParameters()
{
- attempt(
- "messageWithPrimitives",
- "return getMessages().format(\"message-with-primitives\", new java.lang.Object[] { ($w) $1, ($w) $2 });");
+ attempt("messageWithPrimitives", "{\n"
+ + " java.lang.Object[] params = new java.lang.Object[2];\n"
+ + " params[0] = ($w) $1;\n" + " params[1] = ($w) $2;\n"
+ + " return getMessages().format(\"message-with-primitives\", params);\n}\n");
}
public void testNotStringReturnType()
@@ -93,7 +106,7 @@
op.addMethod(
Modifier.PUBLIC,
new MethodSignature(method),
- "return getMessages().getMessage(\"like-getter\");");
+ "{\n return getMessages().getMessage(\"like-getter\");\n}\n");
op.claimProperty("likeGetter");
replayControls();
@@ -119,6 +132,92 @@
verifyControls();
}
+ private Object construct(Class baseClass, String methodName, Messages messages)
+ {
+ ComponentSpecification spec = new ComponentSpecification();
+ EnhancementOperationImpl op = new EnhancementOperationImpl(getClassResolver(), spec,
+ baseClass, new ClassFactoryImpl());
+
+ op.addInjectedField("_messages", Messages.class, messages);
+
+ EnhanceUtils.createSimpleAccessor(op, "_messages", "messages", Messages.class);
+
+ Method method = findMethod(baseClass, methodName);
+
+ new MessageAnnotationWorker().performEnhancement(op, spec, method, null);
+
+ ComponentConstructor cc = op.getConstructor();
+
+ return cc.newInstance();
+ }
+
+ public void testNoParams()
+ {
+ MockControl control = newControl(Messages.class);
+ Messages messages = (Messages) control.getMock();
+
+ messages.getMessage("no-params");
+ control.setReturnValue("<no params>");
+
+ MessagesTarget mt = (MessagesTarget) construct(MessagesTarget.class, "noParams", messages);
+
+ replayControls();
+
+ assertEquals("<no params>", mt.noParams());
+
+ verifyControls();
+ }
+
+ public void testObjectParam()
+ {
+ MockControl control = newControl(Messages.class);
+ Messages messages = (Messages) control.getMock();
+
+ Object[] params = new Object[]
+ { "PinkFloyd" };
+
+ messages.format("object-param", params);
+ control.setMatcher(new ArrayMatcher());
+ control.setReturnValue("<object param>");
+
+ MessagesTarget mt = (MessagesTarget) construct(
+ MessagesTarget.class,
+ "objectParam",
+ messages);
+
+ replayControls();
+
+ assertEquals("<object param>", mt.objectParam("PinkFloyd"));
+
+ verifyControls();
+ }
+
+ public void testPrimitiveParam()
+ {
+
+ MockControl control = newControl(Messages.class);
+ Messages messages = (Messages) control.getMock();
+
+ Object[] params = new Object[]
+ { 451 };
+
+ messages.format("primitive-param", params);
+ control.setMatcher(new ArrayMatcher());
+ control.setReturnValue("<primitive param>");
+
+ MessagesTarget mt = (MessagesTarget) construct(
+ MessagesTarget.class,
+ "primitiveParam",
+ messages);
+
+ replayControls();
+
+ assertEquals("<primitive param>", mt.primitiveParam(451));
+
+ verifyControls();
+
+ }
+
public void testInvalidBindings()
{
invalidBinding("no equals");
1.1 jakarta-tapestry/annotations/src/test/org/apache/tapestry/annotations/MessagesTarget.java
Index: MessagesTarget.java
===================================================================
// Copyright 2005 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.annotations;
import org.apache.tapestry.AbstractComponent;
import org.apache.tapestry.annotations.Message;
/**
* Target "component" used to test the
* {@link org.apache.tapestry.annotations.MessageAnnotationWorker}.
*
* @author Howard Lewis Ship
* @since 4.0
*/
public abstract class MessagesTarget extends AbstractComponent
{
@Message
public abstract String noParams();
@Message
public abstract String objectParam(String bar);
@Message
public abstract String primitiveParam(int bar);
}
1.4 +18 -19 jakarta-tapestry/annotations/src/java/org/apache/tapestry/annotations/MessageAnnotationWorker.java
Index: MessageAnnotationWorker.java
===================================================================
RCS file: /home/cvs/jakarta-tapestry/annotations/src/java/org/apache/tapestry/annotations/MessageAnnotationWorker.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- MessageAnnotationWorker.java 2 Jul 2005 22:51:23 -0000 1.3
+++ MessageAnnotationWorker.java 8 Jul 2005 05:53:39 -0000 1.4
@@ -50,36 +50,35 @@
BodyBuilder builder = new BodyBuilder();
- builder.add("return getMessages().");
+ builder.begin();
Class[] parameterTypes = method.getParameterTypes();
int paramCount = Tapestry.size(parameterTypes);
- builder.add(paramCount == 0 ? "getMessage" : "format");
-
- builder.add("(\"{0}\"", keyName);
-
- for (int i = 0; i < paramCount; i++)
+ if (paramCount > 0)
{
- if (i == 0)
- builder.add(", new java.lang.Object[] { ");
- else
- builder.add(", ");
+ builder.addln("java.lang.Object[] params = new java.lang.Object[{0}];", paramCount);
+ for (int i = 0; i < paramCount; i++)
+ {
+ builder.add("params[{0}] = ", i);
- // Javassist is kind enough to automatically wrapper stuff if we
- // ask it.
+ if (parameterTypes[i].isPrimitive())
+ builder.add("($w) ");
- if (parameterTypes[i].isPrimitive())
- builder.add("($w) ");
+ // Parameter $0 is this, so $1 is the first real parameter.
- // Method parameter are numbered from 1, $0 is this
- builder.add("$" + (i + 1));
+ builder.addln("${0};", i + 1);
+ }
}
- if (paramCount > 0)
- builder.add(" }");
+ builder.add("return getMessages().");
+
+ if (paramCount == 0)
+ builder.addln("getMessage(\"{0}\");", keyName);
+ else
+ builder.addln("format(\"{0}\", params);", keyName);
- builder.add(");");
+ builder.end();
op.addMethod(Modifier.PUBLIC, new MethodSignature(method), builder.toString());
---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-dev-help@jakarta.apache.org