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)


Reply via email to