Index: status.xml
===================================================================
RCS file: /home/cvs/ws-jaxme/status.xml,v
retrieving revision 1.15.2.22
diff -u -r1.15.2.22 status.xml
--- status.xml	22 Oct 2004 21:34:38 -0000	1.15.2.22
+++ status.xml	28 Oct 2004 20:30:31 -0000
@@ -64,6 +64,12 @@
         types. (Daniel B., daniel at fgm.com) See JAXME-44
         in Jira.
       </action>
+      <action dev="JW" type="fix" context="runtime">
+        A namespace prefix wasn't declared for atomic elements.
+        Marshalling such elements required an outer element
+        with the same namespace. (Dogan Atay, doganatay at yahoo.com)
+        See JAXME-45 in Jira.
+      </action>
     </release>
     <release version="0.3.1" date="2004-Sep-03">
       <action dev="JW" type="fix" context="xs">
Index: src/jaxme/org/apache/ws/jaxme/impl/JMXmlSerializerImpl.java
===================================================================
RCS file: /home/cvs/ws-jaxme/src/jaxme/org/apache/ws/jaxme/impl/JMXmlSerializerImpl.java,v
retrieving revision 1.3.2.3
diff -u -r1.3.2.3 JMXmlSerializerImpl.java
--- src/jaxme/org/apache/ws/jaxme/impl/JMXmlSerializerImpl.java	2 Sep 2004 10:31:50 -0000	1.3.2.3
+++ src/jaxme/org/apache/ws/jaxme/impl/JMXmlSerializerImpl.java	28 Oct 2004 20:30:33 -0000
@@ -145,6 +145,8 @@
                                       QName pQName,
                                       String pValue)
       throws SAXException {
+    NamespaceSupport nss = pData.getNamespaceContext();
+    int context = nss.getContext();
     ContentHandler handler = pData.getContentHandler();
     String uri = pQName.getNamespaceURI();
     String localName = pQName.getLocalPart();
@@ -154,18 +156,18 @@
     	handler.characters(pValue.toCharArray(), 0, pValue.length());
     }
     handler.endElement(uri, localName, qName);
+    restoreContext(nss, context, handler);
   }
 
-  protected void marshalAtomicChild(JMXmlSerializer.Data pData,
-                                      String pNamespaceURI,
-                                      String pLocalName,
-                                      String pValue)
-      throws SAXException {
-    ContentHandler handler = pData.getContentHandler();
-    String qName = getElementQName(pData, pNamespaceURI, pLocalName);
-    handler.startElement(pNamespaceURI, pLocalName, qName, zeroAttributes);
-    handler.characters(pValue.toCharArray(), 0, pValue.length());
-    handler.endElement(pNamespaceURI, pLocalName, qName);
+  private void restoreContext(NamespaceSupport pNss, int pContext,
+                              ContentHandler pHandler) throws SAXException {
+    for (;;) {
+        String prefix = pNss.setContext(pContext);
+        if (prefix == null) {
+          return;
+        }
+        pHandler.endPrefixMapping(prefix);
+    }
   }
 
   public void marshal(JMXmlSerializer.Data pData, QName pName, Object pElement)
@@ -185,13 +187,7 @@
     handler.startElement(uri, name, qName, attrs);
     marshalChilds(pData, pElement);
     handler.endElement(uri, name, qName);
-    for (;;) {
-      String prefix = nss.setContext(context);
-      if (prefix == null) {
-        break;
-      }
-      handler.endPrefixMapping(prefix);
-    }
+    restoreContext(nss, context, handler);
   }
 
   protected void createSchemaLocationAttributes(JMXmlSerializer.Data pData, AttributesImpl pAttrs) throws SAXException {
Index: src/jaxme/org/apache/ws/jaxme/junit/BaseTestCase.java
===================================================================
RCS file: /home/cvs/ws-jaxme/src/jaxme/org/apache/ws/jaxme/junit/BaseTestCase.java,v
retrieving revision 1.3.2.1
diff -u -r1.3.2.1 BaseTestCase.java
--- src/jaxme/org/apache/ws/jaxme/junit/BaseTestCase.java	20 Aug 2004 12:22:55 -0000	1.3.2.1
+++ src/jaxme/org/apache/ws/jaxme/junit/BaseTestCase.java	28 Oct 2004 20:30:33 -0000
@@ -16,6 +16,18 @@
  */
 package org.apache.ws.jaxme.junit;
 
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+
+import org.apache.ws.jaxme.JMElement;
+import org.apache.ws.jaxme.impl.JMMarshallerImpl;
+import org.xml.sax.InputSource;
+
 import junit.framework.TestCase;
 
 
@@ -33,6 +45,20 @@
     this(c.getName());
   }
 
+  protected String getNamespaceURI(JMElement pElement) {
+    return pElement.getQName().getNamespaceURI();
+  }
+
+  protected String getPackageName(Class pClass) {
+    String className = pClass.getName();
+    int offset = className.lastIndexOf('.');
+    if (offset == -1) {
+        throw new IllegalStateException("Unable to parse package name: " + className);
+    } else {
+        return className.substring(0, offset);
+    }
+  }
+
   // Asserts equality of the two given byte arrays.
   protected void assertEquals(byte[] pExpect, byte[] pGot) {
     if (pExpect.length != pGot.length) {
@@ -45,5 +71,31 @@
         }
       }
     }
