blob: 9875337d1c52dbc57e63f3feef85a689ff0f97d0 [file] [log] [blame]
/*
* Copyright (c) 2011, 2021 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 v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// gonural - Initial implementation
// 2014-09-01-2.6.0 Dmitry Kornilov
// - Moved to separate package together with other 'no version' tests.
package org.eclipse.persistence.jpars.test.service;
import org.eclipse.persistence.exceptions.JPARSErrorCodes;
import org.eclipse.persistence.jpa.rs.exceptions.JPARSException;
import org.eclipse.persistence.jpars.test.BaseJparsTest;
import org.eclipse.persistence.jpars.test.model.auction.StaticAddress;
import org.eclipse.persistence.jpars.test.model.auction.StaticAuction;
import org.eclipse.persistence.jpars.test.model.auction.StaticBid;
import org.eclipse.persistence.jpars.test.model.auction.StaticUser;
import org.eclipse.persistence.jpars.test.server.RestCallFailedException;
import org.eclipse.persistence.jpars.test.util.RestUtils;
import org.junit.BeforeClass;
import org.junit.Test;
import jakarta.persistence.EntityManager;
import jakarta.ws.rs.core.MediaType;
import jakarta.xml.bind.JAXBException;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import static org.junit.Assert.assertTrue;
/**
* A set of marshal/unmarshal tests.
*
* @author gonural
*/
public class MarshalUnmarshalTestBase extends BaseJparsTest {
@BeforeClass
public static void setup() throws Exception {
initContext("jpars_auction-static", null);
}
/**
* Test unmarshal by ref.
*
* @throws JAXBException the jAXB exception
*/
@Test
public void testUnmarshalByRef() throws JAXBException {
EntityManager em = context.getEmf().createEntityManager();
// Create the bids referenced by hrefs, so that unmarshal can find them
// in PU
em.getTransaction().begin();
// "href":"http://localhost:9090/JPA-RS/jpars_auction-static/entity/StaticBid/1234",
StaticBid bid1 = new StaticBid();
bid1.setId(1234);
bid1.setAmount(110);
bid1.setTime(System.currentTimeMillis());
em.persist(bid1);
// "href":"http://localhost:9090/JPA-RS/jpars_auction-static/entity/StaticBid/5678",
StaticBid bid2 = new StaticBid();
bid2.setId(5678);
bid2.setAmount(111);
bid2.setTime(System.currentTimeMillis());
em.persist(bid2);
em.getTransaction().commit();
//
String jsonMessage = RestUtils.getJSONMessage("auction-bidsByRef.json");
assertTrue(jsonMessage != null);
StaticAuction auction = unmarshal(jsonMessage,
StaticAuction.class.getSimpleName());
assertTrue("Incorrectly unmarshalled auction.", auction.getName()
.equals("Dora Maar au Chat"));
List<StaticBid> bids = auction.getBids();
assertTrue("Incorrectly unmarshalled bids.", bids.size() > 0);
// cleanup
dbDelete(bid1);
dbDelete(bid2);
}
/**
* Test unmarshal by value.
*
* @throws JAXBException the jAXB exception
*/
@Test
public void testUnmarshalByValue() throws JAXBException {
String jsonMessage = RestUtils.getJSONMessage("auction-bidsByValue.json");
StaticAuction auctionUnmarshalled = unmarshal(jsonMessage,
StaticAuction.class.getSimpleName());
assertTrue("Unmarshal returned a null object",
auctionUnmarshalled != null);
List<StaticBid> bidsUnmarshalled = auctionUnmarshalled.getBids();
assertTrue("Incorrectly unmarshalled bids.",
bidsUnmarshalled.size() > 0);
}
/**
* Test unmarshal by reference non existing nested object.
*
* @throws IOException Signals that an I/O exception has occurred.
* @throws JAXBException the jAXB exception
*/
@Test
public void testUnmarshalByReferenceNonExistingNestedObject()
throws IOException, JAXBException {
// Send a JSON message with links where the links point to non-existing
// objects
String jsonMessage = RestUtils.getJSONMessage("auction-bidsByRef.json");
assertTrue(jsonMessage != null);
try {
unmarshal(jsonMessage, StaticAuction.class.getSimpleName());
} catch (JPARSException ex) {
assertTrue(ex.getErrorCode() == JPARSErrorCodes.OBJECT_REFERRED_BY_LINK_DOES_NOT_EXIST);
}
}
/**
* Test marshal.
*
* @throws RestCallFailedException the rest call failed exception
* @throws UnsupportedEncodingException the unsupported encoding exception
* @throws JAXBException the jAXB exception
*/
@Test
public void testMarshal() throws RestCallFailedException,
UnsupportedEncodingException, JAXBException {
StaticBid bid = new StaticBid();
bid.setId(20);
bid.setAmount(100.0);
bid.setTime(System.currentTimeMillis());
StaticUser user = new StaticUser();
user.setId(22);
user.setName("Brahms");
StaticAddress address = new StaticAddress();
address.setCity("Hamburg");
// set pk
address.setId(67);
address.setType("Home");
user.setAddress(address);
bid.setUser(user);
String marshalledBid = marshal(bid);
assertTrue("Marshalling bid returned null", marshalledBid != null);
String marshalledUser = marshal(user);
assertTrue("Marshalling user returned null", marshalledUser != null);
}
@Test
public void testUnmarshalBidWithUserByRef() throws JAXBException, RestCallFailedException, UnsupportedEncodingException {
EntityManager em = context.getEmf().createEntityManager();
em.getTransaction().begin();
StaticBid bid = new StaticBid();
bid.setId(1001);
bid.setAmount(5000);
bid.setTime(System.currentTimeMillis());
StaticUser user = new StaticUser();
user.setId(2002);
user.setName("User 2002");
bid.setUser(user);
em.persist(bid);
em.getTransaction().commit();
marshal(bid);
String xmlMessage = RestUtils.getXMLMessage("bid-UserByRef.xml");
StaticBid bidUnmarshalled = unmarshal(xmlMessage,
StaticBid.class.getSimpleName(), MediaType.APPLICATION_XML_TYPE);
assertTrue("Unmarshal returned a null bid", bidUnmarshalled != null);
StaticUser userUnmarshalled = bidUnmarshalled.getUser();
assertTrue("Unmarshal returned a null user", userUnmarshalled != null);
dbDelete(bid);
}
@SuppressWarnings("unchecked")
private static <T> T unmarshal(String msg, String type)
throws JAXBException {
T resultObject = null;
resultObject = (T) context.unmarshalEntity(type,
MediaType.APPLICATION_JSON_TYPE,
new ByteArrayInputStream(msg.getBytes()));
return resultObject;
}
@SuppressWarnings("unchecked")
private static <T> T unmarshal(String msg, String type, MediaType mediaType)
throws JAXBException {
T resultObject = null;
resultObject = (T) context.unmarshalEntity(type, mediaType,
new ByteArrayInputStream(msg.getBytes()));
return resultObject;
}
private static <T> String marshal(Object object)
throws RestCallFailedException, JAXBException,
UnsupportedEncodingException {
ByteArrayOutputStream os = new ByteArrayOutputStream();
context.marshall(object, MediaType.APPLICATION_JSON_TYPE, os, false);
return os.toString("UTF-8");
}
private static void dbDelete(Object object) {
EntityManager em = context.getEmf().createEntityManager();
em.getTransaction().begin();
Object merged = em.merge(object);
em.remove(merged);
em.getTransaction().commit();
}
}