You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by cm...@apache.org on 2012/05/10 21:15:26 UTC

svn commit: r1336836 - in /camel/trunk/components/camel-jaxb/src: main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java test/java/org/apache/camel/converter/jaxb/JaxbDataFormatMultipleNamespacesTest.java

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)



Re: svn commit: r1336836 - in /camel/trunk/components/camel-jaxb/src: main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java test/java/org/apache/camel/converter/jaxb/JaxbDataFormatMultipleNamespacesTest.java

Posted by Daniel Kulp <dk...@apache.org>.
We ran into the same thing with CXF a long time ago.   It's also a bit more 
complex than just referencing the NamespaceMapper class.   The "key" that is 
used to set it into the context is also different with the built in version 
of JAXB as even the "key" gets the ".internal" into it.

For CXF, we actually have the user set the namespaces into the settings as a 
straight Map<String, String>.   We then use a bit of ASM magic in some cases 
to create a NamespaceMapper from that map and set that on the context.  If 
you really want to look, see:

http://svn.apache.org/repos/asf/cxf/trunk/api/src/main/java/org/apache/cxf/common/jaxb/JAXBUtils.java

the setNamespaceWrapper call.   By using a Map like that, we CAN possible 
update that setNamespaceWrapper call to support other JAXB impls as well 
(potentially Moxy is one) if there is enough demand.


Dan




On Friday, May 11, 2012 08:36:13 AM Christian Müller wrote:
> Good morning Claus!
> 
> I had the same thoughts, but because this class comes from
> jaxb-impl-2.1.13, I assume it will not be a problem with an IBM JDK. I use
> the Apple JDK (Java version: 1.6.0_31, vendor: Apple Inc.) and it works
> well.
> 
> NamespacePrefixMapper is an abstract class which doesn't implement any
> interface.
> Another possibility is to use the java.lang.Object as type for the
> instance variable and the getter/setter and not
> com.sun.xml.bind.marshaller.NamespacePrefixMapper. This is possible,
> because this instance is passed thru the marshaller.setProperty(String,
> Object) method. Than we don't have any imports on
> com.sun.xml.bind.marshaller.NamespacePrefixMapper but may a runtime
> exception if users set Objects from a wrong type (I didn't test whether
> JAXB RI ignore it or throw an exception).
> 
> Thoughts?
> 
> Best,
> Christian
> 

-- 
Daniel Kulp
dkulp@apache.org - http://dankulp.com/blog
Talend Community Coder - http://coders.talend.com


Re: svn commit: r1336836 - in /camel/trunk/components/camel-jaxb/src: main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java test/java/org/apache/camel/converter/jaxb/JaxbDataFormatMultipleNamespacesTest.java

Posted by Christian Müller <ch...@gmail.com>.
Done.
Thanks again Babak for the hint.

Best,
Christian

On Fri, May 11, 2012 at 5:58 PM, Christian Müller <
christian.mueller@gmail.com> wrote:

> Good catch!
>
> I will write a test which proves this. If it works, I will revert my
> changes for this issue.
>
> Best,
> Christian
>
>
> On Fri, May 11, 2012 at 9:48 AM, Babak Vahdat <babak.vahdat@swissonline.ch
> > wrote:
>
>> Hi again,
>>
>> Just found that we've got exactly the same thing here as well (since
>> ages):
>>
>>
>> https://svn.apache.org/repos/asf/camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/util/JAXBMarshallerResolver.java
>>
>> Which came through:
>>
>> https://issues.apache.org/jira/browse/CAMEL-2280
>>
>> Babak
>>
>> --
>> View this message in context:
>> http://camel.465427.n5.nabble.com/Re-svn-commit-r1336836-in-camel-trunk-components-camel-jaxb-src-main-java-org-apache-camel-convertera-tp5702070p5702360.html
>> Sent from the Camel Development mailing list archive at Nabble.com.
>>
>
>

Re: svn commit: r1336836 - in /camel/trunk/components/camel-jaxb/src: main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java test/java/org/apache/camel/converter/jaxb/JaxbDataFormatMultipleNamespacesTest.java

Posted by Christian Müller <ch...@gmail.com>.
Good catch!

