[OLINGO-545] Tests for batch changesets, update and insert requests added

This commit is contained in:
Christian Holzer 2015-04-07 12:22:02 +02:00
parent 62214d2d87
commit 9e232a2d74
6 changed files with 666 additions and 155 deletions

View File

@ -21,6 +21,7 @@ package org.apache.olingo.fit.tecsvc.client;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
@ -64,6 +65,7 @@ import org.apache.olingo.commons.api.domain.ODataProperty;
import org.apache.olingo.commons.api.domain.ODataServiceDocument;
import org.apache.olingo.commons.api.domain.ODataValue;
import org.apache.olingo.commons.api.edm.Edm;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.format.ContentType;
import org.apache.olingo.commons.api.format.ODataFormat;
@ -461,7 +463,11 @@ public class BasicITCase extends AbstractBaseTestITCase {
.add(of.newComplexValue("CTPrimComp")
.add(of.newPrimitiveProperty("PropertyInt16", of.newPrimitiveValueBuilder().buildInt16((short)42)))
.add(of.newComplexProperty("PropertyComp", of.newComplexValue("CTAllPrim")
.add(of.newPrimitiveProperty("PropertyString", of.newPrimitiveValueBuilder().buildString("42"))))))));
.add(of.newPrimitiveProperty("PropertyString", of.newPrimitiveValueBuilder().buildString("42"))))))
.add(of.newComplexValue("CTPrimComp")
.add(of.newPrimitiveProperty("PropertyInt16", of.newPrimitiveValueBuilder().buildInt16((short)43)))
.add(of.newComplexProperty("PropertyComp", of.newComplexValue("CTAllPrim")
.add(of.newPrimitiveProperty("PropertyString", of.newPrimitiveValueBuilder().buildString("43"))))))));
final URI uri = getClient().newURIBuilder(SERVICE_URI)
.appendEntitySetSegment("ESKeyNav")
@ -484,19 +490,26 @@ public class BasicITCase extends AbstractBaseTestITCase {
assertEquals(HttpStatusCode.OK.getStatusCode(), entityResponse.getStatusCode());
assertNotNull(entityResponse.getBody().getProperty("CollPropertyComp"));
assertEquals(1, entityResponse.getBody().getProperty("CollPropertyComp").getCollectionValue().size());
assertEquals(2, entityResponse.getBody().getProperty("CollPropertyComp").getCollectionValue().size());
ODataComplexValue complexProperty = entityResponse.getBody()
.getProperty("CollPropertyComp")
.getCollectionValue()
.iterator()
.next()
.asComplex();
final Iterator<ODataValue> collectionIterator = entityResponse.getBody()
.getProperty("CollPropertyComp")
.getCollectionValue()
.iterator();
ODataComplexValue complexProperty = collectionIterator.next().asComplex();
assertEquals(42, complexProperty.get("PropertyInt16").getPrimitiveValue().toValue());
assertNotNull(complexProperty.get("PropertyComp"));
final ODataComplexValue innerComplexProperty = complexProperty.get("PropertyComp").getComplexValue();
ODataComplexValue innerComplexProperty = complexProperty.get("PropertyComp").getComplexValue();
assertEquals("42", innerComplexProperty.get("PropertyString").getPrimitiveValue().toValue());
complexProperty = collectionIterator.next().asComplex();
assertEquals(43, complexProperty.get("PropertyInt16").getPrimitiveValue().toValue());
assertNotNull(complexProperty.get("PropertyComp"));
innerComplexProperty = complexProperty.get("PropertyComp").getComplexValue();
assertEquals("43", innerComplexProperty.get("PropertyString").getPrimitiveValue().toValue());
}
@Test
@ -614,6 +627,297 @@ public class BasicITCase extends AbstractBaseTestITCase {
}
}
@Test
public void testUpsert() throws EdmPrimitiveTypeException {
final EdmEnabledODataClient client = ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
final ODataObjectFactory of = client.getObjectFactory();
final ODataEntity entity = of.newEntity(new FullQualifiedName("olingo.odata.test1", "ETTwoPrim"));
entity.getProperties().add(of.newPrimitiveProperty("PropertyString", of.newPrimitiveValueBuilder()
.buildString("Test")));
final URI uri = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESTwoPrim").appendKeySegment(33).build();
final ODataEntityUpdateResponse<ODataEntity> updateResponse =
client.getCUDRequestFactory().getEntityUpdateRequest(uri, UpdateType.PATCH, entity).execute();
assertEquals(HttpStatusCode.CREATED.getStatusCode(), updateResponse.getStatusCode());
assertEquals("Test", updateResponse.getBody().getProperty("PropertyString").getPrimitiveValue().toValue());
final String cookie = updateResponse.getHeader(HttpHeader.SET_COOKIE).iterator().next();
final Short key = updateResponse.getBody().getProperty("PropertyInt16")
.getPrimitiveValue()
.toCastValue(Short.class);
final ODataEntityRequest<ODataEntity> entityRequest = client.getRetrieveRequestFactory()
.getEntityRequest(client.newURIBuilder()
.appendEntitySetSegment("ESTwoPrim")
.appendKeySegment(key)
.build());
entityRequest.addCustomHeader(HttpHeader.COOKIE, cookie);
final ODataRetrieveResponse<ODataEntity> responseEntityRequest = entityRequest.execute();
assertEquals(HttpStatusCode.OK.getStatusCode(), responseEntityRequest.getStatusCode());
assertEquals("Test", responseEntityRequest.getBody().getProperty("PropertyString").getPrimitiveValue().toValue());
}
@Test
public void testUpdatePropertyWithNull() {
final EdmEnabledODataClient client = ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
final ODataObjectFactory of = client.getObjectFactory();
final URI targetURI = client.newURIBuilder(SERVICE_URI)
.appendEntitySetSegment("ESAllPrim")
.appendKeySegment(32767)
.build();
final ODataEntity entity = of.newEntity(new FullQualifiedName("olingo.odata.test1", "ETAllPrim"));
entity.getProperties().add(of.newPrimitiveProperty("PropertyString", of.newPrimitiveValueBuilder()
.buildString(null)));
final ODataEntityUpdateResponse<ODataEntity> updateResponse = client.getCUDRequestFactory()
.getEntityUpdateRequest(targetURI, UpdateType.PATCH, entity)
.execute();
assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), updateResponse.getStatusCode());
final String cookie = updateResponse.getHeader(HttpHeader.SET_COOKIE).iterator().next();
final ODataEntityRequest<ODataEntity> entityRequest = client.getRetrieveRequestFactory()
.getEntityRequest(targetURI);
entityRequest.addCustomHeader(HttpHeader.COOKIE, cookie);
final ODataRetrieveResponse<ODataEntity> entityResponse = entityRequest.execute();
assertEquals(HttpStatusCode.OK.getStatusCode(), entityResponse.getStatusCode());
assertTrue(entityResponse.getBody().getProperty("PropertyString").hasNullValue());
assertEquals(34, entityResponse.getBody().getProperty("PropertyDecimal").getPrimitiveValue().toValue());
}
@Test(expected=ODataClientErrorException.class)
public void testUpdatePropertyWithNullNotAllowed() {
final EdmEnabledODataClient client = ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
final ODataObjectFactory of = client.getObjectFactory();
final URI targetURI = client.newURIBuilder(SERVICE_URI)
.appendEntitySetSegment("ESKeyNav")
.appendKeySegment(32767)
.build();
final ODataEntity entity = of.newEntity(new FullQualifiedName("olingo.odata.test1", "ETKeyNav"));
entity.getProperties().add(of.newPrimitiveProperty("PropertyString", of.newPrimitiveValueBuilder()
.buildString(null)));
client.getCUDRequestFactory().getEntityUpdateRequest(targetURI, UpdateType.PATCH, entity).execute();
}
@Test
public void testUpdateMerge() {
final EdmEnabledODataClient client = ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
final ODataObjectFactory of = client.getObjectFactory();
final URI targetURI = client.newURIBuilder(SERVICE_URI)
.appendEntitySetSegment("ESKeyNav")
.appendKeySegment(1)
.build();
final ODataEntity entity = of.newEntity(new FullQualifiedName("olingo.odata.test1", "ETKeyNav"));
entity.addLink(of.newEntityNavigationLink("NavPropertyETKeyNavOne", targetURI));
entity.addLink(of.newEntitySetNavigationLink("NavPropertyETKeyNavMany", client.newURIBuilder(SERVICE_URI)
.appendEntitySetSegment("ESKeyNav").appendKeySegment(3).build()));
entity.getProperties().add(of.newCollectionProperty("CollPropertyString", of.newCollectionValue("Edm.String")
.add(of.newPrimitiveValueBuilder().buildString("Single entry!"))));
entity.getProperties().add(of.newComplexProperty("PropertyCompAllPrim",
of.newComplexValue("CTAllPrim")
.add(of.newPrimitiveProperty("PropertyString",
of.newPrimitiveValueBuilder().buildString("Changed")))));
final ODataEntityUpdateResponse<ODataEntity> response = client.getCUDRequestFactory()
.getEntityUpdateRequest(targetURI,UpdateType.PATCH, entity)
.execute();
assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), response.getStatusCode());
final String cookie = response.getHeader(HttpHeader.SET_COOKIE).iterator().next();
final ODataEntityRequest<ODataEntity> entityRequest = client.getRetrieveRequestFactory()
.getEntityRequest(
client.newURIBuilder()
.appendEntitySetSegment("ESKeyNav")
.appendKeySegment(1)
.expand("NavPropertyETKeyNavOne", "NavPropertyETKeyNavMany")
.build());
entityRequest.addCustomHeader(HttpHeader.COOKIE, cookie);
final ODataRetrieveResponse<ODataEntity> entitytResponse = entityRequest.execute();
assertEquals(HttpStatusCode.OK.getStatusCode(), entitytResponse.getStatusCode());
assertEquals(1, entitytResponse.getBody().getNavigationLink("NavPropertyETKeyNavOne")
.asInlineEntity()
.getEntity()
.getProperty("PropertyInt16")
.getPrimitiveValue()
.toValue());
assertEquals(3, entitytResponse.getBody().getNavigationLink("NavPropertyETKeyNavMany")
.asInlineEntitySet()
.getEntitySet()
.getEntities()
.size());
assertEquals(1, entitytResponse.getBody().getNavigationLink("NavPropertyETKeyNavMany")
.asInlineEntitySet()
.getEntitySet()
.getEntities()
.get(0)
.getProperty("PropertyInt16")
.getPrimitiveValue()
.toValue());
assertEquals(2, entitytResponse.getBody().getNavigationLink("NavPropertyETKeyNavMany")
.asInlineEntitySet()
.getEntitySet()
.getEntities()
.get(1)
.getProperty("PropertyInt16")
.getPrimitiveValue()
.toValue());
assertEquals(3, entitytResponse.getBody().getNavigationLink("NavPropertyETKeyNavMany")
.asInlineEntitySet()
.getEntitySet()
.getEntities()
.get(2)
.getProperty("PropertyInt16")
.getPrimitiveValue()
.toValue());
final Iterator<ODataValue> collectionIterator = entitytResponse.getBody()
.getProperty("CollPropertyString")
.getCollectionValue()
.iterator();
assertTrue(collectionIterator.hasNext());
assertEquals("Single entry!", collectionIterator.next().asPrimitive().toValue());
assertFalse(collectionIterator.hasNext());
final ODataComplexValue complexValue = entitytResponse.getBody()
.getProperty("PropertyCompAllPrim")
.getComplexValue();
assertEquals("Changed", complexValue.get("PropertyString").getPrimitiveValue().toValue());
}
@Test
public void testUpdateReplace() {
final EdmEnabledODataClient client = ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
final ODataObjectFactory of = client.getObjectFactory();
final URI targetURI = client.newURIBuilder(SERVICE_URI)
.appendEntitySetSegment("ESKeyNav")
.appendKeySegment(1)
.build();
final ODataEntity entity = of.newEntity(new FullQualifiedName("olingo.odata.test1", "ETKeyNav"));
entity.addLink(of.newEntityNavigationLink("NavPropertyETKeyNavOne", targetURI));
entity.addLink(of.newEntitySetNavigationLink("NavPropertyETKeyNavMany", client.newURIBuilder(SERVICE_URI)
.appendEntitySetSegment("ESKeyNav").appendKeySegment(3).build()));
entity.getProperties().add(of.newPrimitiveProperty("PropertyString", of.newPrimitiveValueBuilder()
.buildString("Must not be null")));
entity.getProperties().add(of.newComplexProperty("PropertyCompTwoPrim", of.newComplexValue("CTTwoPrim")
.add(of.newPrimitiveProperty("PropertyString", of.newPrimitiveValueBuilder()
.buildString("Must not be null")))
.add(of.newPrimitiveProperty("PropertyInt16", of.newPrimitiveValueBuilder().buildInt16((short) 42)))));
entity.getProperties().add(of.newCollectionProperty("CollPropertyString", of.newCollectionValue("Edm.String")
.add(of.newPrimitiveValueBuilder().buildString("Single entry!"))));
entity.getProperties().add(of.newComplexProperty("PropertyCompAllPrim",
of.newComplexValue("CTAllPrim")
.add(of.newPrimitiveProperty("PropertyString",
of.newPrimitiveValueBuilder().buildString("Changed")))));
final ODataEntityUpdateResponse<ODataEntity> response = client.getCUDRequestFactory()
.getEntityUpdateRequest(targetURI,UpdateType.REPLACE, entity)
.execute();
assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), response.getStatusCode());
final String cookie = response.getHeader(HttpHeader.SET_COOKIE).iterator().next();
final ODataEntityRequest<ODataEntity> entityRequest = client.getRetrieveRequestFactory()
.getEntityRequest(
client.newURIBuilder()
.appendEntitySetSegment("ESKeyNav")
.appendKeySegment(1)
.expand("NavPropertyETKeyNavOne", "NavPropertyETKeyNavMany")
.build());
entityRequest.addCustomHeader(HttpHeader.COOKIE, cookie);
final ODataRetrieveResponse<ODataEntity> entitytResponse = entityRequest.execute();
assertEquals(HttpStatusCode.OK.getStatusCode(), entitytResponse.getStatusCode());
assertEquals(1, entitytResponse.getBody().getNavigationLink("NavPropertyETKeyNavOne")
.asInlineEntity()
.getEntity()
.getProperty("PropertyInt16")
.getPrimitiveValue()
.toValue());
assertEquals(3, entitytResponse.getBody().getNavigationLink("NavPropertyETKeyNavMany")
.asInlineEntitySet()
.getEntitySet()
.getEntities()
.size());
assertEquals(1, entitytResponse.getBody().getNavigationLink("NavPropertyETKeyNavMany")
.asInlineEntitySet()
.getEntitySet()
.getEntities()
.get(0)
.getProperty("PropertyInt16")
.getPrimitiveValue()
.toValue());
assertEquals(2, entitytResponse.getBody().getNavigationLink("NavPropertyETKeyNavMany")
.asInlineEntitySet()
.getEntitySet()
.getEntities()
.get(1)
.getProperty("PropertyInt16")
.getPrimitiveValue()
.toValue());
assertEquals(3, entitytResponse.getBody().getNavigationLink("NavPropertyETKeyNavMany")
.asInlineEntitySet()
.getEntitySet()
.getEntities()
.get(2)
.getProperty("PropertyInt16")
.getPrimitiveValue()
.toValue());
final Iterator<ODataValue> collectionIterator = entitytResponse.getBody()
.getProperty("CollPropertyString")
.getCollectionValue()
.iterator();
assertTrue(collectionIterator.hasNext());
assertEquals("Single entry!", collectionIterator.next().asPrimitive().toValue());
assertFalse(collectionIterator.hasNext());
final ODataComplexValue propCompAllPrim = entitytResponse.getBody()
.getProperty("PropertyCompAllPrim")
.getComplexValue();
assertEquals("Changed", propCompAllPrim.get("PropertyString").getPrimitiveValue().toValue());
assertTrue(propCompAllPrim.get("PropertyInt16").hasNullValue());
assertTrue(propCompAllPrim.get("PropertyDate").hasNullValue());
final ODataComplexValue propCompTwoPrim = entitytResponse.getBody()
.getProperty("PropertyCompTwoPrim")
.getComplexValue();
assertEquals("Must not be null", propCompTwoPrim.get("PropertyString").getPrimitiveValue().toValue());
assertEquals(42, propCompTwoPrim.get("PropertyInt16").getPrimitiveValue().toValue());
assertNotNull(entitytResponse.getBody().getProperty("PropertyCompNav").getComplexValue());
assertTrue(entitytResponse.getBody()
.getProperty("PropertyCompNav")
.getComplexValue()
.get("PropertyInt16")
.hasNullValue());
}
@Override
protected ODataClient getClient() {
ODataClient odata = ODataClientFactory.getClient();

View File

@ -22,14 +22,11 @@ import static org.junit.Assert.assertEquals;
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.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Iterator;
import org.apache.olingo.client.api.ODataBatchConstants;
import org.apache.olingo.client.api.ODataClient;
import org.apache.olingo.client.api.communication.request.batch.BatchManager;
import org.apache.olingo.client.api.communication.request.batch.ODataBatchRequest;
@ -44,9 +41,10 @@ import org.apache.olingo.client.api.communication.response.ODataBatchResponse;
import org.apache.olingo.client.api.communication.response.ODataEntityCreateResponse;
import org.apache.olingo.client.api.communication.response.ODataEntityUpdateResponse;
import org.apache.olingo.client.api.communication.response.ODataResponse;
import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
import org.apache.olingo.client.api.http.HttpClientException;
import org.apache.olingo.client.api.uri.URIBuilder;
import org.apache.olingo.client.core.communication.request.batch.ODataChangesetResponseItem;
import org.apache.olingo.client.core.uri.URIUtils;
import org.apache.olingo.commons.api.domain.ODataEntity;
import org.apache.olingo.commons.api.domain.ODataEntitySet;
import org.apache.olingo.commons.api.domain.ODataObjectFactory;
@ -54,11 +52,11 @@ import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.format.ContentType;
import org.apache.olingo.commons.api.format.ODataFormat;
import org.apache.olingo.commons.api.http.HttpHeader;
import org.apache.olingo.commons.api.http.HttpStatusCode;
import org.apache.olingo.fit.tecsvc.TecSvcConst;
import org.apache.olingo.fit.v4.AbstractTestITCase;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
public class BatchClientITCase extends AbstractTestITCase {
@ -66,8 +64,8 @@ public class BatchClientITCase extends AbstractTestITCase {
private static final String SERVICE_URI = TecSvcConst.BASE_URI;
private static final String SERVICE_NAMESPACE = "olingo.odata.test1";
private static final String ES_NOT_AVAILABLE_NAME = "ESNotAvailable";
private static final FullQualifiedName ES_NOT_AVAILABLE = new FullQualifiedName(SERVICE_NAMESPACE,
ES_NOT_AVAILABLE_NAME);
private static final FullQualifiedName ES_NOT_AVAILABLE = new FullQualifiedName(SERVICE_NAMESPACE,
ES_NOT_AVAILABLE_NAME);
private static final String PROPERTY_STRING = "PropertyString";
@Before
@ -107,7 +105,7 @@ public class BatchClientITCase extends AbstractTestITCase {
.appendEntitySetSegment(ES_NOT_AVAILABLE_NAME)
.build();
final ODataEntityCreateRequest<ODataEntity> createRequest = client.getCUDRequestFactory()
.getEntityCreateRequest(targetURI, entity);
.getEntityCreateRequest(targetURI, entity);
changeset.addRequest(createRequest);
final ODataBatchResponse response = payloadManager.getResponse();
@ -277,8 +275,7 @@ public class BatchClientITCase extends AbstractTestITCase {
assertEquals(400, oDataResponse.getStatusCode());
}
@Test
@Ignore
@Test(expected = HttpClientException.class)
public void testInvalidHost() throws URISyntaxException {
final ODataBatchRequest request = client.getBatchRequestFactory().getBatchRequest(SERVICE_URI);
request.setAccept(ACCEPT);
@ -290,12 +287,10 @@ public class BatchClientITCase extends AbstractTestITCase {
payload.addRequest(queryReq);
// Fetch result
final ODataBatchResponse response = payload.getResponse();
assertEquals(400, response.getStatusCode());
payload.getResponse();
}
@Test
@Ignore
@Test(expected = HttpClientException.class)
public void testInvalidAbsoluteRequest() throws URISyntaxException {
final ODataBatchRequest request = client.getBatchRequestFactory().getBatchRequest(SERVICE_URI);
request.setAccept(ACCEPT);
@ -307,8 +302,7 @@ public class BatchClientITCase extends AbstractTestITCase {
payload.addRequest(queryReq);
// Fetch result
final ODataBatchResponse response = payload.getResponse();
assertEquals(400, response.getStatusCode());
payload.getResponse();
}
@Test
@ -367,111 +361,92 @@ public class BatchClientITCase extends AbstractTestITCase {
assertEquals("application/json;odata.metadata=minimal", oDataResonse.getContentType());
}
@SuppressWarnings("unchecked")
@Test
@Ignore("Not implemented")
public void changesetWithReferences() throws EdmPrimitiveTypeException {
@SuppressWarnings("unchecked")
public void changesetWithReferences() throws EdmPrimitiveTypeException, URISyntaxException {
// create your request
final ODataBatchRequest request = client.getBatchRequestFactory().getBatchRequest(SERVICE_URI);
final ODataObjectFactory of = client.getObjectFactory();
request.setAccept(ACCEPT);
final BatchManager streamManager = request.payloadManager();
final ODataChangeset changeset = streamManager.addChangeset();
ODataEntity esAllPrim = newESAllPrim((short) 23);
final ODataEntity entityESAllPrim = getClient().getObjectFactory().
newEntity(new FullQualifiedName("olingo.odata.test1.ESAllPrim"));
entityESAllPrim.getProperties().add(client.getObjectFactory().newPrimitiveProperty(
"PropertyDouble",
client.getObjectFactory().newPrimitiveValueBuilder().buildDouble(3.1415)));
entityESAllPrim.addLink(
of.newEntityNavigationLink("NavPropertyETTwoPrimOne", client.newURIBuilder(SERVICE_URI)
.appendEntitySetSegment("ESTwoPrim")
.appendKeySegment(-365)
.build()));
final URIBuilder uriBuilder = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESAllPrim");
// add create request
final ODataEntityCreateRequest<ODataEntity> createReq =
client.getCUDRequestFactory().getEntityCreateRequest(uriBuilder.build(), esAllPrim);
client.getCUDRequestFactory().getEntityCreateRequest(uriBuilder.build(), entityESAllPrim);
createReq.setFormat(ODataFormat.JSON);
changeset.addRequest(createReq);
// retrieve request reference
int createRequestRef = changeset.getLastContentId();
// add update request
final ODataEntity customerChanges = client.getObjectFactory().newEntity(esAllPrim.getTypeName());
customerChanges.addLink(client.getObjectFactory().newEntitySetNavigationLink(
final ODataEntity entityUpdate = client.getObjectFactory().newEntity(entityESAllPrim.getTypeName());
entityUpdate.addLink(client.getObjectFactory().newEntitySetNavigationLink(
"NavPropertyETTwoPrimMany",
client.newURIBuilder(SERVICE_URI).appendEntitySetSegment("NavPropertyETTwoPrimMany").
appendKeySegment(new HashMap<String, Object>() {
private static final long serialVersionUID = 3109256773218160485L;
{
put("PropertyInt16", 4242);
put("PropertyString", "Test");
}
}).build()));
client.newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESTwoPrim").appendKeySegment(32767).build()));
final ODataEntityUpdateRequest<ODataEntity> updateReq = client.getCUDRequestFactory().getEntityUpdateRequest(
URI.create("$" + createRequestRef), UpdateType.PATCH, customerChanges);
URI.create("$" + createRequestRef), UpdateType.PATCH, entityUpdate);
updateReq.setFormat(ODataFormat.JSON);
changeset.addRequest(updateReq);
final ODataBatchResponse response = streamManager.getResponse();
assertEquals(200, response.getStatusCode());
assertEquals("OK", response.getStatusMessage());
assertEquals(HttpStatusCode.ACCEPTED.getStatusCode(), response.getStatusCode());
final String cookie = response.getHeader(HttpHeader.SET_COOKIE).iterator().next();
// verify response payload ...
final Iterator<ODataBatchResponseItem> iter = response.getBody();
final Iterator<ODataBatchResponseItem> bodyIterator = response.getBody();
final ODataBatchResponseItem item = bodyIterator.next();
final ODataBatchResponseItem item = iter.next();
assertTrue(item instanceof ODataChangesetResponseItem);
final ODataChangesetResponseItem chgitem = (ODataChangesetResponseItem) item;
assertTrue(chgitem.hasNext());
ODataResponse res = chgitem.next();
assertEquals(201, res.getStatusCode());
assertEquals(HttpStatusCode.CREATED.getStatusCode(), res.getStatusCode());
assertTrue(res instanceof ODataEntityCreateResponse);
esAllPrim = ((ODataEntityCreateResponse<ODataEntity>) res).getBody();
final ODataEntitySetRequest<ODataEntitySet> req = client.getRetrieveRequestFactory().getEntitySetRequest(
URIUtils.getURI(SERVICE_URI, esAllPrim.getEditLink().toASCIIString() + "/NavPropertyETTwoPrimMany"));
assertEquals(Integer.valueOf(4242),
req.execute().getBody().getEntities().get(0).getProperty("PropertyInt16").getPrimitiveValue().
toCastValue(Integer.class));
final ODataEntityCreateResponse<ODataEntity> createResponse = ((ODataEntityCreateResponse<ODataEntity>) res);
res = chgitem.next();
assertEquals(204, res.getStatusCode());
assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), res.getStatusCode());
assertTrue(res instanceof ODataEntityUpdateResponse);
final ODataEntitySetRequest<ODataEntitySet> req = client.getRetrieveRequestFactory().getEntitySetRequest(
new URI(createResponse.getHeader(HttpHeader.LOCATION).iterator().next() + "/NavPropertyETTwoPrimMany"));
req.setFormat(ODataFormat.JSON);
req.addCustomHeader(HttpHeader.COOKIE, cookie);
final ODataRetrieveResponse<ODataEntitySet> getResponse = req.execute();
assertEquals(32767, getResponse.getBody()
.getEntities()
.get(0)
.getProperty("PropertyInt16")
.getPrimitiveValue()
.toValue());
}
// clean ...
assertEquals(204, client.getCUDRequestFactory().getDeleteRequest(
URIUtils.getURI(SERVICE_URI, esAllPrim.getEditLink().toASCIIString())).execute().
getStatusCode());
try {
client.getRetrieveRequestFactory().getEntityRequest(
URIUtils.getURI(SERVICE_URI, esAllPrim.getEditLink().toASCIIString())).
execute().getBody();
fail("Entity not deleted");
} catch (Exception e) {
// ignore
}
}
private ODataEntity newESAllPrim(short id) {
final ODataEntity entity = getClient().getObjectFactory().
newEntity(new FullQualifiedName("olingo.odata.test1.ESAllPrim"));
entity.getProperties().add(client.getObjectFactory().newPrimitiveProperty(
"PropertyInt16",
client.getObjectFactory().newPrimitiveValueBuilder().buildInt16(id)));
entity.getProperties().add(client.getObjectFactory().newPrimitiveProperty(
"PropertyDouble",
client.getObjectFactory().newPrimitiveValueBuilder().buildDouble(3.1415)));
return entity;
}
// TODO If write support is implemented, remove ignore tag
@Test
@Ignore("Not implemented")
@SuppressWarnings("unchecked")
public void changesetBatchRequest() throws URISyntaxException {
final ODataBatchRequest request = client.getBatchRequestFactory().getBatchRequest(SERVICE_URI);
final ODataObjectFactory of = client.getObjectFactory();
request.setAccept(ACCEPT);
final BatchManager payload = request.payloadManager();
@ -491,21 +466,20 @@ public class BatchClientITCase extends AbstractTestITCase {
client.newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESAllPrim");
URI editLink = targetURI.build();
ODataEntity post = client.getObjectFactory().newEntity(
ODataEntity postEntity = client.getObjectFactory().newEntity(
new FullQualifiedName("olingo.odata.test1.ESAllPrim"));
postEntity.addLink(of.newEntityNavigationLink("NavPropertyETTwoPrimOne", client.newURIBuilder(SERVICE_URI)
.appendEntitySetSegment("ESTwoPrim")
.appendKeySegment(32766)
.build()));
post.getProperties().add(client.getObjectFactory().newPrimitiveProperty(
"PropertyInt16",
client.getObjectFactory().newPrimitiveValueBuilder().buildInt16((short) 15)));
post.getProperties().add(client.getObjectFactory().newPrimitiveProperty(
postEntity.getProperties().add(client.getObjectFactory().newPrimitiveProperty(
"PropertyDouble",
client.getObjectFactory().newPrimitiveValueBuilder().buildDouble(3.1415)));
final ODataEntityCreateRequest<ODataEntity> createRequest =
client.getCUDRequestFactory().getEntityCreateRequest(editLink, post);
createRequest.setFormat(ODataFormat.JSON_FULL_METADATA);
createRequest.setContentType("1");
client.getCUDRequestFactory().getEntityCreateRequest(editLink, postEntity);
createRequest.setFormat(ODataFormat.JSON);
changeset.addRequest(createRequest);
@ -514,40 +488,44 @@ public class BatchClientITCase extends AbstractTestITCase {
targetURI = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESAllPrim").appendKeySegment(0);
editLink = targetURI.build();
ODataEntity patch = client.getObjectFactory().newEntity(new FullQualifiedName("olingo.odata.test1.ESAllPrim"));
patch.setEditLink(editLink);
ODataEntity patchEntity = client.getObjectFactory()
.newEntity(new FullQualifiedName("olingo.odata.test1.ESAllPrim"));
patchEntity.setEditLink(editLink);
patch.getProperties().add(client.getObjectFactory().newPrimitiveProperty(
patchEntity.getProperties().add(client.getObjectFactory().newPrimitiveProperty(
"PropertyDouble",
client.getObjectFactory().newPrimitiveValueBuilder().buildDouble(3.1415)));
ODataEntityUpdateRequest<ODataEntity> changeReq =
client.getCUDRequestFactory().getEntityUpdateRequest(UpdateType.PATCH, patch);
changeReq.setFormat(ODataFormat.JSON_FULL_METADATA);
changeReq.setContentType("2");
client.getCUDRequestFactory().getEntityUpdateRequest(UpdateType.PATCH, patchEntity);
changeReq.setFormat(ODataFormat.JSON);
changeset.addRequest(changeReq);
// ------------------------
// Patch request (Upsert)
targetURI = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESAllPrim").appendKeySegment(35);
targetURI = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESAllPrim").appendKeySegment(15);
editLink = targetURI.build();
patch = client.getObjectFactory().newEntity(new FullQualifiedName("olingo.odata.test1.ESAllPrim"));
patch.setEditLink(editLink);
patchEntity = client.getObjectFactory().newEntity(new FullQualifiedName("olingo.odata.test1.ESAllPrim"));
patchEntity.setEditLink(editLink);
patch.getProperties().add(client.getObjectFactory().newPrimitiveProperty(
patchEntity.getProperties().add(client.getObjectFactory().newPrimitiveProperty(
"PropertyDouble",
client.getObjectFactory().newPrimitiveValueBuilder().buildDouble(3.1415)));
changeReq = client.getCUDRequestFactory().getEntityUpdateRequest(UpdateType.PATCH, patch);
changeReq.setFormat(ODataFormat.JSON_FULL_METADATA);
changeReq.setContentType("3");
patchEntity.addLink(of.newEntityNavigationLink("NavPropertyETTwoPrimOne", client.newURIBuilder(SERVICE_URI)
.appendEntitySetSegment("ESTwoPrim")
.appendKeySegment(32766)
.build()));
changeReq = client.getCUDRequestFactory().getEntityUpdateRequest(UpdateType.PATCH, patchEntity);
changeReq.setFormat(ODataFormat.JSON);
changeset.addRequest(changeReq);
// -----------------------------
// - Append get request
// -----------------------------
appendGetRequest(payload, "ESAllPrim", 32767, false); // Without error
appendGetRequest(payload, "ESAllPrim", 0, false); // Without error
// -----------------------------
// - Fetch result
@ -560,42 +538,54 @@ public class BatchClientITCase extends AbstractTestITCase {
assertTrue(bodyIterator.hasNext());
ODataBatchResponseItem item = bodyIterator.next();
assertFalse(item.isChangeset());
assertTrue(item.hasNext());
final ODataResponse response0 = item.next();
assertTrue(response0 instanceof ODataRetrieveResponse);
assertEquals(34, ((ODataRetrieveResponse<ODataEntity>)response0).getBody()
.getProperty("PropertyDecimal")
.getPrimitiveValue()
.toValue());
// Check change set
assertTrue(bodyIterator.hasNext());
item = bodyIterator.next();
assertTrue(item.isChangeset());
// Insert
assertTrue(item.hasNext());
final ODataResponse response1 = item.next();
assertEquals(HttpStatusCode.CREATED.getStatusCode(), response1.getStatusCode());
assertTrue(response1 instanceof ODataEntityCreateResponse);
assertEquals(3.1415, ((ODataEntityCreateResponse<ODataEntity>) response1).getBody().getProperty("PropertyDouble")
.getPrimitiveValue()
.toValue());
// Update
assertTrue(item.hasNext());
final ODataResponse response2 = item.next();
assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), response2.getStatusCode());
assertTrue(response2 instanceof ODataEntityUpdateResponse);
for (int i = 0; i < 3; i++) {
assertTrue(item.hasNext());
assertTrue(item instanceof ODataChangesetResponseItem);
ODataChangesetResponseItem changeSetResponseItem = (ODataChangesetResponseItem) item.next();
assertNotNull(changeSetResponseItem);
ODataResponse chgRequest = changeSetResponseItem.next();
final String contentId = chgRequest.getHeader(ODataBatchConstants.CHANGESET_CONTENT_ID_NAME).iterator().next();
if (contentId == "1") {
// Insert
assertEquals(HttpStatusCode.CREATED.getStatusCode(), chgRequest.getStatusCode());
} else if (contentId == "2") {
// Update
assertEquals(HttpStatusCode.OK.getStatusCode(), chgRequest.getStatusCode());
} else if (contentId == "3") {
// Upsert
assertEquals(HttpStatusCode.CREATED.getStatusCode(), chgRequest.getStatusCode());
} else {
fail("Unkonwn content id " + contentId);
}
}
assertFalse(item.hasNext());
// Upsert
assertTrue(item.hasNext());
final ODataResponse response3 = item.next();
assertEquals(HttpStatusCode.CREATED.getStatusCode(),response3.getStatusCode());
assertTrue(response3 instanceof ODataEntityUpdateResponse);
assertEquals(3.1415, ((ODataEntityUpdateResponse<ODataEntity>) response3).getBody().getProperty("PropertyDouble")
.getPrimitiveValue()
.toValue());
// Check second get request
assertTrue(bodyIterator.hasNext());
item = bodyIterator.next();
assertFalse(item.isChangeset());
assertTrue(item.hasNext());
final ODataResponse response4 = item.next();
assertTrue(response4 instanceof ODataRetrieveResponse);
assertEquals(3.1415, ((ODataRetrieveResponse<ODataEntity>)response4).getBody()
.getProperty("PropertyDouble")
.getPrimitiveValue()
.toValue());
}
private void appendGetRequest(final BatchManager manager, final String segment, final Object key, boolean isRelative)
throws URISyntaxException {
final URIBuilder targetURI = client.newURIBuilder(SERVICE_URI);

View File

@ -33,9 +33,11 @@ import org.apache.olingo.client.api.EdmEnabledODataClient;
import org.apache.olingo.client.api.ODataClient;
import org.apache.olingo.client.api.communication.ODataClientErrorException;
import org.apache.olingo.client.api.communication.request.cud.ODataEntityCreateRequest;
import org.apache.olingo.client.api.communication.request.cud.UpdateType;
import org.apache.olingo.client.api.communication.request.retrieve.ODataEntityRequest;
import org.apache.olingo.client.api.communication.request.retrieve.ODataEntitySetRequest;
import org.apache.olingo.client.api.communication.response.ODataEntityCreateResponse;
import org.apache.olingo.client.api.communication.response.ODataEntityUpdateResponse;
import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
import org.apache.olingo.client.core.ODataClientFactory;
import org.apache.olingo.commons.api.domain.ODataComplexValue;
@ -54,6 +56,7 @@ import org.apache.olingo.commons.api.http.HttpHeader;
import org.apache.olingo.commons.api.http.HttpStatusCode;
import org.apache.olingo.fit.AbstractBaseTestITCase;
import org.apache.olingo.fit.tecsvc.TecSvcConst;
import org.junit.Ignore;
import org.junit.Test;
public class DeepInsertITCase extends AbstractBaseTestITCase {
@ -567,7 +570,7 @@ public class DeepInsertITCase extends AbstractBaseTestITCase {
// Entity must not be created
validateSet(targetURI, cookie, (short) 1, (short) 2, (short) 3);
}
@Test
public void testInvalidType() throws EdmPrimitiveTypeException {
final EdmEnabledODataClient client = ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
@ -607,7 +610,7 @@ public class DeepInsertITCase extends AbstractBaseTestITCase {
}
@Test
@org.junit.Ignore
@Ignore
public void testDeepInsertOnNavigationPropertyInComplexProperty() {
final EdmEnabledODataClient client = ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
final ODataObjectFactory of = client.getObjectFactory();
@ -662,6 +665,202 @@ public class DeepInsertITCase extends AbstractBaseTestITCase {
.toValue());
}
@Test
public void testDeepUpsert() {
final ODataClient client = getClient();
final URI updateURI = client.newURIBuilder(SERVICE_URI)
.appendEntitySetSegment(ES_KEY_NAV)
.appendKeySegment(815)
.build();
final ODataObjectFactory of = client.getObjectFactory();
final ODataEntity entity = client.getObjectFactory().newEntity(ET_KEY_NAV);
// Prepare entity(EntitySet: ESKeyNav, Type: ETKeyNav)
entity.getProperties()
.add(of.newPrimitiveProperty(PROPERTY_INT16, of.newPrimitiveValueBuilder().buildInt16((short) 42)));
entity.getProperties()
.add(of.newPrimitiveProperty(PROPERTY_STRING, of.newPrimitiveValueBuilder().buildString("42")));
entity.getProperties()
.add(of.newComplexProperty(PROPERTY_COMP_NAV, of.newComplexValue(CT_NAV_FIVE_PROP)
.add(of.newPrimitiveProperty(PROPERTY_INT16, of.newPrimitiveValueBuilder().buildInt16((short) 42)))));
entity.getProperties()
.add(of.newComplexProperty(PROPERTY_COMP_ALL_PRIM, of.newComplexValue(CT_ALL_PRIM)
.add(of.newPrimitiveProperty(PROPERTY_STRING, of.newPrimitiveValueBuilder().buildString("42")))));
entity.getProperties()
.add(of.newComplexProperty(PROPERTY_COMP_TWO_PRIM, of.newComplexValue(CT_TWO_PRIM)
.add(of.newPrimitiveProperty(PROPERTY_INT16, of.newPrimitiveValueBuilder().buildInt16((short) 42)))
.add(of.newPrimitiveProperty(PROPERTY_STRING, of.newPrimitiveValueBuilder().buildString("42")))));
entity.getProperties()
.add(of.newComplexProperty(PROPERTY_COMP_COMP_NAV, of.newComplexValue(CT_PRIM_COMP)
.add(of.newPrimitiveProperty(PROPERTY_STRING, of.newPrimitiveValueBuilder().buildString("42")))
.add(of.newComplexProperty(PROPERTY_COMP_NAV, of.newComplexValue(CT_NAV_FIVE_PROP)
.add(of.newPrimitiveProperty(PROPERTY_INT16, of.newPrimitiveValueBuilder().buildInt16((short) 42)))))));
// Non collection navigation property
// Create related entity(EntitySet: ESTwoKeyNav, Type: ETTwoKeyNav, Nav. Property: NavPropertyETTwoKeyNavOne)
final ODataEntity inlineEntitySingle = client.getObjectFactory().newEntity(ET_TWO_KEY_NAV);
inlineEntitySingle.getProperties()
.add(of.newPrimitiveProperty(PROPERTY_INT16, of.newPrimitiveValueBuilder().buildInt16((short) 43)));
inlineEntitySingle.getProperties()
.add(of.newPrimitiveProperty(PROPERTY_STRING, of.newPrimitiveValueBuilder().buildString("43")));
inlineEntitySingle.getProperties().add(
of.newComplexProperty(PROPERTY_COMP, of.newComplexValue(CT_PRIM_COMP)));
inlineEntitySingle.getProperties()
.add(of.newComplexProperty(PROPERTY_COMP_NAV, of.newComplexValue(CT_PRIM_COMP)
.add(of.newPrimitiveProperty(PROPERTY_INT16, of.newPrimitiveValueBuilder().buildInt16((short) 431)))));
inlineEntitySingle.getProperties()
.add(of.newComplexProperty(PROPERTY_COMP_TWO_PRIM, of.newComplexValue(CT_TWO_PRIM)
.add(of.newPrimitiveProperty(PROPERTY_INT16, of.newPrimitiveValueBuilder().buildInt16((short) 432)))
.add(of.newPrimitiveProperty(PROPERTY_STRING, of.newPrimitiveValueBuilder().buildString("432")))));
// Collection navigation property
// The navigation property has a partner navigation property named "NavPropertyETKeyNavOne"
// Create related entity(EntitySet: ESTwoKeyNav, Type: NavPropertyETTwoKeyNavMany
final ODataEntity inlineEntityCol1 = client.getObjectFactory().newEntity(ET_TWO_KEY_NAV);
inlineEntityCol1.getProperties()
.add(of.newPrimitiveProperty(PROPERTY_INT16, of.newPrimitiveValueBuilder().buildInt16((short) 44)));
inlineEntityCol1.getProperties()
.add(of.newPrimitiveProperty(PROPERTY_STRING, of.newPrimitiveValueBuilder().buildString("44")));
inlineEntityCol1.getProperties()
.add(of.newComplexProperty(PROPERTY_COMP_NAV, of.newComplexValue(CT_PRIM_COMP)
.add(of.newPrimitiveProperty(PROPERTY_INT16, of.newPrimitiveValueBuilder().buildInt16((short) 441)))));
inlineEntityCol1.getProperties().add(
of.newComplexProperty(PROPERTY_COMP, of.newComplexValue(CT_PRIM_COMP)));
inlineEntityCol1.getProperties()
.add(of.newComplexProperty(PROPERTY_COMP_TWO_PRIM, of.newComplexValue(CT_TWO_PRIM)
.add(of.newPrimitiveProperty(PROPERTY_INT16, of.newPrimitiveValueBuilder().buildInt16((short) 442)))
.add(of.newPrimitiveProperty(PROPERTY_STRING, of.newPrimitiveValueBuilder().buildString("442")))));
final ODataEntity inlineEntityCol2 = client.getObjectFactory().newEntity(ET_TWO_KEY_NAV);
inlineEntityCol2.getProperties()
.add(of.newPrimitiveProperty(PROPERTY_INT16, of.newPrimitiveValueBuilder().buildInt16((short) 45)));
inlineEntityCol2.getProperties()
.add(of.newPrimitiveProperty(PROPERTY_STRING, of.newPrimitiveValueBuilder().buildString("45")));
inlineEntityCol2.getProperties()
.add(of.newComplexProperty(PROPERTY_COMP_NAV, of.newComplexValue(CT_PRIM_COMP)
.add(of.newPrimitiveProperty(PROPERTY_INT16, of.newPrimitiveValueBuilder().buildInt16((short) 451)))));
inlineEntityCol2.getProperties().add(
of.newComplexProperty(PROPERTY_COMP, of.newComplexValue(CT_PRIM_COMP)));
inlineEntityCol2.getProperties()
.add(of.newComplexProperty(PROPERTY_COMP_TWO_PRIM, of.newComplexValue(CT_TWO_PRIM)
.add(of.newPrimitiveProperty(PROPERTY_INT16, of.newPrimitiveValueBuilder().buildInt16((short) 452)))
.add(of.newPrimitiveProperty(PROPERTY_STRING, of.newPrimitiveValueBuilder().buildString("452")))));
final ODataInlineEntity newDeepInsertEntityLink =
of.newDeepInsertEntity(NAV_PROPERTY_ET_TWO_KEY_NAV_ONE, inlineEntitySingle);
final ODataEntitySet newDeepInsertEntitySet = of.newEntitySet();
newDeepInsertEntitySet.getEntities().add(inlineEntityCol1);
newDeepInsertEntitySet.getEntities().add(inlineEntityCol2);
final ODataInlineEntitySet newDeepInsertEntitySetLink =
of.newDeepInsertEntitySet(NAV_PROPERTY_ET_TWO_KEY_NAV_MANY, newDeepInsertEntitySet);
entity.addLink(newDeepInsertEntityLink);
entity.addLink(newDeepInsertEntitySetLink);
// Perform update request (upsert)
final ODataEntityUpdateResponse<ODataEntity> responseCreate = client.getCUDRequestFactory()
.getEntityUpdateRequest(updateURI, UpdateType.PATCH, entity)
.execute();
assertEquals(HttpStatusCode.CREATED.getStatusCode(), responseCreate.getStatusCode());
final String cookie = responseCreate.getHeader(HttpHeader.SET_COOKIE).toString();
// Fetch ESKeyNav entity with expand of NavPropertyETTwoKeyNavOne nav. property
ODataProperty propertyInt16 = responseCreate.getBody().getProperty(PROPERTY_INT16);
final URI esKeyNavURI =
client.newURIBuilder(SERVICE_URI).appendEntitySetSegment(ES_KEY_NAV).appendKeySegment(
propertyInt16.getPrimitiveValue().toValue()).expand(NAV_PROPERTY_ET_TWO_KEY_NAV_ONE,
NAV_PROPERTY_ET_TWO_KEY_NAV_MANY).build();
final ODataEntityRequest<ODataEntity> esKeyNavRequest = client.getRetrieveRequestFactory()
.getEntityRequest(esKeyNavURI);
esKeyNavRequest.addCustomHeader(HttpHeader.COOKIE, cookie);
final ODataRetrieveResponse<ODataEntity> esKeyNavResponse = esKeyNavRequest.execute();
// Check nav. property NavPropertyETTwoKeyNavOne
assertNotNull(esKeyNavResponse.getBody().getProperty(NAV_PROPERTY_ET_TWO_KEY_NAV_ONE));
assertEquals(431, esKeyNavResponse.getBody().getProperty(NAV_PROPERTY_ET_TWO_KEY_NAV_ONE).getComplexValue().get(
PROPERTY_COMP_NAV).getComplexValue().get(PROPERTY_INT16).getPrimitiveValue().toValue());
// Check nav. property NavPropertyETTwoKeyNavMany
assertNotNull(esKeyNavResponse.getBody().getProperty(NAV_PROPERTY_ET_TWO_KEY_NAV_MANY));
assertEquals(2, esKeyNavResponse.getBody().getProperty(NAV_PROPERTY_ET_TWO_KEY_NAV_MANY).getCollectionValue()
.size());
Iterator<ODataValue> twoKeyNavManyIterator =
esKeyNavResponse.getBody().getProperty(NAV_PROPERTY_ET_TWO_KEY_NAV_MANY).getCollectionValue().iterator();
final ODataValue firstTwoKeyNavEnity = twoKeyNavManyIterator.next(); // First entity
assertEquals(441, firstTwoKeyNavEnity.asComplex().get(PROPERTY_COMP_NAV).getValue().asComplex().get(
PROPERTY_INT16).getPrimitiveValue().toValue());
final ODataValue secondTwoKeyNavEnity = twoKeyNavManyIterator.next(); // Second entity
assertEquals(451, secondTwoKeyNavEnity.asComplex().get(PROPERTY_COMP_NAV).getValue().asComplex().get(
PROPERTY_INT16).getPrimitiveValue().toValue());
// Fetch ESTwoKeyNav entities and check if available and the partner relation have been set up
// Check ESTwoKeyNav(Created via NavPropertyETTwoKeyNavOne)
Map<String, Object> composedKey = new HashMap<String, Object>();
composedKey.put(PROPERTY_INT16, esKeyNavResponse.getBody().getProperty(NAV_PROPERTY_ET_TWO_KEY_NAV_ONE)
.getComplexValue().get(PROPERTY_INT16)
.getPrimitiveValue().toValue());
composedKey.put(PROPERTY_STRING, esKeyNavResponse.getBody().getProperty(NAV_PROPERTY_ET_TWO_KEY_NAV_ONE)
.getComplexValue().get(PROPERTY_STRING)
.getPrimitiveValue().toValue());
final URI esTwoKeyNavEntitySingleURI = client.newURIBuilder(SERVICE_URI)
.appendEntitySetSegment(ES_TWO_KEY_NAV)
.appendKeySegment(composedKey)
.build();
final ODataEntityRequest<ODataEntity> esTwoKeyNavSingleRequest = client.getRetrieveRequestFactory()
.getEntityRequest(esTwoKeyNavEntitySingleURI);
esTwoKeyNavSingleRequest.addCustomHeader(HttpHeader.COOKIE, cookie);
final ODataRetrieveResponse<ODataEntity> esTwoKeyNavSingleResponse = esTwoKeyNavSingleRequest.execute();
assertEquals(431, esTwoKeyNavSingleResponse.getBody().getProperty(PROPERTY_COMP_NAV).getComplexValue().get(
PROPERTY_INT16).getPrimitiveValue().toValue());
// Check ESTwoKeyNav(Created via NavPropertyETTwoKeyNavMany(0))
composedKey.clear();
composedKey.put(PROPERTY_INT16, firstTwoKeyNavEnity.asComplex().get(PROPERTY_INT16).getPrimitiveValue().toValue());
composedKey.put(PROPERTY_STRING, firstTwoKeyNavEnity.asComplex().get(PROPERTY_STRING).getPrimitiveValue()
.toValue());
URI esTwoKeyNavEntityManyOneURI =
client.newURIBuilder(SERVICE_URI).appendEntitySetSegment(ES_TWO_KEY_NAV).appendKeySegment(composedKey)
.expand(NAV_PROPERTY_ET_KEY_NAV_ONE).build();
final ODataEntityRequest<ODataEntity> esTwoKeyNavManyOneRequest =
client.getRetrieveRequestFactory().getEntityRequest(esTwoKeyNavEntityManyOneURI);
esTwoKeyNavManyOneRequest.addCustomHeader(HttpHeader.COOKIE, cookie);
final ODataRetrieveResponse<ODataEntity> esTwoKeyNavManyOneResponse = esTwoKeyNavManyOneRequest.execute();
assertEquals(441, esTwoKeyNavManyOneResponse.getBody().getProperty(PROPERTY_COMP_NAV).getComplexValue().get(
PROPERTY_INT16).getPrimitiveValue().toValue());
assertNotNull(esTwoKeyNavManyOneResponse.getBody().getProperty(NAV_PROPERTY_ET_KEY_NAV_ONE).getComplexValue());
assertEquals(propertyInt16.getPrimitiveValue().toValue(), esTwoKeyNavManyOneResponse.getBody().getProperty(
NAV_PROPERTY_ET_KEY_NAV_ONE).getComplexValue().get(PROPERTY_INT16).getPrimitiveValue().toValue());
// Check ESTwoKeyNav(Created via NavPropertyETTwoKeyNavMany(1))
composedKey.clear();
composedKey.put(PROPERTY_INT16, secondTwoKeyNavEnity.asComplex().get(PROPERTY_INT16).getPrimitiveValue().toValue());
composedKey.put(PROPERTY_STRING, secondTwoKeyNavEnity.asComplex().get(PROPERTY_STRING).getPrimitiveValue()
.toValue());
URI esTwoKeyNavEntityManyTwoURI =
client.newURIBuilder(SERVICE_URI).appendEntitySetSegment(ES_TWO_KEY_NAV).appendKeySegment(composedKey)
.expand(NAV_PROPERTY_ET_KEY_NAV_ONE).build();
final ODataEntityRequest<ODataEntity> esTwoKeyNavManyTwoRequest =
client.getRetrieveRequestFactory().getEntityRequest(esTwoKeyNavEntityManyTwoURI);
esTwoKeyNavManyTwoRequest.addCustomHeader(HttpHeader.COOKIE, cookie);
final ODataRetrieveResponse<ODataEntity> esTwoKeyNavManyTwoResponse = esTwoKeyNavManyTwoRequest.execute();
assertEquals(451, esTwoKeyNavManyTwoResponse.getBody().getProperty(PROPERTY_COMP_NAV).getComplexValue().get(
PROPERTY_INT16).getPrimitiveValue().toValue());
assertNotNull(esTwoKeyNavManyTwoResponse.getBody().getProperty(NAV_PROPERTY_ET_KEY_NAV_ONE).getComplexValue());
assertEquals(propertyInt16.getPrimitiveValue().toValue(), esTwoKeyNavManyTwoResponse.getBody().getProperty(
NAV_PROPERTY_ET_KEY_NAV_ONE).getComplexValue().get(PROPERTY_INT16).getPrimitiveValue().toValue());
}
private String getCookie() {
final EdmEnabledODataClient client = ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
final ODataRetrieveResponse<ODataEntitySet> response = client.getRetrieveRequestFactory()

View File

@ -522,6 +522,11 @@ public class DataCreator {
setLink(entitySet.getEntities().get(0), "NavPropertyETMediaOne", esMediaTargets.get(0));
setLink(entitySet.getEntities().get(1), "NavPropertyETMediaOne", esMediaTargets.get(1));
setLink(entitySet.getEntities().get(2), "NavPropertyETMediaOne", esMediaTargets.get(2));
// NavPropertyETMediaMany
setLinks(entitySet.getEntities().get(0), "NavPropertyETMediaMany", esMediaTargets.get(0), esMediaTargets.get(2));
setLinks(entitySet.getEntities().get(1), "NavPropertyETMediaMany", esMediaTargets.get(2));
setLinks(entitySet.getEntities().get(2), "NavPropertyETMediaMany", esMediaTargets.get(0), esMediaTargets.get(1));
}
private void linkESTwoKeyNav(Map<String, EntityCollection> data) {

View File

@ -44,19 +44,30 @@ import org.apache.olingo.server.tecsvc.data.DataProvider.DataProviderException;
public class RequestValidator {
private DataProvider provider;
private boolean isInsert;
private boolean isPatch;
private UriHelper uriHelper;
private Edm edm;
private String rawServiceRoot;
public RequestValidator(final DataProvider provider, final boolean isInsert, final UriHelper uriHelper,
public RequestValidator(final DataProvider provider, final UriHelper uriHelper,
final Edm edm, final String rawServiceRoot) {
this.provider = provider;
this.isInsert = isInsert;
this.isInsert = true;
this.uriHelper = uriHelper;
this.edm = edm;
this.rawServiceRoot = rawServiceRoot;
}
public RequestValidator(final DataProvider provider, final boolean isUpdate, final boolean isPatch,
final UriHelper uriHelper, final Edm edm, final String rawServiceRoot) {
this.provider = provider;
this.isInsert = !isUpdate;
this.isPatch = isPatch;
this.uriHelper = uriHelper;
this.edm = edm;
this.rawServiceRoot = rawServiceRoot;
}
public void validate(final EdmBindingTarget edmBindingTarget, final Entity entity)
throws DataProviderException {
final List<String> path = new ArrayList<String>();
@ -84,9 +95,10 @@ public class RequestValidator {
edmProperty,
target);
if (( isInsert && !edmProperty.isNullable() && (bindingResult != ValidatioResult.FOUND
&& linkResult != ValidatioResult.FOUND))
|| (!isInsert && !edmProperty.isNullable() && linkResult == ValidatioResult.EMPTY)) {
if (( isInsert && !edmProperty.isNullable()
&& (bindingResult != ValidatioResult.FOUND
&& linkResult != ValidatioResult.FOUND))
|| (!(isInsert && isPatch) && !edmProperty.isNullable() && linkResult == ValidatioResult.EMPTY)) {
throw new DataProviderException("Navigation property " + navPropertyName + " must not be null",
HttpStatusCode.BAD_REQUEST);
}
@ -192,8 +204,9 @@ public class RequestValidator {
// Check if all "not nullable" properties are set
if(!edmProperty.isNullable()) {
if((property != null && property.isNull()) // Update,insert; Property is explicit set to null
|| (isInsert && property == null) ) { // Insert; Property not provided
if((property != null && property.isNull()) // Update,insert; Property is explicit set to null
|| (isInsert && property == null) // Insert; Property not provided
|| (!isInsert && !isPatch && property == null)) { // Insert(Put); Property not provided
throw new DataProviderException("Property " + propertyName + " must not be null",
HttpStatusCode.BAD_REQUEST);
}

View File

@ -241,7 +241,6 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
final DeserializerResult deserializerResult = odata.createDeserializer(ODataFormat.fromContentType(requestFormat))
.entity(request.getBody(), edmEntityType);
new RequestValidator(dataProvider,
true, // Insert
odata.createUriHelper(),
serviceMetadata.getEdm(),
request.getRawBaseUri()
@ -289,7 +288,8 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
final Entity changedEntity = deserializer.entity(request.getBody(), edmEntitySet.getEntityType()).getEntity();
new RequestValidator(dataProvider,
false, // Update
true, // Update
request.getMethod() == HttpMethod.PATCH,
odata.createUriHelper(),
serviceMetadata.getEdm(),
request.getRawBaseUri()