This is an automated email from the ASF dual-hosted git repository. ramyav pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/olingo-odata2.git
The following commit(s) were added to refs/heads/master by this push: new 77b42d0 [OLINGO-1497]Support collection of Entries in Function imports 77b42d0 is described below commit 77b42d00354a91990d788d5906c1e7131b02a7de Author: ramya vasanth <ramya.vasa...@sap.com> AuthorDate: Tue Nov 24 16:31:46 2020 +0530 [OLINGO-1497]Support collection of Entries in Function imports --- .../odata2/client/core/uri/UriParserTest.java | 2 +- .../org/apache/olingo/odata2/core/Dispatcher.java | 2 ++ .../olingo/odata2/core/ODataRequestHandler.java | 1 + .../olingo/odata2/core/ep/AtomEntityProvider.java | 13 ++++++--- .../olingo/odata2/core/ep/JsonEntityProvider.java | 15 ++++++---- .../olingo/odata2/core/uri/UriParserImpl.java | 7 +---- .../org/apache/olingo/odata2/core/uri/UriType.java | 4 +++ .../apache/olingo/odata2/core/DispatcherTest.java | 1 + .../core/ODataRequestHandlerValidationTest.java | 4 +-- .../olingo/odata2/core/uri/UriParserTest.java | 2 +- .../odata2/fit/ref/FunctionImportXmlTest.java | 32 ++++------------------ .../odata2/ref/processor/ScenarioDataSource.java | 2 +- 12 files changed, 39 insertions(+), 46 deletions(-) diff --git a/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/uri/UriParserTest.java b/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/uri/UriParserTest.java index 330c8b3..21394c1 100644 --- a/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/uri/UriParserTest.java +++ b/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/uri/UriParserTest.java @@ -621,7 +621,7 @@ public class UriParserTest { UriInfoImpl result = parse("EmployeeSearch"); assertEquals("EmployeeSearch", result.getFunctionImport().getName()); assertEquals(EdmTypeKind.ENTITY, result.getTargetType().getKind()); - assertEquals(UriType.URI1, result.getUriType()); + assertEquals(UriType.URI10a, result.getUriType()); result = parse("AllLocations"); assertEquals("AllLocations", result.getFunctionImport().getName()); diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/Dispatcher.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/Dispatcher.java index 5809bfd..1ec2b7b 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/Dispatcher.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/Dispatcher.java @@ -193,6 +193,7 @@ public class Dispatcher { } case URI10: + case URI10a: case URI11: case URI12: case URI13: @@ -289,6 +290,7 @@ public class Dispatcher { feature = BatchProcessor.class; break; case URI10: + case URI10a: case URI11: case URI12: case URI13: diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataRequestHandler.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataRequestHandler.java index 844f41d..ce390cc 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataRequestHandler.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ODataRequestHandler.java @@ -275,6 +275,7 @@ public class ODataRequestHandler { break; case URI10: + case URI10a: case URI11: case URI12: case URI13: diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/AtomEntityProvider.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/AtomEntityProvider.java index 4576ce5..6d7c496 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/AtomEntityProvider.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/AtomEntityProvider.java @@ -349,17 +349,22 @@ public class AtomEntityProvider implements ContentTypeBasedEntityProvider { } @Override + @SuppressWarnings("unchecked") public ODataResponse writeFunctionImport(final EdmFunctionImport functionImport, final Object data, final EntityProviderWriteProperties properties) throws EntityProviderException { try { if(functionImport.getReturnType() !=null){ final EdmType type = functionImport.getReturnType().getType(); final boolean isCollection = functionImport.getReturnType().getMultiplicity() == EdmMultiplicity.MANY; - + if (type.getKind() == EdmTypeKind.ENTITY) { - @SuppressWarnings("unchecked") - Map<String, Object> map = (Map<String, Object>) data; - return writeEntry(functionImport.getEntitySet(), map, properties); + if (isCollection) { + List<Map<String, Object>> dataList = (List<Map<String, Object>>) data; + return writeFeed(functionImport.getEntitySet(), dataList, properties); + } else { + Map<String, Object> map = (Map<String, Object>) data; + return writeEntry(functionImport.getEntitySet(), map, properties); + } } final EntityPropertyInfo info = EntityInfoAggregator.create(functionImport); if (isCollection) { diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/JsonEntityProvider.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/JsonEntityProvider.java index 1d87012..546319e 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/JsonEntityProvider.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/JsonEntityProvider.java @@ -302,18 +302,23 @@ public class JsonEntityProvider implements ContentTypeBasedEntityProvider { } @Override + @SuppressWarnings("unchecked") public ODataResponse writeFunctionImport(final EdmFunctionImport functionImport, final Object data, final EntityProviderWriteProperties properties) throws EntityProviderException { try { if(functionImport.getReturnType() !=null){ + final boolean isCollection = functionImport.getReturnType().getMultiplicity() == EdmMultiplicity.MANY; if (functionImport.getReturnType().getType().getKind() == EdmTypeKind.ENTITY) { - @SuppressWarnings("unchecked") - Map<String, Object> map = (Map<String, Object>) data; - return writeEntry(functionImport.getEntitySet(), map, properties); + if (isCollection) { + List<Map<String, Object>> dataList = (List<Map<String, Object>>) data; + return writeFeed(functionImport.getEntitySet(), dataList, properties); + } else { + return writeEntry(functionImport.getEntitySet(), (Map<String, Object>)data, properties); + } } - + final EntityPropertyInfo info = EntityInfoAggregator.create(functionImport); - if (functionImport.getReturnType().getMultiplicity() == EdmMultiplicity.MANY) { + if (isCollection) { return writeCollection(info, (List<?>) data); } else { return writeSingleTypedElement(info, data); diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriParserImpl.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriParserImpl.java index a49e7c1..1d28fae 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriParserImpl.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriParserImpl.java @@ -551,11 +551,6 @@ public class UriParserImpl extends UriParser { final EdmType type = returnType.getType(); final boolean isCollection = returnType.getMultiplicity() == EdmMultiplicity.MANY; - if (type.getKind() == EdmTypeKind.ENTITY && isCollection) { - handleEntitySet(functionImport.getEntitySet(), keyPredicate); - return; - } - if (emptyParentheses != null) { throw new UriSyntaxException(UriSyntaxException.INVALIDSEGMENT.addContent(emptyParentheses)); } @@ -569,7 +564,7 @@ public class UriParserImpl extends UriParser { uriResult.setUriType(isCollection ? UriType.URI11 : UriType.URI12); break; case ENTITY: - uriResult.setUriType(UriType.URI10); + uriResult.setUriType(isCollection ? UriType.URI10a : UriType.URI10); break; default: throw new UriSyntaxException(UriSyntaxException.INVALIDRETURNTYPE.addContent(type.getKind())); diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriType.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriType.java index 0983d08..3a0772f 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriType.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/uri/UriType.java @@ -82,6 +82,10 @@ public enum UriType { */ URI10(SystemQueryOption.$format), /** + * Function import returning an entity set + */ + URI10a(SystemQueryOption.$format), + /** * Function import returning a collection of complex-type instances */ URI11(SystemQueryOption.$format), diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/DispatcherTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/DispatcherTest.java index 717f031..96b73fe 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/DispatcherTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/DispatcherTest.java @@ -274,6 +274,7 @@ public class DispatcherTest extends BaseTest { checkDispatch(ODataHttpMethod.POST, UriType.URI9, "executeBatch"); checkDispatch(ODataHttpMethod.GET, UriType.URI10, "executeFunctionImport"); + checkDispatch(ODataHttpMethod.GET, UriType.URI10a, "executeFunctionImport"); checkDispatch(ODataHttpMethod.GET, UriType.URI11, "executeFunctionImport"); checkDispatch(ODataHttpMethod.GET, UriType.URI12, "executeFunctionImport"); checkDispatch(ODataHttpMethod.GET, UriType.URI13, "executeFunctionImport"); diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataRequestHandlerValidationTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataRequestHandlerValidationTest.java index 7105c93..538bba1 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataRequestHandlerValidationTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataRequestHandlerValidationTest.java @@ -371,7 +371,7 @@ public class ODataRequestHandlerValidationTest extends BaseTest { private void wrongFunctionHttpMethod(final ODataHttpMethod method, final UriType uriType) throws ODataException { wrongRequest(method, - uriType == UriType.URI1 ? Arrays.asList("EmployeeSearch") : createPathSegments(uriType, false, false), + uriType == UriType.URI10a ? Arrays.asList("EmployeeSearch") : createPathSegments(uriType, false, false), null); } @@ -531,7 +531,7 @@ public class ODataRequestHandlerValidationTest extends BaseTest { @Test public void functionImportWrongHttpMethod() throws Exception { - wrongFunctionHttpMethod(ODataHttpMethod.POST, UriType.URI1); + wrongFunctionHttpMethod(ODataHttpMethod.POST, UriType.URI10a); wrongFunctionHttpMethod(ODataHttpMethod.PUT, UriType.URI10); wrongFunctionHttpMethod(ODataHttpMethod.POST, UriType.URI11); wrongFunctionHttpMethod(ODataHttpMethod.PATCH, UriType.URI12); diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/uri/UriParserTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/uri/UriParserTest.java index 5896cfe..2429f35 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/uri/UriParserTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/uri/UriParserTest.java @@ -682,7 +682,7 @@ public class UriParserTest extends BaseTest { UriInfoImpl result = parse("EmployeeSearch"); assertEquals("EmployeeSearch", result.getFunctionImport().getName()); assertEquals(EdmTypeKind.ENTITY, result.getTargetType().getKind()); - assertEquals(UriType.URI1, result.getUriType()); + assertEquals(UriType.URI10a, result.getUriType()); result = parse("AllLocations"); assertEquals("AllLocations", result.getFunctionImport().getName()); diff --git a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/FunctionImportXmlTest.java b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/FunctionImportXmlTest.java index 97187f5..538a91d 100644 --- a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/FunctionImportXmlTest.java +++ b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/FunctionImportXmlTest.java @@ -20,7 +20,6 @@ package org.apache.olingo.odata2.fit.ref; import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo; import static org.custommonkey.xmlunit.XMLAssert.assertXpathExists; -import static org.custommonkey.xmlunit.XMLAssert.assertXpathNotExists; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -55,10 +54,9 @@ public class FunctionImportXmlTest extends AbstractRefXmlTest { @Test public void functionImports() throws Exception { - HttpResponse response = callUri("EmployeeSearch('1')/ne_Room/Id/$value?q='alter'"); - checkMediaType(response, HttpContentType.TEXT_PLAIN_UTF8); - checkEtag(response, "W/\"1\""); - assertEquals("1", getBody(response)); + HttpResponse response = callUri("EmployeeSearch?q='alter'"); + checkMediaType(response, HttpContentType.APPLICATION_XML_UTF8); + assertXpathEvaluatesTo("Walter Winter", "/atom:feed/atom:entry[1]/atom:title", getBody(response)); assertFalse(getBody(callUri("EmployeeSearch?q='-'")).contains("entry")); @@ -140,10 +138,9 @@ public class FunctionImportXmlTest extends AbstractRefXmlTest { @Test public void functionImportsDefaultAccept() throws Exception { - HttpResponse response = callUri("EmployeeSearch('1')/ne_Room/Id/$value?q='alter'"); - checkMediaType(response, HttpContentType.TEXT_PLAIN_UTF8); - checkEtag(response, "W/\"1\""); - assertEquals("1", getBody(response)); + HttpResponse response = callUri("EmployeeSearch?q='alter'"); + checkMediaType(response, HttpContentType.APPLICATION_XML_UTF8); + assertXpathEvaluatesTo("Walter Winter", "/atom:feed/atom:entry[1]/atom:title", getBody(response)); assertFalse(getBody(callUri("EmployeeSearch?q='-'")).contains("entry")); @@ -197,21 +194,4 @@ public class FunctionImportXmlTest extends AbstractRefXmlTest { ContentType.parse(response.getFirstHeader(HttpHeaders.CONTENT_TYPE).getValue()); Assert.assertEquals(expectedContentType, responseContentType); } - - @Test - public void select() throws Exception { - HttpResponse response = callUri("EmployeeSearch?q='ede'&$select=Age"); - checkMediaType(response, HttpContentType.APPLICATION_ATOM_XML_UTF8 + ";type=feed"); - String body = getBody(response); - assertXpathEvaluatesTo(EMPLOYEE_2_AGE, "/atom:feed/atom:entry/m:properties/d:Age", body); - assertXpathNotExists("/atom:feed/atom:entry/m:properties/d:Location", body); - assertXpathEvaluatesTo("2", "count(/atom:feed/atom:entry/atom:link)", body); - - response = callUri("EmployeeSearch('2')/ne_Room?q='ede'&$select=Seats"); - checkMediaType(response, HttpContentType.APPLICATION_ATOM_XML_UTF8 + ";type=entry"); - body = getBody(response); - assertXpathEvaluatesTo("5", "/atom:entry/atom:content/m:properties/d:Seats", body); - assertXpathNotExists("/atom:entry/atom:content/m:properties/d:Id", body); - assertXpathEvaluatesTo("1", "count(/atom:entry/atom:link)", body); - } } diff --git a/odata2-lib/odata-ref/src/main/java/org/apache/olingo/odata2/ref/processor/ScenarioDataSource.java b/odata2-lib/odata-ref/src/main/java/org/apache/olingo/odata2/ref/processor/ScenarioDataSource.java index 2db59b7..a192077 100644 --- a/odata2-lib/odata-ref/src/main/java/org/apache/olingo/odata2/ref/processor/ScenarioDataSource.java +++ b/odata2-lib/odata-ref/src/main/java/org/apache/olingo/odata2/ref/processor/ScenarioDataSource.java @@ -221,7 +221,7 @@ public class ScenarioDataSource { throw new ODataNotFoundException(null); } else { final List<Employee> found = searchEmployees((String) parameters.get("q")); - if (keys.isEmpty()) { + if (null == keys || keys.isEmpty()) { return found; } else { for (final Employee employee : found) {