I will write a test which proves this. If it works, I will revert my
changes for this issue.

Best,
Christian

On Fri, May 11, 2012 at 9:48 AM, Babak Vahdat
<ba...@swissonline.ch>wrote:

> Hi again,
>
> Just found that we've got exactly the same thing here as well (since ages):
>
>
> https://svn.apache.org/repos/asf/camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/util/JAXBMarshallerResolver.java
>
> Which came through:
>
> https://issues.apache.org/jira/browse/CAMEL-2280
>
> Babak
>
> --
> View this message in context:
> http://camel.465427.n5.nabble.com/Re-svn-commit-r1336836-in-camel-trunk-components-camel-jaxb-src-main-java-org-apache-camel-convertera-tp5702070p5702360.html
> Sent from the Camel Development mailing list archive at Nabble.com.
>

Re: svn commit: r1336836 - in /camel/trunk/components/camel-jaxb/src: main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java test/java/org/apache/camel/converter/jaxb/JaxbDataFormatMultipleNamespacesTest.java

Posted by Babak Vahdat <ba...@swissonline.ch>.
Hi again,

Just found that we've got exactly the same thing here as well (since ages):

https://svn.apache.org/repos/asf/camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/util/JAXBMarshallerResolver.java

Which came through:

https://issues.apache.org/jira/browse/CAMEL-2280

Babak

--
View this message in context: http://camel.465427.n5.nabble.com/Re-svn-commit-r1336836-in-camel-trunk-components-camel-jaxb-src-main-java-org-apache-camel-convertera-tp5702070p5702360.html
Sent from the Camel Development mailing list archive at Nabble.com.

Re: svn commit: r1336836 - in /camel/trunk/components/camel-jaxb/src: main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java test/java/org/apache/camel/converter/jaxb/JaxbDataFormatMultipleNamespacesTest.java

Posted by Babak Vahdat <ba...@swissonline.ch>.
Good morning

Not sure if I'm missing anything here about the requested feature but I
think there's no extra feature/functionality we should provide for this
as that's already given out of the box through the JAXB's own *public*
API:

See the Javadoc examples here:

http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlSchema.html

Also in Camel source itself we've got a lot of usages of this, like:

https://svn.apache.org/repos/asf/camel/trunk/camel-core/src/main/java/org/apache/camel/package-info.java

The only think the folks should remember is that by each invocation
of xjc this package-info.java file get's overwritten, so they should keep
the "-npa" option in mind if they don't want to loose their custom
namespace prefixes. Also the equivalent maven plugin (maven-jaxb2-plugin)
does provide the same "-npa" option as well.

Babak

--
View this message in context: http://camel.465427.n5.nabble.com/Re-svn-commit-r1336836-in-camel-trunk-components-camel-jaxb-src-main-java-org-apache-camel-convertera-tp5702070p5702306.html
Sent from the Camel Development mailing list archive at Nabble.com.

Re: svn commit: r1336836 - in /camel/trunk/components/camel-jaxb/src: main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java test/java/org/apache/camel/converter/jaxb/JaxbDataFormatMultipleNamespacesTest.java

Posted by Babak Vahdat <ba...@swissonline.ch>.
Good morning

Not sure if I'm missing anything here about the requested feature but I
think there's no extra feature/functionality we should provide for this
as that's already given out of the box through the JAXB's own *public*
API:

See the Javadoc examples here:

http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlSchem
a.html

Also in Camel source itself we've got a lot of usages of this, like:

https://svn.apache.org/repos/asf/camel/trunk/camel-core/src/main/java/org/a
pache/camel/package-info.java

The only think the folks should remember is that by each invocation
of xjc this package-info.java file get's overwritten, so they should keep
the "-npa" option in mind if they don't want to loose their custom
namespace
prefixes. Also the equivalent maven plugin (maven-jaxb2-plugin) does
provide
the same "-npa" option as well.

Babak


Am 11.05.12 08:36 schrieb "Christian Müller" unter
<ch...@gmail.com>:

