You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by il...@apache.org on 2014/04/07 13:58:14 UTC

[1/2] git commit: [OLINGO-202] Required changes provided

Repository: olingo-odata4
Updated Branches:
  refs/heads/master 05b26700a -> 855a586b3


[OLINGO-202] Required changes provided


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/081df2aa
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/081df2aa
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/081df2aa

Branch: refs/heads/master
Commit: 081df2aa70b348e43a90ba40614745c0f9de7f89
Parents: 05b2670
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Mon Apr 7 13:21:17 2014 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Mon Apr 7 13:21:17 2014 +0200

----------------------------------------------------------------------
 .../client/core/edm/EdmActionImportImpl.java    |  19 +-
 .../olingo/client/core/edm/EdmClientImpl.java   |  35 +++-
 .../client/core/edm/EdmFunctionImportImpl.java  |  25 +--
 .../core/edm/v3/EdmActionImportProxy.java       |  20 +-
 .../core/edm/v3/EdmFunctionImportProxy.java     |  27 +--
 .../client/core/it/v3/InvokeTestITCase.java     |  12 +-
 .../olingo/client/core/v3/MetadataTest.java     |   8 +-
 .../olingo/client/core/v4/MetadataTest.java     |   7 +-
 .../org/apache/olingo/commons/api/edm/Edm.java  | 185 +++++++++++--------
 .../olingo/commons/api/edm/EdmActionImport.java |   9 -
 .../commons/api/edm/EdmFunctionImport.java      |  16 +-
 .../olingo/commons/core/edm/AbstractEdm.java    | 180 +++++++++++-------
 .../commons/core/edm/EdmImplCachingTest.java    |  56 ++++--
 .../commons/core/edm/EdmImplCallCreateTest.java |  27 ++-
 .../core/edm/provider/EdmActionImportImpl.java  |  10 +-
 .../edm/provider/EdmFunctionImportImpl.java     |  19 +-
 .../core/edm/provider/EdmProviderImpl.java      |  49 +++--
 .../core/uri/parser/UriParseTreeVisitor.java    |  10 +-
 .../edm/provider/EdmActionImportImplTest.java   |   2 +-
 .../EdmProviderImplOverloadingTest.java         |  30 +--
 .../core/edm/provider/EdmProviderImplTest.java  |  16 +-
 .../core/edm/provider/EdmSchemaImplTest.java    |   4 +-
 .../server/core/uri/UriResourceImplTest.java    |   2 +-
 .../queryoption/expression/ExpressionTest.java  |  17 +-
 24 files changed, 457 insertions(+), 328 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmActionImportImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmActionImportImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmActionImportImpl.java
index 5941824..15a9604 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmActionImportImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmActionImportImpl.java
@@ -30,6 +30,8 @@ public class EdmActionImportImpl extends EdmOperationImportImpl implements EdmAc
 
   private final ActionImport actionImport;
 
+  private FullQualifiedName actionFQN;
+
   public EdmActionImportImpl(final Edm edm, final EdmEntityContainer container, final String name,
           final ActionImport actionImport) {
 
@@ -37,18 +39,17 @@ public class EdmActionImportImpl extends EdmOperationImportImpl implements EdmAc
     this.actionImport = actionImport;
   }
 