+  }
+
+  protected void unmarshalMarshalUnmarshal(Class pClass, String pXML) throws Exception {
+  	Object o = unmarshal(pClass, pXML);
+  	assertNotNull(o);
+  	String s = marshal(o, pClass);
+  	assertEquals(pXML, s);
+  	Object comp = unmarshal(pClass, s);
+  	assertNotNull(comp);
+  }
+  
+  protected Object unmarshal(Class pClass, String pXML) throws JAXBException {
+  	JAXBContext context = JAXBContext.newInstance(getPackageName(pClass));
+  	Unmarshaller unmarshaller = context.createUnmarshaller();
+  	unmarshaller.unmarshal(new InputSource(new StringReader(pXML)));
+  	return unmarshaller.unmarshal(new InputSource(new StringReader(pXML)));
+  }
+  
+  protected String marshal(Object o, Class pClass) throws JAXBException {
+  	JAXBContext context = JAXBContext.newInstance(getPackageName(pClass));
+  	Marshaller marshaller = context.createMarshaller();
+  	marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
+  	marshaller.setProperty(JMMarshallerImpl.JAXME_XML_DECLARATION, Boolean.FALSE);
+  	StringWriter sw = new StringWriter();
+  	marshaller.marshal(o, sw);
+  	return sw.toString();
   }
 }
Index: src/jaxme/org/apache/ws/jaxme/junit/JiraTest.java
===================================================================
RCS file: src/jaxme/org/apache/ws/jaxme/junit/JiraTest.java
diff -N src/jaxme/org/apache/ws/jaxme/junit/JiraTest.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ src/jaxme/org/apache/ws/jaxme/junit/JiraTest.java	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,46 @@
+package org.apache.ws.jaxme.junit;
+
+import java.io.StringWriter;
+
+import javax.xml.bind.JAXBContext;
+
+import org.apache.ws.jaxme.test.misc.types.Row;
+import org.apache.ws.jaxme.test.misc.types.impl.RowImpl;
+import org.apache.ws.jaxme.test.misc.xsimport.a.Outer;
+
+
+/** Some excerpts from Jira bug reports.
+ */
+public class JiraTest extends BaseTestCase {
+	/** Creates a new instance with the given name.
+	 */
+    public JiraTest(String pName) {
+    	super(pName);
+    }
+
+
+    /** Test for <a href="http://nagoya.apache.org/jira/browse/JAXME-38">JAXME-38</a>
+     */
+    public void testJaxMe38() throws Exception {
+    	RowImpl emptyRow = new RowImpl();
+        final String xml = "<ex:row xmlns:ex=\"" + getNamespaceURI(emptyRow) + "\">\n" +
+        "  <ex:cell id=\"1\">a</ex:cell>\n" +
+        "</ex:row>";
+        unmarshalMarshalUnmarshal(Row.class, xml);
+    }
+
+    /** Test for <a href="http://nagoya.apache.org/jira/browse/JAXME-45">JAXME-45</a>
+     */
+    public void testJaxMe45() throws Exception {
+    	Outer outer = new org.apache.ws.jaxme.test.misc.xsimport.a.ObjectFactory().createOuter();
+        outer.setInner1("ok");
+        outer.setInner2(0);
+        JAXBContext context = JAXBContext.newInstance("org.apache.ws.jaxme.test.misc.xsimport.a");
+        StringWriter sw = new StringWriter();
+        context.createMarshaller().marshal(outer, sw);
+        assertEquals("<a:outer xmlns:a=\"http://ws.apache.org/jaxme/test/misc/xsimport/a\">\n" +
+                     "  <b:inner1 xmlns:b=\"http://ws.apache.org/jaxme/test/misc/xsimport/b\">ok</b:inner1>\n" +
+                     "  <b:inner2 xmlns:b=\"http://ws.apache.org/jaxme/test/misc/xsimport/b\">0</b:inner2>\n" +
+                     "</a:outer>", sw.toString());
+    }
+}
Index: src/test/jaxb/jira/jira45.xsd
===================================================================
RCS file: src/test/jaxb/jira/jira45.xsd
diff -N src/test/jaxb/jira/jira45.xsd
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ src/test/jaxb/jira/jira45.xsd	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema
+    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+    xmlns:a="http://ws.apache.org/jaxme/test/misc/xsimport/a"
+    xmlns:b="http://ws.apache.org/jaxme/test/misc/xsimport/b"
+    targetNamespace="http://ws.apache.org/jaxme/test/misc/xsimport/a"
+    elementFormDefault="qualified"
+    attributeFormDefault="unqualified">
+  <xs:import namespace="http://ws.apache.org/jaxme/test/misc/xsimport/b"
+    schemaLocation="jira45.xsi"/>
+
+	<xs:element name="outer">
+	  <xs:complexType>
+	    <xs:sequence>
+		  <xs:element ref="b:inner1"/>
+		  <xs:element ref="b:inner2"/>
+		</xs:sequence>
+	  </xs:complexType>
+	</xs:element>
+</xs:schema>
Index: src/test/jaxb/jira/jira45.xsi
===================================================================
RCS file: src/test/jaxb/jira/jira45.xsi
diff -N src/test/jaxb/jira/jira45.xsi
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ src/test/jaxb/jira/jira45.xsi	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema
+    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+    xmlns:b="http://ws.apache.org/jaxme/test/misc/xsimport/b"
+    targetNamespace="http://ws.apache.org/jaxme/test/misc/xsimport/b"
+    elementFormDefault="qualified"
+    attributeFormDefault="unqualified">
+  <xs:element name="inner1" type="xs:string"/>
+  <xs:element name="inner2" type="xs:int"/>
+</xs:schema>
