Allow update call with a list
diff --git a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/PersistenceContext.java b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/PersistenceContext.java
index 118dd09..9faf33f 100644
--- a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/PersistenceContext.java
+++ b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/PersistenceContext.java
@@ -9,6 +9,7 @@
  *

  * Contributors:

  * 		dclarke/tware - initial 

+ *      tware

  ******************************************************************************/

 package org.eclipse.persistence.jpa.rs;

 

@@ -17,6 +18,7 @@
 import java.io.IOException;

 import java.io.InputStream;

 import java.net.URL;

+import java.util.ArrayList;

 import java.util.HashMap;

 import java.util.Iterator;

 import java.util.List;

@@ -27,7 +29,7 @@
 import javax.persistence.Query;

 import javax.persistence.spi.PersistenceUnitInfo;

 import javax.ws.rs.core.MediaType;

-import javax.xml.bind.JAXBContext;

+import org.eclipse.persistence.jaxb.JAXBContext;

 import javax.xml.bind.JAXBElement;

 import javax.xml.bind.JAXBException;

 import javax.xml.bind.Unmarshaller;

@@ -35,6 +37,7 @@
 

 import org.eclipse.persistence.descriptors.ClassDescriptor;

 import org.eclipse.persistence.dynamic.DynamicEntity;

+import org.eclipse.persistence.dynamic.DynamicType;

 import org.eclipse.persistence.internal.helper.ConversionManager;

 import org.eclipse.persistence.internal.jpa.EJBQueryImpl;

 import org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl;

@@ -46,9 +49,11 @@
 import org.eclipse.persistence.jpa.JpaHelper;

 import org.eclipse.persistence.jpa.PersistenceProvider;

 import org.eclipse.persistence.jpa.dynamic.JPADynamicHelper;

+import org.eclipse.persistence.jpa.rs.util.CustomSerializationMetadataSource;

 import org.eclipse.persistence.jpa.rs.util.DynamicXMLMetadataSource;

 import org.eclipse.persistence.jpa.rs.util.InMemoryArchive;

 import org.eclipse.persistence.queries.DatabaseQuery;

+import org.eclipse.persistence.sessions.Session;

 import org.eclipse.persistence.sessions.server.Server;

 import org.eclipse.persistence.sessions.server.ServerSession;

 

@@ -119,17 +124,21 @@
         if (oxmLocation != null){

             metadataLocation = new InMemoryArchive((new URL(oxmLocation)).openStream());

         } else {

-            metadataLocation = new DynamicXMLMetadataSource(session, packageName);

+            metadataLocation = new DynamicXMLMetadataSource(persistenceUnitName, session, packageName);

         }

-        properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, metadataLocation);

+        List<Object> metadataLocations = new ArrayList<Object>();

+        metadataLocations.add(metadataLocation);

+        metadataLocations.add(new CustomSerializationMetadataSource(persistenceUnitName, session, packageName));

+        properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, metadataLocations);

 

         ClassLoader cl = session.getPlatform().getConversionManager().getLoader();

         jaxbContext = DynamicJAXBContextFactory.createContextFromOXM(cl, properties);

+

         session.setProperty(JAXBContext.class.getName(), jaxbContext);

 

         return jaxbContext;

     }

-

+    

     public String getName() {

         return name;

     }

@@ -154,12 +163,25 @@
         }

     }

 

