Author: cmueller Date: Thu May 10 19:15:26 2012 New Revision: 1336836 URL: http://svn.apache.org/viewvc?rev=1336836&view=rev Log: CAMEL-5267: Improve camel-jaxb to be able to set a custom NameSpacePrefixMapper
Modified: camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/converter/jaxb/JaxbDataFormatMultipleNamespacesTest.java Modified: camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java?rev=1336836&r1=1336835&r2=1336836&view=diff ============================================================================== --- camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java (original) +++ camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java Thu May 10 19:15:26 2012 @@ -43,6 +43,8 @@ import org.apache.camel.util.ObjectHelpe import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.sun.xml.bind.marshaller.NamespacePrefixMapper; + /** * A <a href="http://camel.apache.org/data-format.html">data format</a> ({@link DataFormat}) * using JAXB2 to marshal to and from XML @@ -64,6 +66,7 @@ public class JaxbDataFormat extends Serv private QName partNamespace; private String partClass; private Class<Object> partialClass; + private NamespacePrefixMapper nameSpacePrefixMapper; private TypeConverter typeConverter; @@ -82,6 +85,9 @@ public class JaxbDataFormat extends Serv try { // must create a new instance of marshaller as its not thread safe Marshaller marshaller = getContext().createMarshaller(); + if (nameSpacePrefixMapper != null) { + marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", nameSpacePrefixMapper); + } if (isPrettyPrint()) { marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); } @@ -244,6 +250,14 @@ public class JaxbDataFormat extends Serv public void setCamelContext(CamelContext camelContext) { this.camelContext = camelContext; } + + public NamespacePrefixMapper getNameSpacePrefixMapper() { + return nameSpacePrefixMapper; + } + + public void setNameSpacePrefixMapper(NamespacePrefixMapper nameSpacePrefixMapper) { + this.nameSpacePrefixMapper = nameSpacePrefixMapper; + } @Override protected void doStart() throws Exception { @@ -287,5 +301,4 @@ public class JaxbDataFormat extends Serv protected Unmarshaller createUnmarshaller() throws JAXBException { return getContext().createUnmarshaller(); } - } Modified: camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/converter/jaxb/JaxbDataFormatMultipleNamespacesTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/converter/jaxb/JaxbDataFormatMultipleNamespacesTest.java?rev=1336836&r1=1336835&r2=1336836&view=diff ============================================================================== --- camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/converter/jaxb/JaxbDataFormatMultipleNamespacesTest.java (original) +++ camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/converter/jaxb/JaxbDataFormatMultipleNamespacesTest.java Thu May 10 19:15:26 2012 @@ -26,6 +26,8 @@ import org.apache.camel.example.Order; import org.apache.camel.test.junit4.CamelTestSupport; import org.junit.Test; +import com.sun.xml.bind.marshaller.NamespacePrefixMapper; + public class JaxbDataFormatMultipleNamespacesTest extends CamelTestSupport { @EndpointInject(uri = "mock:marshall") @@ -59,6 +61,35 @@ public class JaxbDataFormatMultipleNames assertTrue(payload.contains("city>Sulzbach</")); assertTrue(payload.contains("order>")); } + + @Test + public void testMarshallWithNamespacePrefixMapper() throws Exception { + mockMarshall.expectedMessageCount(1); + + Order order = new Order(); + order.setId("1"); + Address address = new Address(); + address.setStreet("Main Street"); + address.setStreetNumber("3a"); + address.setZip("65843"); + address.setCity("Sulzbach"); + order.setAddress(address); + template.sendBody("direct:marshallWithNamespacePrefixMapper", order); + + assertMockEndpointsSatisfied(); + + String payload = mockMarshall.getExchanges().get(0).getIn().getBody(String.class); + assertTrue(payload.startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>")); + assertTrue(payload.contains("<order:order xmlns:order=\"http://www.camel.apache.org/jaxb/example/order/1\" xmlns:address=\"http://www.camel.apache.org/jaxb/example/address/1\">")); + assertTrue(payload.contains("<order:id>1</order:id>")); + assertTrue(payload.contains("<address:address>")); + assertTrue(payload.contains("<address:street>Main Street</address:street>")); + assertTrue(payload.contains("<address:streetNumber>3a</address:streetNumber>")); + assertTrue(payload.contains("<address:zip>65843</address:zip>")); + assertTrue(payload.contains("<address:city>Sulzbach</address:city>")); + assertTrue(payload.contains("</address:address>")); + assertTrue(payload.contains("</order:order>")); + } @Test public void testUnarshallMultipleNamespaces() throws Exception { @@ -87,9 +118,25 @@ public class JaxbDataFormatMultipleNames public void configure() throws Exception { JaxbDataFormat jaxbDataFormat = new JaxbDataFormat(JAXBContext.newInstance(Order.class, Address.class)); + JaxbDataFormat jaxbDataFormatWithNamespacePrefixMapper = new JaxbDataFormat(JAXBContext.newInstance(Order.class, Address.class)); + jaxbDataFormatWithNamespacePrefixMapper.setNameSpacePrefixMapper(new NamespacePrefixMapper() { + public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) { + if (namespaceUri.equals("http://www.camel.apache.org/jaxb/example/order/1")) { + return "order"; + } else if (namespaceUri.equals("http://www.camel.apache.org/jaxb/example/address/1")) { + return "address"; + } + return "ns"; + } + }); + from("direct:marshall") .marshal(jaxbDataFormat) .to("mock:marshall"); + + from("direct:marshallWithNamespacePrefixMapper") + .marshal(jaxbDataFormatWithNamespacePrefixMapper) + .to("mock:marshall"); from("direct:unmarshall") .unmarshal(jaxbDataFormat)