You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by st...@apache.org on 2012/07/08 12:06:59 UTC

[1/2] git commit: DELTASPIKE-232 make Messages and handling Serializable

Updated Branches:
  refs/heads/master 1d09e789c -> 6055b4255


DELTASPIKE-232 make Messages and handling Serializable


Project: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/commit/6055b425
Tree: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/tree/6055b425
Diff: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/diff/6055b425

Branch: refs/heads/master
Commit: 6055b4255b5353424a53776f1748949ff021cd48
Parents: 0319ee6
Author: Mark Struberg <st...@apache.org>
Authored: Sun Jul 8 12:05:50 2012 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Sun Jul 8 12:05:50 2012 +0200

----------------------------------------------------------------------
 .../deltaspike/core/api/message/Message.java       |    6 +-
 .../core/api/message/MessageInterpolator.java      |    2 +-
 .../core/impl/message/DefaultMessage.java          |   11 +-
 .../impl/message/DefaultMessageInterpolator.java   |    2 +-
 .../message/MessageBundleInvocationHandler.java    |   32 ++++--
 .../test/core/api/message/MessageContextTest.java  |   19 ++++
 .../core/api/message/TestMessageInterpolator.java  |    3 +-
 .../deltaspike/test/category/Serializer.java       |   81 +++++++++++++++
 8 files changed, 137 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/6055b425/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/message/Message.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/message/Message.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/message/Message.java
index f03b54c..885b53a 100644
--- a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/message/Message.java
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/message/Message.java
@@ -18,10 +18,12 @@
  */
 package org.apache.deltaspike.core.api.message;
 
+import java.io.Serializable;
+
 /**
  * Basic interface for all message-types
  */
