You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gp...@apache.org on 2010/06/22 19:36:56 UTC

svn commit: r956961 - in /myfaces/extensions/cdi/trunk/jse-modules/message-module: api/src/main/java/org/apache/myfaces/extensions/cdi/message/api/payload/ impl/src/main/java/org/apache/myfaces/extensions/cdi/message/impl/ impl/src/test/java/org/apache...

Author: gpetracek
Date: Tue Jun 22 17:36:55 2010
New Revision: 956961

URL: http://svn.apache.org/viewvc?rev=956961&view=rev
Log:
EXTCDI-21 optional attribute descriptor syntax for lazy attributes

Added:
    myfaces/extensions/cdi/trunk/jse-modules/message-module/api/src/main/java/org/apache/myfaces/extensions/cdi/message/api/payload/ArgumentDescriptor.java
    myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/ArgumentDescriptorTest.java
    myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/TestArgument.java
    myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/TestStorage.java
Modified:
    myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/message/impl/DefaultMessageBuilder.java
    myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/AllTests.java

Added: myfaces/extensions/cdi/trunk/jse-modules/message-module/api/src/main/java/org/apache/myfaces/extensions/cdi/message/api/payload/ArgumentDescriptor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jse-modules/message-module/api/src/main/java/org/apache/myfaces/extensions/cdi/message/api/payload/ArgumentDescriptor.java?rev=956961&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jse-modules/message-module/api/src/main/java/org/apache/myfaces/extensions/cdi/message/api/payload/ArgumentDescriptor.java (added)
+++ myfaces/extensions/cdi/trunk/jse-modules/message-module/api/src/main/java/org/apache/myfaces/extensions/cdi/message/api/payload/ArgumentDescriptor.java Tue Jun 22 17:36:55 2010
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.myfaces.extensions.cdi.message.api.payload;
+
+/**
+ * marker for {@link org.apache.myfaces.extensions.cdi.message.api.Localizable} arguments which were stored as
+ * message-key (format {key}) usually such lazy arguments are e.g. arguments for messages which should be resolved
+ * as soon as the message should be resolved
+ *
+ * example:
+ * message-descriptor: info
+ * message-argument (instance of {@link org.apache.myfaces.extensions.cdi.message.api.Localizable}: additional_info
+ *
+ * as soon as we save the argument e.g. as string we lose the information if it is
+ * {@link org.apache.myfaces.extensions.cdi.message.api.Localizable} or if it is just a string-value
+ * so we need the key-syntax here as well
+ *
+ * info is e.g.:
+ * info=hello: {0}
+ *
+ * additional_info is e.g.:
+ * additional_info=codi
+ *
+ * if we store additional_info as string we have to store: {additional_info}
+ * if we restore and resolve the final text the result should be: hello: codi
+ *
+ * this interface is a marker payload
+ *
+ * @author Gerhard Petracek
+ */
+public interface ArgumentDescriptor extends MessagePayload
+{
+}

Modified: myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/message/impl/DefaultMessageBuilder.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/message/impl/DefaultMessageBuilder.java?rev=956961&r1=956960&r2=956961&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/message/impl/DefaultMessageBuilder.java (original)
+++ myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/message/impl/DefaultMessageBuilder.java Tue Jun 22 17:36:55 2010
@@ -32,6 +32,7 @@ import org.apache.myfaces.extensions.cdi
 import org.apache.myfaces.extensions.cdi.message.api.payload.MessagePayload;
 import org.apache.myfaces.extensions.cdi.message.api.payload.MessagePayloadKey;
 import org.apache.myfaces.extensions.cdi.message.api.payload.MessageSeverity;
+import org.apache.myfaces.extensions.cdi.message.api.payload.ArgumentDescriptor;
 
 import java.io.Serializable;
 import java.util.List;
@@ -229,7 +230,9 @@ class DefaultMessageBuilder implements M
         if (messageInterpolator != null && message != null)
         {
             return checkedResult(
-                    interpolateMessage(messageInterpolator, message, baseMessage.getArguments()),
+                    interpolateMessage(messageInterpolator,
+                                       message,
+                                       tryToRestoreLazyArguments(baseMessage, this.messageContext)),
                     baseMessage);
         }
 
@@ -311,6 +314,70 @@ class DefaultMessageBuilder implements M
         return result.toString();
     }
 
