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 <claus.ib...@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, <cmuel...@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: cib...@fusesource.com > Web: http://fusesource.com > Twitter: davsclaus, fusenews > Blog: http://davsclaus.blogspot.com/ > Author of Camel in Action: http://www.manning.com/ibsen/ >