-  @Override
-  public EdmAction getUnboundAction() {
-    return getBoundAction(null, null);
+  public FullQualifiedName getActionFQN() {
+    if (actionFQN == null) {
+      actionFQN = new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(actionImport.getAction()).
+              setDefaultNamespace(container.getNamespace()).build().getFullQualifiedName();
+    }
+    return actionFQN;
   }
 
   @Override
-  public EdmAction getBoundAction(
-          final FullQualifiedName bindingParameterTypeName, final Boolean isBindingParameterCollection) {
-
-    return edm.getAction(new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(actionImport.getAction()).
-            setDefaultNamespace(container.getNamespace()).build().getFullQualifiedName(),
-            bindingParameterTypeName, isBindingParameterCollection);
+  public EdmAction getUnboundAction() {
+    return edm.getUnboundAction(getActionFQN());
   }
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmClientImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmClientImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmClientImpl.java
index 52fce98..21a1dbf 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmClientImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmClientImpl.java
@@ -211,6 +211,37 @@ public class EdmClientImpl extends AbstractEdm {
   }
 
   @Override
+  protected List<EdmFunction> createUnboundFunctions(final FullQualifiedName functionName) {
+    final List<EdmFunction> result = new ArrayList<EdmFunction>();
+
+    final Schema schema = xmlSchemaByNamespace.get(functionName.getNamespace());
+    if (schema instanceof org.apache.olingo.client.api.edm.xml.v4.Schema) {
+      final List<Function> functions = ((org.apache.olingo.client.api.edm.xml.v4.Schema) schema).
+              getFunctions(functionName.getName());
+      for (final Iterator<Function> itor = functions.iterator(); itor.hasNext();) {
+        final Function function = itor.next();
+        if (!function.isBound()) {
+          result.add(EdmFunctionImpl.getInstance(this, functionName, function));
+        }
+      }
+    } else {
+      for (EntityContainer entityContainer : schema.getEntityContainers()) {
+        @SuppressWarnings("unchecked")
+        final List<FunctionImport> functionImports =
+                (List<FunctionImport>) entityContainer.getFunctionImports(functionName.getName());
+        for (final Iterator<FunctionImport> itor = functionImports.iterator(); itor.hasNext();) {
+          final FunctionImport functionImport = itor.next();
+          if (FunctionImportUtils.canProxyFunction(functionImport) && !functionImport.isBindable()) {
+            result.add(EdmFunctionProxy.getInstance(this, functionName, functionImport));
+          }
+        }
+      }
+    }
+
+    return result;
+  }
+
+  @Override
   protected EdmFunction createUnboundFunction(final FullQualifiedName functionName, final List<String> parameterNames) {
     EdmFunction result = null;
 
@@ -235,8 +266,8 @@ public class EdmClientImpl extends AbstractEdm {
     } else {
       for (EntityContainer entityContainer : schema.getEntityContainers()) {
         @SuppressWarnings("unchecked")
-        final List<FunctionImport> functionImports = (List<FunctionImport>) entityContainer.
-                getFunctionImports(functionName.getName());
+        final List<FunctionImport> functionImports =
+                (List<FunctionImport>) entityContainer.getFunctionImports(functionName.getName());
         boolean found = false;
         for (final Iterator<FunctionImport> itor = functionImports.iterator(); itor.hasNext() && !found;) {
           final FunctionImport functionImport = itor.next();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmFunctionImportImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmFunctionImportImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmFunctionImportImpl.java
index 51ea4e6..5c2575e 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmFunctionImportImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmFunctionImportImpl.java
@@ -32,6 +32,8 @@ public class EdmFunctionImportImpl extends EdmOperationImportImpl implements Edm
 
   private final FunctionImport functionImport;
 
+  private FullQualifiedName functionFQN;
+
   public EdmFunctionImportImpl(final Edm edm, final EdmEntityContainer container, final String name,
           final FunctionImport functionImport) {
 
@@ -40,17 +42,22 @@ public class EdmFunctionImportImpl extends EdmOperationImportImpl implements Edm
   }
 
   @Override
-  public EdmFunction getUnboundFunction(final List<String> parameterNames) {
-    return getBoundFunction(parameterNames, null, null);
+  public FullQualifiedName getFunctionFqn() {
+    if (functionFQN == null) {
+      functionFQN = new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(functionImport.getFunction()).
+              setDefaultNamespace(container.getNamespace()).build().getFullQualifiedName();
+    }
+    return functionFQN;
   }
 
   @Override
-  public EdmFunction getBoundFunction(final List<String> parameterNames,
-          final FullQualifiedName bindingParameterTypeName, final Boolean isBindingParameterCollection) {
+  public List<EdmFunction> getUnboundFunctions() {
+    return edm.getUnboundFunctions(getFunctionFqn());
+  }
 
-    return edm.getFunction(new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(functionImport.getFunction()).
-            setDefaultNamespace(container.getNamespace()).build().getFullQualifiedName(),
-            bindingParameterTypeName, isBindingParameterCollection, parameterNames);
+  @Override
+  public EdmFunction getUnboundFunction(final List<String> parameterNames) {
+    return edm.getUnboundFunction(getFunctionFqn(), parameterNames);
   }
 
   @Override
@@ -58,8 +65,4 @@ public class EdmFunctionImportImpl extends EdmOperationImportImpl implements Edm
     return functionImport.isIncludeInServiceDocument();
   }
 
-  @Override
-  public FullQualifiedName getFunctionFqn() {
-    return new FullQualifiedName(functionImport.getFunction());
-  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmActionImportProxy.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmActionImportProxy.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmActionImportProxy.java
index e39dd23..cb9ae27 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmActionImportProxy.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmActionImportProxy.java
@@ -31,6 +31,8 @@ public class EdmActionImportProxy extends EdmOperationImportImpl implements EdmA
 
   private final FunctionImport functionImport;
 
+  private FullQualifiedName actionFQN;
+
   public EdmActionImportProxy(final Edm edm, final EdmEntityContainer container, final String name,
           final FunctionImport functionImport) {
 
@@ -38,19 +40,17 @@ public class EdmActionImportProxy extends EdmOperationImportImpl implements EdmA
     this.functionImport = functionImport;
   }
 
-  @Override
-  public EdmAction getUnboundAction() {
-    return edm.getAction(new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(functionImport.getName()).
-            setDefaultNamespace(container.getNamespace()).build().getFullQualifiedName(), null, null);
+  public FullQualifiedName getActionFQN() {
+    if (actionFQN == null) {
+      actionFQN = new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(functionImport.getName()).
+              setDefaultNamespace(container.getNamespace()).build().getFullQualifiedName();
+    }
+    return actionFQN;
   }
 
   @Override
-  public EdmAction getBoundAction(
-          final FullQualifiedName bindingParameterTypeName, final Boolean isBindingParameterCollection) {
-
-    return edm.getAction(new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(functionImport.getName()).
-            setDefaultNamespace(container.getNamespace()).build().getFullQualifiedName(),
-            bindingParameterTypeName, isBindingParameterCollection);
+  public EdmAction getUnboundAction() {
+    return edm.getUnboundAction(getActionFQN());
   }
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmFunctionImportProxy.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmFunctionImportProxy.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmFunctionImportProxy.java
index b1dcec8..b64c9bb 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmFunctionImportProxy.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmFunctionImportProxy.java
@@ -22,7 +22,6 @@ import java.util.List;
 
 import org.apache.olingo.client.api.edm.xml.v3.FunctionImport;
 import org.apache.olingo.client.core.edm.EdmOperationImportImpl;
-import org.apache.olingo.commons.core.edm.EdmTypeInfo;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmEntityContainer;
 import org.apache.olingo.commons.api.edm.EdmFunction;
@@ -33,6 +32,8 @@ public class EdmFunctionImportProxy extends EdmOperationImportImpl implements Ed
 
   private final FunctionImport functionImport;
 
+  private FullQualifiedName functionFQN;
+
   public EdmFunctionImportProxy(final Edm edm, final EdmEntityContainer container, final String name,
           final FunctionImport functionImport) {
 
@@ -41,27 +42,27 @@ public class EdmFunctionImportProxy extends EdmOperationImportImpl implements Ed
   }
 
   @Override
-  public EdmFunction getUnboundFunction(final List<String> parameterNames) {
-    return getBoundFunction(parameterNames, null, null);
+  public FullQualifiedName getFunctionFqn() {
+    if (functionFQN == null) {
+      functionFQN = new FullQualifiedName(container.getNamespace(), getName());
+    }
+    return functionFQN;
   }
 
   @Override
-  public EdmFunction getBoundFunction(final List<String> parameterNames,
-          final FullQualifiedName bindingParameterTypeName, final Boolean isBindingParameterCollection) {
+  public List<EdmFunction> getUnboundFunctions() {
+    return edm.getUnboundFunctions(getFunctionFqn());
+  }
 
-    return edm.getFunction(new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(functionImport.getName()).
-            setDefaultNamespace(container.getNamespace()).build().getFullQualifiedName(),
-            bindingParameterTypeName, isBindingParameterCollection, parameterNames);
+  @Override
+  public EdmFunction getUnboundFunction(final List<String> parameterNames) {
+    return edm.getUnboundFunction(getFunctionFqn(), parameterNames);
   }
 
   @Override
   public boolean isIncludeInServiceDocument() {
-    //V3 states that all function imports are included in the service document
+    // V3 states that all function imports are included in the service document
     return true;
   }
 
-  @Override
-  public FullQualifiedName getFunctionFqn() {
-    return new FullQualifiedName(container.getNamespace(), getName());
-  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/InvokeTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/InvokeTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/InvokeTestITCase.java
index 48410cc..1cc4e14 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/InvokeTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/InvokeTestITCase.java
@@ -48,13 +48,13 @@ import org.apache.olingo.commons.api.domain.v3.ODataEntitySet;
 import org.apache.olingo.commons.api.domain.v3.ODataProperty;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmAction;
-import org.apache.olingo.commons.api.edm.EdmActionImport;
 import org.apache.olingo.commons.api.edm.EdmEntityContainer;
 import org.apache.olingo.commons.api.edm.EdmFunction;
 import org.apache.olingo.commons.api.edm.EdmFunctionImport;
 import org.apache.olingo.commons.api.edm.EdmParameter;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.format.ODataPubFormat;
 import org.apache.olingo.commons.core.edm.EdmTypeInfo;
 import org.junit.Test;
@@ -244,10 +244,10 @@ public class InvokeTestITCase extends AbstractTestITCase {
     assertNotNull(edm);
 
     final EdmEntityContainer container = edm.getSchemas().get(0).getEntityContainer();
-    final EdmActionImport actImp = container.getActionImport(operation.getTitle());
     final EdmTypeInfo createdTypeInfo =
             new EdmTypeInfo.Builder().setEdm(edm).setTypeExpression(created.getName()).build();
-    final EdmAction action = actImp.getBoundAction(
+    final EdmAction action = edm.getBoundAction(
+            new FullQualifiedName(container.getNamespace(), operation.getTitle()),
             createdTypeInfo.getFullQualifiedName(), createdTypeInfo.isCollection());
 
     final ODataInvokeRequest<ODataNoContent> req = getClient().getInvokeRequestFactory().
@@ -294,11 +294,11 @@ public class InvokeTestITCase extends AbstractTestITCase {
     assertNotNull(edm);
 
     final EdmEntityContainer container = edm.getSchemas().get(0).getEntityContainer();
-    final EdmActionImport actImp = container.getActionImport("IncreaseSalaries");
 
     final EdmTypeInfo employeesTypeInfo = new EdmTypeInfo.Builder().setEdm(edm).
             setTypeExpression("Collection(Microsoft.Test.OData.Services.AstoriaDefaultService.Employee)").build();
-    final EdmAction action = actImp.getBoundAction(
+    final EdmAction action = edm.getBoundAction(
+            new FullQualifiedName(container.getNamespace(), "IncreaseSalaries"),
             employeesTypeInfo.getFullQualifiedName(), employeesTypeInfo.isCollection());
 
     final EdmParameter param = action.getParameter(action.getParameterNames().get(1));
@@ -308,7 +308,7 @@ public class InvokeTestITCase extends AbstractTestITCase {
             build();
 
     final ODataInvokeRequest<ODataNoContent> req = getClient().getInvokeRequestFactory().getInvokeRequest(
-            builder.appendOperationCallSegment(actImp.getName()).build(), action,
+            builder.appendOperationCallSegment(action.getName()).build(), action,
             Collections.<String, ODataValue>singletonMap(param.getName(), paramValue));
     final ODataInvokeResponse<ODataNoContent> res = req.execute();
     assertNotNull(res);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/MetadataTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/MetadataTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/MetadataTest.java
index d41a370..ac4fffe 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/MetadataTest.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/MetadataTest.java
@@ -189,16 +189,16 @@ public class MetadataTest extends AbstractTest {
     final EdmEntityType computer = metadata.getEntityType(new FullQualifiedName(container.getNamespace(), "Computer"));
     assertNotNull(computer);
 
-    final EdmFunction getComputer = metadata.getFunction(
+    final EdmFunction getComputer = metadata.getBoundFunction(
             new FullQualifiedName(container.getNamespace(), "GetComputer"),
             new FullQualifiedName(container.getNamespace(), computer.getName()),
-            Boolean.FALSE, Arrays.asList(new String[] {"computer"}));
+            Boolean.FALSE, Arrays.asList("computer"));
     assertNotNull(getComputer);
     assertEquals(computer, getComputer.getParameter("computer").getType());
     assertEquals(computer, getComputer.getReturnType().getType());
 
-    final EdmAction resetDataSource2 = metadata.getAction(
-            new FullQualifiedName(container.getNamespace(), "ResetDataSource"), null, Boolean.FALSE);
+    final EdmAction resetDataSource2 = metadata.getUnboundAction(
+            new FullQualifiedName(container.getNamespace(), "ResetDataSource"));
     assertNotNull(resetDataSource2);
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/MetadataTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/MetadataTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/MetadataTest.java
index c90fae5..56de140 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/MetadataTest.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/MetadataTest.java
@@ -100,7 +100,7 @@ public class MetadataTest extends AbstractTest {
     assertEquals(folder, user.getNavigationProperty("Inbox").getType());
 
     // 4. Action
-    final EdmAction move = edm.getAction(
+    final EdmAction move = edm.getBoundAction(
             new FullQualifiedName("Microsoft.Exchange.Services.OData.Model", "Move"),
             new FullQualifiedName("Microsoft.Exchange.Services.OData.Model", "Folder"),
             false);
@@ -209,9 +209,8 @@ public class MetadataTest extends AbstractTest {
     assertNotNull(fi);
     assertEquals(demoService.getEntitySet("Products"), fi.getReturnedEntitySet());
 
-    final EdmFunction function = edm.getFunction(
-            new FullQualifiedName(metadata.getSchema(0).getNamespace(), "ProductsByRating"),
-            null, Boolean.FALSE, null);
+    final EdmFunction function = edm.getUnboundFunction(
+            new FullQualifiedName(metadata.getSchema(0).getNamespace(), "ProductsByRating"), null);
     assertNotNull(function);
     assertEquals(function.getName(), fi.getUnboundFunction(null).getName());
     assertEquals(function.getNamespace(), fi.getUnboundFunction(null).getNamespace());

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/Edm.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/Edm.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/Edm.java
index 48230d6..fa417f1 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/Edm.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/Edm.java
@@ -27,92 +27,117 @@ import java.util.List;
  */
 public interface Edm {
 
-    /**
-     * This method <b>DOES NOT</b> support lazy loading. All schemas are loaded completely!
-     *
-     * @return all schemas defined for this EDM
-     */
-    List<EdmSchema> getSchemas();
+  /**
+   * This method <b>DOES NOT</b> support lazy loading. All schemas are loaded completely!
+   *
+   * @return all schemas defined for this EDM
+   */
+  List<EdmSchema> getSchemas();
 
-    /**
-     * Get entity container by full qualified name.
-     * <br/>
-     * See {@link EdmEntityContainer} for more information.
-     *
-     * @param name
-     * @return {@link EdmEntityContainer}
-     */
-    EdmEntityContainer getEntityContainer(FullQualifiedName name);
+  /**
+   * Get entity container by full qualified name.
+   * <br/>
+   * See {@link EdmEntityContainer} for more information.
+   *
+   * @param name
+   * @return {@link EdmEntityContainer}
+   */
+  EdmEntityContainer getEntityContainer(FullQualifiedName name);
 
-    /**
-     * Get enum type by full qualified name.
-     * <br/>
-     * See {@link EdmEnumType} for more information
-     *
-     * @param name
-     * @return {@link EdmEnumType}
-     */
-    EdmEnumType getEnumType(FullQualifiedName name);
+  /**
+   * Get enum type by full qualified name.
+   * <br/>
+   * See {@link EdmEnumType} for more information
+   *
+   * @param name
+   * @return {@link EdmEnumType}
+   */
+  EdmEnumType getEnumType(FullQualifiedName name);
 
-    /**
-     * Get a type definition by full qualified name.
-     * <br/>
-     * See {@link EdmTypeDefinition} for more information
-     *
-     * @param name
-     * @return {@link EdmTypeDefinition}
-     */
-    EdmTypeDefinition getTypeDefinition(FullQualifiedName name);
+  /**
+   * Get a type definition by full qualified name.
+   * <br/>
+   * See {@link EdmTypeDefinition} for more information
+   *
+   * @param name
+   * @return {@link EdmTypeDefinition}
+   */
+  EdmTypeDefinition getTypeDefinition(FullQualifiedName name);
 
-    /**
-     * Get entity type by full qualified name.
-     * <br/>
-     * See {@link EdmEntityType} for more information.
-     *
-     * @param name
-     * @return {@link EdmEntityType}
-     */
-    EdmEntityType getEntityType(FullQualifiedName name);
+  /**
+   * Get entity type by full qualified name.
+   * <br/>
+   * See {@link EdmEntityType} for more information.
+   *
+   * @param name
+   * @return {@link EdmEntityType}
+   */
+  EdmEntityType getEntityType(FullQualifiedName name);
 
-    /**
-     * Get complex type by full qualified name..
-     * <br/>
-     * See {@link EdmComplexType} for more information.
-     *
-     * @param name
-     * @return {@link EdmComplexType}
-     */
-    EdmComplexType getComplexType(FullQualifiedName name);
+  /**
+   * Get complex type by full qualified name..
+   * <br/>
+   * See {@link EdmComplexType} for more information.
+   *
+   * @param name
+   * @return {@link EdmComplexType}
+   */
+  EdmComplexType getComplexType(FullQualifiedName name);
 
-    /**
-     * Get Action by full qualified name and binding parameter type.
-     *
-     * @param actionName must not be null
-     * @param bindingParameterTypeName may be null if it is an unbound action
-     * @param isBindingParameterCollection may be null if it is an unbound action
-     * @return {@link EdmAction}
-     */
-    EdmAction getAction(FullQualifiedName actionName, FullQualifiedName bindingParameterTypeName,
-            Boolean isBindingParameterCollection);
+  /**
+   * Get unbound Action by full qualified name.
+   *
+   * @param actionName must not be null
+   * @return {@link EdmAction}
+   */
+  EdmAction getUnboundAction(FullQualifiedName actionName);
 
-    /**
-     * Get Function by full qualified name and binding parameter type and binding parameter names.
-     *
-     * @param functionName
-     * @param bindingParameterTypeName may be null if it is an unbound function
-     * @param isBindingParameterCollection may be null if it is an unbound function
-     * @param parameterNames may be null if it is an unbound function
-     * @return {@link EdmFunction}
-     */
-    EdmFunction getFunction(FullQualifiedName functionName, FullQualifiedName bindingParameterTypeName,
-            Boolean isBindingParameterCollection, List<String> parameterNames);
+  /**
+   * Get Action by full qualified name and binding parameter type.
+   *
+   * @param actionName must not be null
+   * @param bindingParameterTypeName must not be null
+   * @param isBindingParameterCollection may be null
+   * @return {@link EdmAction}
+   */
+  EdmAction getBoundAction(FullQualifiedName actionName, FullQualifiedName bindingParameterTypeName,
+          Boolean isBindingParameterCollection);
 
-    /**
-     * Get service metadata.
-     * <br/>
-     * See {@link EdmServiceMetadata} for more information.
-     *
-     * @return {@link EdmServiceMetadata}
-     */
-    EdmServiceMetadata getServiceMetadata();
+  /**
+   * Get Function by full qualified name.
+   *
+   * @param functionName must not be null
+   * @return {@link EdmFunction}
+   */
+  List<EdmFunction> getUnboundFunctions(FullQualifiedName functionName);
+
+  /**
+   * Get Function by full qualified name.
+   *
+   * @param functionName must not be null
+   * @param parameterNames may be null: in this case it is considered as empty
+   * @return {@link EdmFunction}
+   */
+  EdmFunction getUnboundFunction(FullQualifiedName functionName, List<String> parameterNames);
+
+  /**
+   * Get Function by full qualified name and binding parameter type and binding parameter names.
+   *
+   * @param functionName must not be null
+   * @param bindingParameterTypeName must not be null
+   * @param isBindingParameterCollection may be null
+   * @param parameterNames may be null: in this case it is considered as empty
+   * @return {@link EdmFunction}
+   */
+  EdmFunction getBoundFunction(FullQualifiedName functionName, FullQualifiedName bindingParameterTypeName,
+          Boolean isBindingParameterCollection, List<String> parameterNames);
+
+  /**
+   * Get service metadata.
+   * <br/>
+   * See {@link EdmServiceMetadata} for more information.
+   *
+   * @return {@link EdmServiceMetadata}
+   */
+  EdmServiceMetadata getServiceMetadata();
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmActionImport.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmActionImport.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmActionImport.java
index 39a0db2..b44f365 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmActionImport.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmActionImport.java
@@ -29,13 +29,4 @@ public interface EdmActionImport extends EdmOperationImport {
    * @return unbound action.
    */
   EdmAction getUnboundAction();
-
-  /**
-   * Gets bound action.
-   *
-   * @param bindingParameterTypeName may be null if it is an unbound function
-   * @param isBindingParameterCollection may be null if it is an unbound function
-   * @return bound action with given parameter names
-   */
-  EdmAction getBoundAction(FullQualifiedName bindingParameterTypeName, Boolean isBindingParameterCollection);
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmFunctionImport.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmFunctionImport.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmFunctionImport.java
index 815ff8d..e9532a6 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmFunctionImport.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmFunctionImport.java
@@ -26,23 +26,19 @@ import java.util.List;
 public interface EdmFunctionImport extends EdmOperationImport {
 
   /**
-   * Gets unbound function with given parameter names.
+   * Gets unbound functions.
    *
-   * @param parameterNames parameter names
-   * @return unbound function with given parameter names
+   * @return unbound functions
    */
-  EdmFunction getUnboundFunction(List<String> parameterNames);
+  List<EdmFunction> getUnboundFunctions();
 
   /**
-   * Gets bound function with given parameter names.
+   * Gets unbound function with given parameter names.
    *
    * @param parameterNames parameter names
-   * @param bindingParameterTypeName may be null if it is an unbound function
-   * @param isBindingParameterCollection may be null if it is an unbound function
-   * @return bound function with given parameter names
+   * @return unbound function with given parameter names
    */
-  EdmFunction getBoundFunction(List<String> parameterNames,
-          FullQualifiedName bindingParameterTypeName, Boolean isBindingParameterCollection);
+  EdmFunction getUnboundFunction(List<String> parameterNames);
 
   /**
    * @return the Full qualified name for the function as specified in the metadata

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
index 5047192..1367e0e 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
@@ -18,6 +18,7 @@
  */
 package org.apache.olingo.commons.core.edm;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -37,12 +38,12 @@ import org.apache.olingo.commons.api.edm.FullQualifiedName;
 public abstract class AbstractEdm implements Edm {
 
   private final Map<FullQualifiedName, EdmEntityContainer> entityContainers =
-      new HashMap<FullQualifiedName, EdmEntityContainer>();
+          new HashMap<FullQualifiedName, EdmEntityContainer>();
 
   private final Map<FullQualifiedName, EdmEnumType> enumTypes = new HashMap<FullQualifiedName, EdmEnumType>();
 
   private final Map<FullQualifiedName, EdmTypeDefinition> typeDefinitions =
-      new HashMap<FullQualifiedName, EdmTypeDefinition>();
+          new HashMap<FullQualifiedName, EdmTypeDefinition>();
 
   private final Map<FullQualifiedName, EdmEntityType> entityTypes = new HashMap<FullQualifiedName, EdmEntityType>();
 
@@ -50,7 +51,10 @@ public abstract class AbstractEdm implements Edm {
 
   private final Map<FullQualifiedName, EdmAction> unboundActions = new HashMap<FullQualifiedName, EdmAction>();
 
-  private final Map<FunctionMapKey, EdmFunction> unboundFunctions = new HashMap<FunctionMapKey, EdmFunction>();
+  private final Map<FullQualifiedName, List<EdmFunction>> unboundFunctionsByName =
+          new HashMap<FullQualifiedName, List<EdmFunction>>();
+
+  private final Map<FunctionMapKey, EdmFunction> unboundFunctionsByKey = new HashMap<FunctionMapKey, EdmFunction>();
 
   private final Map<ActionMapKey, EdmAction> boundActions = new HashMap<ActionMapKey, EdmAction>();
 
@@ -69,26 +73,26 @@ public abstract class AbstractEdm implements Edm {
       if (schemas != null) {
         aliasToNamespaceInfo = new HashMap<String, String>();
         for (EdmSchema schema : schemas) {
-          String namespace = schema.getNamespace();
+          final String namespace = schema.getNamespace();
           if (schema.getAlias() != null) {
             aliasToNamespaceInfo.put(schema.getAlias(), namespace);
           }
 
-          List<EdmEnumType> localEnumTypes = schema.getEnumTypes();
+          final List<EdmEnumType> localEnumTypes = schema.getEnumTypes();
           if (localEnumTypes != null) {
             for (EdmEnumType enumType : localEnumTypes) {
               enumTypes.put(new FullQualifiedName(namespace, enumType.getName()), enumType);
             }
           }
 
-          List<EdmTypeDefinition> localTypeDefinitions = schema.getTypeDefinitions();
+          final List<EdmTypeDefinition> localTypeDefinitions = schema.getTypeDefinitions();
           if (localTypeDefinitions != null) {
             for (EdmTypeDefinition typeDef : localTypeDefinitions) {
               typeDefinitions.put(new FullQualifiedName(namespace, typeDef.getName()), typeDef);
             }
           }
 
-          List<EdmComplexType> localComplexTypes = schema.getComplexTypes();
+          final List<EdmComplexType> localComplexTypes = schema.getComplexTypes();
           if (localComplexTypes != null) {
             for (EdmComplexType complexType : localComplexTypes) {
               complexTypes.put(new FullQualifiedName(namespace, complexType.getName()), complexType);
@@ -102,39 +106,45 @@ public abstract class AbstractEdm implements Edm {
             }
           }
 
-          List<EdmAction> localActions = schema.getActions();
+          final List<EdmAction> localActions = schema.getActions();
           if (localActions != null) {
             for (EdmAction action : localActions) {
+              final FullQualifiedName name = new FullQualifiedName(namespace, action.getName());
               if (action.isBound()) {
-                ActionMapKey key = new ActionMapKey(new FullQualifiedName(namespace, action.getName()),
-                    action.getBindingParameterTypeFqn(), action.isBindingParameterTypeCollection());
+                final ActionMapKey key = new ActionMapKey(name,
+                        action.getBindingParameterTypeFqn(), action.isBindingParameterTypeCollection());
                 boundActions.put(key, action);
               } else {
-                unboundActions.put(new FullQualifiedName(namespace, action.getName()), action);
+                unboundActions.put(name, action);
               }
             }
           }
 
-          List<EdmFunction> localFunctions = schema.getFunctions();
+          final List<EdmFunction> localFunctions = schema.getFunctions();
           if (localFunctions != null) {
             for (EdmFunction function : localFunctions) {
-              FunctionMapKey key =
-                  new FunctionMapKey(new FullQualifiedName(namespace, function.getName()), function
-                      .getBindingParameterTypeFqn(), function.isBindingParameterTypeCollection(), function
-                      .getParameterNames());
+              final FullQualifiedName name = new FullQualifiedName(namespace, function.getName());
+              final FunctionMapKey key = new FunctionMapKey(name,
+                      function.getBindingParameterTypeFqn(), function.isBindingParameterTypeCollection(),
+                      function.getParameterNames());
 
               if (function.isBound()) {
                 boundFunctions.put(key, function);
               } else {
-                unboundFunctions.put(key, function);
+                if (!unboundFunctionsByName.containsKey(name)) {
+                  unboundFunctionsByName.put(name, new ArrayList<EdmFunction>());
+                }
+                unboundFunctionsByName.get(name).add(function);
+
+                unboundFunctionsByKey.put(key, function);
               }
             }
           }
-          
-          EdmEntityContainer entityContainer = schema.getEntityContainer();
-          if(entityContainer != null){
+
+          final EdmEntityContainer entityContainer = schema.getEntityContainer();
+          if (entityContainer != null) {
             entityContainers.put(new FullQualifiedName(namespace, entityContainer.getName()), entityContainer);
-            if(!entityContainers.containsKey(null)){
+            if (!entityContainers.containsKey(null)) {
               entityContainers.put(null, entityContainer);
             }
           }
@@ -213,29 +223,30 @@ public abstract class AbstractEdm implements Edm {
   }
 
   @Override
-  public EdmAction getAction(final FullQualifiedName actionName, final FullQualifiedName bindingParameterTypeName,
-      final Boolean isBindingParameterCollection) {
+  public EdmAction getUnboundAction(final FullQualifiedName actionName) {
+    EdmAction action = unboundActions.get(actionName);
+    if (action == null) {
+      action = createUnboundAction(resolvePossibleAlias(actionName));
+      if (action != null) {
+        unboundActions.put(actionName, action);
+      }
+    }
+
+    return action;
+  }
 
-    EdmAction action = null;
+  @Override
+  public EdmAction getBoundAction(final FullQualifiedName actionName,
+          final FullQualifiedName bindingParameterTypeName, final Boolean isBindingParameterCollection) {
 
     final FullQualifiedName actionFqn = resolvePossibleAlias(actionName);
-    if (bindingParameterTypeName == null) {
-      action = unboundActions.get(actionName);
-      if (action == null) {
-        action = createUnboundAction(actionFqn);
-        if (action != null) {
-          unboundActions.put(actionName, action);
-        }
-      }
-    } else {
-      final FullQualifiedName bindingParameterTypeFqn = resolvePossibleAlias(bindingParameterTypeName);
-      final ActionMapKey key = new ActionMapKey(actionFqn, bindingParameterTypeFqn, isBindingParameterCollection);
-      action = boundActions.get(key);
-      if (action == null) {
-        action = createBoundAction(actionFqn, bindingParameterTypeFqn, isBindingParameterCollection);
-        if (action != null) {
-          boundActions.put(key, action);
-        }
+    final FullQualifiedName bindingParameterTypeFqn = resolvePossibleAlias(bindingParameterTypeName);
+    final ActionMapKey key = new ActionMapKey(actionFqn, bindingParameterTypeFqn, isBindingParameterCollection);
+    EdmAction action = boundActions.get(key);
+    if (action == null) {
+      action = createBoundAction(actionFqn, bindingParameterTypeFqn, isBindingParameterCollection);
+      if (action != null) {
+        boundActions.put(key, action);
       }
     }
 
@@ -243,34 +254,65 @@ public abstract class AbstractEdm implements Edm {
   }
 
   @Override
-  public EdmFunction getFunction(final FullQualifiedName functionName,
-      final FullQualifiedName bindingParameterTypeName,
-      final Boolean isBindingParameterCollection, final List<String> parameterNames) {
+  public List<EdmFunction> getUnboundFunctions(final FullQualifiedName functionName) {
+    final FullQualifiedName functionFqn = resolvePossibleAlias(functionName);
 
-    EdmFunction function = null;
+    List<EdmFunction> functions = unboundFunctionsByName.get(functionFqn);
+    if (functions == null) {
+      functions = createUnboundFunctions(functionFqn);
+      if (functions != null) {
+        unboundFunctionsByName.put(functionFqn, functions);
+
+        for (EdmFunction unbound : functions) {
+          final FunctionMapKey key = new FunctionMapKey(
+                  new FullQualifiedName(unbound.getNamespace(), unbound.getName()),
+                  unbound.getBindingParameterTypeFqn(),
+                  unbound.isBindingParameterTypeCollection(),
+                  unbound.getParameterNames());
+          unboundFunctionsByKey.put(key, unbound);
+        }
+      }
+    }
 
+    return functions;
+  }
+
+  @Override
+  public EdmFunction getUnboundFunction(final FullQualifiedName functionName, final List<String> parameterNames) {
     final FullQualifiedName functionFqn = resolvePossibleAlias(functionName);
-    if (bindingParameterTypeName == null) {
-      final FunctionMapKey key = new FunctionMapKey(
-          functionFqn, bindingParameterTypeName, isBindingParameterCollection, parameterNames);
-      function = unboundFunctions.get(key);
-      if (function == null) {
-        function = createUnboundFunction(functionFqn, parameterNames);
-        if (function != null) {
-          unboundFunctions.put(key, function);
+
+    final FunctionMapKey key = new FunctionMapKey(functionFqn, null, null, parameterNames);
+    EdmFunction function = unboundFunctionsByKey.get(key);
+    if (function == null) {
+      function = createUnboundFunction(functionFqn, parameterNames);
+      if (function != null) {
+        unboundFunctionsByKey.put(key, function);
+
+        if (!unboundFunctionsByName.containsKey(functionFqn)) {
+          unboundFunctionsByName.put(functionFqn, new ArrayList<EdmFunction>());
         }
+        unboundFunctionsByName.get(functionFqn).add(function);
       }
-    } else {
-      final FullQualifiedName bindingParameterTypeFqn = resolvePossibleAlias(bindingParameterTypeName);
-      final FunctionMapKey key =
-          new FunctionMapKey(functionFqn, bindingParameterTypeFqn, isBindingParameterCollection, parameterNames);
-      function = boundFunctions.get(key);
-      if (function == null) {
-        function = createBoundFunction(functionFqn, bindingParameterTypeFqn, isBindingParameterCollection,
-            parameterNames);
-        if (function != null) {
-          boundFunctions.put(key, function);
-        }
+    }
+
+    return function;
+  }
+
+  @Override
+  public EdmFunction getBoundFunction(final FullQualifiedName functionName,
+          final FullQualifiedName bindingParameterTypeName,
+          final Boolean isBindingParameterCollection, final List<String> parameterNames) {
+
+    final FullQualifiedName functionFqn = resolvePossibleAlias(functionName);
+    final FullQualifiedName bindingParameterTypeFqn = resolvePossibleAlias(bindingParameterTypeName);
+    final FunctionMapKey key =
+            new FunctionMapKey(functionFqn, bindingParameterTypeFqn, isBindingParameterCollection, parameterNames);
+    EdmFunction function = boundFunctions.get(key);
+    if (function == null) {
+      function = createBoundFunction(functionFqn, bindingParameterTypeFqn, isBindingParameterCollection,
+              parameterNames);
+      if (function != null) {
+        boundFunctions.put(key, function);
       }
     }
 
@@ -316,15 +358,17 @@ public abstract class AbstractEdm implements Edm {
 
   protected abstract EdmAction createUnboundAction(FullQualifiedName actionName);
 
+  protected abstract List<EdmFunction> createUnboundFunctions(FullQualifiedName functionName);
+
   protected abstract EdmFunction createUnboundFunction(FullQualifiedName functionName, List<String> parameterNames);
 
   protected abstract EdmAction createBoundAction(FullQualifiedName actionName,
-      FullQualifiedName bindingParameterTypeName,
-      Boolean isBindingParameterCollection);
+          FullQualifiedName bindingParameterTypeName,
+          Boolean isBindingParameterCollection);
 
   protected abstract EdmFunction createBoundFunction(FullQualifiedName functionName,
-      FullQualifiedName bindingParameterTypeName, Boolean isBindingParameterCollection,
-      List<String> parameterNames);
+          FullQualifiedName bindingParameterTypeName, Boolean isBindingParameterCollection,
+          List<String> parameterNames);
 
   protected abstract EdmServiceMetadata createServiceMetadata();
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/EdmImplCachingTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/EdmImplCachingTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/EdmImplCachingTest.java
index 474a58d..287f7c2 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/EdmImplCachingTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/EdmImplCachingTest.java
@@ -26,6 +26,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -41,7 +42,6 @@ import org.apache.olingo.commons.api.edm.EdmSchema;
 import org.apache.olingo.commons.api.edm.EdmServiceMetadata;
 import org.apache.olingo.commons.api.edm.EdmTypeDefinition;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
-import org.apache.olingo.commons.core.edm.AbstractEdm;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -57,14 +57,14 @@ public class EdmImplCachingTest {
   public void cacheSchema() {
     List<EdmSchema> schemas = edm.getSchemas();
     assertNotNull(schemas);
-    
+
     assertEquals(1, schemas.size());
-    
+
     List<EdmSchema> cachedSchemas = edm.getSchemas();
-    assertTrue(schemas == cachedSchemas );
+    assertTrue(schemas == cachedSchemas);
     assertEquals(schemas, schemas);
   }
-  
+
   @Test
   public void cacheEntityContainer() {
     EdmEntityContainer entityContainer = edm.getEntityContainer(null);
@@ -158,32 +158,32 @@ public class EdmImplCachingTest {
 
   @Test
   public void cacheUnboundAction() {
-    EdmAction action = edm.getAction(NAME1, null, null);
+    EdmAction action = edm.getUnboundAction(NAME1);
     assertNotNull(action);
 
-    EdmAction cachedAction = edm.getAction(NAME1, null, null);
+    EdmAction cachedAction = edm.getUnboundAction(NAME1);
     assertNotNull(cachedAction);
 
     assertTrue(action == cachedAction);
     assertEquals(action, cachedAction);
 
-    EdmAction action2 = edm.getAction(NAME2, null, false);
+    EdmAction action2 = edm.getUnboundAction(NAME2);
     assertNotNull(action2);
     assertNotSame(action, action2);
   }
 
   @Test
   public void cacheBoundAction() {
-    EdmAction action = edm.getAction(NAME1, NAME2, true);
+    EdmAction action = edm.getBoundAction(NAME1, NAME2, true);
     assertNotNull(action);
 
-    EdmAction cachedAction = edm.getAction(NAME1, NAME2, true);
+    EdmAction cachedAction = edm.getBoundAction(NAME1, NAME2, true);
     assertNotNull(cachedAction);
 
     assertTrue(action == cachedAction);
     assertEquals(action, cachedAction);
 
-    EdmAction action2 = edm.getAction(NAME2, NAME2, true);
+    EdmAction action2 = edm.getBoundAction(NAME2, NAME2, true);
     assertNotNull(action2);
     assertNotSame(action, action2);
 
@@ -191,16 +191,16 @@ public class EdmImplCachingTest {
 
   @Test
   public void cacheUnboundFunctionNoParameters() {
-    EdmFunction function = edm.getFunction(NAME1, null, null, null);
+    EdmFunction function = edm.getUnboundFunction(NAME1, null);
     assertNotNull(function);
 
-    EdmFunction cachedfunction = edm.getFunction(NAME1, null, null, null);
+    EdmFunction cachedfunction = edm.getUnboundFunction(NAME1, null);
     assertNotNull(cachedfunction);
 
     assertTrue(function == cachedfunction);
     assertEquals(function, cachedfunction);
 
-    EdmFunction function2 = edm.getFunction(NAME2, null, false, null);
+    EdmFunction function2 = edm.getBoundFunction(NAME2, null, false, null);
     assertNotNull(function2);
 
     assertNotSame(function, function2);
@@ -208,16 +208,16 @@ public class EdmImplCachingTest {
 
   @Test
   public void cacheBoundFunction() {
-    EdmFunction function = edm.getFunction(NAME1, NAME2, true, new ArrayList<String>());
+    EdmFunction function = edm.getBoundFunction(NAME1, NAME2, true, new ArrayList<String>());
     assertNotNull(function);
 
-    EdmFunction cachedfunction = edm.getFunction(NAME1, NAME2, true, new ArrayList<String>());
+    EdmFunction cachedfunction = edm.getBoundFunction(NAME1, NAME2, true, new ArrayList<String>());
     assertNotNull(cachedfunction);
 
     assertTrue(function == cachedfunction);
     assertEquals(function, cachedfunction);
 
-    EdmFunction function2 = edm.getFunction(NAME2, NAME2, true, new ArrayList<String>());
+    EdmFunction function2 = edm.getBoundFunction(NAME2, NAME2, true, new ArrayList<String>());
     assertNotNull(function2);
 
     assertNotSame(function, function2);
@@ -228,19 +228,19 @@ public class EdmImplCachingTest {
     ArrayList<String> parameters1 = new ArrayList<String>();
     parameters1.add("A");
     parameters1.add("B");
-    EdmFunction function = edm.getFunction(NAME1, NAME2, true, parameters1);
+    EdmFunction function = edm.getBoundFunction(NAME1, NAME2, true, parameters1);
     assertNotNull(function);
 
     ArrayList<String> parameters2 = new ArrayList<String>();
     parameters2.add("B");
     parameters2.add("A");
-    EdmFunction cachedfunction = edm.getFunction(NAME1, NAME2, true, parameters2);
+    EdmFunction cachedfunction = edm.getBoundFunction(NAME1, NAME2, true, parameters2);
     assertNotNull(cachedfunction);
 
     assertTrue(function == cachedfunction);
     assertEquals(function, cachedfunction);
 
-    EdmFunction function2 = edm.getFunction(NAME2, NAME2, true, new ArrayList<String>());
+    EdmFunction function2 = edm.getBoundFunction(NAME2, NAME2, true, new ArrayList<String>());
     assertNotNull(function2);
 
     assertNotSame(function, function2);
@@ -384,6 +384,22 @@ public class EdmImplCachingTest {
     }
 
     @Override
+    protected List<EdmFunction> createUnboundFunctions(final FullQualifiedName fqn) {
+      if (NAME1.equals(fqn)) {
+        EdmFunction function = mock(EdmFunction.class);
+        when(function.getNamespace()).thenReturn(fqn.getNamespace());
+        when(function.getName()).thenReturn(fqn.getName());
+        return Collections.singletonList(function);
+      } else if (NAME2.equals(fqn)) {
+        EdmFunction function = mock(EdmFunction.class);
+        when(function.getNamespace()).thenReturn(fqn.getNamespace());
+        when(function.getName()).thenReturn(fqn.getName());
+        return Collections.singletonList(function);
+      }
+      return Collections.emptyList();
+    }
+
+    @Override
     protected EdmFunction createUnboundFunction(final FullQualifiedName fqn, final List<String> parameterNames) {
       if (NAME1.equals(fqn)) {
         EdmFunction function = mock(EdmFunction.class);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/EdmImplCallCreateTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/EdmImplCallCreateTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/EdmImplCallCreateTest.java
index 52d47e2..bc83caf 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/EdmImplCallCreateTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/EdmImplCallCreateTest.java
@@ -26,6 +26,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -41,7 +42,6 @@ import org.apache.olingo.commons.api.edm.EdmSchema;
 import org.apache.olingo.commons.api.edm.EdmServiceMetadata;
 import org.apache.olingo.commons.api.edm.EdmTypeDefinition;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
-import org.apache.olingo.commons.core.edm.AbstractEdm;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -58,7 +58,7 @@ public class EdmImplCallCreateTest {
     List<EdmSchema> schemas = edm.getSchemas();
     assertNotNull(schemas);
   }
-  
+
   @Test
   public void callCreateEntityContainer() {
     EdmEntityContainer entityContainer = edm.getEntityContainer(FQN);
@@ -116,36 +116,36 @@ public class EdmImplCallCreateTest {
 
   @Test
   public void callCreateAction() {
-    EdmAction action = edm.getAction(FQN, null, null);
+    EdmAction action = edm.getUnboundAction(FQN);
     assertNotNull(action);
     assertEquals(FQN.getNamespace(), action.getNamespace());
     assertEquals(FQN.getName(), action.getName());
 
-    EdmAction action2 = edm.getAction(FQN, FQN, true);
+    EdmAction action2 = edm.getBoundAction(FQN, FQN, true);
     assertNotNull(action2);
     assertEquals(FQN.getNamespace(), action2.getNamespace());
     assertEquals(FQN.getName(), action2.getName());
 
     assertNotSame(action, action2);
 
-    assertNull(edm.getAction(WRONG_FQN, null, null));
+    assertNull(edm.getUnboundAction(WRONG_FQN));
   }
 
   @Test
   public void callCreateFunction() {
-    EdmFunction function = edm.getFunction(FQN, null, null, null);
+    EdmFunction function = edm.getUnboundFunction(FQN, null);
     assertNotNull(function);
     assertEquals(FQN.getNamespace(), function.getNamespace());
     assertEquals(FQN.getName(), function.getName());
 
-    EdmFunction function2 = edm.getFunction(FQN, FQN, true, new ArrayList<String>());
+    EdmFunction function2 = edm.getBoundFunction(FQN, FQN, true, new ArrayList<String>());
     assertNotNull(function2);
     assertEquals(FQN.getNamespace(), function2.getNamespace());
     assertEquals(FQN.getName(), function2.getName());
 
     assertNotSame(function, function2);
 
-    assertNull(edm.getFunction(WRONG_FQN, null, null, null));
+    assertNull(edm.getUnboundFunction(WRONG_FQN, null));
   }
 
   @Test
@@ -262,6 +262,17 @@ public class EdmImplCallCreateTest {
     }
 
     @Override
+    protected List<EdmFunction> createUnboundFunctions(final FullQualifiedName fqn) {
+      if (FQN.getNamespace().equals(fqn.getNamespace()) && FQN.getName().equals(fqn.getName())) {
+        EdmFunction function = mock(EdmFunction.class);
+        when(function.getNamespace()).thenReturn(fqn.getNamespace());
+        when(function.getName()).thenReturn(fqn.getName());
+        return Collections.singletonList(function);
+      }
+      return Collections.emptyList();
+    }
+
+    @Override
     protected EdmFunction createUnboundFunction(final FullQualifiedName fqn, final List<String> parameterNames) {
       if (FQN.getNamespace().equals(fqn.getNamespace()) && FQN.getName().equals(fqn.getName())) {
         EdmFunction function = mock(EdmFunction.class);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImpl.java
index 3e2a9f5..8796671 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImpl.java
@@ -22,7 +22,6 @@ import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmAction;
 import org.apache.olingo.commons.api.edm.EdmActionImport;
 import org.apache.olingo.commons.api.edm.EdmEntityContainer;
-import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.server.api.edm.provider.ActionImport;
 
 public class EdmActionImportImpl extends EdmOperationImportImpl implements EdmActionImport {
@@ -37,14 +36,7 @@ public class EdmActionImportImpl extends EdmOperationImportImpl implements EdmAc
 
   @Override
   public EdmAction getUnboundAction() {
-    return getBoundAction(null, null);
-  }
-
-  @Override
-  public EdmAction getBoundAction(
-          final FullQualifiedName bindingParameterTypeName, final Boolean isBindingParameterCollection) {
-
-    return edm.getAction(actionImport.getAction(), bindingParameterTypeName, isBindingParameterCollection);
+    return edm.getUnboundAction(actionImport.getAction());
   }
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImpl.java
index 2c8a097..23111eb 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImpl.java
@@ -38,17 +38,18 @@ public class EdmFunctionImportImpl extends EdmOperationImportImpl implements Edm
   }
 
   @Override
-  public EdmFunction getUnboundFunction(final List<String> parameterNames) {
-    return getBoundFunction(parameterNames, null, null);
+  public FullQualifiedName getFunctionFqn() {
+    return functionImport.getFunction();
   }
 
   @Override
-  public EdmFunction getBoundFunction(final List<String> parameterNames,
-          final FullQualifiedName bindingParameterTypeName, final Boolean isBindingParameterCollection) {
-
-    return edm.getFunction(functionImport.getFunction(),
-            bindingParameterTypeName, isBindingParameterCollection, parameterNames);
+  public EdmFunction getUnboundFunction(final List<String> parameterNames) {
+    return edm.getUnboundFunction(getFunctionFqn(), parameterNames);
+  }
 
+  @Override
+  public List<EdmFunction> getUnboundFunctions() {
+    return edm.getUnboundFunctions(getFunctionFqn());
   }
 
   @Override
@@ -56,8 +57,4 @@ public class EdmFunctionImportImpl extends EdmOperationImportImpl implements Edm
     return functionImport.isIncludeInServiceDocument();
   }
 
-  @Override
-  public FullQualifiedName getFunctionFqn() {
-    return functionImport.getFunction();
-  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmProviderImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmProviderImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmProviderImpl.java
index d35d55d..b7191a6 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmProviderImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmProviderImpl.java
@@ -129,7 +129,7 @@ public class EdmProviderImpl extends AbstractEdm {
 
   @Override
   public EdmAction createBoundAction(final FullQualifiedName actionName,
-      final FullQualifiedName bindingParameterTypeName, final Boolean isBindingParameterCollection) {
+          final FullQualifiedName bindingParameterTypeName, final Boolean isBindingParameterCollection) {
 
     try {
       List<Action> actions = actionsMap.get(actionName);
@@ -147,7 +147,7 @@ public class EdmProviderImpl extends AbstractEdm {
           final List<Parameter> parameters = action.getParameters();
           final Parameter parameter = parameters.get(0);
           if (bindingParameterTypeName.equals(parameter.getType())
-              && isBindingParameterCollection.booleanValue() == parameter.isCollection()) {
+                  && isBindingParameterCollection.booleanValue() == parameter.isCollection()) {
 
             return EdmActionImpl.getInstance(this, actionName, action);
           }
@@ -162,8 +162,8 @@ public class EdmProviderImpl extends AbstractEdm {
 
   @Override
   public EdmFunction createBoundFunction(final FullQualifiedName functionName,
-      final FullQualifiedName bindingParameterTypeName, final Boolean isBindingParameterCollection,
-      final List<String> parameterNames) {
+          final FullQualifiedName bindingParameterTypeName, final Boolean isBindingParameterCollection,
+          final List<String> parameterNames) {
 
     try {
       List<Function> functions = functionsMap.get(functionName);
@@ -175,8 +175,8 @@ public class EdmProviderImpl extends AbstractEdm {
           functionsMap.put(functionName, functions);
         }
       }
-      final List<String> parameterNamesCopy =
-          parameterNames == null ? Collections.<String> emptyList() : parameterNames;
+      final List<String> parameterNamesCopy
+              = parameterNames == null ? Collections.<String>emptyList() : parameterNames;
       for (Function function : functions) {
         if (function.isBound()) {
           List<Parameter> providerParameters = function.getParameters();
@@ -185,7 +185,7 @@ public class EdmProviderImpl extends AbstractEdm {
           }
           final Parameter bindingParameter = providerParameters.get(0);
           if (bindingParameterTypeName.equals(bindingParameter.getType())
-              && isBindingParameterCollection.booleanValue() == bindingParameter.isCollection()) {
+                  && isBindingParameterCollection.booleanValue() == bindingParameter.isCollection()) {
 
             if (parameterNamesCopy.size() == providerParameters.size() - 1) {
               final List<String> providerParameterNames = new ArrayList<String>();
@@ -251,19 +251,44 @@ public class EdmProviderImpl extends AbstractEdm {
   }
 
   @Override
-  protected EdmFunction createUnboundFunction(final FullQualifiedName functionName, final List<String> parameterNames) {
+  protected List<EdmFunction> createUnboundFunctions(final FullQualifiedName functionName) {
+    List<EdmFunction> result = new ArrayList<EdmFunction>();
+
     try {
       List<Function> functions = functionsMap.get(functionName);
       if (functions == null) {
         functions = provider.getFunctions(functionName);
         if (functions != null) {
           functionsMap.put(functionName, functions);
-        } else {
+
+          for (Function function : functions) {
+            if (!function.isBound()) {
+              result.add(EdmFunctionImpl.getInstance(this, functionName, function));
+            }
+          }
+        }
+      }
+    } catch (ODataException e) {
+      throw new EdmException(e);
+    }
+
+    return result;
+  }
+
+  @Override
+  protected EdmFunction createUnboundFunction(final FullQualifiedName functionName, final List<String> parameterNames) {
+    try {
+      List<Function> functions = functionsMap.get(functionName);
+      if (functions == null) {
+        functions = provider.getFunctions(functionName);
+        if (functions == null) {
           return null;
+        } else {
+          functionsMap.put(functionName, functions);
         }
       }
-      final List<String> parameterNamesCopy =
-          parameterNames == null ? Collections.<String> emptyList() : parameterNames;
+      final List<String> parameterNamesCopy
+              = parameterNames == null ? Collections.<String>emptyList() : parameterNames;
       for (Function function : functions) {
         if (!function.isBound()) {
           List<Parameter> providerParameters = function.getParameters();
@@ -271,7 +296,7 @@ public class EdmProviderImpl extends AbstractEdm {
             providerParameters = Collections.emptyList();
           }
           if (parameterNamesCopy.size() == providerParameters.size()) {
-            List<String> functionParameterNames = new ArrayList<String>();
+            final List<String> functionParameterNames = new ArrayList<String>();
             for (Parameter parameter : providerParameters) {
               functionParameterNames.add(parameter.getName());
             }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java
index f237fea..0039952 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java
@@ -558,7 +558,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
       FullQualifiedName fullBindingTypeName = new FullQualifiedName(source.type.getNamespace(), source.type.getName());
 
       // check for action
-      EdmAction action = edm.getAction(fullFilterName, fullBindingTypeName, source.isCollection);
+      EdmAction action = edm.getBoundAction(fullFilterName, fullBindingTypeName, source.isCollection);
       if (action != null) {
         UriResourceActionImpl pathInfoAction = new UriResourceActionImpl();
         pathInfoAction.setAction(action);
@@ -583,7 +583,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
         names.add(item.getName());
       }
 
-      EdmFunction function = edm.getFunction(fullFilterName, fullBindingTypeName, source.isCollection, names);
+      EdmFunction function = edm.getBoundFunction(fullFilterName, fullBindingTypeName, source.isCollection, names);
 
       if (function != null) {
         UriResourceFunctionImpl pathInfoFunction = new UriResourceFunctionImpl()
@@ -597,7 +597,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
       }
 
       // check for unbound function in the $filter case ( where the previous resource segment is a $it)
-      function = edm.getFunction(fullFilterName, null, null, names);
+      function = edm.getUnboundFunction(fullFilterName, names);
 
       if (function != null) {
         UriResourceFunctionImpl pathInfoFunction = new UriResourceFunctionImpl()
@@ -1972,7 +1972,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
       FullQualifiedName finalTypeName = new FullQualifiedName(prevType.getNamespace(), prevType.getName());
 
       // check for action
-      EdmAction action = edm.getAction(fullName, finalTypeName, null);
+      EdmAction action = edm.getBoundAction(fullName, finalTypeName, null);
 
       if (action != null) {
         UriResourceActionImpl uriAction = new UriResourceActionImpl();
@@ -1983,7 +1983,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
       }
 
       // check for function
-      EdmFunction function = edm.getFunction(fullName, finalTypeName, null, null);
+      EdmFunction function = edm.getBoundFunction(fullName, finalTypeName, null, null);
 
       if (function != null) {
         UriResourceFunctionImpl uriFunction = new UriResourceFunctionImpl();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImplTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImplTest.java
index c9393aa..08bdc3e 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImplTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImplTest.java
@@ -57,7 +57,7 @@ public class EdmActionImportImplTest {
     container = mock(EdmEntityContainer.class);
     when(edm.getEntityContainer(entityContainerFqn)).thenReturn(container);
     action = mock(EdmAction.class);
-    when(edm.getAction(actionFqn, null, null)).thenReturn(action);
+    when(edm.getUnboundAction(actionFqn)).thenReturn(action);
 
     entitySet = mock(EdmEntitySet.class);
     when(container.getEntitySet("entitySetName")).thenReturn(entitySet);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmProviderImplOverloadingTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmProviderImplOverloadingTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmProviderImplOverloadingTest.java
index 1ac09ce..1a4795f 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmProviderImplOverloadingTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmProviderImplOverloadingTest.java
@@ -104,46 +104,46 @@ public class EdmProviderImplOverloadingTest {
 
   @Test
   public void simpleActionGet() {
-    EdmAction action = edm.getAction(operationName1, null, null);
+    EdmAction action = edm.getUnboundAction(operationName1);
     assertNotNull(action);
     assertEquals(operationName1.getNamespace(), action.getNamespace());
     assertEquals(operationName1.getName(), action.getName());
 
-    assertNull(edm.getAction(wrongOperationName, null, null));
+    assertNull(edm.getUnboundAction(wrongOperationName));
   }
 
   @Test
   public void boundActionOverloading() {
-    EdmAction action = edm.getAction(operationName1, operationType1, false);
+    EdmAction action = edm.getBoundAction(operationName1, operationType1, false);
     assertNotNull(action);
     assertEquals(operationName1.getNamespace(), action.getNamespace());
     assertEquals(operationName1.getName(), action.getName());
-    assertTrue(action == edm.getAction(operationName1, operationType1, false));
+    assertTrue(action == edm.getBoundAction(operationName1, operationType1, false));
 
-    EdmAction action2 = edm.getAction(operationName1, operationType1, true);
+    EdmAction action2 = edm.getBoundAction(operationName1, operationType1, true);
     assertNotNull(action2);
     assertEquals(operationName1.getNamespace(), action2.getNamespace());
     assertEquals(operationName1.getName(), action2.getName());
-    assertTrue(action2 == edm.getAction(operationName1, operationType1, true));
+    assertTrue(action2 == edm.getBoundAction(operationName1, operationType1, true));
 
     assertNotSame(action, action2);
   }
 
   @Test
   public void simpleFunctionGet() {
-    EdmFunction function = edm.getFunction(operationName1, null, null, null);
+    EdmFunction function = edm.getUnboundFunction(operationName1, null);
     assertNotNull(function);
     assertEquals(operationName1.getNamespace(), function.getNamespace());
     assertEquals(operationName1.getName(), function.getName());
 
-    EdmFunction function2 = edm.getFunction(operationName1, null, null, new ArrayList<String>());
+    EdmFunction function2 = edm.getUnboundFunction(operationName1, new ArrayList<String>());
     assertNotNull(function2);
     assertEquals(operationName1.getNamespace(), function2.getNamespace());
     assertEquals(operationName1.getName(), function2.getName());
 
     assertEquals(function, function2);
 
-    assertNull(edm.getFunction(wrongOperationName, null, null, new ArrayList<String>()));
+    assertNull(edm.getUnboundFunction(wrongOperationName, new ArrayList<String>()));
   }
 
   @Test
@@ -152,28 +152,28 @@ public class EdmProviderImplOverloadingTest {
     parameter1Names.add("a");
     List<String> parameter2Names = new ArrayList<String>();
     parameter2Names.add("b");
-    EdmFunction function = edm.getFunction(operationName1, null, null, new ArrayList<String>());
+    EdmFunction function = edm.getUnboundFunction(operationName1, new ArrayList<String>());
     assertNotNull(function);
     assertFalse(function.isBound());
 
-    EdmFunction function1 = edm.getFunction(operationName1, null, null, parameter1Names);
+    EdmFunction function1 = edm.getUnboundFunction(operationName1, parameter1Names);
     assertNotNull(function1);
     assertFalse(function1.isBound());
 
     assertFalse(function == function1);
     assertNotSame(function, function1);
 
-    EdmFunction function2 = edm.getFunction(operationName1, null, null, parameter2Names);
+    EdmFunction function2 = edm.getUnboundFunction(operationName1, parameter2Names);
     assertNotNull(function2);
     assertFalse(function2.isBound());
 
     assertFalse(function1 == function2);
     assertNotSame(function1, function2);
 
-    EdmFunction function3 = edm.getFunction(operationName1, operationType1, false, parameter2Names);
+    EdmFunction function3 = edm.getBoundFunction(operationName1, operationType1, false, parameter2Names);
     assertNotNull(function3);
     assertTrue(function3.isBound());
-    EdmFunction function4 = edm.getFunction(operationName1, operationType2, false, parameter2Names);
+    EdmFunction function4 = edm.getBoundFunction(operationName1, operationType2, false, parameter2Names);
     assertNotNull(function4);
     assertTrue(function4.isBound());
 
@@ -192,7 +192,7 @@ public class EdmProviderImplOverloadingTest {
 
   @Test(expected = EdmException.class)
   public void noParametersAtBoundFunctionReslutsInException() {
-    edm.getFunction(badOperationName, operationType1, true, null);
+    edm.getBoundFunction(badOperationName, operationType1, true, null);
   }
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmProviderImplTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmProviderImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmProviderImplTest.java
index 66a3f99..2156077 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmProviderImplTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmProviderImplTest.java
@@ -89,10 +89,10 @@ public class EdmProviderImplTest {
     when(localProvider.getActions(FQN)).thenReturn(null);
     when(localProvider.getFunctions(FQN)).thenReturn(null);
     Edm localEdm = new EdmProviderImpl(localProvider);
-    localEdm.getAction(FQN, null, null);
-    localEdm.getFunction(FQN, null, null, null);
-    localEdm.getAction(FQN, FQN, true);
-    localEdm.getFunction(FQN, FQN, true, null);
+    localEdm.getUnboundAction(FQN);
+    localEdm.getUnboundFunction(FQN, null);
+    localEdm.getBoundAction(FQN, FQN, true);
+    localEdm.getBoundFunction(FQN, FQN, true, null);
     localEdm.getComplexType(FQN);
     localEdm.getEntityContainer(FQN);
     localEdm.getEntityType(FQN);
@@ -123,24 +123,24 @@ public class EdmProviderImplTest {
 
     // seperate because of signature
     try {
-      localEdm.getAction(fqn, null, null);
+      localEdm.getUnboundAction(fqn);
     } catch (EdmException e) {
       assertEquals("org.apache.olingo.commons.api.ODataException: msg", e.getMessage());
     }
 
     try {
-      localEdm.getFunction(fqn, null, null, null);
+      localEdm.getUnboundFunction(fqn, null);
     } catch (EdmException e) {
       assertEquals("org.apache.olingo.commons.api.ODataException: msg", e.getMessage());
     }
     try {
-      localEdm.getAction(fqn, fqn, true);
+      localEdm.getBoundAction(fqn, fqn, true);
     } catch (EdmException e) {
       assertEquals("org.apache.olingo.commons.api.ODataException: msg", e.getMessage());
     }
 
     try {
-      localEdm.getFunction(fqn, fqn, true, null);
+      localEdm.getBoundFunction(fqn, fqn, true, null);
     } catch (EdmException e) {
       assertEquals("org.apache.olingo.commons.api.ODataException: msg", e.getMessage());
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmSchemaImplTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmSchemaImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmSchemaImplTest.java
index ec7e1ee..c04211d 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmSchemaImplTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmSchemaImplTest.java
@@ -149,7 +149,7 @@ public class EdmSchemaImplTest {
     assertEquals(2, actions.size());
 
     for (EdmAction action : actions) {
-      assertTrue(action == edm.getAction(new FullQualifiedName("namespace", action.getName()), null, null));
+      assertTrue(action == edm.getUnboundAction(new FullQualifiedName("namespace", action.getName())));
     }
   }
 
@@ -161,7 +161,7 @@ public class EdmSchemaImplTest {
 
     for (EdmFunction function : functions) {
       FullQualifiedName functionName = new FullQualifiedName("namespace", function.getName());
-      assertTrue(function == edm.getFunction(functionName, null, null, null));
+      assertTrue(function == edm.getUnboundFunction(functionName, null));
     }
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriResourceImplTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriResourceImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriResourceImplTest.java
index 51a9638..680e919 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriResourceImplTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriResourceImplTest.java
@@ -76,7 +76,7 @@ public class UriResourceImplTest {
     assertEquals("", impl.toString());
 
     // action
-    EdmAction action = edm.getAction(ActionProvider.nameUARTETParam, null, null);
+    EdmAction action = edm.getUnboundAction(ActionProvider.nameUARTETParam);
     impl.setAction(action);
     assertEquals(action, impl.getAction());
     assertEquals(ActionProvider.nameUARTETParam.getName(), impl.toString());

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/081df2aa/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/queryoption/expression/ExpressionTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/queryoption/expression/ExpressionTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/queryoption/expression/ExpressionTest.java
index 91f3ad9..2902bdc 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/queryoption/expression/ExpressionTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/queryoption/expression/ExpressionTest.java
@@ -135,7 +135,7 @@ public class ExpressionTest {
     EdmEntityType entityType = edm.getEntityType(EntityTypeProvider.nameETKeyNav);
 
     // UriResourceImplTyped
-    EdmAction action = edm.getAction(ActionProvider.nameUARTPrimParam, null, null);
+    EdmAction action = edm.getUnboundAction(ActionProvider.nameUARTPrimParam);
     UriInfoResource uriInfo = new UriInfoImpl().setKind(UriInfoKind.resource).addResourcePart(
         new UriResourceActionImpl().setAction(action)).asUriInfoResource();
     expression.setResourcePath(uriInfo);
@@ -149,21 +149,21 @@ public class ExpressionTest {
     assertEquals(false, expression.isCollection());
 
     // UriResourceImplTyped check collection = true case
-    action = edm.getAction(ActionProvider.nameUARTPrimCollParam, null, null);
+    action = edm.getUnboundAction(ActionProvider.nameUARTPrimCollParam);
     expression.setResourcePath(new UriInfoImpl().setKind(UriInfoKind.resource).addResourcePart(
         new UriResourceActionImpl().setAction(action))
         .asUriInfoResource());
     assertEquals(true, expression.isCollection());
 
     // UriResourceImplTyped with filter
-    action = edm.getAction(ActionProvider.nameUARTPrimParam, null, null);
+    action = edm.getUnboundAction(ActionProvider.nameUARTPrimParam);
     expression.setResourcePath(new UriInfoImpl().setKind(UriInfoKind.resource).addResourcePart(
         new UriResourceActionImpl().setAction(action).setTypeFilter(entityType))
         .asUriInfoResource());
     assertEquals(entityType, expression.getType());
 
     // UriResourceImplKeyPred
-    EdmFunction function = edm.getFunction(FunctionProvider.nameUFCRTETKeyNav, null, null, null);
+    EdmFunction function = edm.getUnboundFunction(FunctionProvider.nameUFCRTETKeyNav, null);
     expression.setResourcePath(new UriInfoImpl().setKind(UriInfoKind.resource).addResourcePart(
         new UriResourceFunctionImpl().setFunction(function))
         .asUriInfoResource());
@@ -171,8 +171,7 @@ public class ExpressionTest {
 
     // UriResourceImplKeyPred typeFilter on entry
     EdmEntityType entityBaseType = edm.getEntityType(EntityTypeProvider.nameETBaseTwoKeyNav);
-    function = edm.getFunction(FunctionProvider.nameUFCRTESTwoKeyNavParam, null, null,
-        Arrays.asList(("ParameterInt16")));
+    function = edm.getUnboundFunction(FunctionProvider.nameUFCRTESTwoKeyNavParam, Arrays.asList("ParameterInt16"));
     expression.setResourcePath(new UriInfoImpl().setKind(UriInfoKind.resource).addResourcePart(
         new UriResourceFunctionImpl().setFunction(function).setEntryTypeFilter(entityBaseType))
         .asUriInfoResource());
@@ -180,8 +179,7 @@ public class ExpressionTest {
 
     // UriResourceImplKeyPred typeFilter on entry
     entityBaseType = edm.getEntityType(EntityTypeProvider.nameETBaseTwoKeyNav);
-    function = edm.getFunction(FunctionProvider.nameUFCRTESTwoKeyNavParam, null, null,
-        Arrays.asList(("ParameterInt16")));
+    function = edm.getUnboundFunction(FunctionProvider.nameUFCRTESTwoKeyNavParam, Arrays.asList("ParameterInt16"));
     expression.setResourcePath(new UriInfoImpl().setKind(UriInfoKind.resource).addResourcePart(
         new UriResourceFunctionImpl().setFunction(function).setCollectionTypeFilter(entityBaseType))
         .asUriInfoResource());
@@ -189,8 +187,7 @@ public class ExpressionTest {
 
     // no typed
     entityBaseType = edm.getEntityType(EntityTypeProvider.nameETBaseTwoKeyNav);
-    function = edm.getFunction(FunctionProvider.nameUFCRTESTwoKeyNavParam, null, null,
-        Arrays.asList(("ParameterInt16")));
+    function = edm.getUnboundFunction(FunctionProvider.nameUFCRTESTwoKeyNavParam, Arrays.asList("ParameterInt16"));
     expression.setResourcePath(new UriInfoImpl().setKind(UriInfoKind.all));
     assertEquals(null, expression.getType());
 


[2/2] git commit: [OLINGO-202] Remove caching by by name for get with key

Posted by il...@apache.org.
[OLINGO-202] Remove caching by by name for get with key


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/855a586b
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/855a586b
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/855a586b

Branch: refs/heads/master
Commit: 855a586b3dad92de0415cd7713dd8f7e5970681e
Parents: 081df2a
Author: Christian Amend <ch...@apache.org>
Authored: Mon Apr 7 13:52:45 2014 +0200
Committer: Christian Amend <ch...@apache.org>
Committed: Mon Apr 7 13:52:45 2014 +0200

----------------------------------------------------------------------
 .../java/org/apache/olingo/commons/core/edm/AbstractEdm.java    | 5 -----
 1 file changed, 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/855a586b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
index 1367e0e..98a22c5 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/AbstractEdm.java
@@ -287,11 +287,6 @@ public abstract class AbstractEdm implements Edm {
       function = createUnboundFunction(functionFqn, parameterNames);
       if (function != null) {
         unboundFunctionsByKey.put(key, function);
-
-        if (!unboundFunctionsByName.containsKey(functionFqn)) {
-          unboundFunctionsByName.put(functionFqn, new ArrayList<EdmFunction>());
-        }
-        unboundFunctionsByName.get(functionFqn).add(function);
       }
     }