>Good morning Claus!
>
>I had the same thoughts, but because this class comes from
>jaxb-impl-2.1.13, I assume it will not be a problem with an IBM JDK. I use
>the Apple JDK (Java version: 1.6.0_31, vendor: Apple Inc.) and it works
>well.
>
>NamespacePrefixMapper is an abstract class which doesn't implement any
>interface.
>Another possibility is to use the java.lang.Object as type for the
>instance
>variable and the getter/setter and not
>com.sun.xml.bind.marshaller.NamespacePrefixMapper. This is possible,
>because this instance is passed thru the marshaller.setProperty(String,
>Object) method. Than we don't have any imports on
>com.sun.xml.bind.marshaller.NamespacePrefixMapper but may a runtime
>exception if users set Objects from a wrong type (I didn't test whether
>JAXB RI ignore it or throw an exception).
>
>Thoughts?
>
>Best,
>Christian
>
>On Fri, May 11, 2012 at 5:57 AM, Claus Ibsen <cl...@gmail.com>
>wrote:
>
>> Morning guys
>>
>> Christian I noticed that you import a com.sun package.
>> +import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
>>
>> Will this not be problems for people using IBM JVMs etc?
>> I would normally discourage against using com.sun packages, especially
>> in camel-core.
>>
>> Maybe there is an interface for the mapper? Or we could create an
>> interface, and allow people to plugin the SUN if they configure that
>> themselves etc.
>>
>> Or maybe we can use reflection to load the mapper class or something?
>> Just so at least the code can compile on IBM JDKs and run there.
>>
>> And I wonder about OpenJDK as well? Do they carry the com.sun classes as
>> well?
>>
>>
>> On Thu, May 10, 2012 at 9:15 PM,  <cm...@apache.org> wrote:
>> > 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/converte
>>r/jaxb/JaxbDataFormat.java
>> >
>>  
>>camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/converte
>>r/jaxb/JaxbDataFormatMultipleNamespacesTest.java
>> >
>> > Modified:
>> 
>>camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converte
>>r/jaxb/JaxbDataFormat.java
>> > URL:
>> 
>>http://svn.apache.org/viewvc/camel/trunk/components/camel-jaxb/src/main/j
>>ava/org/apache/camel/converter/jaxb/JaxbDataFormat.java?rev=1336836&r1=13
>>36835&r2=1336836&view=diff
>> >
>> 
>>=========================================================================
>>=====
>> > ---
>> 
>>camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converte
>>r/jaxb/JaxbDataFormat.java
>> (original)
>> > +++
>> 
>>camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converte
>>r/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/converte
>>r/jaxb/JaxbDataFormatMultipleNamespacesTest.java
>> > URL:
>> 
>>http://svn.apache.org/viewvc/camel/trunk/components/camel-jaxb/src/test/j
>>ava/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/converte
>>r/jaxb/JaxbDataFormatMultipleNamespacesTest.java
>> (original)
>> > +++
>> 
>>camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/converte
>>r/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:streetNumb
>>er>"));
>> > +
>>  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)
>> >
>> >
>>
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> CamelOne 2012 Conference, May 15-16, 2012: http://camelone.com
>> FuseSource
>> Email: cibsen@fusesource.com
>> Web: http://fusesource.com
>> Twitter: davsclaus, fusenews
>> Blog: http://davsclaus.blogspot.com/
>> Author of Camel in Action: http://www.manning.com/ibsen/
>>



Re: svn commit: r1336836 - in /camel/trunk/components/camel-jaxb/src: main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java test/java/org/apache/camel/converter/jaxb/JaxbDataFormatMultipleNamespacesTest.java

Posted by Christian Müller <ch...@gmail.com>.
Good morning Claus!

I had the same thoughts, but because this class comes from
jaxb-impl-2.1.13, I assume it will not be a problem with an IBM JDK. I use
the Apple JDK (Java version: 1.6.0_31, vendor: Apple Inc.) and it works
well.

NamespacePrefixMapper is an abstract class which doesn't implement any
interface.
Another possibility is to use the java.lang.Object as type for the instance
variable and the getter/setter and not
com.sun.xml.bind.marshaller.NamespacePrefixMapper. This is possible,
because this instance is passed thru the marshaller.setProperty(String,
Object) method. Than we don't have any imports on
com.sun.xml.bind.marshaller.NamespacePrefixMapper but may a runtime
exception if users set Objects from a wrong type (I didn't test whether
JAXB RI ignore it or throw an exception).

