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 <christian.muel...@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 <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/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: 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/ >>