{"id":4455,"date":"2019-11-28T12:17:32","date_gmt":"2019-11-28T10:17:32","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=4455"},"modified":"2019-11-28T12:25:35","modified_gmt":"2019-11-28T10:25:35","slug":"snippet-jaxb-and-cdata-contenthandler-with-characterescapehandler","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2019\/11\/snippet-jaxb-and-cdata-contenthandler-with-characterescapehandler\/","title":{"rendered":"Snippet: JAXB and CDATA ContentHandler with CharacterEscapeHandler"},"content":{"rendered":"<p>Main program:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">package com.tutego.jaxb;\r\n\r\nimport javax.xml.bind.JAXBContext;\r\nimport javax.xml.bind.Marshaller;\r\nimport java.io.PrintWriter;\r\n\r\npublic class App {\r\n  public static void main( String&#x5B;] args ) throws Exception {\r\n    Dog dog = new Dog();\r\n    dog.name = &quot;W\u00fcffi&quot;;\r\n    Flea flea = new Flea();\r\n    flea.name = &quot;&lt;&gt;&lt;&gt; B\u00f6ser Floh &lt;&gt;&lt;&gt;&quot;;\r\n    dog.flea = flea;\r\n\r\n    JAXBContext jaxbContext = JAXBContext.newInstance( dog.getClass() );\r\n    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();\r\n    jaxbMarshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, true );\r\n    jaxbMarshaller.marshal( dog, new CDATAContentHandler( new PrintWriter( System.out ) ) );\r\n  }\r\n}\r\n<\/pre>\n<p>Dog and Flea:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage com.tutego.jaxb;\r\n\r\nimport javax.xml.bind.annotation.XmlRootElement;\r\n\r\n@XmlRootElement\r\npublic class Dog {\r\n  public String name;\r\n  public Flea flea;\r\n}\r\n\r\nclass Flea {\r\n  public String name;\r\n}\r\n<\/pre>\n<p>CDATAContentHandler:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage com.tutego.jaxb;\r\n\r\nimport com.sun.xml.txw2.output.CharacterEscapeHandler;\r\nimport com.sun.xml.txw2.output.DataWriter;\r\nimport org.xml.sax.SAXException;\r\nimport java.io.IOException;\r\nimport java.io.Writer;\r\n\r\npublic class CDATAContentHandler extends DataWriter {\r\n  public CDATAContentHandler( Writer writer ) {\r\n    super( writer, &quot;UTF-8&quot;, MinimumEscapeHandler.theInstance );\r\n  }\r\n\r\n  @Override\r\n  public void characters( char&#x5B;] ch, int start, int length ) throws SAXException {\r\n    boolean useCData = false;\r\n\r\n    loop:\r\n    for ( int i = start; i &lt; start + length; i++ )\r\n      switch ( ch&#x5B; i ] ) {\r\n        case '&lt;': case '&gt;': case '&amp;': useCData = true;\r\n        break loop;\r\n      }\r\n\r\n    if ( useCData ) super.startCDATA();\r\n    super.characters( ch, start, length );\r\n    if ( useCData ) super.endCDATA();\r\n  }\r\n}\r\n\r\n\/**\r\n * Performs no character escaping. Usable only when the output encoding\r\n * is UTF, but this handler gives the maximum performance.\r\n *\r\n * @author Kohsuke Kawaguchi (kohsuke.kawaguchi@sun.com)\r\n *\/\r\nclass MinimumEscapeHandler implements CharacterEscapeHandler {\r\n\r\n  private MinimumEscapeHandler() {\r\n  }  \/\/ no instanciation please\r\n\r\n  public static final CharacterEscapeHandler theInstance = new MinimumEscapeHandler();\r\n\r\n  public void escape( char&#x5B;] ch, int start, int length, boolean isAttVal, Writer out )\r\n      throws IOException {\r\n    \/\/ avoid calling the Writerwrite method too much by assuming\r\n    \/\/ that the escaping occurs rarely.\r\n    \/\/ profiling revealed that this is faster than the naive code.\r\n    int limit = start + length;\r\n    for ( int i = start; i &lt; limit; i++ ) {\r\n      char c = ch&#x5B; i ];\r\n      if ( c == '&amp;' || c == '&lt;' || c == '&gt;' || c == '\\r' || (c == '\\n' &amp;&amp; isAttVal) || (c == '\\&quot;' &amp;&amp; isAttVal) ) {\r\n        if ( i != start )\r\n          out.write( ch, start, i - start );\r\n        start = i + 1;\r\n        switch ( ch&#x5B; i ] ) {\r\n          case '&amp;':\r\n            out.write( &quot;&amp;amp;&quot; );\r\n            break;\r\n          case '&lt;':\r\n            out.write( &quot;&amp;lt;&quot; );\r\n            break;\r\n          case '&gt;':\r\n            out.write( &quot;&amp;gt;&quot; );\r\n            break;\r\n          case '\\&quot;':\r\n            out.write( &quot;&amp;quot;&quot; );\r\n            break;\r\n          case '\\n':\r\n          case '\\r':\r\n            out.write( &quot;&amp;#&quot; );\r\n            out.write( Integer.toString( c ) );\r\n            out.write( ';' );\r\n            break;\r\n          default:\r\n            throw new IllegalArgumentException( &quot;Cannot escape: '&quot; + c + &quot;'&quot; );\r\n        }\r\n      }\r\n    }\r\n\r\n    if ( start != limit )\r\n      out.write( ch, start, limit - start );\r\n  }\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Main program: package com.tutego.jaxb; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import java.io.PrintWriter; public class App { public static void main( String&#x5B;] args ) throws Exception { Dog dog = new Dog(); dog.name = &quot;W\u00fcffi&quot;; Flea flea = new Flea(); flea.name = &quot;&lt;&gt;&lt;&gt; B\u00f6ser Floh &lt;&gt;&lt;&gt;&quot;; dog.flea = flea; JAXBContext jaxbContext = JAXBContext.newInstance( dog.getClass() ); Marshaller jaxbMarshaller = [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[68],"tags":[],"class_list":["post-4455","post","type-post","status-publish","format-standard","hentry","category-snippet"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=4455"}],"version-history":[{"count":5,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4455\/revisions"}],"predecessor-version":[{"id":4461,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4455\/revisions\/4461"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=4455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=4455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=4455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}