[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) {