Uploaded image for project: 'Camel'
  1. Camel
  2. CAMEL-12415

Camel-jaxb option "encoding" with option "filterNonXmlChars" generate wrong data

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Minor
    • Resolution: Fixed
    • 2.21.0
    • 2.21.1, 2.22.0
    • camel-jaxb
    • None
    • OS X 13.3, Java 8

    • Patch Available
    • Unknown
    • Patch

    Description

      When using the jaxb-component to marshal.

      The properties:

      • Encoding
      • FilterNonXmlChars

      do not work together correctly.

      FilterNonXmlChars will ignore the set encoding, and make the output bytes UTF-8 encoded.
      I would either expect this to just work, and by that I mean bytes should be encoded as the set encoding, or minimally fail during startup of the route with an exception explaining that these properties does not work together. I'd really prefer the first, since I want to use the functionality of both.

      I have provided a patch which makes this work.I have done a small refactoring to not have to duplicate more code. I can rewrite this if it is a problem.

      Below is a test which will reproduce the problem.

      public class ExplicitEncodingAndXMLCharFilteringTest extends CamelTestSupport {
      
          @Override
          public void setUp() throws Exception {
              deleteDirectory("target/charset");
              super.setUp();
          }
      
          @Test
          public void testIsoAndCharacterFiltering() throws Exception {
              PurchaseOrder order = new PurchaseOrder();
              //Data containing characters ÆØÅæøå that differ in utf-8 and iso + a spouting whale
              String name = "\u00c6\u00d8\u00C5\u00e6\u00f8\u00e5\uD83D\uDC33\uFFFD";
              String expected = "\u00c6\u00d8\u00C5\u00e6\u00f8\u00e5  \uFFFD"; //Spouting whale has become spaces
              order.setName(name);
              order.setAmount(123.45);
              order.setPrice(2.22);
      
              MockEndpoint result = getMockEndpoint("mock:file");
              result.expectedFileExists("target/charset/output.xml");
      
              template.sendBody("direct:start", order);
              assertMockEndpointsSatisfied();
      
              JAXBContext jaxbContext = JAXBContext.newInstance("org.apache.camel.example");
              Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
              InputStream inputStream = new FileInputStream("target/charset/output.xml");
              Reader reader = new InputStreamReader(inputStream, "ISO-8859-1");
              PurchaseOrder obj = (PurchaseOrder) unmarshaller.unmarshal(reader);
              assertEquals(expected, obj.getName());
          }
      
          @Override
          protected RouteBuilder createRouteBuilder() throws Exception {
              return new RouteBuilder() {
                  @Override
                  public void configure() throws Exception {
                      JaxbDataFormat jaxb = new JaxbDataFormat("org.apache.camel.example");
                      jaxb.setFilterNonXmlChars(true);
                      jaxb.setEncoding("iso-8859-1");
      
                      from("direct:start")
                              .marshal(jaxb)
                              .to("file:target/charset/?fileName=output.xml&charset=iso-8859-1");
                  }
              };
          }
      
      

       

      Attachments

        Activity

          People

            aldettinger Alex Dettinger
            MadMod Jonas Waage
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: