You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by bi...@apache.org on 2007/11/28 02:06:48 UTC

svn commit: r598839 - in /incubator/cxf/trunk: rt/databinding/jaxb/src/main/java/org/apache/cxf/endpoint/dynamic/ rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/ rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/ rt/databinding/jaxb/src/t...

Author: bimargulies
Date: Tue Nov 27 17:06:45 2007
New Revision: 598839

URL: http://svn.apache.org/viewvc?rev=598839&view=rev
Log:
Allow applications to supply JAXB context and Marshaller properties. This allows complete control of prefixes on the wire for types managed by JAXB, aside from other sneaky tricks.

Added:
    incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/fortest/
    incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/fortest/unqualified/
    incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/fortest/unqualified/UnqualifiedBean.java
Modified:
    incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/endpoint/dynamic/DynamicClientFactory.java
    incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
    incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
    incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataWriterImpl.java
    incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java
    incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBEncoderDecoderTest.java
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java

Modified: incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/endpoint/dynamic/DynamicClientFactory.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/endpoint/dynamic/DynamicClientFactory.java?rev=598839&r1=598838&r2=598839&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/endpoint/dynamic/DynamicClientFactory.java (original)
+++ incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/endpoint/dynamic/DynamicClientFactory.java Tue Nov 27 17:06:45 2007
@@ -26,7 +26,9 @@
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
+import java.util.Map;
 import java.util.StringTokenizer;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -84,6 +86,8 @@
 
     private boolean simpleBindingEnabled = true;
     
+    private Map<String, Object> jaxbContextProperties;
+    
     private DynamicClientFactory(Bus bus) {
         this.bus = bus;
     }
@@ -225,12 +229,17 @@
         }
 
         JAXBContext context;
-
+        Map<String, Object> contextProperties = jaxbContextProperties;
+        
+        if (contextProperties == null) {
+            contextProperties = Collections.emptyMap();
+        }
+        
         try {
             if (StringUtils.isEmpty(packageList)) {
-                context = JAXBContext.newInstance(new Class[0]);
+                context = JAXBContext.newInstance(new Class[0], contextProperties);
             } else {
-                context = JAXBContext.newInstance(packageList, cl);
+                context = JAXBContext.newInstance(packageList, cl, contextProperties);
             }
         } catch (JAXBException jbe) {
             throw new IllegalStateException("Unable to create JAXBContext for generated packages: "
@@ -445,5 +454,21 @@
             }
             return null;
         }
+    }
+
+    /**
+     * Return the map of JAXB context properties used at the time that we create new contexts.
+     * @return the map
+     */
+    public Map<String, Object> getJaxbContextProperties() {
+        return jaxbContextProperties;
+    }
+
+    /**
+     * Set the map of JAXB context properties used at the time that we create new contexts.
+     * @param jaxbContextProperties
+     */
+    public void setJaxbContextProperties(Map<String, Object> jaxbContextProperties) {
+        this.jaxbContextProperties = jaxbContextProperties;
     }
 }

Modified: incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java?rev=598839&r1=598838&r2=598839&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java (original)
+++ incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java Tue Nov 27 17:06:45 2007
@@ -27,6 +27,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -97,6 +98,9 @@
 
     Class<?> cls;
 
+    private Map<String, Object> contextProperties = Collections.emptyMap();
+    private Map<String, Object> marshallerProperties = Collections.emptyMap();
+
     
     public JAXBDataBinding() {
     }
@@ -123,13 +127,14 @@
     @SuppressWarnings("unchecked")
     public <T> DataWriter<T> createWriter(Class<T> c) {
         if (c == XMLStreamWriter.class) {
-            return (DataWriter<T>)new DataWriterImpl<XMLStreamWriter>(context);
+            return (DataWriter<T>)new DataWriterImpl<XMLStreamWriter>(context, marshallerProperties);
         } else if (c == OutputStream.class) {
-            return (DataWriter<T>)new DataWriterImpl<OutputStream>(context);            
+            return (DataWriter<T>)new DataWriterImpl<OutputStream>(context, marshallerProperties);            
         } else if (c == XMLEventWriter.class) {
-            return (DataWriter<T>)new DataWriterImpl<XMLEventWriter>(context);           
+            return (DataWriter<T>)new DataWriterImpl<XMLEventWriter>(context,
+                                                                     marshallerProperties);           
         } else if (c == Node.class) {
-            return (DataWriter<T>)new DataWriterImpl<Node>(context);      
+            return (DataWriter<T>)new DataWriterImpl<Node>(context, marshallerProperties);      
         }
         
         return null;
@@ -312,6 +317,11 @@
             map.put("com.sun.xml.bind.defaultNamespaceRemap", defaultNs);
         }
         
+        if (contextProperties != null) {
+            //add any specified context properties into the properties map
+            map.putAll(contextProperties);
+        }
+        
         //try and read any jaxb.index files that are with the other classes.  This should 
         //allow loading of extra classes (such as subclasses for inheritance reasons) 
         //that are in the same package.
@@ -425,6 +435,27 @@
      */
     public Map<String, String> getDeclaredNamespaceMappings() {
         return null;
+    }
+
+    /**
+     * Return a map of properties. These properties are passed to
+     * JAXBContext.newInstance when this object creates a context.
+     * @return the map of JAXB context properties.
+     */
+    public Map<String, Object> getContextProperties() {
+        return contextProperties;
+    }
+
+    /**
+     * Set a map of JAXB context properties. These properties are passed
+     * to JAXBContext.newInstance when this object creates a context.
+     * Note that if you create a JAXB context elsewhere, you will 
+     * not respect these properties unless you handle it manually. 
+     * 
+     * @param contextProperties map of properties.
+     */
+    public void setContextProperties(Map<String, Object> contextProperties) {
+        this.contextProperties = contextProperties;
     }
     
     

Modified: incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java?rev=598839&r1=598838&r2=598839&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java (original)
+++ incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java Tue Nov 27 17:06:45 2007
@@ -33,12 +33,16 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.ResourceBundle;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBElement;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
+import javax.xml.bind.PropertyException;
 import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
@@ -58,6 +62,7 @@
 
 import org.apache.cxf.common.i18n.BundleUtils;
 import org.apache.cxf.common.i18n.Message;
+import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.service.model.MessagePartInfo;
@@ -72,11 +77,14 @@
  */
 public final class JAXBEncoderDecoder {
     private static final ResourceBundle BUNDLE = BundleUtils.getBundle(JAXBEncoderDecoder.class);
+    private static final Logger LOG = LogUtils.getLogger(JAXBEncoderDecoder.class);
     
     private JAXBEncoderDecoder() {
     }
 
-    private static Marshaller createMarshaller(JAXBContext context, Class<?> cls) throws JAXBException {
+    private static Marshaller createMarshaller(JAXBContext context, Class<?> cls,
+                                               Map<String, Object> marshallerProperties)
+        throws JAXBException {
         Marshaller jm = null;
         if (context == null) {
             context = JAXBContext.newInstance(cls);
@@ -85,6 +93,15 @@
         jm = context.createMarshaller();
         jm.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
         jm.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
+        if (marshallerProperties != null) {
+            for (Map.Entry<String, Object> propEntry : marshallerProperties.entrySet()) {
+                try {
+                    jm.setProperty(propEntry.getKey(), propEntry.getValue());
+                } catch (PropertyException pe) {
+                    LOG.log(Level.INFO, "PropertyException setting Marshaller properties", pe);
+                }
+            }
+        }
 
         return jm;
     }
@@ -95,7 +112,8 @@
                                 Object elValue, 
                                 MessagePartInfo part,
                                 Object source, 
-                                AttachmentMarshaller am) {
+                                AttachmentMarshaller am,
+                                Map<String, Object> marshallerProperties) {
         Class<?> cls = null;
         if (part != null) {
             cls = part.getTypeClass();
@@ -111,7 +129,7 @@
         }
         
         try {
-            Marshaller u = createMarshaller(context, cls);
+            Marshaller u = createMarshaller(context, cls, marshallerProperties);
             try {
                 // The Marshaller.JAXB_FRAGMENT will tell the Marshaller not to
                 // generate the xml declaration.
@@ -196,7 +214,8 @@
                                 Exception elValue, 
                                 MessagePartInfo part,
                                 Object source, 
-                                AttachmentMarshaller am) {
+                                AttachmentMarshaller am,
+                                Map<String, Object> marshallerProperties) {
         XMLStreamWriter writer = getStreamWriter(source);
         QName qn = part.getElementQName();
         try {
@@ -209,8 +228,9 @@
             XmlAccessType accessType = accessorType != null 
                 ? accessorType.value() : XmlAccessType.PUBLIC_MEMBER;
             String namespace = part.getElementQName().getNamespaceURI();
-            Marshaller u = createMarshaller(context, cls);
+            Marshaller u = createMarshaller(context, cls, marshallerProperties);
             try {
+                // override anything the user asked us to set.
                 // The Marshaller.JAXB_FRAGMENT will tell the Marshaller not to
                 // generate the xml declaration.
                 u.setProperty(Marshaller.JAXB_FRAGMENT, true);
@@ -347,16 +367,18 @@
         throw new Fault(new Message("UNKNOWN_SOURCE", BUNDLE, source.getClass().getName()));
     }
 
-    public static void marshall(JAXBContext context, Schema schema, Object elValue, Object source) {
-        marshall(context, schema, elValue, null, source, null);
+    public static void marshall(JAXBContext context, Schema schema, Object elValue, Object source,
+                                Map<String, Object> marshallerProperties) {
+        marshall(context, schema, elValue, null, source, null, marshallerProperties);
     }
     
     @SuppressWarnings("unchecked")
     public static void marshallNullElement(JAXBContext context, Schema schema, 
-                                               Object source, MessagePartInfo part) {
+                                           Object source, MessagePartInfo part,
+                                           Map<String, Object> marshallerProperties) {
         Class<?> clazz = part != null ? (Class) part.getTypeClass() : null;
         try {
-            Marshaller u = createMarshaller(context, clazz);
+            Marshaller u = createMarshaller(context, clazz, marshallerProperties);
             u.setSchema(schema);
             try {
                 // The Marshaller.JAXB_FRAGMENT will tell the Marshaller not to
@@ -375,8 +397,9 @@
     public static void marshall(JAXBContext context, Schema schema, 
                                 Object elValue, 
                                 MessagePartInfo part,
-                                Object source) {
-        marshall(context, schema, elValue, part, source, null);
+                                Object source,
+                                Map<String, Object> marshallerProperties) {
+        marshall(context, schema, elValue, part, source, null, marshallerProperties);
     }
 
     private static Unmarshaller createUnmarshaller(JAXBContext context, Class<?> cls) throws JAXBException {

Modified: incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataWriterImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataWriterImpl.java?rev=598839&r1=598838&r2=598839&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataWriterImpl.java (original)
+++ incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataWriterImpl.java Tue Nov 27 17:06:45 2007
@@ -19,6 +19,9 @@
 
 package org.apache.cxf.jaxb.io;
 
+import java.util.Collections;
+import java.util.Map;
+
 import javax.xml.bind.JAXBContext;
 
 import org.apache.cxf.databinding.DataWriter;
@@ -29,10 +32,18 @@
 import org.apache.ws.commons.schema.XmlSchemaElement;
 
 public class DataWriterImpl<T> extends JAXBDataBase implements DataWriter<T> {
+    
+    private Map<String, Object> marshallerProperties = Collections.emptyMap();
+    
     public DataWriterImpl(JAXBContext ctx) {
         super(ctx);
     }
     
+    public DataWriterImpl(JAXBContext ctx, Map<String, Object> marshallerProperties) {
+        super(ctx);
+        this.marshallerProperties = marshallerProperties;
+    }
+    
     public void write(Object obj, T output) {
         write(obj, null, output);
     }
@@ -46,13 +57,16 @@
                 && Boolean.TRUE.equals(part.getProperty(JAXBDataBinding.class.getName() 
                                                         + ".CUSTOM_EXCEPTION"))) {
                 JAXBEncoderDecoder.marshallException(getJAXBContext(), getSchema(), (Exception)obj,
-                                                     part, output, getAttachmentMarshaller());                
+                                                     part, output, getAttachmentMarshaller(),
+                                                     marshallerProperties);                
             } else {
                 JAXBEncoderDecoder.marshall(getJAXBContext(), getSchema(), obj, part, output, 
-                                        getAttachmentMarshaller());
+                                        getAttachmentMarshaller(),
+                                        marshallerProperties);
             }
         } else if (obj == null && needToRender(obj, part)) {
-            JAXBEncoderDecoder.marshallNullElement(getJAXBContext(), getSchema(), output, part);
+            JAXBEncoderDecoder.marshallNullElement(getJAXBContext(), getSchema(), output, part,
+                                                   marshallerProperties);
         }
     }
 
@@ -62,5 +76,13 @@
             return element.isNillable() && element.getMinOccurs() > 0;
         }
         return false;
+    }
+
+    public Map<String, Object> getMarshallerProperties() {
+        return marshallerProperties;
+    }
+
+    public void setMarshallerProperties(Map<String, Object> marshallerProperties) {
+        this.marshallerProperties = marshallerProperties;
     }
 }

Modified: incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java?rev=598839&r1=598838&r2=598839&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java (original)
+++ incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java Tue Nov 27 17:06:45 2007
@@ -21,9 +21,12 @@
 
 
 import java.io.OutputStream;
+import java.io.StringWriter;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.logging.Logger;
 
@@ -34,11 +37,13 @@
 import javax.xml.bind.JAXBContext;
 import javax.xml.stream.XMLEventReader;
 import javax.xml.stream.XMLEventWriter;
+import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
 
 import org.w3c.dom.Node;
 
+import com.sun.xml.bind.api.JAXBRIContext;
 import com.sun.xml.bind.v2.runtime.JAXBContextImpl;
 
 import org.apache.cxf.Bus;
@@ -47,6 +52,7 @@
 import org.apache.cxf.databinding.DataReader;
 import org.apache.cxf.databinding.DataWriter;
 import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.jaxb.fortest.unqualified.UnqualifiedBean;
 import org.apache.cxf.jaxb.io.DataReaderImpl;
 import org.apache.cxf.jaxb.io.DataWriterImpl;
 import org.apache.cxf.jaxb_misc.ObjectFactory;
@@ -191,6 +197,27 @@
             JAXBContextImpl rictx = (JAXBContextImpl)ctx;
             assertNotNull(rictx.getBeanInfo(TestJAXBClass.class));
         }
+    }
+    
+    @Test 
+    public void testContextProperties() throws Exception {
+        JAXBDataBinding db = new JAXBDataBinding();
+        Map<String, Object> contextProperties = new HashMap<String, Object>();
+        contextProperties.put(JAXBRIContext.DEFAULT_NAMESPACE_REMAP, "uri:ultima:thule");
+        db.setContextProperties(contextProperties);
+        Set<Class<?>> classes = new HashSet<Class<?>>();
+        classes.add(UnqualifiedBean.class);
+        db.setContext(db.createJAXBContext(classes));
+        DataWriter<XMLStreamWriter> writer = db.createWriter(XMLStreamWriter.class);
+        XMLOutputFactory writerFactory = XMLOutputFactory.newInstance();
+        StringWriter stringWriter = new StringWriter();
+        XMLStreamWriter xmlWriter = writerFactory.createXMLStreamWriter(stringWriter);
+        UnqualifiedBean bean = new UnqualifiedBean();
+        bean.setAriadne("spider");
+        writer.write(bean, xmlWriter);
+        xmlWriter.flush();
+        String xml = stringWriter.toString();
+        assertTrue(xml.contains("uri:ultima:thule"));
     }
     
 }

Modified: incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBEncoderDecoderTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBEncoderDecoderTest.java?rev=598839&r1=598838&r2=598839&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBEncoderDecoderTest.java (original)
+++ incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBEncoderDecoderTest.java Tue Nov 27 17:06:45 2007
@@ -25,6 +25,9 @@
 import java.io.StringWriter;
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.xml.XMLConstants;
 import javax.xml.bind.JAXBContext;
@@ -45,6 +48,8 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
+import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
+
 import org.apache.cxf.helpers.DOMUtils;
 import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.jaxb_form.ObjectWithQualifiedElementElement;
@@ -58,6 +63,7 @@
 import org.apache.hello_world_soap_http.types.GreetMeResponse;
 import org.apache.hello_world_soap_http.types.StringStruct;
 import org.apache.type_test.doc.TypeTestPortType;
+
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -76,13 +82,8 @@
     JAXBContext context;
     Schema schema;
     
-    public JAXBEncoderDecoderTest() {
-    }
-
+    private Map<String, Object> emptyMarshallerProperties = Collections.emptyMap();
     
-    public JAXBEncoderDecoderTest(String arg0) {
-    }
-
     @Before
     public void setUp() throws Exception {
         
@@ -118,7 +119,7 @@
 
         Node node;
         try {
-            JAXBEncoderDecoder.marshall(context, null, null, part, elNode);
+            JAXBEncoderDecoder.marshall(context, null, null, part, elNode, emptyMarshallerProperties);
             fail("Should have thrown a Fault");
         } catch (Fault ex) {
             //expected - not a valid object
@@ -129,7 +130,7 @@
         QName elName = new QName(wrapperAnnotation.targetNamespace(),
                                  wrapperAnnotation.localName());
         part.setElementQName(elName);
-        JAXBEncoderDecoder.marshall(context, null, obj, part, elNode);
+        JAXBEncoderDecoder.marshall(context, null, obj, part, elNode, emptyMarshallerProperties);
         node = elNode.getLastChild();
         //The XML Tree Looks like
         //<GreetMe><requestType>Hello</requestType></GreetMe>
@@ -146,10 +147,11 @@
         //stringStruct.setArg0("hello");
         stringStruct.setArg1("world");
         // Marshal without the schema should work.
-        JAXBEncoderDecoder.marshall(context, null, stringStruct, part,  elNode);
+        JAXBEncoderDecoder.marshall(context, null, stringStruct, part,  elNode, emptyMarshallerProperties);
         try {
             // Marshal with the schema should get an exception.
-            JAXBEncoderDecoder.marshall(context, schema, stringStruct, part,  elNode);
+            JAXBEncoderDecoder.marshall(context, schema, stringStruct, part,  elNode, 
+                                        emptyMarshallerProperties);
             fail("Marshal with schema should have thrown a Fault");
         } catch (Fault ex) {
             //expected - not a valid object
@@ -172,7 +174,7 @@
         XMLOutputFactory opFactory = XMLOutputFactory.newInstance();
         opFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE);
         XMLEventWriter writer = opFactory.createXMLEventWriter(stringWriter);
-        JAXBEncoderDecoder.marshall(context, null, testObject, part, writer);
+        JAXBEncoderDecoder.marshall(context, null, testObject, part, writer, emptyMarshallerProperties);
         writer.flush();
         writer.close();
         String xmlResult = stringWriter.toString();
@@ -180,6 +182,45 @@
         // so that it could be examined inside the debugger to see how JAXB works.
         assertTrue(xmlResult.contains("ns3:string2"));
     }
+    
+    @Test
+    public void testCustomNamespaces() throws Exception {
+        Map<String, Object> marshallProps = new HashMap<String, Object>();
+        NamespacePrefixMapper mapper = new NamespacePrefixMapper() {
+
+            @Override
+            public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
+                if ("http://apache.org/hello_world_soap_http/types".equals(namespaceUri)) {
+                    return "Omnia";
+                } else if ("http://cxf.apache.org/jaxb_form".equals(namespaceUri)) {
+                    return "Gallia";
+                }
+                return suggestion;
+            } 
+        };
+        marshallProps.put("com.sun.xml.bind.namespacePrefixMapper", mapper);
+        ObjectWithQualifiedElementElement testObject = new ObjectWithQualifiedElementElement();
+        testObject.setString1("twine");
+        testObject.setString2("cord");
+        
+        QName elName = new QName(wrapperAnnotation.targetNamespace(),
+                                 wrapperAnnotation.localName());
+        MessagePartInfo part = new MessagePartInfo(elName, null);
+        part.setElement(true);
+        part.setElementQName(elName);
+        
+        StringWriter stringWriter = new StringWriter();
+        XMLOutputFactory opFactory = XMLOutputFactory.newInstance();
+        opFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE);
+        XMLEventWriter writer = opFactory.createXMLEventWriter(stringWriter);
+        JAXBEncoderDecoder.marshall(context, null, testObject, part, writer, marshallProps);
+        writer.flush();
+        writer.close();
+        String xmlResult = stringWriter.toString();
+        // the following is a bit of a crock, but, to tell the truth, this test case most exists
+        // so that it could be examined inside the debugger to see how JAXB works.
+        assertTrue(xmlResult.contains("Gallia:string2"));
+    }
 
     @Test
     public void testMarshallIntoStax() throws Exception {
@@ -198,7 +239,7 @@
 
         //STARTDOCUMENT/ENDDOCUMENT is not required
         //writer.add(eFactory.createStartDocument("utf-8", "1.0"));        
-        JAXBEncoderDecoder.marshall(context, null, obj, part, writer);
+        JAXBEncoderDecoder.marshall(context, null, obj, part, writer, emptyMarshallerProperties);
         //writer.add(eFactory.createEndDocument());
         writer.flush();
         writer.close();
@@ -256,7 +297,8 @@
         Document doc = DOMUtils.createDocument();
         Element elNode = doc.createElementNS(elName.getNamespaceURI(), 
                                              elName.getLocalPart());
-        JAXBEncoderDecoder.marshall(context, null, new String("TestSOAPMessage"), part,  elNode);
+        JAXBEncoderDecoder.marshall(context, null, 
+                                    new String("TestSOAPMessage"), part,  elNode, emptyMarshallerProperties);
         
         assertNotNull(elNode.getChildNodes());
         assertEquals("TestSOAPMessage", elNode.getFirstChild().getFirstChild().getNodeValue());
@@ -366,7 +408,7 @@
 
         //STARTDOCUMENT/ENDDOCUMENT is not required
         //writer.add(eFactory.createStartDocument("utf-8", "1.0"));        
-        JAXBEncoderDecoder.marshall(context, null, obj, writer);
+        JAXBEncoderDecoder.marshall(context, null, obj, writer, emptyMarshallerProperties);
         //writer.add(eFactory.createEndDocument());
         writer.flush();
         writer.close();

Added: incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/fortest/unqualified/UnqualifiedBean.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/fortest/unqualified/UnqualifiedBean.java?rev=598839&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/fortest/unqualified/UnqualifiedBean.java (added)
+++ incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/fortest/unqualified/UnqualifiedBean.java Tue Nov 27 17:06:45 2007
@@ -0,0 +1,39 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.jaxb.fortest.unqualified;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * Test class that is not in any namespace, for testing JAXB context properties.
+ */
+@XmlRootElement()
+public class UnqualifiedBean {
+    private String ariadne;
+
+    public String getAriadne() {
+        return ariadne;
+    }
+
+    public void setAriadne(String ariadne) {
+        this.ariadne = ariadne;
+    }
+
+}

Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java?rev=598839&r1=598838&r2=598839&view=diff
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java (original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java Tue Nov 27 17:06:45 2007
@@ -49,7 +49,8 @@
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 
-//import org.apache.cxf.Bus;
+import com.sun.xml.bind.api.JAXBRIContext;
+
 import org.apache.cxf.Bus;
 import org.apache.cxf.binding.soap.Soap11;
 import org.apache.cxf.bus.CXFBusFactory;
@@ -838,28 +839,30 @@
     }
     
     @Test
-    public void testDynamicClientFactory()  {
+    public void testDynamicClientFactory() throws Exception {
         URL wsdl = getClass().getResource("/wsdl/hello_world.wsdl");
         assertNotNull(wsdl);
         String wsdlUrl = null;
-        try {
-            wsdlUrl = wsdl.toURI().toString();
-        } catch (URISyntaxException e) {
-            e.printStackTrace();
-            fail("Can't get the hello_world.wsdl url");            
-        }
-        try {
-            //TODO test fault exceptions 
-            DynamicClientFactory dcf = DynamicClientFactory.newInstance();
-            Client client = dcf.createClient(wsdlUrl, serviceName, portName);
-            client.invoke("greetMe", "test");        
-            Object[] result = client.invoke("sayHi");
-            assertNotNull("no response received from service", result);
-            assertEquals("Bonjour", result[0]);
-        } catch (Exception e) {            
-            e.printStackTrace();
-            fail("There is some excpetion happened ");
-        }    
+        wsdlUrl = wsdl.toURI().toString();
+
+        //TODO test fault exceptions 
+        DynamicClientFactory dcf = DynamicClientFactory.newInstance();
+        Client client = dcf.createClient(wsdlUrl, serviceName, portName);
+        client.invoke("greetMe", "test");        
+        Object[] result = client.invoke("sayHi");
+        assertNotNull("no response received from service", result);
+        assertEquals("Bonjour", result[0]);
+        //TODO: the following isn't a real test. We need to test against a service
+        // that would actually notice the difference. At least it ensures that 
+        // specifying the property does not explode.
+        Map<String, Object> jaxbContextProperties = new HashMap<String, Object>();
+        jaxbContextProperties.put(JAXBRIContext.DEFAULT_NAMESPACE_REMAP, "uri:ultima:thule");
+        dcf.setJaxbContextProperties(jaxbContextProperties);
+        client = dcf.createClient(wsdlUrl, serviceName, portName);
+        client.invoke("greetMe", "test");        
+        result = client.invoke("sayHi");
+        assertNotNull("no response received from service", result);
+        assertEquals("Bonjour", result[0]);
     }
     
     @Test