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;
+ }
+
+}