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