Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "EclipseLink/Release/2.4.0/JAXB RI Extensions/Character Escape Handler"

 
(15 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
<div style="margin:5px;float:right;border:1px solid #000000;padding:5px">__TOC__</div>
 
<div style="margin:5px;float:right;border:1px solid #000000;padding:5px">__TOC__</div>
  
= Design Documentation: CharacterEscapeHandler =
+
= Character Escape Handler =
  
[http://bugs.eclipse.org/370589 ER 370589]
+
In the current JAXB RI, developed by Sun, there is a series of "proprietary" JAXB extensions which provide advanced functionality outside of the JAXB specification (these extension classes and properties reside in the '''com.sun.xml.bind''' package).
 
+
In the current JAXB RI, developed by Sun, there are a series of "proprietary" JAXB extensions that are available to provide advanced JAXB functionality outside of the JAXB spec (these extension classes reside in the '''com.sun.xml.bind''' package).
+
  
 
The '''CharacterEscapeHandler''' interface provided in the Sun JAXB implementation allows users to write their own character escaping code, to be used when marshalling.
 
The '''CharacterEscapeHandler''' interface provided in the Sun JAXB implementation allows users to write their own character escaping code, to be used when marshalling.
  
This document will outline the design for an EclipseLink equivalent to this extension.
 
  
 +
= Behaviour =
  
= Requirements =
+
If a custom '''CharacterEscapeHandler''' is set, then that class will be responsible for all character escaping during marshal operations.
  
* Provide an interface that the user can implement, and use this implementation when escaping characters during marshal.
+
Custom escape handling is not supported when marshalling to the following targets:
* Provide drop-in-replacement support, so that users already using the Sun implementation will not need to change their code when switching to EclipseLink.
+
  
 
+
* javax.xml.stream.XMLStreamWriter
= Behaviour =
+
* javax.xml.stream.XMLEventWriter
 
+
* org.xml.sax.ContentHandler
If a custom '''CharacterEscapeHandler''' is set, then that class will be responsible for all character escaping during marshal operations.
+
* org.w3c.dom.Node
  
  
Line 27: Line 24:
 
Your custom handler should be an implementation of the '''org.eclipse.persistence.oxm.CharacterEscapeHandler''' interface.
 
Your custom handler should be an implementation of the '''org.eclipse.persistence.oxm.CharacterEscapeHandler''' interface.
  
A custom '''CharacterEscapeHandler''' can be specified on a '''Marshaller''' using the <tt>addProperty()</tt> method:
+
A custom '''CharacterEscapeHandler''' can be specified on a '''Marshaller''' using the <tt>setProperty()</tt> method:
  
 
<div style="width:850px">
 
<div style="width:850px">
Line 34: Line 31:
 
JAXBContext ctx = ...
 
JAXBContext ctx = ...
 
Marshaller m = ctx.createMarshaller();
 
Marshaller m = ctx.createMarshaller();
m.setProperty(org.eclipse.persistence.jaxb.JAXBMarshaller.CHARACTER_ESCAPE_HANDLER, new MyHandler());
+
m.setProperty(MarshallerProperties.CHARACTER_ESCAPE_HANDLER, new MyHandler());
 
...
 
...
 
</source>
 
</source>
Line 51: Line 48:
 
= Appendix A - Example CharacterEscapeHandler =
 
= Appendix A - Example CharacterEscapeHandler =
  
<div style="width:850px">
+
<div style="width:900px">
 
<source lang="java">
 
<source lang="java">
 
package example;
 
package example;
Line 61: Line 58:
  
 
public class MyHandler implements CharacterEscapeHandler {
 
public class MyHandler implements CharacterEscapeHandler {
   
+
 
 
     /**
 
     /**
     * Escape characters inside the buffer and send the output to the writer.
+
     * Escape characters inside the buffer and send the output to the Writer.
 
     *  
 
     *  
 
     * @exception IOException
 
     * @exception IOException
     *   if something goes wrong, IOException can be thrown to stop the
+
     *               In an error condition, IOException can be thrown to stop
     *   marshalling process.
+
     *               the marshalling process.
 
     */
 
     */
     public void escape( char[] buf, int start, int len, boolean isAttValue, Writer out ) throws IOException {
+
     public void escape(char[] buf, int start, int len, boolean isAttValue, Writer out) throws IOException {
         for( int i=start; i<start+len; i++ ) {
+
         for (int i = start; i < start + len; i++) {
 
             char ch = buf[i];
 
             char ch = buf[i];
           
+
 
            // you are supposed to do the standard XML character escapes
+
             if (ch == '&') {
            // like & ... &amp;  < ... &lt;  etc
+
           
+
             if( ch=='&' ) {
+
 
                 out.write("&amp;");
 
                 out.write("&amp;");
 
                 continue;
 
                 continue;
 
             }
 
             }
           
+
 
             if( ch=='"' && isAttValue ) {
+
             if (ch == '"' && isAttValue) {
                // isAttValue is set to true when the marshaller is processing
+
                // attribute values. Inside attribute values, there are more
+
                // things you need to escape, usually.
+
 
                 out.write("&quot;");
 
                 out.write("&quot;");
 
                 continue;
 
                 continue;
 
             }
 
             }
             if( ch=='\'' && isAttValue ) {
+
             if (ch == '\'' && isAttValue) {
 
                 out.write("&apos;");
 
                 out.write("&apos;");
 
                 continue;
 
                 continue;
 
             }
 
             }
           
+
 
 
             // you should handle other characters like < or >
 
             // you should handle other characters like < or >
              
+
             // ...
           
+
 
             if( ch>0x7F ) {
+
             if (ch > 0x7F) {
 
                 // escape everything above ASCII to &#xXXXX;
 
                 // escape everything above ASCII to &#xXXXX;
 
                 out.write("&#x");
 
                 out.write("&#x");
                 out.write( Integer.toHexString(ch) );
+
                 out.write(Integer.toHexString(ch));
 
                 out.write(";");
 
                 out.write(";");
 
                 continue;
 
                 continue;
 
             }
 
             }
           
+
 
 
             // otherwise print normally
 
             // otherwise print normally
 
             out.write(ch);
 
             out.write(ch);
Line 111: Line 102:
 
</source>
 
</source>
 
</div>
 
</div>
 
 
= Document History =
 
 
{|{{BMTableStyle}}
 
|-{{BMTHStyle}}
 
! Date
 
! Author
 
! Version Description & Notes
 
|-
 
| 120222
 
| Rick Barkhouse
 
| 1.00 : First draft
 
|}<br>
 

Latest revision as of 11:36, 18 June 2012

Character Escape Handler

In the current JAXB RI, developed by Sun, there is a series of "proprietary" JAXB extensions which provide advanced functionality outside of the JAXB specification (these extension classes and properties reside in the com.sun.xml.bind package).

The CharacterEscapeHandler interface provided in the Sun JAXB implementation allows users to write their own character escaping code, to be used when marshalling.


Behaviour

If a custom CharacterEscapeHandler is set, then that class will be responsible for all character escaping during marshal operations.

Custom escape handling is not supported when marshalling to the following targets:

  • javax.xml.stream.XMLStreamWriter
  • javax.xml.stream.XMLEventWriter
  • org.xml.sax.ContentHandler
  • org.w3c.dom.Node


Configuration

Your custom handler should be an implementation of the org.eclipse.persistence.oxm.CharacterEscapeHandler interface.

A custom CharacterEscapeHandler can be specified on a Marshaller using the setProperty() method:

...
JAXBContext ctx = ...
Marshaller m = ctx.createMarshaller();
m.setProperty(MarshallerProperties.CHARACTER_ESCAPE_HANDLER, new MyHandler());
...

Note: EclipseLink also supports Sun's CharacterEscapeHandler property names:

m.setProperty("com.sun.xml.bind.marshaller.CharacterEscapeHandler", new MyHandler());
m.setProperty("com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler", new MyHandler());


Appendix A - Example CharacterEscapeHandler

package example;
 
import java.io.IOException;
import java.io.Writer;
 
import org.eclipse.persistence.oxm.CharacterEscapeHandler;
 
public class MyHandler implements CharacterEscapeHandler {
 
    /**
     * Escape characters inside the buffer and send the output to the Writer.
     * 
     * @exception IOException
     *                In an error condition, IOException can be thrown to stop
     *                the marshalling process.
     */
    public void escape(char[] buf, int start, int len, boolean isAttValue, Writer out) throws IOException {
        for (int i = start; i < start + len; i++) {
            char ch = buf[i];
 
            if (ch == '&') {
                out.write("&amp;");
                continue;
            }
 
            if (ch == '"' && isAttValue) {
                out.write("&quot;");
                continue;
            }
            if (ch == '\'' && isAttValue) {
                out.write("&apos;");
                continue;
            }
 
            // you should handle other characters like < or >
            // ...
 
            if (ch > 0x7F) {
                // escape everything above ASCII to &#xXXXX;
                out.write("&#x");
                out.write(Integer.toHexString(ch));
                out.write(";");
                continue;
            }
 
            // otherwise print normally
            out.write(ch);
        }
    }
}

Copyright © Eclipse Foundation, Inc. All Rights Reserved.