-public interface Message
+public interface Message extends Serializable
 {
     /**
      * @param messageTemplate message key (or inline-text) for the current message
@@ -33,7 +35,7 @@ public interface Message
      * @param arguments numbered and/or named argument(s) for the current message
      * @return the current instance of the message builder to allow a fluent api
      */
-    Message argument(Object... arguments);
+    Message argument(Serializable... arguments);
 
     /**
      * @return the message key (or inline-text) of the current message

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/6055b425/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/message/MessageInterpolator.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/message/MessageInterpolator.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/message/MessageInterpolator.java
index ee9b559..13d2d86 100644
--- a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/message/MessageInterpolator.java
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/message/MessageInterpolator.java
@@ -47,5 +47,5 @@ public interface MessageInterpolator extends Serializable, DeltaSpikeConfig
      *         if it was possible to replace the parameters with the given arguments
      *         the unmodified messageText otherwise
      */
-    String interpolate(String messageText, Object[] arguments, Locale locale);
+    String interpolate(String messageText, Serializable[] arguments, Locale locale);
 }

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/6055b425/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/message/DefaultMessage.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/message/DefaultMessage.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/message/DefaultMessage.java
index 8d9d38c..b3916ce 100644
--- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/message/DefaultMessage.java
+++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/message/DefaultMessage.java
@@ -24,6 +24,7 @@ import org.apache.deltaspike.core.api.message.MessageInterpolator;
 import org.apache.deltaspike.core.api.message.MessageResolver;
 
 import javax.enterprise.inject.Typed;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -39,7 +40,7 @@ import static org.apache.deltaspike.core.api.message.MessageResolver.MISSING_RES
 class DefaultMessage implements Message
 {
     protected String messageTemplate;
-    protected List<Object> arguments = new ArrayList<Object>();
+    protected List<Serializable> arguments = new ArrayList<Serializable>();
 
     private MessageContext messageContext;
 
@@ -53,11 +54,11 @@ class DefaultMessage implements Message
     protected void reset()
     {
         messageTemplate = null;
-        arguments = new ArrayList<Object>();
+        arguments = new ArrayList<Serializable>();
     }
 
     @Override
-    public Message argument(Object... arguments)
+    public Message argument(Serializable... arguments)
     {
         Collections.addAll(this.arguments, arguments);
         return this;
@@ -77,9 +78,9 @@ class DefaultMessage implements Message
     }
 
     @Override
-    public Object[] getArguments()
+    public Serializable[] getArguments()
     {
-        return arguments.toArray();
+        return arguments.toArray(new Serializable[arguments.size()]);
     }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/6055b425/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/message/DefaultMessageInterpolator.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/message/DefaultMessageInterpolator.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/message/DefaultMessageInterpolator.java
index 6f00db2..028a0dc 100644
--- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/message/DefaultMessageInterpolator.java
+++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/message/DefaultMessageInterpolator.java
@@ -33,7 +33,7 @@ public class DefaultMessageInterpolator implements MessageInterpolator, Serializ
     private static final long serialVersionUID = -8854087197813424812L;
 
     @Override
-    public String interpolate(String messageTemplate, Object[] arguments, Locale locale)
+    public String interpolate(String messageTemplate, Serializable[] arguments, Locale locale)
     {
         if (arguments == null || arguments.length == 0)
         {

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/6055b425/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/message/MessageBundleInvocationHandler.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/message/MessageBundleInvocationHandler.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/message/MessageBundleInvocationHandler.java
index b89269a..feac510 100644
--- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/message/MessageBundleInvocationHandler.java
+++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/message/MessageBundleInvocationHandler.java
@@ -18,6 +18,7 @@
  */
 package org.apache.deltaspike.core.impl.message;
 
+import java.io.Serializable;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -25,6 +26,7 @@ import java.util.List;
 
 import org.apache.deltaspike.core.api.literal.AnyLiteral;
 import org.apache.deltaspike.core.api.message.LocaleResolver;
+import org.apache.deltaspike.core.api.message.Message;
 import org.apache.deltaspike.core.api.message.MessageContext;
 import org.apache.deltaspike.core.api.message.MessageInterpolator;
 import org.apache.deltaspike.core.api.message.MessageResolver;
@@ -57,7 +59,7 @@ class MessageBundleInvocationHandler implements InvocationHandler
         }
 
         MessageContext messageContext = resolveMessageContextFromArguments(args);
-        List<Object> arguments = resolveMessageArguments(args);
+        List<Serializable> arguments = resolveMessageArguments(args);
 
         if (messageContext == null)
         {
@@ -74,15 +76,17 @@ class MessageBundleInvocationHandler implements InvocationHandler
 
         String messageBundleName = method.getDeclaringClass().getName();
 
+        Message message =  messageContext
+                .messageSource(messageBundleName).message()
+                .template(messageTemplateValue)
+                .argument(arguments.toArray(new Serializable[arguments.size()]));
+
         if (String.class.isAssignableFrom(method.getReturnType()))
         {
-            return messageContext.messageSource(messageBundleName).message().template(messageTemplateValue)
-                    .argument(arguments.toArray()).toString();
+            return message.toString();
         }
 
-        return messageContext.messageSource(messageBundleName).message().template(messageTemplateValue)
-                .argument(arguments.toArray());
-
+        return message;
     }
 
     private void applyMessageContextConfig(MessageContext messageContext, MessageContextConfig messageContextConfig)
@@ -119,19 +123,29 @@ class MessageBundleInvocationHandler implements InvocationHandler
 
     }
 
-    private List<Object> resolveMessageArguments(Object[] args)
+    private List<Serializable> resolveMessageArguments(Object[] args)
     {
-        List<Object> arguments = new ArrayList<Object>();
+        List<Serializable> arguments = new ArrayList<Serializable>();
         if (args != null && args.length > 0)
         {
             for (int i = 0; i < args.length; i++)
             {
+                Object arg = args[i];
+
                 if (i == 0 && MessageContext.class.isAssignableFrom(args[0].getClass()))
                 {
                     continue;
                 }
 
-                arguments.add(args[i]);
+                if (arg instanceof Serializable)
+                {
+                    arguments.add((Serializable) arg);
+                }
+                else
+                {
+                    // for non-serializable objects we perform an immediate toString() instead
+                    arguments.add(arg.toString());
+                }
             }
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/6055b425/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/MessageContextTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/MessageContextTest.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/MessageContextTest.java
index 9408f9a..091a47e 100644
--- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/MessageContextTest.java
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/MessageContextTest.java
@@ -166,4 +166,23 @@ public class MessageContextTest
         Assert.assertFalse(m1.equals(m2));
         Assert.assertFalse(m2.equals(m1));
     }
+
+    @Test
+    public void testSerialisation()
+    {
+        Serializer<Message> messageSerializer = new Serializer<Message>();
+
+        LocaleResolver localeResolver = new FixedGermanLocaleResolver();
+        Message message = messageContext
+                .localeResolver(localeResolver)
+                .messageResolver(new TestMessageResolver())
+                .message().template("{hello}").argument("hans");
+        Assert.assertEquals("Test Nachricht an hans", message.toString());
+
+        Message messageClone = messageSerializer.roundTrip(message);
+
+        Assert.assertEquals(message, messageClone);
+        Assert.assertEquals("Test Nachricht an hans", messageClone.toString());
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/6055b425/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/TestMessageInterpolator.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/TestMessageInterpolator.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/TestMessageInterpolator.java
index 47a1730..0da5178 100644
--- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/TestMessageInterpolator.java
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/message/TestMessageInterpolator.java
@@ -21,6 +21,7 @@ package org.apache.deltaspike.test.core.api.message;
 import org.apache.deltaspike.core.api.message.MessageInterpolator;
 
 import javax.enterprise.context.ApplicationScoped;
+import java.io.Serializable;
 import java.util.Locale;
 
 @ApplicationScoped
@@ -31,7 +32,7 @@ public class TestMessageInterpolator implements MessageInterpolator
     public static final String SPECIALFORMATTED = "specialformatted ";
 
     @Override
-    public String interpolate(String messageTemplate, Object[] arguments, Locale locale)
+    public String interpolate(String messageTemplate, Serializable[] arguments, Locale locale)
     {
         return SPECIALFORMATTED + String.format(locale, messageTemplate, arguments);
     }

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/6055b425/deltaspike/test-utils/src/main/java/org/apache/deltaspike/test/category/Serializer.java
----------------------------------------------------------------------
diff --git a/deltaspike/test-utils/src/main/java/org/apache/deltaspike/test/category/Serializer.java b/deltaspike/test-utils/src/main/java/org/apache/deltaspike/test/category/Serializer.java
new file mode 100644
index 0000000..bd03e94
--- /dev/null
+++ b/deltaspike/test-utils/src/main/java/org/apache/deltaspike/test/category/Serializer.java
@@ -0,0 +1,81 @@
+/*
+ * 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.deltaspike.test.category;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+/**
+ * A few helper methods for testing serialisation.
+ * They help serializing to a byte[] and back to the object
+ */
+public class Serializer<T>
+{
+
+    /**
+     * Serializes the given instance to a byte[] and immediately
+     * de-serialize it back.
+     * @param original instance
+     * @return the deserialized new instance
+     */
+    public T roundTrip(T original)
+    {
+        return deserialize(serialize(original));
+    }
+
+    /**
+     * Serializes the given instance to a byte[].
+     */
+    public byte[] serialize(T o)
+    {
+        try
+        {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            ObjectOutputStream oos = null;
+            oos = new ObjectOutputStream(baos);
+            oos.writeObject(o);
+            return baos.toByteArray();
+        }
+        catch (IOException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * De-serializes the given byte[] to an instance of T.
+     */
+    public T deserialize(byte[] serial)
+    {
+        try
+        {
+            ByteArrayInputStream bais = new ByteArrayInputStream(serial);
+            ObjectInputStream ois = new ObjectInputStream(bais);
+            return (T) ois.readObject();
+        }
+        catch (Exception e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+}