blob: 692b34eaad3d9a7430d676c4ba1f9a0d4deb9dfe [file] [log] [blame]
/****************************************************************************
* Copyright (c) 2011, 2013 Oracle and/or its affiliates. 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.jpars.test.service;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import javax.xml.bind.JAXBException;
import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.eclipse.persistence.descriptors.FetchGroupManager;
import org.eclipse.persistence.dynamic.DynamicClassLoader;
import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.jpa.rs.PersistenceContext;
import org.eclipse.persistence.jpa.rs.PersistenceFactoryBase;
import org.eclipse.persistence.jpa.rs.resources.unversioned.EntityResource;
import org.eclipse.persistence.jpa.rs.resources.unversioned.PersistenceResource;
import org.eclipse.persistence.jpa.rs.resources.unversioned.PersistenceUnitResource;
import org.eclipse.persistence.jpa.rs.resources.unversioned.QueryResource;
import org.eclipse.persistence.jpa.rs.resources.unversioned.SingleResultQueryResource;
import org.eclipse.persistence.jpa.rs.util.StreamingOutputMarshaller;
import org.eclipse.persistence.jpa.rs.util.xmladapters.LinkAdapter;
import org.eclipse.persistence.jpars.test.model.auction.StaticBid;
import org.eclipse.persistence.jpars.test.model.auction.StaticUser;
import org.eclipse.persistence.jpars.test.model.multitenant.Account;
import org.eclipse.persistence.jpars.test.util.ExamplePropertiesLoader;
import org.eclipse.persistence.jpars.test.util.RestUtils;
import org.eclipse.persistence.jpars.test.util.StaticModelDatabasePopulator;
import org.eclipse.persistence.jpars.test.util.TestHttpHeaders;
import org.eclipse.persistence.jpars.test.util.TestURIInfo;
import org.eclipse.persistence.queries.FetchGroupTracker;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Tests for the JPA RS resource classes
* @author tware
*
*/
public class TestService {
private static PersistenceFactoryBase factory;
private static PersistenceContext context;
public static PersistenceContext getAuctionPersistenceContext(Map<String, Object> additionalProperties) throws URISyntaxException {
Map<String, Object> properties = new HashMap<String, Object>();
if (additionalProperties != null){
properties.putAll(additionalProperties);
}
properties.put(PersistenceUnitProperties.WEAVING, "static");
PersistenceContext context = factory.get("jpars_auction", RestUtils.getServerURI(), null, properties);
return context;
}
public static PersistenceContext getPhoneBookPersistenceContext(Map<String, Object> additionalProperties) throws URISyntaxException {
Map<String, Object> properties = new HashMap<String, Object>();
if (additionalProperties != null){
properties.putAll(additionalProperties);
}
properties.put(PersistenceUnitProperties.WEAVING, "static");
PersistenceContext context = factory.get("jpars_phonebook", RestUtils.getServerURI(), null, properties);
return context;
}
@BeforeClass
public static void setup(){
Map<String, Object> properties = new HashMap<String, Object>();
ExamplePropertiesLoader.loadProperties(properties);
factory = null;
try{
factory = new PersistenceFactoryBase();
properties.put(PersistenceUnitProperties.NON_JTA_DATASOURCE, null);
properties.put(PersistenceUnitProperties.DDL_GENERATION, PersistenceUnitProperties.DROP_AND_CREATE);
//properties.put(PersistenceUnitProperties.DEPLOY_ON_STARTUP, "true");
properties.put(PersistenceUnitProperties.CLASSLOADER, new DynamicClassLoader(Thread.currentThread().getContextClassLoader()));
getAuctionPersistenceContext(properties);
getPhoneBookPersistenceContext(properties);
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpars_auction-static-local", properties);
context = factory.bootstrapPersistenceContext("jpars_auction-static-local", emf, RestUtils.getServerURI(), null, false);
if (context == null) {
throw new Exception("Persistence context could not be created.");
}
StaticModelDatabasePopulator.populateDB(emf);
} catch (Exception e){
e.printStackTrace();
fail(e.toString());
}
}
@AfterClass
public static void teardown() throws URISyntaxException {
clearData();
}
protected static void clearData() throws URISyntaxException {
EntityManager em = getAuctionPersistenceContext(null).getEmf().createEntityManager();
em.getTransaction().begin();
em.createQuery("delete from Bid b").executeUpdate();
em.createQuery("delete from Auction a").executeUpdate();
em.createQuery("delete from User u").executeUpdate();
em.getTransaction().commit();
em = getPhoneBookPersistenceContext(null).getEmf().createEntityManager();
em.getTransaction().begin();
em.createQuery("delete from Person p").executeUpdate();
em.getTransaction().commit();
}
@SuppressWarnings("unchecked")
@Test
public void testUpdateUserList() throws URISyntaxException {
EntityResource resource = new EntityResource();
resource.setPersistenceFactory(factory);
PersistenceContext context = TestService.getAuctionPersistenceContext(null);
DynamicEntity entity = (DynamicEntity)context.newEntity("User");
entity.set("name", "Jim");
context.create(null, entity);
entity.set("name", "James");
DynamicEntity entity2 = (DynamicEntity)context.newEntity("User");
entity2.set("name", "Jill");
context.create(null, entity2);
entity2.set("name", "Gillian");
List<DynamicEntity> entities = new ArrayList<DynamicEntity>();
entities.add(entity);
entities.add(entity2);
StreamingOutput output = (StreamingOutput) resource.update("jpars_auction", "User", generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), new TestURIInfo(),
TestService.serializeListToStream(entities, context, MediaType.APPLICATION_JSON_TYPE)).getEntity();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try{
output.write(outputStream);
} catch (IOException ex){
fail(ex.toString());
}
InputStream stream = new ByteArrayInputStream(outputStream.toByteArray());
try{
entities = (List<DynamicEntity>)context.unmarshalEntity("User", MediaType.APPLICATION_JSON_TYPE, stream);
} catch (JAXBException e){
fail("Exception unmarsalling: " + e);
}
assertNotNull("returned data was null", 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){
((FetchGroupTracker)value)._persistence_setSession(context.getJpaSession());
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());
clearData();
}
@SuppressWarnings("unchecked")
@Test
public void testUpdatePhoneNumberList() throws URISyntaxException {
EntityResource resource = new EntityResource();
resource.setPersistenceFactory(factory);
PersistenceContext context = getPhoneBookPersistenceContext(null);
DynamicEntity entity = (DynamicEntity)context.newEntity("Person");
entity.set("firstName", "Jim");
entity.set("lastName", "Jones");
entity.set("phoneNumber", "1234567");
context.create(null, entity);
entity.set("firstName", "James");
DynamicEntity entity2 = (DynamicEntity)context.newEntity("Person");
entity2.set("firstName", "Jill");
entity2.set("lastName", "Jones");
context.create(null, entity2);
entity2.set("firstName", "Gillian");
List<DynamicEntity> entities = new ArrayList<DynamicEntity>();
entities.add(entity);
entities.add(entity2);
StreamingOutput output = (StreamingOutput) resource.update("jpars_phonebook", "Person", generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), new TestURIInfo(),
serializeListToStream(entities, context, MediaType.APPLICATION_JSON_TYPE)).getEntity();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try{
output.write(outputStream);
} catch (IOException ex){
fail(ex.toString());
}
InputStream stream = new ByteArrayInputStream(outputStream.toByteArray());
try{
entities = (List<DynamicEntity>)context.unmarshalEntity("Person", MediaType.APPLICATION_JSON_TYPE, stream);
} catch (JAXBException e){
fail("Exception unmarsalling: " + e);
}
assertNotNull("returned data was null", entities);
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){
((FetchGroupTracker)value)._persistence_setSession(context.getJpaSession());
assertTrue("Incorrect firstName returned", value.get("firstName").equals("James") || value.get("firstName").equals("Gillian"));
values.remove(value.get("firstName"));
}
assertTrue("Incorrent set of names.", values.isEmpty());
clearData();
}
@Test
public void testMarshallBid() throws URISyntaxException {
PersistenceResource resource = new PersistenceResource();
resource.setPersistenceFactory(factory);
PersistenceContext context = getAuctionPersistenceContext(null);
DynamicEntity entity1 = (DynamicEntity)context.newEntity("Auction");
entity1.set("name", "Computer");
DynamicEntity entity2 = (DynamicEntity)context.newEntity("User");
entity2.set("name", "Bob");
context.create(null, entity2);
DynamicEntity entity3 = (DynamicEntity)context.newEntity("Bid");
entity3.set("amount", 200d);
entity3.set("user", entity2);
entity3.set("auction", entity1);
context.create(null, entity3);
InputStream stream = serializeToStream(entity3, context, MediaType.APPLICATION_JSON_TYPE);
try{
entity3 = (DynamicEntity)context.unmarshalEntity("Bid", MediaType.APPLICATION_JSON_TYPE, stream);
} catch (JAXBException e){
fail("Exception unmarsalling: " + e);
}
(new FetchGroupManager()).setObjectFetchGroup(entity3, null, null);
entity1 = entity3.get("auction");
assertNotNull("Name of auction is null.", entity1.get("name"));
assertTrue("Name of auction is incorrect.", entity1.get("name").equals("Computer"));
}
@Test
public void testNamedQuery() throws URISyntaxException {
QueryResource resource = new QueryResource();
resource.setPersistenceFactory(factory);
PersistenceContext context = getAuctionPersistenceContext(null);
DynamicEntity entity1 = (DynamicEntity)context.newEntity("Auction");
entity1.set("name", "Computer");
context.create(null, entity1);
DynamicEntity entity2 = (DynamicEntity)context.newEntity("Auction");
entity2.set("name", "Word Processor");
context.create(null, entity2);
TestHttpHeaders headers = new TestHttpHeaders();
headers.getAcceptableMediaTypes().add(MediaType.APPLICATION_JSON_TYPE);
List<String> mediaTypes = new ArrayList<String>();
mediaTypes.add(MediaType.APPLICATION_JSON);
TestURIInfo ui = new TestURIInfo();
StreamingOutput output = (StreamingOutput) resource.namedQuery("jpars_auction", "Auction.all", headers, ui).getEntity();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try{
output.write(outputStream);
} catch (IOException ex){
fail(ex.toString());
}
String resultString = outputStream.toString();
assertTrue("Computer was not in results.", resultString.contains("\"name\":\"Computer\""));
assertTrue("Word Processor was not in restuls.", resultString.contains("\"name\":\"Word Processor\""));
clearData();
}
@Test
public void testNamedQuerySingleResult() throws URISyntaxException {
SingleResultQueryResource resource = new SingleResultQueryResource();
resource.setPersistenceFactory(factory);
PersistenceContext context = getAuctionPersistenceContext(null);
DynamicEntity entity1 = (DynamicEntity)context.newEntity("Auction");
entity1.set("name", "Computer");
context.create(null, entity1);
DynamicEntity entity2 = (DynamicEntity)context.newEntity("Auction");
entity2.set("name", "Word Processor");
context.create(null, entity2);
TestHttpHeaders headers = new TestHttpHeaders();
headers.getAcceptableMediaTypes().add(MediaType.APPLICATION_JSON_TYPE);
List<String> mediaTypes = new ArrayList<String>();
mediaTypes.add(MediaType.APPLICATION_JSON);
TestURIInfo ui = new TestURIInfo();
ui.addMatrixParameter("Auction.forName", "name", "Computer");
StreamingOutput output = (StreamingOutput) resource.namedQuerySingleResult("jpars_auction", "Auction.forName", headers, ui).getEntity();
String resultString = stringifyResults(output);
assertTrue("Computer was not in results.", resultString.contains("\"name\":\"Computer\""));
assertFalse("Word Processor was in results.", resultString.contains("\"name\":\"Word Processor\""));
clearData();
}
@Test
public void testUpdate() throws URISyntaxException {
EntityResource resource = new EntityResource();
resource.setPersistenceFactory(factory);
PersistenceContext context = getAuctionPersistenceContext(null);
DynamicEntity entity1 = (DynamicEntity)context.newEntity("Auction");
entity1.set("name", "Computer");
context.create(null, entity1);
entity1.set("name", "Laptop");
entity1.set("description", "Speedy");
StreamingOutput output = (StreamingOutput) resource.update("jpars_auction", "Auction", generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), new TestURIInfo(),
serializeToStream(entity1, context, MediaType.APPLICATION_JSON_TYPE)).getEntity();
String resultString = stringifyResults(output);
assertTrue("Laptop was not in results.", resultString.contains("\"name\":\"Laptop\""));
assertTrue("Laptop was not in results.", resultString.contains("\"description\":\"Speedy\""));
}
@Test
public void testUpdateRelationship() throws URISyntaxException {
EntityResource resource = new EntityResource();
resource.setPersistenceFactory(factory);
PersistenceContext context = getAuctionPersistenceContext(null);
DynamicEntity entity1 = (DynamicEntity)context.newEntity("Auction");
entity1.set("name", "Computer");
DynamicEntity entity2 = (DynamicEntity)context.newEntity("User");
entity2.set("name", "Bob");
context.create(null, entity2);
DynamicEntity entity3 = (DynamicEntity)context.newEntity("Bid");
entity3.set("amount", 200d);
entity3.set("user", entity2);
entity3.set("auction", entity1);
context.create(null, entity3);
entity3 = (DynamicEntity)context.find(null, "Bid", entity3.get("id"), null);
entity3.set("amount", 201d);
entity1 = entity3.get("auction");
entity1.set("name", "Laptop");
StreamingOutput output = (StreamingOutput) resource.update("jpars_auction", "Bid", generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), new TestURIInfo(),
serializeToStream(entity3, context, MediaType.APPLICATION_JSON_TYPE)).getEntity();
String resultString = stringifyResults(output);
assertTrue("amount was not in results.", resultString.replace(" ","").contains("\"amount\":201.0"));
String uri = RestUtils.getServerURI() + "jpars_auction/entity/Bid/";
assertTrue("link was not in results.", resultString.replace(" ", "").contains(uri));
assertTrue("rel was not in results.", resultString.replace(" ","").contains("\"rel\":\"user\""));
assertTrue("Laptop was not a link in results.", !resultString.replace(" ","").contains("\"name\":\"Laptop\""));
}
@Test
public void testMetadataQuery(){
PersistenceResource resource = new PersistenceResource();
resource.setPersistenceFactory(factory);
StreamingOutput output = null;
try{
output = (StreamingOutput) resource.getContexts(generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), new TestURIInfo()).getEntity();
} catch (JAXBException e){
fail("Exception: " + e);
}
String result = stringifyResults(output);
assertTrue("auction was not in the results", result.contains("jpars_auction"));
assertTrue("phonebook was not in the results", result.contains("jpars_phonebook"));
}
@Test
public void testTypes() {
PersistenceUnitResource resource = new PersistenceUnitResource();
resource.setPersistenceFactory(factory);
StreamingOutput output = null;
output = (StreamingOutput) resource.getTypes("jpars_auction", generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), new TestURIInfo()).getEntity();
String result = stringifyResults(output);
assertTrue("Bid was not in the results", result.contains("Bid"));
assertTrue("Auction was not in the results", result.contains("Auction"));
assertTrue("User was not in the results", result.contains("User"));
}
@Test
public void testDelete() throws URISyntaxException {
EntityResource resource = new EntityResource();
resource.setPersistenceFactory(factory);
PersistenceContext context = getAuctionPersistenceContext(null);
DynamicEntity entity1 = (DynamicEntity)context.newEntity("Auction");
entity1.set("name", "Computer1");
context.create(null, entity1);
TestURIInfo ui = new TestURIInfo();
resource.delete("jpars_auction", "Auction", entity1.get("id").toString(), ui, generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON));
entity1 = (DynamicEntity)context.find("Auction", entity1.get("id"));
assertTrue("Entity was not deleted.", entity1 == null);
}
@Test
public void testWriteQuery() throws URISyntaxException {
QueryResource resource = new QueryResource();
resource.setPersistenceFactory(factory);
PersistenceContext context = getAuctionPersistenceContext(null);
DynamicEntity entity = (DynamicEntity)context.newEntity("User");
entity.set("name", "Bob");
context.create(null, entity);
TestURIInfo ui = new TestURIInfo();
ui.addMatrixParameter("User.updateName", "name", "Robert");
ui.addMatrixParameter("User.updateName", "id", entity.get("id").toString());
resource.namedQueryUpdate("jpars_auction", "User.updateName", generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), ui);
entity = (DynamicEntity)context.find("User", entity.get("id"));
assertTrue("Entity was not updated.", entity.get("name").equals("Robert"));
}
@Test
public void testDynamicCompositeKey() throws URISyntaxException {
EntityResource resource = new EntityResource();
resource.setPersistenceFactory(factory);
PersistenceContext context = getAuctionPersistenceContext(null);
DynamicEntity user = (DynamicEntity)context.newEntity("User");
user.set("name", "Wes");
DynamicEntity address = (DynamicEntity)context.newEntity("Address");
address.set("city", "Ottawa");
address.set("postalCode", "a1a1a1");
address.set("street", "Main Street");
address.set("type", "Home");
user.set("address", address);
context.create(null, user);
Response output = resource.find("jpars_auction", "Address", address.get("id") + "+" + address.get("type"), generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON),
new TestURIInfo());
String result = stringifyResults((StreamingOutputMarshaller)output.getEntity());
assertTrue("Type was not in the result", result.contains("Home"));
assertTrue("Id was not in the result", result.contains(address.get("id").toString()));
}
@Test
public void testStaticCompositeKey(){
EntityResource resource = new EntityResource();
resource.setPersistenceFactory(factory);
Response output = resource.find("jpars_auction-static-local", "StaticAddress", StaticModelDatabasePopulator.ADDRESS1_ID + "+" + StaticModelDatabasePopulator.address1().getType(),
generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), new TestURIInfo());
String result = stringifyResults((StreamingOutputMarshaller)output.getEntity());
assertTrue("home was not in the result", result.contains("home"));
assertTrue("user was not in the result", result.contains("\"rel\":\"user\""));
}
@Test
public void testStaticRelationships(){
EntityResource resource = new EntityResource();
resource.setPersistenceFactory(factory);
Response output = resource.find("jpars_auction-static-local", "StaticBid", String.valueOf(StaticModelDatabasePopulator.BID1_ID),
generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), new TestURIInfo());
String result = stringifyResults((StreamingOutputMarshaller)output.getEntity());
assertTrue("Auction was not in the result", result.contains("\"rel\":\"auction\""));
assertTrue("User link was not in the result", result.contains("\"rel\":\"user\""));
}
@Test
public void testUpdateStaticRelationship() throws URISyntaxException {
EntityResource resource = new EntityResource();
resource.setPersistenceFactory(factory);
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(PersistenceUnitProperties.NON_JTA_DATASOURCE, null);
PersistenceContext context = factory.get("jpars_auction-static-local", RestUtils.getServerURI(), null, properties);
StaticUser initialUser = (StaticUser)((StaticBid)context.find("StaticBid", StaticModelDatabasePopulator.BID1_ID)).getUser();
StaticUser user2 = (StaticUser)context.find("StaticUser", StaticModelDatabasePopulator.USER2_ID);
try{
Response output = resource.setOrAddAttribute("jpars_auction-static-local", "StaticBid", String.valueOf(StaticModelDatabasePopulator.BID1_ID), "user",
generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), new TestURIInfo(), serializeToStream(user2, context, MediaType.APPLICATION_JSON_TYPE));
stringifyResults((StreamingOutputMarshaller)output.getEntity());
context.getJpaSession().getIdentityMapAccessor().initializeAllIdentityMaps();
StaticBid bid = (StaticBid)context.find("StaticBid", StaticModelDatabasePopulator.BID1_ID);
assertTrue(bid.getUser().equals(user2));
} finally {
context.updateOrAddAttribute(null, "StaticBid", StaticModelDatabasePopulator.BID1_ID, null, "user", initialUser, null);
}
}
@Test
public void testStaticReportQuery() throws URISyntaxException {
QueryResource resource = new QueryResource();
resource.setPersistenceFactory(factory);
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(PersistenceUnitProperties.NON_JTA_DATASOURCE, null);
@SuppressWarnings("unused")
PersistenceContext context = factory.get("jpars_auction-static-local", RestUtils.getServerURI(), null, properties);
TestHttpHeaders headers = new TestHttpHeaders();
headers.getAcceptableMediaTypes().add(MediaType.APPLICATION_JSON_TYPE);
List<String> mediaTypes = new ArrayList<String>();
mediaTypes.add(MediaType.APPLICATION_JSON);
TestURIInfo ui = new TestURIInfo();
StreamingOutput output = (StreamingOutput) resource.namedQuery("jpars_auction-static-local", "User.count", headers, ui).getEntity();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try{
output.write(outputStream);
} catch (IOException ex){
fail(ex.toString());
}
String resultString = outputStream.toString();
assertTrue("Incorrect result", resultString.contains("[{\"COUNT\":3}]"));
clearData();
}
@Test
public void testUnmarshallNonExistantLink() throws URISyntaxException {
PersistenceResource resource = new PersistenceResource();
resource.setPersistenceFactory(factory);
PersistenceContext context = getAuctionPersistenceContext(null);
LinkAdapter adapter = new LinkAdapter("http://localhost:9090/JPA-RS/", context);
DynamicEntity entity1 = null;
DynamicEntity entity2 = null;
try{
entity1 = (DynamicEntity) adapter.unmarshal("http://localhost:9090/JPA-RS/jpars_auction/entity/Auction/1");
} catch (Exception e){
fail(e.toString());
}
assertTrue("id for Auction was missing", entity1.get("id").equals(1));
try{
entity2 = (DynamicEntity) adapter.unmarshal("http://localhost:9090/JPA-RS/jpars_auction/entity/Address/1+Home");
} catch (Exception e){
fail(e.toString());
}
assertTrue("id for Address was missing", entity2.get("id").equals(1));
assertTrue("type for Address was missing", entity2.get("type").equals("Home"));
}
@Test
public void testMetadata() {
PersistenceResource resource = new PersistenceResource();
resource.setPersistenceFactory(factory);
try {
resource.getContexts(generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), new TestURIInfo());
} catch (JAXBException e) {
fail(e.toString());
}
}
@Test
public void testMetadataTypes() {
PersistenceUnitResource resource = new PersistenceUnitResource();
resource.setPersistenceFactory(factory);
resource.getTypes("jpars_auction", generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), new TestURIInfo());
resource.getDescriptorMetadata("jpars_auction", "Bid", generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), new TestURIInfo());
resource.getQueriesMetadata("jpars_auction", generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), new TestURIInfo());
}
@Test
public void testMultitenant() throws JAXBException, URISyntaxException {
EntityResource resource = new EntityResource();
resource.setPersistenceFactory(factory);
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(PersistenceUnitProperties.NON_JTA_DATASOURCE, null);
PersistenceContext context = factory.get("jpars_auction-static-local", RestUtils.getServerURI(), null, properties);
Account account = new Account();
account.setAccoutNumber("AAA111");
TestURIInfo ui = new TestURIInfo();
ui.addMatrixParameter("jpars_auction-static-local", "tenant.id", "AcctOwner1");
StreamingOutput output = (StreamingOutput) resource.update("jpars_auction-static-local", "Account", generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), ui,
serializeToStream(account, context, MediaType.APPLICATION_JSON_TYPE)).getEntity();
String result = stringifyResults(output);
account = (Account)context.unmarshalEntity(Account.class, MediaType.APPLICATION_JSON_TYPE, new ByteArrayInputStream(result.getBytes()));
output = (StreamingOutput) resource.find("jpars_auction-static-local", "Account", String.valueOf(account.getId()),
generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), ui).getEntity();
result = stringifyResults(output);
account = (Account)context.unmarshalEntity(Account.class, MediaType.APPLICATION_JSON_TYPE, new ByteArrayInputStream(result.getBytes()));
assertTrue("account is null", account != null);
TestURIInfo ui2 = new TestURIInfo();
ui2.addMatrixParameter("jpars_auction-static-local", "tenant.id", "AcctOwner2");
output = (StreamingOutput) resource.find("jpars_auction-static-local", "Account", String.valueOf(account.getId()),
generateHTTPHeader(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON), ui2).getEntity();
assertTrue("output should be null", output == null);
}
public static String stringifyResults(StreamingOutput output){
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try{
output.write(outputStream);
} catch (IOException ex){
fail(ex.toString());
}
return outputStream.toString();
}
public static InputStream serializeToStream(Object object, PersistenceContext context, MediaType mediaType){
ByteArrayOutputStream os = new ByteArrayOutputStream();
try{
context.marshallEntity(object, mediaType, os);
} catch (Exception e){
e.printStackTrace();
fail(e.toString());
}
ByteArrayInputStream stream = new ByteArrayInputStream(os.toByteArray());
return stream;
}
public static InputStream serializeListToStream(List<DynamicEntity> object, PersistenceContext context, MediaType mediaType){
ByteArrayOutputStream os = new ByteArrayOutputStream();
try{
context.marshallEntity(object, mediaType, os);
} catch (Exception e){
e.printStackTrace();
fail(e.toString());
}
ByteArrayInputStream stream = new ByteArrayInputStream(os.toByteArray());
return stream;
}
public static HttpHeaders generateHTTPHeader(MediaType acceptableMedia, String mediaTypeString){
TestHttpHeaders headers = new TestHttpHeaders();
headers.getAcceptableMediaTypes().add(acceptableMedia);
List<String> mediaTypes = new ArrayList<String>();
mediaTypes.add(mediaTypeString);
headers.getRequestHeaders().put(HttpHeaders.CONTENT_TYPE, mediaTypes);
return headers;
}
}