blob: 9615caad2b3229ef40c4418d792e621d573e15cf [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
******************************************************************************/
package org.apache.olingo.odata2.client.core.ep;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.olingo.odata2.api.batch.BatchException;
import org.apache.olingo.odata2.api.batch.BatchResponsePart;
import org.apache.olingo.odata2.api.client.batch.BatchChangeSet;
import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart;
import org.apache.olingo.odata2.api.client.batch.BatchPart;
import org.apache.olingo.odata2.api.client.batch.BatchSingleResponse;
import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
import org.apache.olingo.odata2.api.edm.EdmEntitySet;
import org.apache.olingo.odata2.api.edm.EdmFunctionImport;
import org.apache.olingo.odata2.api.ep.EntityProviderException;
import org.apache.olingo.odata2.api.ep.entry.ODataEntry;
import org.apache.olingo.odata2.api.ep.feed.ODataDeltaFeed;
import org.apache.olingo.odata2.api.ep.feed.ODataFeed;
import org.apache.olingo.odata2.api.exception.ODataException;
import org.apache.olingo.odata2.api.processor.ODataResponse;
import org.apache.olingo.odata2.client.api.ODataClient;
import org.apache.olingo.odata2.client.api.ep.DeserializerProperties;
import org.apache.olingo.odata2.client.api.ep.Entity;
import org.apache.olingo.odata2.client.api.ep.EntityCollection;
import org.apache.olingo.odata2.client.api.ep.EntityCollectionSerializerProperties;
import org.apache.olingo.odata2.client.api.ep.EntitySerializerProperties;
import org.apache.olingo.odata2.client.api.ep.EntityStream;
import org.apache.olingo.odata2.core.batch.v2.BatchLineReader;
import org.apache.olingo.odata2.core.batch.v2.BatchParser;
import org.apache.olingo.odata2.core.batch.v2.Line;
import org.apache.olingo.odata2.testutil.mock.MockFacade;
import org.junit.Test;
public class ProducerConsumerIntegrationTest {
protected static final URI BASE_URI;
private static final String PUT = "PUT";
private static final String BOUNDARY = "batch_123";
private static final Object CRLF = "\r\n";
static {
try {
BASE_URI = new URI("http://host:80/service/");
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
private static final DeserializerProperties DEFAULT_READ_PROPERTIES
= DeserializerProperties.init()
.build();
private static final EntitySerializerProperties DEFAULT_WRITE_PROPERTIES
= EntitySerializerProperties
.serviceRoot(
BASE_URI).build();
private static final String XML = "application/xml";
private static final String JSON = "application/json";
@Test
public void produceRoomAndThenConsumeIt() throws Exception {
EdmEntitySet roomSet = MockFacade.getMockEdm()
.getDefaultEntityContainer().getEntitySet("Rooms");
Entity localRoomData = new Entity();
localRoomData.addProperty("Id", "1");
localRoomData.addProperty("Name", "Neu \n Schwanstein蝴蝶");
Map<String, Object> properties = execute(localRoomData, roomSet, XML);
assertEquals("1", properties.get("Id"));
assertEquals("Neu \n Schwanstein蝴蝶", properties.get("Name"));
Map<String, Object> properties2 = execute(localRoomData, roomSet, JSON);
assertEquals("1", properties2.get("Id"));
assertEquals("Neu \n Schwanstein蝴蝶", properties2.get("Name"));
}
@Test
public void produceRoomFeedAndThenConsumeIt() throws Exception {
EdmEntitySet roomSet = MockFacade.getMockEdm()
.getDefaultEntityContainer().getEntitySet("Rooms");
EntityCollection roomsData = new EntityCollection();
Entity localRoomData = new Entity();
localRoomData.addProperty("Id", "1");
localRoomData.addProperty("Name", "Neu \n Schwanstein蝴蝶");
roomsData.addEntity(localRoomData);
localRoomData = new Entity();
localRoomData.addProperty("Id", "2");
localRoomData.addProperty("Name", "John蝴蝶");
roomsData.addEntity(localRoomData);
List<Map<String, Object>> entries = execute1(roomsData, roomSet, XML);
validateResults(entries);
entries = execute1(roomsData, roomSet, JSON);
validateResults(entries);
}
@Test(expected=EntityProviderException.class)
public void negativeTests() throws Exception {
EdmEntitySet roomSet = MockFacade.getMockEdm()
.getDefaultEntityContainer().getEntitySet("Rooms");
Entity localRoomData = new Entity();
localRoomData.addProperty("Id", "1");
localRoomData.addProperty("Name", "Neu \n Schwanstein蝴蝶");
Map<String, Object> properties = execute(localRoomData, roomSet, "abc");
assertEquals("1", properties.get("Id"));
assertEquals("Neu \n Schwanstein蝴蝶", properties.get("Name"));
}
@Test(expected=EntityProviderException.class)
public void negativeTestsDeserializer() throws Exception {
EdmEntitySet roomSet = MockFacade.getMockEdm()
.getDefaultEntityContainer().getEntitySet("Rooms");
Entity localRoomData = new Entity();
localRoomData.addProperty("Id", "1");
localRoomData.addProperty("Name", "Neu \n Schwanstein蝴蝶");
Map<String, Object> properties = executeFail(localRoomData, roomSet, "abc");
assertEquals("1", properties.get("Id"));
assertEquals("Neu \n Schwanstein蝴蝶", properties.get("Name"));
}
/**
* @param entries
*/
private void validateResults(List<Map<String, Object>> entries) {
for (Map<String, Object> entryProperties : entries) {
for (Entry<String, Object> properties : entryProperties.entrySet()) {
if (properties.getKey().equals("Id")) {
assertTrue(properties.getValue().toString().contains("1") ||
properties.getValue().toString().contains("2"));
} else {
assertTrue(properties.getValue().toString().contains("Neu \n Schwanstein蝴蝶") ||
properties.getValue().toString().contains("John蝴蝶"));
}
}
}
}
private Map<String, Object> execute(final Entity localRoomData, final EdmEntitySet roomSet,
final String contentType)
throws ODataException {
localRoomData.setWriteProperties(DEFAULT_WRITE_PROPERTIES);
ODataResponse response = ODataClient.newInstance().createSerializer(contentType)
.writeEntry(roomSet, localRoomData);
InputStream content = response.getEntityAsStream();
EntityStream entityContent = new EntityStream();
entityContent.setReadProperties(DEFAULT_READ_PROPERTIES);
entityContent.setContent(content);
ODataEntry entry = ODataClient.newInstance()
.createDeserializer(contentType).readEntry(roomSet, entityContent);
Map<String, Object> properties = entry.getProperties();
return properties;
}
private Map<String, Object> executeFail(final Entity localRoomData, final EdmEntitySet roomSet,
final String contentType)
throws ODataException {
localRoomData.setWriteProperties(DEFAULT_WRITE_PROPERTIES);
ODataResponse response = ODataClient.newInstance().createSerializer(XML)
.writeEntry(roomSet, localRoomData);
InputStream content = response.getEntityAsStream();
EntityStream entityContent = new EntityStream();
entityContent.setReadProperties(DEFAULT_READ_PROPERTIES);
entityContent.setContent(content);
ODataEntry entry = ODataClient.newInstance()
.createDeserializer(contentType).readEntry(roomSet, entityContent);
Map<String, Object> properties = entry.getProperties();
return properties;
}
private List<Map<String, Object>> execute1(final EntityCollection localRoomData, final EdmEntitySet roomSet,
final String contentType)
throws ODataException {
List<Map<String, Object>> propertiesList = new ArrayList<Map<String,Object>>();
localRoomData.setCollectionProperties(EntityCollectionSerializerProperties.serviceRoot(BASE_URI).build());
ODataResponse response = ODataClient.newInstance().createSerializer(contentType)
.writeFeed(roomSet, localRoomData);
InputStream content = response.getEntityAsStream();
EntityStream entityContent = new EntityStream();
entityContent.setReadProperties(DEFAULT_READ_PROPERTIES);
entityContent.setContent(content);
ODataFeed feed = ODataClient.newInstance()
.createDeserializer(contentType).readFeed(roomSet, entityContent);
List<ODataEntry> entries = feed.getEntries();
for (ODataEntry entry : entries) {
propertiesList.add(entry.getProperties());
}
return propertiesList;
}
@Test
public void executeWriteBatchRequestJSON() throws IOException,
EntityProviderException, BatchException, URISyntaxException {
List<BatchPart> batch = new ArrayList<BatchPart>();
Map<String, String> headers = new HashMap<String, String>();
headers.put("content-type", "application/json");
BatchChangeSetPart request = BatchChangeSetPart.method(PUT)
.uri("Employees('2')")
.body("{\"Age\":40}")
.headers(headers)
.contentId("111")
.build();
BatchChangeSet changeSet = BatchChangeSet.newBuilder().build();
changeSet.add(request);
batch.add((BatchPart) changeSet);
InputStream batchRequest = ODataClient.newInstance().createSerializer(JSON).
readBatchRequest(batch, BOUNDARY);
validateBatchRequest(batchRequest);
}
private void validateBatchRequest(InputStream batchRequest) throws IOException {
BatchLineReader reader =
new BatchLineReader(batchRequest);
List<Line> lines = reader.toLineList();
reader.close();
int index = 0;
assertTrue(lines.get(index++).toString().startsWith("--batch"));
assertTrue(lines.get(index++).toString().startsWith("Content-Type: multipart/mixed; boundary=changeset_"));
assertEquals(CRLF, lines.get(index++).toString());
assertTrue(lines.get(index++).toString().startsWith("--changeset"));
assertEquals("Content-Type: application/http" + CRLF, lines.get(index++).toString());
assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(index++).toString());
assertEquals("Content-Id: 111" + CRLF, lines.get(index++).toString());
assertEquals(CRLF, lines.get(index++).toString());
assertEquals("PUT Employees('2') HTTP/1.1" + CRLF, lines.get(index++).toString());
assertEquals("Content-Length: 10" + CRLF, lines.get(index++).toString());
assertEquals("content-type: application/json" + CRLF, lines.get(index++).toString());
assertEquals(CRLF, lines.get(index++).toString());
assertEquals("{\"Age\":40}" + CRLF, lines.get(index++).toString());
assertTrue(lines.get(index++).toString().startsWith("--changeset"));
assertTrue(lines.get(index++).toString().startsWith("--batch"));
}
@Test
public void executeWriteBatchResponseJSON() throws BatchException, EntityProviderException {
List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>();
ODataResponse response = ODataResponse.entity("Walter Winter")
.status(HttpStatusCodes.OK)
.contentHeader("application/json")
.build();
List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
responses.add(response);
parts.add(BatchResponsePart.responses(responses).changeSet(false).build());
ODataResponse changeSetResponse = ODataResponse.status(HttpStatusCodes.NO_CONTENT).build();
responses = new ArrayList<ODataResponse>(1);
responses.add(changeSetResponse);
parts.add(BatchResponsePart.responses(responses).changeSet(true).build());
ODataResponse batchResponse = ODataClient.newInstance().createDeserializer(JSON).writeBatchResponse(parts);
assertEquals(202, batchResponse.getStatus().getStatusCode());
assertNotNull(batchResponse.getEntity());
String body = (String) batchResponse.getEntity();
assertTrue(body.contains("--batch"));
assertTrue(body.contains("--changeset"));
assertTrue(body.contains("HTTP/1.1 200 OK"));
assertTrue(body.contains("Content-Type: application/http"));
assertTrue(body.contains("Content-Transfer-Encoding: binary"));
assertTrue(body.contains("Walter Winter"));
assertTrue(body.contains("multipart/mixed; boundary=changeset"));
assertTrue(body.contains("HTTP/1.1 204 No Content"));
String contentHeader = batchResponse.getContentHeader();
BatchParser parser = new BatchParser(contentHeader, true);
List<BatchSingleResponse> result = parser.parseBatchResponse(new ByteArrayInputStream(body.getBytes()));
assertEquals(2, result.size());
}
@Test
public void readFunctionImportJOSNSimpleProperty1() throws Exception {
final EdmFunctionImport functionImport = MockFacade.getMockEdm().getDefaultEntityContainer()
.getFunctionImport("MaximalAge");
InputStream content = new ByteArrayInputStream("{\"d\":{\"MaximalAge\":42}}".getBytes("UTF-8"));
EntityStream entityStream = new EntityStream();
entityStream.setReadProperties(DEFAULT_READ_PROPERTIES);
entityStream.setContent(content);
final Object result = executeFunctionImport(functionImport, entityStream, JSON);
assertEquals((short) 42, result);
}
@Test
public void readFunctionImportXMLSimpleProperty() throws Exception {
final EdmFunctionImport functionImport = MockFacade.getMockEdm().getDefaultEntityContainer()
.getFunctionImport("MaximalAge");
InputStream content = new ByteArrayInputStream((
"<?xml version='1.0' encoding='utf-8'?>"
+ "<MaximalAge xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices\" "
+ "xmlns:m=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\">"
+ "42</MaximalAge>").getBytes("UTF-8"));
EntityStream entityStream = new EntityStream();
entityStream.setReadProperties(DEFAULT_READ_PROPERTIES);
entityStream.setContent(content);
final Object result = executeFunctionImport(functionImport, entityStream, XML);
assertEquals((short) 42, result);
}
@Test
public void readFunctionImportJOSNSimpleProperty2() throws Exception {
final EdmFunctionImport functionImport = MockFacade.getMockEdm().getDefaultEntityContainer()
.getFunctionImport("MaximalAge");
InputStream content = new ByteArrayInputStream("{\"MaximalAge\":42}".getBytes("UTF-8"));
EntityStream entityStream = new EntityStream();
entityStream.setReadProperties(DEFAULT_READ_PROPERTIES);
entityStream.setContent(content);
final Object result = executeFunctionImport(functionImport, entityStream, JSON);
assertEquals((short) 42, result);
}
@SuppressWarnings("unchecked")
@Test
public void readFunctionImportJSONCollectionOfComplexProperty1() throws Exception {
final EdmFunctionImport functionImport = MockFacade.getMockEdm().getDefaultEntityContainer()
.getFunctionImport("AllLocations");
InputStream content = new ByteArrayInputStream((
"{\"results\": [{\"City\": {\"PostalCode\":\"56\",\"CityName\":\"Bangalore\"},"
+ "\"Country\": \"India\"}]}").getBytes("UTF-8"));
EntityStream entityStream = new EntityStream();
entityStream.setReadProperties(DEFAULT_READ_PROPERTIES);
entityStream.setContent(content);
final Object result = executeFunctionImport(functionImport, entityStream, JSON);
List<Map<String, Object>> res = (List<Map<String, Object>>) result;
assertEquals(1, res.size());
assertEquals("India", ((HashMap<String, Object>)res.get(0)).get("Country"));
assertEquals(2, ((Map<String, Object>)((Map<String, Object>)res.get(0)).get("City")).size());
}
@SuppressWarnings("unchecked")
@Test
public void readFunctionImportJSONCollectionOfComplexProperty2() throws Exception {
final EdmFunctionImport functionImport = MockFacade.getMockEdm().getDefaultEntityContainer()
.getFunctionImport("AllLocations");
InputStream content = new ByteArrayInputStream((
"{\"d\":{\"results\": [{\"City\": {\"PostalCode\":\"56\",\"CityName\":\"Bangalore\"},"
+ "\"Country\": \"India\"}]}}").getBytes("UTF-8"));
EntityStream entityStream = new EntityStream();
entityStream.setReadProperties(DEFAULT_READ_PROPERTIES);
entityStream.setContent(content);
final Object result = executeFunctionImport(functionImport, entityStream, JSON);
List<Map<String, Object>> res = (List<Map<String, Object>>) result;
assertEquals(1, res.size());
assertEquals("India", ((HashMap<String, Object>)res.get(0)).get("Country"));
assertEquals(2, ((Map<String, Object>)((Map<String, Object>)res.get(0)).get("City")).size());
}
@SuppressWarnings("unchecked")
@Test
public void readFunctionImportXMLCollectionOfComplexProperty() throws Exception {
final EdmFunctionImport functionImport = MockFacade.getMockEdm().getDefaultEntityContainer()
.getFunctionImport("AllLocations");
InputStream content = new ByteArrayInputStream((
"<?xml version='1.0' encoding='utf-8'?>"
+ "<AllLocations xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices\" "
+ "xmlns:m=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\">"
+ "<element m:type=\"RefScenario.c_Location\">"
+ "<City m:type=\"RefScenario.c_City\">"
+ "<PostalCode>69124</PostalCode>"
+ "<CityName>Heidelberg</CityName>"
+ "</City>"
+ "<Country>Germany</Country>"
+ "</element>"
+ "<element m:type=\"RefScenario.c_Location\">"
+ "<City m:type=\"RefScenario.c_City\">"
+ "<PostalCode>69190</PostalCode>"
+ "<CityName>Walldorf</CityName>"
+ "</City>"
+ "<Country>Germany</Country>"
+ "</element>"
+ "</AllLocations>").getBytes("UTF-8"));
EntityStream entityStream = new EntityStream();
entityStream.setReadProperties(DEFAULT_READ_PROPERTIES);
entityStream.setContent(content);
final Object result = executeFunctionImport(functionImport, entityStream, XML);
List<Map<String, Object>> res = (List<Map<String, Object>>) result;
assertEquals(2, res.size());
assertEquals("Germany", ((HashMap<String, Object>)res.get(0)).get("Country"));
assertEquals(2, ((Map<String, Object>)((Map<String, Object>)res.get(0)).get("City")).size());
}
@Test
public void readFunctionImportJSONSingleEntity1() throws Exception {
final EdmFunctionImport functionImport = MockFacade.getMockEdm().getDefaultEntityContainer()
.getFunctionImport("OldestEmployee");
InputStream content = new ByteArrayInputStream(
("{\"d\": {"
+ "\"__metadata\": {"
+ "\"type\": \"RefScenario.Employee\","
+ "\"content_type\": \"image/jpeg\","
+ "\"media_src\":\"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/$value\","
+ "\"edit_media\":\"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/$value\""
+ "},"
+ "\"EmployeeId\": \"3\","
+ "\"EmployeeName\": \"Jonathan Smith\","
+ "\"ManagerId\": \"1\","
+ "\"RoomId\": \"2\","
+ "\"TeamId\": \"1\","
+ "\"Location\": {"
+ "\"__metadata\": {"
+ "\"type\": \"RefScenario.c_Location\""
+ "},"
+ "\"City\": {"
+ "\"__metadata\": {"
+ "\"type\": \"RefScenario.c_City\""
+ "},"
+ "\"PostalCode\": \"69190\","
+ "\"CityName\": \"Walldorf\""
+ "},"
+ "\"Country\": \"Germany\""
+ "},"
+ "\"Age\": 56,"
+ "\"EntryDate\": null,"
+ "\"ImageUrl\": \"Employees('3')/$value\","
+ "\"ne_Manager\": {"
+ "\"__deferred\": {"
+ "\"uri\": \"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/ne_Manager\""
+ "}"
+ "},"
+ "\"ne_Team\": {"
+ "\"__deferred\": {"
+ "\"uri\": \"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/ne_Team\""
+ "}"
+ "},"
+ "\"ne_Room\": {"
+ "\"__deferred\": {"
+ "\"uri\": \"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/ne_Room\""
+ "}"
+ "}"
+ "}"
+ "}").getBytes("UTF-8"));
EntityStream entityStream = new EntityStream();
entityStream.setReadProperties(DEFAULT_READ_PROPERTIES);
entityStream.setContent(content);
final Object result = executeFunctionImport(functionImport, entityStream, JSON);
ODataEntry entry = (ODataEntry) result;
assertEquals(9, entry.getProperties().size());
assertEquals("3", entry.getProperties().get("EmployeeId"));
}
@Test
public void readFunctionImportXMLSingleEntity() throws Exception {
final EdmFunctionImport functionImport = MockFacade.getMockEdm().getDefaultEntityContainer()
.getFunctionImport("OldestEmployee");
InputStream content = new ByteArrayInputStream(
("<?xml version='1.0' encoding='utf-8'?>"
+ "<entry xmlns=\"http://www.w3.org/2005/Atom\" "
+ "xmlns:m=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\" "
+ "xmlns:d=\"http://schemas.microsoft.com/ado/2007/08/dataservices\" "
+ "xml:base=\"http://localhost:8083/olingo-odata2-ref-web/ReferenceScenarioNonJaxrs.svc/\">"
+ "<id>"
+ "http://localhost:8083/olingo-odata2-ref-web/ReferenceScenarioNonJaxrs.svc/Employees('3')"
+ "</id>"
+ "<title type=\"text\">Jonathan Smith</title>"
+ "<updated>2017-10-26T09:06:41.15+05:30</updated>"
+ "<category term=\"RefScenario.Employee\" "
+ "scheme=\"http://schemas.microsoft.com/ado/2007/08/dataservices/scheme\"/>"
+ "<link href=\"Employees('3')\" rel=\"edit\" title=\"Employee\"/>"
+ "<link href=\"Employees('3')/$value\" rel=\"edit-media\" "
+ "type=\"image/jpeg\"/><link href=\"Employees('3')/ne_Manager\" "
+ "rel=\"http://schemas.microsoft.com/ado/2007/08/dataservices/related/ne_Manager\" "
+ "title=\"ne_Manager\" type=\"application/atom+xml;type=entry\"/>"
+ "<link href=\"Employees('3')/ne_Team\" "
+ "rel=\"http://schemas.microsoft.com/ado/2007/08/dataservices/related/ne_Team\" "
+ "title=\"ne_Team\" type=\"application/atom+xml;type=entry\"/>"
+ "<link href=\"Employees('3')/ne_Room\" "
+ "rel=\"http://schemas.microsoft.com/ado/2007/08/dataservices/related/ne_Room\" "
+ "title=\"ne_Room\" type=\"application/atom+xml;type=entry\"/>"
+ "<content type=\"image/jpeg\" src=\"Employees('3')/$value\"/>"
+ "<m:properties><d:EmployeeId>3</d:EmployeeId>"
+ "<d:EmployeeName>Jonathan Smith</d:EmployeeName>"
+ "<d:ManagerId>1</d:ManagerId><d:RoomId>2</d:RoomId>"
+ "<d:TeamId>1</d:TeamId><d:Location m:type=\"RefScenario.c_Location\">"
+ "<d:City m:type=\"RefScenario.c_City\"><d:PostalCode>69190</d:PostalCode>"
+ "<d:CityName>Walldorf</d:CityName></d:City><d:Country>Germany</d:Country>"
+ "</d:Location><d:Age>56</d:Age><d:EntryDate m:null=\"true\"/>"
+ "<d:ImageUrl>Employees('3')/$value</d:ImageUrl>"
+ "</m:properties></entry>").getBytes("UTF-8"));
EntityStream entityStream = new EntityStream();
entityStream.setReadProperties(DEFAULT_READ_PROPERTIES);
entityStream.setContent(content);
final Object result = executeFunctionImport(functionImport, entityStream, XML);
ODataEntry entry = (ODataEntry) result;
assertEquals(9, entry.getProperties().size());
assertEquals("3", entry.getProperties().get("EmployeeId"));
assertEquals("Employees('3')/ne_Manager", entry.getMetadata().getAssociationUris("ne_Manager").get(0));
assertEquals("http://localhost:8083/olingo-odata2-ref-web/"
+ "ReferenceScenarioNonJaxrs.svc/Employees('3')", entry.getMetadata().getId());
}
@Test
public void readFunctionImportJSONSingleEntity2() throws Exception {
final EdmFunctionImport functionImport = MockFacade.getMockEdm().getDefaultEntityContainer()
.getFunctionImport("OldestEmployee");
InputStream content = new ByteArrayInputStream(
("{"
+ "\"__metadata\": {"
+ "\"type\": \"RefScenario.Employee\","
+ "\"content_type\": \"image/jpeg\","
+ "\"media_src\":\"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/$value\","
+ "\"edit_media\":\"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/$value\""
+ "},"
+ "\"EmployeeId\": \"3\","
+ "\"EmployeeName\": \"Jonathan Smith\","
+ "\"ManagerId\": \"1\","
+ "\"RoomId\": \"2\","
+ "\"TeamId\": \"1\","
+ "\"Location\": {"
+ "\"__metadata\": {"
+ "\"type\": \"RefScenario.c_Location\""
+ "},"
+ "\"City\": {"
+ "\"__metadata\": {"
+ "\"type\": \"RefScenario.c_City\""
+ "},"
+ "\"PostalCode\": \"69190\","
+ "\"CityName\": \"Walldorf\""
+ "},"
+ "\"Country\": \"Germany\""
+ "},"
+ "\"Age\": 56,"
+ "\"EntryDate\": null,"
+ "\"ImageUrl\": \"Employees('3')/$value\","
+ "\"ne_Manager\": {"
+ "\"__deferred\": {"
+ "\"uri\": \"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/ne_Manager\""
+ "}"
+ "},"
+ "\"ne_Team\": {"
+ "\"__deferred\": {"
+ "\"uri\": \"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/ne_Team\""
+ "}"
+ "},"
+ "\"ne_Room\": {"
+ "\"__deferred\": {"
+ "\"uri\": \"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/ne_Room\""
+ "}"
+ "}"
+ "}").getBytes("UTF-8"));
EntityStream entityStream = new EntityStream();
entityStream.setReadProperties(DEFAULT_READ_PROPERTIES);
entityStream.setContent(content);
final Object result = executeFunctionImport(functionImport, entityStream, JSON);
ODataEntry entry = (ODataEntry) result;
assertEquals(9, entry.getProperties().size());
assertEquals("3", entry.getProperties().get("EmployeeId"));
}
@Test
public void readMultipleEntityJSONFunctionImport1() throws Exception {
final EdmFunctionImport functionImport = MockFacade.getMockEdm().getDefaultEntityContainer()
.getFunctionImport("EmployeeSearch");
InputStream content = new ByteArrayInputStream(
("{\"d\": {"
+ "\"results\": [{"
+ "\"__metadata\": {"
+ "\"type\": \"RefScenario.Employee\","
+ "\"content_type\": \"image/jpeg\","
+ "\"media_src\":\"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/$value\","
+ "\"edit_media\":\"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/$value\""
+ "},"
+ "\"EmployeeId\": \"3\","
+ "\"EmployeeName\": \"Jonathan Smith\","
+ "\"ManagerId\": \"1\","
+ "\"RoomId\": \"2\","
+ "\"TeamId\": \"1\","
+ "\"Location\": {"
+ "\"__metadata\": {"
+ "\"type\": \"RefScenario.c_Location\""
+ "},"
+ "\"City\": {"
+ "\"__metadata\": {"
+ "\"type\": \"RefScenario.c_City\""
+ "},"
+ "\"PostalCode\": \"69190\","
+ "\"CityName\": \"Walldorf\""
+ "},"
+ "\"Country\": \"Germany\""
+ "},"
+ "\"Age\": 56,"
+ "\"EntryDate\": null,"
+ "\"ImageUrl\": \"Employees('3')/$value\","
+ "\"ne_Manager\": {"
+ "\"__deferred\": {"
+ "\"uri\": \"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/ne_Manager\""
+ "}"
+ "},"
+ "\"ne_Team\": {"
+ "\"__deferred\": {"
+ "\"uri\": \"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/ne_Team\""
+ "}"
+ "},"
+ "\"ne_Room\": {"
+ "\"__deferred\": {"
+ "\"uri\": \"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/ne_Room\""
+ "}"
+ "}"
+ "}]"
+ "}"
+ "}").getBytes("UTF-8"));
EntityStream entityStream = new EntityStream();
entityStream.setReadProperties(DEFAULT_READ_PROPERTIES);
entityStream.setContent(content);
final Object result = executeFunctionImport(functionImport, entityStream, JSON);
ODataDeltaFeed feed = (ODataDeltaFeed) result;
List<ODataEntry> entries = feed.getEntries();
int size = entries.size();
assertEquals(1, size);
String id = (String) entries.get(0).getProperties().get("EmployeeId");
assertEquals("3", id);
}
@Test
public void readMultipleEntityJSONFunctionImport2() throws Exception {
final EdmFunctionImport functionImport = MockFacade.getMockEdm().getDefaultEntityContainer()
.getFunctionImport("EmployeeSearch");
InputStream content = new ByteArrayInputStream(
("{"
+ "\"results\": [{"
+ "\"__metadata\": {"
+ "\"type\": \"RefScenario.Employee\","
+ "\"content_type\": \"image/jpeg\","
+ "\"media_src\":\"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/$value\","
+ "\"edit_media\":\"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/$value\""
+ "},"
+ "\"EmployeeId\": \"3\","
+ "\"EmployeeName\": \"Jonathan Smith\","
+ "\"ManagerId\": \"1\","
+ "\"RoomId\": \"2\","
+ "\"TeamId\": \"1\","
+ "\"Location\": {"
+ "\"__metadata\": {"
+ "\"type\": \"RefScenario.c_Location\""
+ "},"
+ "\"City\": {"
+ "\"__metadata\": {"
+ "\"type\": \"RefScenario.c_City\""
+ "},"
+ "\"PostalCode\": \"69190\","
+ "\"CityName\": \"Walldorf\""
+ "},"
+ "\"Country\": \"Germany\""
+ "},"
+ "\"Age\": 56,"
+ "\"EntryDate\": null,"
+ "\"ImageUrl\": \"Employees('3')/$value\","
+ "\"ne_Manager\": {"
+ "\"__deferred\": {"
+ "\"uri\": \"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/ne_Manager\""
+ "}"
+ "},"
+ "\"ne_Team\": {"
+ "\"__deferred\": {"
+ "\"uri\": \"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/ne_Team\""
+ "}"
+ "},"
+ "\"ne_Room\": {"
+ "\"__deferred\": {"
+ "\"uri\": \"http://localhost:19000/abc/FunctionImportJsonTest/Employees('3')/ne_Room\""
+ "}"
+ "}"
+ "}]"
+ "}").getBytes("UTF-8"));
EntityStream entityStream = new EntityStream();
entityStream.setReadProperties(DEFAULT_READ_PROPERTIES);
entityStream.setContent(content);
final Object result = executeFunctionImport(functionImport, entityStream, JSON);
ODataDeltaFeed feed = (ODataDeltaFeed) result;
List<ODataEntry> entries = feed.getEntries();
int size = entries.size();
assertEquals(1, size);
String id = (String) entries.get(0).getProperties().get("EmployeeId");
assertEquals("3", id);
}
@SuppressWarnings("unchecked")
@Test
public void readMultipleEntityXMLFunctionImport() throws Exception {
final EdmFunctionImport functionImport = MockFacade.getMockEdm().getDefaultEntityContainer()
.getFunctionImport("EmployeeSearch");
InputStream content = new ByteArrayInputStream(
("<?xml version='1.0' encoding='utf-8'?>"
+ "<feed xmlns=\"http://www.w3.org/2005/Atom\" "
+ "xmlns:m=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\" "
+ "xmlns:d=\"http://schemas.microsoft.com/ado/2007/08/dataservices\" "
+ "xml:base=\"http://localhost:8083/olingo-odata2-ref-web/ReferenceScenarioNonJaxrs.svc/\">"
+ "<id>http://localhost:8083/olingo-odata2-ref-web/ReferenceScenarioNonJaxrs.svc/Employees</id>"
+ "<title type=\"text\">Employees</title><updated>2017-10-26T09:17:27.113+05:30</updated>"
+ "<author><name/></author><link href=\"Employees\" rel=\"self\" title=\"Employees\"/>"
+ "<entry>"
+ "<id>http://localhost:8083/olingo-odata2-ref-web/ReferenceScenarioNonJaxrs.svc/Employees('1')</id>"
+ "<title type=\"text\">Walter Winter</title>"
+ "<updated>1999-01-01T00:00:00Z</updated><category term=\"RefScenario.Employee\" "
+ "scheme=\"http://schemas.microsoft.com/ado/2007/08/dataservices/scheme\"/>"
+ "<link href=\"Employees('1')\" rel=\"edit\" title=\"Employee\"/>"
+ "<link href=\"Employees('1')/$value\" rel=\"edit-media\" type=\"image/jpeg\"/>"
+ "<link href=\"Employees('1')/ne_Manager\" "
+ "rel=\"http://schemas.microsoft.com/ado/2007/08/dataservices/related/ne_Manager\" "
+ "title=\"ne_Manager\" type=\"application/atom+xml;type=entry\"/>"
+ "<link href=\"Employees('1')/ne_Team\" "
+ "rel=\"http://schemas.microsoft.com/ado/2007/08/dataservices/related/ne_Team\" "
+ "title=\"ne_Team\" type=\"application/atom+xml;type=entry\"/>"
+ "<link href=\"Employees('1')/ne_Room\" "
+ "rel=\"http://schemas.microsoft.com/ado/2007/08/dataservices/related/ne_Room\" "
+ "title=\"ne_Room\" type=\"application/atom+xml;type=entry\"/>"
+ "<content type=\"image/jpeg\" src=\"Employees('1')/$value\"/>"
+ "<m:properties><d:EmployeeId>1</d:EmployeeId>"
+ "<d:EmployeeName>Walter Winter</d:EmployeeName>"
+ "<d:ManagerId>1</d:ManagerId><d:RoomId>1</d:RoomId><d:TeamId>1</d:TeamId>"
+ "<d:Location m:type=\"RefScenario.c_Location\"><d:City m:type=\"RefScenario.c_City\">"
+ "</d:City>"
+ "<d:Country>Germany</d:Country></d:Location><d:Age>52</d:Age>"
+ "<d:EntryDate>1999-01-01T00:00:00</d:EntryDate>"
+ "<d:ImageUrl>Employees('1')/$value</d:ImageUrl>"
+ "</m:properties></entry>"
+ "<entry>"
+ "<id>http://localhost:8083/olingo-odata2-ref-web/ReferenceScenarioNonJaxrs.svc/Employees('2')</id>"
+ "<title type=\"text\">Frederic Fall</title>"
+ "<updated>2003-07-01T00:00:00Z</updated>"
+ "<category term=\"RefScenario.Employee\" "
+ "scheme=\"http://schemas.microsoft.com/ado/2007/08/dataservices/scheme\"/>"
+ "<link href=\"Employees('2')\" rel=\"edit\" title=\"Employee\"/>"
+ "<link href=\"Employees('2')/$value\" rel=\"edit-media\" "
+ "type=\"image/jpeg\"/><link href=\"Employees('2')/ne_Manager\" "
+ "rel=\"http://schemas.microsoft.com/ado/2007/08/dataservices/related/ne_Manager\" "
+ "title=\"ne_Manager\" type=\"application/atom+xml;type=entry\"/>"
+ "<link href=\"Employees('2')/ne_Team\" "
+ "rel=\"http://schemas.microsoft.com/ado/2007/08/dataservices/related/ne_Team\" "
+ "title=\"ne_Team\" type=\"application/atom+xml;type=entry\"/>"
+ "<link href=\"Employees('2')/ne_Room\" "
+ "rel=\"http://schemas.microsoft.com/ado/2007/08/dataservices/related/ne_Room\" "
+ "title=\"ne_Room\" type=\"application/atom+xml;type=entry\"/>"
+ "<content type=\"image/jpeg\" src=\"Employees('2')/$value\"/>"
+ "<m:properties><d:EmployeeId>2</d:EmployeeId>"
+ "<d:EmployeeName>Frederic Fall</d:EmployeeName>"
+ "<d:ManagerId>1</d:ManagerId><d:RoomId>2</d:RoomId>"
+ "<d:TeamId>1</d:TeamId>"
+ "<d:Location m:type=\"RefScenario.c_Location\" m:null=\"true\">"
+ "</d:Location><d:Age>32</d:Age>"
+ "<d:EntryDate>2003-07-01T00:00:00</d:EntryDate>"
+ "</m:properties></entry></feed>").getBytes("UTF-8"));
EntityStream entityStream = new EntityStream();
entityStream.setReadProperties(DEFAULT_READ_PROPERTIES);
entityStream.setContent(content);
final Object result = executeFunctionImport(functionImport, entityStream, XML);
ODataDeltaFeed feed = (ODataDeltaFeed) result;
List<ODataEntry> entries = feed.getEntries();
int size = entries.size();
assertEquals(2, size);
assertEquals(9, entries.get(0).getProperties().size());
assertEquals(8, entries.get(1).getProperties().size());
assertEquals(0, ((Map<String, Object>)
((Map<String, Object>)entries.get(0).getProperties().get("Location")).get("City")).size());
assertEquals(null, entries.get(1).getProperties().get("Location"));
String id = (String) entries.get(0).getProperties().get("EmployeeId");
assertEquals("1", id);
}
/**
* @param functionImport
* @param entityStream
* @return
* @throws EntityProviderException
*/
private Object executeFunctionImport(final EdmFunctionImport functionImport,
EntityStream entityStream, String contentType)
throws EntityProviderException {
return ODataClient.newInstance().
createDeserializer(contentType).readFunctionImport(functionImport, entityStream);
}
}