[OLINGO-1497]Support collection of Entries in Function imports
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 @@
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 @@
}
case URI10:
+ case URI10a:
case URI11:
case URI12:
case URI13:
@@ -289,6 +290,7 @@
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 @@
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 @@
}
@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 @@
}
@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 @@
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 @@
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 @@
*/
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 @@
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 @@
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 @@
@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 @@
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 @@
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 @@
@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 @@
@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 @@
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 @@
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) {