Thoughts?

Best,
Christian

On Fri, May 11, 2012 at 5:57 AM, Claus Ibsen <cl...@gmail.com> wrote:

> Morning guys
>
> Christian I noticed that you import a com.sun package.
> +import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
>
> Will this not be problems for people using IBM JVMs etc?
> I would normally discourage against using com.sun packages, especially
> in camel-core.
>
> Maybe there is an interface for the mapper? Or we could create an
> interface, and allow people to plugin the SUN if they configure that
> themselves etc.
>
> Or maybe we can use reflection to load the mapper class or something?
> Just so at least the code can compile on IBM JDKs and run there.
>
> And I wonder about OpenJDK as well? Do they carry the com.sun classes as
> well?
>
>
> On Thu, May 10, 2012 at 9:15 PM,  <cm...@apache.org> wrote:
> > 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)
> >
> >
>
>
>
> --
> Claus Ibsen
> -----------------
> CamelOne 2012 Conference, May 15-16, 2012: http://camelone.com
> FuseSource
> Email: cibsen@fusesource.com
> Web: http://fusesource.com
> Twitter: davsclaus, fusenews
> Blog: http://davsclaus.blogspot.com/
> Author of Camel in Action: http://www.manning.com/ibsen/
>

Re: svn commit: r1336836 - in /camel/trunk/components/camel-jaxb/src: main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java test/java/org/apache/camel/converter/jaxb/JaxbDataFormatMultipleNamespacesTest.java

Posted by Christian Müller <ch...@gmail.com>.
And the import
+import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
is in camel-jaxb, not camel-core...

Best,
Christian

On Fri, May 11, 2012 at 5:57 AM, Claus Ibsen <cl...@gmail.com> wrote:

> Morning guys
>
> Christian I noticed that you import a com.sun package.
> +import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
>
> Will this not be problems for people using IBM JVMs etc?
> I would normally discourage against using com.sun packages, especially
> in camel-core.
>
> Maybe there is an interface for the mapper? Or we could create an
> interface, and allow people to plugin the SUN if they configure that
> themselves etc.
>
> Or maybe we can use reflection to load the mapper class or something?
> Just so at least the code can compile on IBM JDKs and run there.
>
> And I wonder about OpenJDK as well? Do they carry the com.sun classes as
> well?
>
>
> On Thu, May 10, 2012 at 9:15 PM,  <cm...@apache.org> wrote:
> > 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)
> >
> >
>
>
>
> --
> Claus Ibsen
> -----------------
> CamelOne 2012 Conference, May 15-16, 2012: http://camelone.com
> FuseSource
> Email: cibsen@fusesource.com
> Web: http://fusesource.com
> Twitter: davsclaus, fusenews
> Blog: http://davsclaus.blogspot.com/
> Author of Camel in Action: http://www.manning.com/ibsen/
>

Re: svn commit: r1336836 - in /camel/trunk/components/camel-jaxb/src: main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java test/java/org/apache/camel/converter/jaxb/JaxbDataFormatMultipleNamespacesTest.java

Posted by Claus Ibsen <cl...@gmail.com>.
Morning guys

Christian I noticed that you import a com.sun package.
+import com.sun.xml.bind.marshaller.NamespacePrefixMapper;

Will this not be problems for people using IBM JVMs etc?
I would normally discourage against using com.sun packages, especially
in camel-core.

Maybe there is an interface for the mapper? Or we could create an
interface, and allow people to plugin the SUN if they configure that
themselves etc.

Or maybe we can use reflection to load the mapper class or something?
Just so at least the code can compile on IBM JDKs and run there.

And I wonder about OpenJDK as well? Do they carry the com.sun classes as well?


On Thu, May 10, 2012 at 9:15 PM,  <cm...@apache.org> wrote:
> 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)
>
>



-- 
Claus Ibsen
-----------------
CamelOne 2012 Conference, May 15-16, 2012: http://camelone.com
FuseSource
Email: cibsen@fusesource.com
Web: http://fusesource.com
Twitter: davsclaus, fusenews
Blog: http://davsclaus.blogspot.com/
Author of Camel in Action: http://www.manning.com/ibsen/