You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by jo...@apache.org on 2009/05/20 22:25:50 UTC

svn commit: r776832 - in /incubator/shindig/trunk/java/gadgets/src: main/java/org/apache/shindig/gadgets/spec/MessageBundle.java test/java/org/apache/shindig/gadgets/spec/MessageBundleTest.java

Author: johnh
Date: Wed May 20 20:25:50 2009
New Revision: 776832

URL: http://svn.apache.org/viewvc?rev=776832&view=rev
Log:
Let message bundle message values include XML tags. Previously these were completely dropped since .getTextContent() just concatenates all Text nodes found as descendants of an element.


Modified:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/MessageBundle.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/MessageBundleTest.java

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/MessageBundle.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/MessageBundle.java?rev=776832&r1=776831&r2=776832&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/MessageBundle.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/MessageBundle.java Wed May 20 20:25:50 2009
@@ -20,6 +20,8 @@
 import org.apache.shindig.common.xml.XmlException;
 import org.apache.shindig.common.xml.XmlUtil;
 
+import org.apache.shindig.gadgets.parse.DefaultHtmlSerializer;
+
 import com.google.common.collect.Maps;
 import com.google.common.collect.ImmutableMap;
 
@@ -27,6 +29,8 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
+import java.io.IOException;
+import java.io.StringWriter;
 import java.util.Map;
 
 /**
@@ -36,6 +40,7 @@
 
   public static final MessageBundle EMPTY = new MessageBundle();
 
+  private static final DefaultHtmlSerializer htmlSerializer = new DefaultHtmlSerializer();
   private final ImmutableMap<String, String> messages;
   private final String languageDirection;
   private final String jsonString;
@@ -155,7 +160,17 @@
         throw new SpecParserException(
             "All message bundle entries must have a name attribute.");
       }
-      messages.put(name, msg.getTextContent().trim());
+      StringWriter sw = new StringWriter();
+      NodeList msgChildren = msg.getChildNodes();
+      for (int child = 0; child < msgChildren.getLength(); ++child) {
+        try {
+          htmlSerializer.serialize(msgChildren.item(child), sw);
+        } catch (IOException e) {
+          throw new SpecParserException("Unexpected error getting value of msg node", 
+                                        new XmlException(e));
+        }
+      }
+      messages.put(name, sw.toString().trim());
     }
 
     return ImmutableMap.copyOf(messages);

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/MessageBundleTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/MessageBundleTest.java?rev=776832&r1=776831&r2=776832&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/MessageBundleTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/MessageBundleTest.java Wed May 20 20:25:50 2009
@@ -118,6 +118,15 @@
   }
 
   @Test
+  public void extractNestedTagsVerbatim() throws Exception {
+    String xml = "<messagebundle><msg name='key'>This is <x>nested</x> content</msg>" +
+                 "</messagebundle>";
+    Element element = XmlUtil.parse(xml);
+    MessageBundle bundle = new MessageBundle(element);
+    assertEquals("This is <x>nested</x> content", bundle.getMessages().get("key"));
+  }
+
+  @Test
   public void merge() throws Exception {
     MessageBundle parent = new MessageBundle(XmlUtil.parse(PARENT_LOCALE));
     MessageBundle child = new MessageBundle(XmlUtil.parse(XML));



Re: svn commit: r776832 - in /incubator/shindig/trunk/java/gadgets/src: main/java/org/apache/shindig/gadgets/spec/MessageBundle.java test/java/org/apache/shindig/gadgets/spec/MessageBundleTest.java

Posted by Kevin Brown <et...@google.com>.
On Wed, May 20, 2009 at 1:25 PM, <jo...@apache.org> wrote:

> Author: johnh
> Date: Wed May 20 20:25:50 2009
> New Revision: 776832
>
> URL: http://svn.apache.org/viewvc?rev=776832&view=rev
> Log:
> Let message bundle message values include XML tags. Previously these were
> completely dropped since .getTextContent() just concatenates all Text nodes
> found as descendants of an element.
>
>
> Modified:
>
>  incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/MessageBundle.java
>
>  incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/MessageBundleTest.java
>
> Modified:
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/MessageBundle.java
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/MessageBundle.java?rev=776832&r1=776831&r2=776832&view=diff
>
> ==============================================================================
> ---
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/MessageBundle.java
> (original)
> +++
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/MessageBundle.java
> Wed May 20 20:25:50 2009
> @@ -20,6 +20,8 @@
>  import org.apache.shindig.common.xml.XmlException;
>  import org.apache.shindig.common.xml.XmlUtil;
>
> +import org.apache.shindig.gadgets.parse.DefaultHtmlSerializer;
> +
>  import com.google.common.collect.Maps;
>  import com.google.common.collect.ImmutableMap;
>
> @@ -27,6 +29,8 @@
>  import org.w3c.dom.Element;
>  import org.w3c.dom.NodeList;
>
> +import java.io.IOException;
> +import java.io.StringWriter;
>  import java.util.Map;
>
>  /**
> @@ -36,6 +40,7 @@
>
>   public static final MessageBundle EMPTY = new MessageBundle();
>
> +  private static final DefaultHtmlSerializer htmlSerializer = new
> DefaultHtmlSerializer();


DefaultHtmlSerializer is not an XML serializer. It does not correctly
serialize many XML constructs (self closing tags, for instance), and it
assumes that HTML entities are valid in XML in general (not all are).

It also doesn't drop SGML comments, which means that on input of <!-- this
message is special --> Special message, gadgets.Prefs.getMsg() is going to
retain the comment.

The XML serializers in javax.xml.* would probably be more appropriate.


>
>   private final ImmutableMap<String, String> messages;
>   private final String languageDirection;
>   private final String jsonString;
> @@ -155,7 +160,17 @@
>         throw new SpecParserException(
>             "All message bundle entries must have a name attribute.");
>       }
> -      messages.put(name, msg.getTextContent().trim());
> +      StringWriter sw = new StringWriter();
> +      NodeList msgChildren = msg.getChildNodes();
> +      for (int child = 0; child < msgChildren.getLength(); ++child) {
> +        try {
> +          htmlSerializer.serialize(msgChildren.item(child), sw);
> +        } catch (IOException e) {
> +          throw new SpecParserException("Unexpected error getting value of
> msg node",
> +                                        new XmlException(e));
> +        }
> +      }
> +      messages.put(name, sw.toString().trim());
>     }
>
>     return ImmutableMap.copyOf(messages);
>
> Modified:
> incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/MessageBundleTest.java
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/MessageBundleTest.java?rev=776832&r1=776831&r2=776832&view=diff
>
> ==============================================================================
> ---
> incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/MessageBundleTest.java
> (original)
> +++
> incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/MessageBundleTest.java
> Wed May 20 20:25:50 2009
> @@ -118,6 +118,15 @@
>   }
>
>   @Test
> +  public void extractNestedTagsVerbatim() throws Exception {
> +    String xml = "<messagebundle><msg name='key'>This is <x>nested</x>
> content</msg>" +
> +                 "</messagebundle>";
> +    Element element = XmlUtil.parse(xml);
> +    MessageBundle bundle = new MessageBundle(element);
> +    assertEquals("This is <x>nested</x> content",
> bundle.getMessages().get("key"));
> +  }
> +
> +  @Test
>   public void merge() throws Exception {
>     MessageBundle parent = new MessageBundle(XmlUtil.parse(PARENT_LOCALE));
>     MessageBundle child = new MessageBundle(XmlUtil.parse(XML));
>
>
>