-    public DynamicEntity merge(String tenantId, DynamicEntity entity) {

+    public DynamicEntity merge(String type, String tenantId, DynamicEntity entity) {

         EntityManager em = getEmf().createEntityManager();

-

+        DynamicEntity mergedEntity = null;

         try {

             em.getTransaction().begin();

-            DynamicEntity mergedEntity = em.merge(entity);

+            

+            if (isList(type)){

+                mergedEntity = newEntity(type);

+                List<Object> returnValues = new ArrayList<Object>();

+                mergedEntity.set("serializedData", returnValues);

+                @SuppressWarnings("unchecked")

+                List<Object> values = (List<Object>)entity.get("serializedData");

+                for (Object value: values){

+                    Object merged = em.merge(value);

+                    returnValues.add(merged);

+                }

+            } else {

+                mergedEntity = em.merge(entity);

+            }

             em.getTransaction().commit();

             return mergedEntity;

         } finally {

@@ -167,6 +189,15 @@
         }

     }

 

+    public boolean isList(String type){

+        Server session = JpaHelper.getServerSession(getEmf());

+        ClassDescriptor descriptor = session.getDescriptorForAlias(type);

+        if (descriptor == null && getDescriptor(type) != null){

+            return true;

+        }

+        return false;

+    }

+    

     /**

      * TODO

      */

@@ -176,7 +207,20 @@
 

     public DynamicEntity newEntity(String tenantId, String type) {

         JPADynamicHelper helper = new JPADynamicHelper(getEmf());

-        return helper.newDynamicEntity(type);

+        DynamicEntity entity = null;

+        try{

+            entity = helper.newDynamicEntity(type);

+        } catch (IllegalArgumentException e){

+            ClassDescriptor descriptor = getDescriptor(type);

+            if (descriptor != null){

+                DynamicType jaxbType = (DynamicType) descriptor.getProperty(DynamicType.DESCRIPTOR_PROPERTY);     

+                if (jaxbType != null){

+                    return jaxbType.newDynamicEntity();

+                }

+            }

+            throw e;

+        }

+        return entity;

     }

 

     /**

@@ -240,6 +284,14 @@
     public ClassDescriptor getDescriptor(String entityName){

         Server session = JpaHelper.getServerSession(getEmf());

         ClassDescriptor descriptor = session.getDescriptorForAlias(entityName);

+        if (descriptor == null){

+            for (Object ajaxBSession:((JAXBContext)getJAXBContext()).getXMLContext().getSessions() ){

+                descriptor = ((Session)ajaxBSession).getClassDescriptorForAlias(entityName);

+                if (descriptor != null){

+                    break;

+                }

+            }

+        }

         return descriptor;

     }

     

diff --git a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/Service.java b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/Service.java
index 6e49f33..cb7b46a 100644
--- a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/Service.java
+++ b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/Service.java
@@ -140,7 +140,7 @@
         MediaType contentType = mediaType(hh.getRequestHeader(HttpHeaders.CONTENT_TYPE)); 

 

         DynamicEntity entity = unmarshalEntity(app, type, tenantId, contentType, in);

-        entity = app.merge(tenantId, entity);

+        entity = app.merge(type, tenantId, entity);

 

         JAXBContext context = app.getJAXBContext();

         return new StreamingOutputMarshaller(context, entity, hh.getAcceptableMediaTypes());

diff --git a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/qcn/JPARSDatabaseChangeListener.java b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/qcn/JPARSDatabaseChangeListener.java
index 5b0d6f1..089682b 100644
--- a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/qcn/JPARSDatabaseChangeListener.java
+++ b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/qcn/JPARSDatabaseChangeListener.java
@@ -9,6 +9,7 @@
  *

  * Contributors:

  * 		dclarke/tware - initial 

+ *      tware

  ******************************************************************************/

 package org.eclipse.persistence.jpa.rs.qcn;

 

diff --git a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/CustomSerializationMetadataSource.java b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/CustomSerializationMetadataSource.java
new file mode 100644
index 0000000..a2453ee
--- /dev/null
+++ b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/CustomSerializationMetadataSource.java
@@ -0,0 +1,80 @@
+/*******************************************************************************

+ * Copyright (c) 2011 Oracle. All rights reserved.

+ * This program and the accompanying materials are made available under the 

+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 

+ * which accompanies this distribution. 

+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at 

+ * http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *      tware

+ ******************************************************************************/

+package org.eclipse.persistence.jpa.rs.util;

+

+import java.util.Map;

+

+import org.eclipse.persistence.descriptors.ClassDescriptor;

+import org.eclipse.persistence.jaxb.metadata.MetadataSource;

+import org.eclipse.persistence.jaxb.xmlmodel.JavaType;

+import org.eclipse.persistence.jaxb.xmlmodel.ObjectFactory;

+import org.eclipse.persistence.jaxb.xmlmodel.XmlBindings;

+import org.eclipse.persistence.jaxb.xmlmodel.XmlElement;

+import org.eclipse.persistence.jaxb.xmlmodel.XmlElements;

+import org.eclipse.persistence.jaxb.xmlmodel.JavaType.JavaAttributes;

+import org.eclipse.persistence.jaxb.xmlmodel.XmlBindings.JavaTypes;

+import org.eclipse.persistence.sessions.server.Server;

+

+/**

+ * This class is used to pass a list of objects of varying types over JSON or XML between client and server

+ * 

+ * It builds a class that wraps an XML Choice List that potentially contains any class in the project for the 

+ * session passed in.

+ * 

+ * The JPA RS service will deserialize this class and then make use of the contents of the list.

+ * 

+ * This is a workaround for the fact that our current JAXB and JSON support does not support serializing/deserializing 

+ * a list that is not wrapped in a mapped object.

+ * 

+ * @author tware

+ *

+ */

+public class CustomSerializationMetadataSource implements MetadataSource {

+    private XmlBindings xmlBindings;

+

+    public CustomSerializationMetadataSource(String persistenceUnitName, Server session, String packageName) {

+        ObjectFactory objectFactory = new ObjectFactory();

+        xmlBindings = new XmlBindings();

+        xmlBindings.setPackageName(packageName);

+

+        JavaTypes javaTypes = new JavaTypes();

+        xmlBindings.setJavaTypes(javaTypes);

+  

+        addSerializationType(persistenceUnitName, session, objectFactory, javaTypes);

+    }

+    

+    private void addSerializationType(String persistenceUnitName, Server session, ObjectFactory objectFactory, JavaTypes javaTypes){

+        JavaType serializationType = new JavaType();

+        serializationType.setName(persistenceUnitName + "SerializedData");

+        serializationType.setJavaAttributes(new JavaAttributes());

+        

+        XmlElements xmlElements = new XmlElements(); 

+        xmlElements.setJavaAttribute("serializedData");

+        

+        xmlElements.setContainerType("java.util.List");

+        for (ClassDescriptor ormDescriptor : session.getProject().getOrderedDescriptors()) {

+            XmlElement childElement = new XmlElement(); 

+            childElement.setType(ormDescriptor.getJavaClassName());

+            childElement.setName(ormDescriptor.getAlias());

+            xmlElements.getXmlElement().add(childElement);

+        }

+        serializationType.getJavaAttributes().getJavaAttribute().add(objectFactory.createXmlElements(xmlElements));

+        serializationType.setXmlRootElement(new org.eclipse.persistence.jaxb.xmlmodel.XmlRootElement());

+        javaTypes.getJavaType().add(serializationType);

+    }

+    

+    @Override

+    public XmlBindings getXmlBindings(Map<String, ?> properties, ClassLoader classLoader) {

+        return this.xmlBindings;

+    }

+}

diff --git a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/DynamicXMLMetadataSource.java b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/DynamicXMLMetadataSource.java
index 677592f..9e14af0 100644
--- a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/DynamicXMLMetadataSource.java
+++ b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/DynamicXMLMetadataSource.java
@@ -9,6 +9,7 @@
  *

  * Contributors:

  *      dclarke/tware - initial 

+ *      tware

  ******************************************************************************/

 package org.eclipse.persistence.jpa.rs.util;

 

@@ -41,14 +42,14 @@
 

     private XmlBindings xmlBindings;

 

-    public DynamicXMLMetadataSource(Server session, String packageName) {

+    public DynamicXMLMetadataSource(String persistenceUnitName, Server session, String packageName) {

         ObjectFactory objectFactory = new ObjectFactory();

         xmlBindings = new XmlBindings();

         xmlBindings.setPackageName(packageName);

 

         JavaTypes javaTypes = new JavaTypes();

         xmlBindings.setJavaTypes(javaTypes);

-

+  

         for (ClassDescriptor ormDescriptor : session.getProject().getOrderedDescriptors()) {

             javaTypes.getJavaType().add(createJAXBType(ormDescriptor, objectFactory));

         }

diff --git a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/StreamingOutputMarshaller.java b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/StreamingOutputMarshaller.java
index a603d8c..f332f6c 100644
--- a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/StreamingOutputMarshaller.java
+++ b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/StreamingOutputMarshaller.java
@@ -9,6 +9,7 @@
  *

  * Contributors:

  * 		dclarke/tware - initial 

+ *      tware

  ******************************************************************************/

 package org.eclipse.persistence.jpa.rs.util;

 

diff --git a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/websockets/ApplicationListener.java b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/websockets/ApplicationListener.java
index 8301b2d..a24e1e3 100644
--- a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/websockets/ApplicationListener.java
+++ b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/websockets/ApplicationListener.java
@@ -9,6 +9,7 @@
  *

  * Contributors:

  * 		dclarke/tware - initial 

+ *      tware

  ******************************************************************************/

 package org.eclipse.persistence.jpa.rs.websockets;

 

diff --git a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/websockets/Registration.java b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/websockets/Registration.java
index 83a5509..3d3e908 100644
--- a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/websockets/Registration.java
+++ b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/websockets/Registration.java
@@ -9,6 +9,7 @@
  *

  * Contributors:

  * 		dclarke/tware - initial 

+ *      tware

  ******************************************************************************/

 package org.eclipse.persistence.jpa.rs.websockets;

 

diff --git a/JPA-RS Incubator/tests/JPA-RS Tests/.classpath b/JPA-RS Incubator/tests/JPA-RS Tests/.classpath
index 9db7c81..b24e4d8 100644
--- a/JPA-RS Incubator/tests/JPA-RS Tests/.classpath
+++ b/JPA-RS Incubator/tests/JPA-RS Tests/.classpath
@@ -11,5 +11,6 @@
 	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>

 	<classpathentry combineaccessrules="false" kind="src" path="/JPA-RS"/>

 	<classpathentry combineaccessrules="false" kind="src" path="/javax.persistence 2.0.0"/>

+	<classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish 3.1"/>

 	<classpathentry kind="output" path="classes"/>

 </classpath>

diff --git a/JPA-RS Incubator/tests/JPA-RS Tests/jpars.properties b/JPA-RS Incubator/tests/JPA-RS Tests/jpars.properties
index 6b1e844..e826a4c 100644
--- a/JPA-RS Incubator/tests/JPA-RS Tests/jpars.properties
+++ b/JPA-RS Incubator/tests/JPA-RS Tests/jpars.properties
@@ -1,17 +1,20 @@
 javax.persistence.jdbc.driver=oracle.jdbc.OracleDriver

-javax.persistence.jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl

-javax.persistence.jdbc.user=scott

-javax.persistence.jdbc.password=tiger

+#javax.persistence.jdbc.url=jdbc:oracle:thin:@adc6160375.us.oracle.com:1521:TOPLINK

+#javax.persistence.jdbc.user=dev1

+javax.persistence.jdbc.url=jdbc:oracle:thin:@ottvm035.ca.oracle.com:1521:TOPLINK

+javax.persistence.jdbc.user=tware

+javax.persistence.jdbc.password=password

 

 eclipselink.jdbc.read-connections.min=1

 eclipselink.jdbc.write-connections.min=1

 

-eclipselink.logging.connection=false

-eclipselink.logging.timestamp=false

-eclipselink.logging.thread=false

-eclipselink.logging.session=false

-eclipselink.logging.exceptions=false

-eclipselink.logging.level.sql=FINE

-eclipselink.logging.level.ejb_or_metadata=WARNING

+eclipselink.logging.level=FINEST

+#eclipselink.logging.connection=false

+#eclipselink.logging.timestamp=false

+#eclipselink.logging.thread=false

+#eclipselink.logging.session=false

+#eclipselink.logging.exceptions=false

+#eclipselink.logging.level.sql=FINE

+#eclipselink.logging.level.ejb_or_metadata=WARNING

 

 eclipselink.target-server=NONE
\ No newline at end of file
diff --git a/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/crud/CRUDTests.java b/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/crud/CRUDTests.java
index 48c89e5..7bae397 100644
--- a/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/crud/CRUDTests.java
+++ b/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/crud/CRUDTests.java
@@ -80,11 +80,12 @@
         

         entity = persistenceContext.find("User", entity.get("id"));

         

-        assertNull("Entity was note deleted", entity);

+        assertNull("Entity was not deleted", entity);

     }

 

     

     @Test

+    @SuppressWarnings("unchecked")

     public void testQuery(){

         DynamicEntity entity = persistenceContext.newEntity("User");

         entity.set("name", "Jill");

diff --git a/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/service/TestService.java b/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/service/TestService.java
new file mode 100644
index 0000000..9eac60c
--- /dev/null
+++ b/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/service/TestService.java
@@ -0,0 +1,148 @@
+/****************************************************************************

+ * Copyright (c) 2011 Oracle. All rights reserved.

+ * This program and the accompanying materials are made available under the 

+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 

+ * which accompanies this distribution. 

+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at 

+ * http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *      tware - 

+ ******************************************************************************/

+package jpars.test.service;

+

+import static org.eclipse.persistence.jaxb.JAXBContext.MEDIA_TYPE;

+import static org.junit.Assert.fail;

+

+import java.io.ByteArrayInputStream;

+import java.io.ByteArrayOutputStream;

+import java.io.IOException;

+import java.io.InputStream;

+import java.io.StringWriter;

+import java.net.URL;

+import java.util.ArrayList;

+import java.util.HashMap;

+import java.util.List;

+import java.util.Map;

+

+import javax.ws.rs.WebApplicationException;

+import javax.ws.rs.core.MediaType;

+import javax.ws.rs.core.StreamingOutput;

+import javax.ws.rs.core.Response.Status;

+import javax.xml.bind.JAXBElement;

+import javax.xml.bind.JAXBException;

+import javax.xml.bind.Unmarshaller;

+import javax.xml.transform.stream.StreamSource;

+

+import jpars.test.util.ExamplePropertiesLoader;

+import jpars.test.util.TestHttpHeaders;

+

+import org.eclipse.persistence.dynamic.DynamicEntity;

+import org.eclipse.persistence.jaxb.JAXBMarshaller;

+import org.eclipse.persistence.jpa.rs.PersistenceContext;

+import org.eclipse.persistence.jpa.rs.PersistenceFactory;

+import org.eclipse.persistence.jpa.rs.Service;

+import org.junit.BeforeClass;

+import org.junit.Test;

+import static org.junit.Assert.*;

+

+/**

+ * Tests for the JPA RS service class

+ * @author tware

+ *

+ */

+public class TestService {

+

+    private static PersistenceFactory factory;

+    

+    @BeforeClass

+    public static void setup(){

+        Map<String, Object> properties = new HashMap<String, Object>();

+        ExamplePropertiesLoader.loadProperties(properties); 

+        factory = null;

+        try{

+            factory = new PersistenceFactory();

+            factory.bootstrapPersistenceContext("auction", new URL("file:///C:/EclipseLinkView2/incubator/JPA-RS Incubator/tests/JPA-RS Tests/src/xmldocs/auction-persistence.xml"), properties);

+        } catch (Exception e){

+            e.printStackTrace();

+            fail(e.toString());

+        }

+    }

+    

+    @Test

+    public void testUpdateList(){

+        Service service = new Service();

+        service.setPersistenceFactory(factory);

+        PersistenceContext context = factory.getPersistenceContext("auction");

+        

+        DynamicEntity entity = context.newEntity("User");

+        entity.set("name", "Jim");

+        context.create(null, entity);

+        

+        entity.set("name", "James");

+        

+        DynamicEntity entity2 = context.newEntity("User");

+        entity2.set("name", "Jill");

+        context.create(null, entity2);

+        

+        entity2.set("name", "Gillian");       

+        

+        DynamicEntity serializedData = context.newEntity("auctionSerializedData");

+        List<DynamicEntity> entities = new ArrayList<DynamicEntity>();

+        entities.add(entity);

+        entities.add(entity2);

+        serializedData.set("serializedData", entities);

+

+        StringWriter writer = new StringWriter();

+        

+        JAXBMarshaller marshaller = null;

+

+        try{

+            marshaller = (JAXBMarshaller)context.getJAXBContext().createMarshaller();

+            marshaller.setProperty("eclipselink.media-type", MediaType.APPLICATION_XML);

+            marshaller.marshal(serializedData, writer);

+        } catch (Exception e){

+            e.printStackTrace();

+            fail(e.toString());

+        }

+        ByteArrayInputStream stream = new ByteArrayInputStream(writer.toString().getBytes());

+

+        StreamingOutput output = service.update("auction", "auctionSerializedData", new TestHttpHeaders(), stream);

+

+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

+        try{

+            output.write(outputStream);

+        } catch (IOException ex){

+            fail(ex.toString());

+        }

+        stream = new ByteArrayInputStream(outputStream.toByteArray());

+        serializedData = unmarshalEntity(context, "auctionSerializedData", null, MediaType.APPLICATION_XML, stream);

+        

+        assertNotNull("returned data was null", serializedData);

+        entities = serializedData.get("serializedData");

+        assertNotNull("returned data had null list", entities);

+        assertTrue("returned data had wrong list size", entities.size() == 2);

+        List<String> values = new ArrayList<String>();

+        values.add("James");

+        values.add("Gillian");

+        for (DynamicEntity value: entities){

+            assertTrue("Incorrect name returned", value.get("name").equals("James") || value.get("name").equals("Gillian"));

+            values.remove(value.get("name"));

+        }

+        assertTrue("Incorrent set of names.", values.isEmpty());

+    }

+    

+    private DynamicEntity unmarshalEntity(PersistenceContext app, String type, String tenantId, String acceptedMedia, InputStream in) {

+        Unmarshaller unmarshaller;

+        try {

+            unmarshaller = app.getJAXBContext().createUnmarshaller();

+            unmarshaller.setProperty(MEDIA_TYPE, acceptedMedia);

+            JAXBElement<?> element = unmarshaller.unmarshal(new StreamSource(in), app.getClass(type));

+            return (DynamicEntity) element.getValue();

+        } catch (JAXBException e) {

+            throw new WebApplicationException(Status.BAD_REQUEST);

+        }

+    }

+    

+}

diff --git a/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/util/TestHttpHeaders.java b/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/util/TestHttpHeaders.java
new file mode 100644
index 0000000..42bf456
--- /dev/null
+++ b/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/util/TestHttpHeaders.java
@@ -0,0 +1,76 @@
+/****************************************************************************

+ * Copyright (c) 2011 Oracle. All rights reserved.

+ * This program and the accompanying materials are made available under the 

+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 

+ * which accompanies this distribution. 

+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at 

+ * http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *      tware - 

+ ******************************************************************************/

+package jpars.test.util;

+

+import java.util.ArrayList;

+import java.util.List;

+import java.util.Locale;

+import java.util.Map;

+

+import javax.ws.rs.core.Cookie;

+import javax.ws.rs.core.HttpHeaders;

+import javax.ws.rs.core.MediaType;

+import javax.ws.rs.core.MultivaluedMap;

+

+/**

+ * A fake HTTPHeaders implementation to test the service class

+ * @author tware

+ *

+ */

+public class TestHttpHeaders implements HttpHeaders {

+

+    @Override

+    public List<Locale> getAcceptableLanguages() {

+        // TODO Auto-generated method stub

+        return null;

+    }

+

+    @Override

+    public List<MediaType> getAcceptableMediaTypes() {

+        List<MediaType> list = new ArrayList<MediaType>();

+        list.add(MediaType.valueOf(MediaType.APPLICATION_XML));

+        return list;

+    }

+

+    @Override

+    public Map<String, Cookie> getCookies() {

+        // TODO Auto-generated method stub

+        return null;

+    }

+

+    @Override

+    public Locale getLanguage() {

+        // TODO Auto-generated method stub

+        return null;

+    }

+

+    @Override

+    public MediaType getMediaType() {

+        // TODO Auto-generated method stub

+        return null;

+    }

+

+    @Override

+    public List<String> getRequestHeader(String arg0) {

+        List<String> list = new ArrayList<String>();

+        list.add(MediaType.APPLICATION_XML);

+        return list;

+    }

+

+    @Override

+    public MultivaluedMap<String, String> getRequestHeaders() {

+        // TODO Auto-generated method stub

+        return null;

+    }

+

+}