+    //see javadoc of {@link ArgumentDescriptor} for more details
+    private Serializable[] tryToRestoreLazyArguments(Message baseMessage, MessageContext messageContext)
+    {
+        if (messageContext == null)
+        {
+            return baseMessage.getArguments();
+        }
+        List<Serializable> result = new ArrayList<Serializable>();
+
+        for (Serializable argument : baseMessage.getArguments())
+        {
+            if (isNumberedArgumentValueALazyArgument(argument))
+            {
+                resolveAndProcessLazyNumberedArgument(messageContext, result, (String)argument);
+            }
+            else if (argument instanceof NamedArgument && isNamedArgumentValueALazyArgument(((NamedArgument) argument)))
+            {
+                resolveAndProcessLazyNamedArgument(messageContext, result, (NamedArgument) argument);
+            }
+            else
+            {
+                result.add(argument);
+            }
+        }
+        return result.toArray(new Serializable[result.size()]);
+    }
+
+    private boolean isNumberedArgumentValueALazyArgument(Serializable argument)
+    {
+        return argument instanceof String && isKey((String) argument);
+    }
+
+    private boolean isNamedArgumentValueALazyArgument(NamedArgument namedArgument)
+    {
+        return namedArgument.getValue() instanceof String && isKey((String) namedArgument.getValue());
+    }
+
+    private void resolveAndProcessLazyNumberedArgument(
+            MessageContext messageContext, List<Serializable> result, String argument)
+    {
+        String resolvedArgumentValue = resolveValueOfArgumentDescriptor(messageContext, argument);
+
+        result.add(resolvedArgumentValue);
+    }
+
+    private void resolveAndProcessLazyNamedArgument(
+            MessageContext messageContext, List<Serializable> result, NamedArgument argument)
+    {
+        String namedArgumentValue = (String) argument.getValue();
+
+        String resolvedNamedArgumentValue = resolveValueOfArgumentDescriptor(messageContext, namedArgumentValue);
+
+
+        result.add(new DefaultNamedArgument(argument.getName(), resolvedNamedArgumentValue));
+    }
+
+    private String resolveValueOfArgumentDescriptor(MessageContext messageContext, String argumentAsKey)
+    {
+        return messageContext.message()
+                .text(argumentAsKey)
+                .payload(ArgumentDescriptor.class)
+                .toText();
+    }
+
     private boolean isDefaultFormatter(Class<? extends Formatter> formatterClass)
     {
         return formatterClass.isAnnotationPresent(Default.class);

Modified: myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/AllTests.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/AllTests.java?rev=956961&r1=956960&r2=956961&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/AllTests.java (original)
+++ myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/AllTests.java Tue Jun 22 17:36:55 2010
@@ -36,7 +36,8 @@ import org.junit.runners.Suite;
         MessageFilterTest.class,
         HelperTest.class,
         SerializationTest.class,
-        LocalizableMessageArgumentTest.class})
+        LocalizableMessageArgumentTest.class,
+        ArgumentDescriptorTest.class})
 public class AllTests extends TestCase
 {
 }

Added: myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/ArgumentDescriptorTest.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/ArgumentDescriptorTest.java?rev=956961&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/ArgumentDescriptorTest.java (added)
+++ myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/ArgumentDescriptorTest.java Tue Jun 22 17:36:55 2010
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.myfaces.extensions.cdi.message.test;
+
+import org.apache.myfaces.extensions.cdi.message.impl.NumberedArgumentAwareMessageInterpolator;
+import org.apache.myfaces.extensions.cdi.message.impl.ELAwareMessageInterpolator;
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+
+/**
+ * @author Gerhard Petracek
+ */
+public class ArgumentDescriptorTest extends AbstractTest
+{
+    @Test
+    public void lazyNumberedAttributeTest()
+    {
+        TestArgument dynArgument = new TestArgument("brand");
+
+        assertEquals("{brand}", dynArgument.getKey());
+
+        String messageText = this.messageContext.config().use().messageInterpolator(new NumberedArgumentAwareMessageInterpolator()).create()
+                .message().text("{info}").argument(dynArgument.getKey()).toText();
+
+        assertEquals("jCar", dynArgument.toString(this.messageContext));
+        assertEquals("value: jCar", messageText);
+    }
+
+    @Test
+    public void lazyNamedAttributeTest()
+    {
+        TestArgument dynArgument = new TestArgument("brand");
+
+        assertEquals("{brand}", dynArgument.getKey());
+
+        String messageText = this.messageContext.config().use().messageInterpolator(new ELAwareMessageInterpolator(new TestELProvider())).create()
+                .message().text("{brand_info}").namedArgument("brand", dynArgument.getKey()).toText();
+
+        assertEquals("jCar", dynArgument.toString(this.messageContext));
+        assertEquals("value: jCar", messageText);
+    }
+}
\ No newline at end of file

Added: myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/TestArgument.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/TestArgument.java?rev=956961&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/TestArgument.java (added)
+++ myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/TestArgument.java Tue Jun 22 17:36:55 2010
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.myfaces.extensions.cdi.message.test;
+
+import org.apache.myfaces.extensions.cdi.message.api.Localizable;
+import org.apache.myfaces.extensions.cdi.message.api.MessageContext;
+
+import java.io.Serializable;
+
+/**
+ * @author Gerhard Petracek
+ */
+class TestArgument implements Localizable, Serializable
+{
+    private static final long serialVersionUID = -4503818588255027507L;
+    private String key;
+
+    TestArgument(String key)
+    {
+        this.key = key;
+    }
+
+    public String getKey()
+    {
+        return "{" + key + "}";
+    }
+
+    public String toString(MessageContext messageContext)
+    {
+        return messageContext.message().text(getKey()).toText();
+    }
+
+    @Override
+    public String toString()
+    {
+        return "???" + key + "???";
+    }
+}

Added: myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/TestStorage.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/TestStorage.java?rev=956961&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/TestStorage.java (added)
+++ myfaces/extensions/cdi/trunk/jse-modules/message-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/message/test/TestStorage.java Tue Jun 22 17:36:55 2010
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.myfaces.extensions.cdi.message.test;
+
+/**
+ * @author Gerhard Petracek
+ */
+class TestStorage
+{
+    private String key;
+
+    private String args;
+
+    public TestStorage(String key, String args)
+    {
+        this.key = key;
+        this.args = args;
+    }
+
+    public String getKey()
+    {
+        return key;
+    }
+
+    public String getArgs()
+    {
+        return args;
+    }
+}