Repository: olingo-odata4 Updated Branches: refs/heads/master cf360e657 -> 0e84b4cef
[OLINGO-321] client proxy code should support calling operation on minimal metadata entity Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/0e84b4ce Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/0e84b4ce Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/0e84b4ce Branch: refs/heads/master Commit: 0e84b4cefe2511dd1067d01e8e7598678912837d Parents: cf360e6 Author: challenh <[email protected]> Authored: Sun Jun 8 16:57:06 2014 +0800 Committer: challenh <[email protected]> Committed: Sun Jun 8 16:57:06 2014 +0800 ---------------------------------------------------------------------- .../commons/OperationInvocationHandler.java | 26 ++++++++++++++++++++ 1 file changed, 26 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/0e84b4ce/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/OperationInvocationHandler.java ---------------------------------------------------------------------- diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/OperationInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/OperationInvocationHandler.java index f446a96..b561619 100644 --- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/OperationInvocationHandler.java +++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/OperationInvocationHandler.java @@ -30,8 +30,10 @@ import java.util.Map; import org.apache.olingo.client.api.uri.CommonURIBuilder; import org.apache.olingo.commons.api.domain.CommonODataEntity; import org.apache.olingo.commons.api.domain.ODataOperation; +import org.apache.olingo.commons.api.edm.EdmAction; import org.apache.olingo.commons.api.edm.EdmEntityContainer; import org.apache.olingo.commons.api.edm.EdmEntityType; +import org.apache.olingo.commons.api.edm.EdmFunction; import org.apache.olingo.commons.api.edm.EdmOperation; import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.ext.proxy.api.OperationExecutor; @@ -160,6 +162,30 @@ final class OperationInvocationHandler extends AbstractInvocationHandler impleme boundOp = entity.getOperation(new FullQualifiedName(targetFQN.getNamespace(), operation.name()).toString()); } if (boundOp == null) { + // json minimal/none metadata doesn't return operations for entity, so here try creating it from Edm: + EdmAction action = this.getClient().getEdm(null).getBoundAction( + new FullQualifiedName(targetFQN.getNamespace(), operation.name()), targetFQN, false); + if(action!=null){ + boundOp = new ODataOperation(); + boundOp.setMetadataAnchor(action.getFullQualifiedName().toString()); + boundOp.setTitle(boundOp.getMetadataAnchor()); + boundOp.setTarget(URI.create(entity.getEditLink().toString() + "/" + + action.getFullQualifiedName().toString())); + } + } + if (boundOp == null) { + // json minimal/none metadata doesn't return operations for entity, so here try creating it from Edm: + EdmFunction func = this.getClient().getEdm(null).getBoundFunction( + new FullQualifiedName(targetFQN.getNamespace(), operation.name()), targetFQN, false, parameterNames); + if(func!=null){ + boundOp = new ODataOperation(); + boundOp.setMetadataAnchor(func.getFullQualifiedName().toString()); + boundOp.setTitle(boundOp.getMetadataAnchor()); + boundOp.setTarget(URI.create(entity.getEditLink().toString() + "/" + + func.getFullQualifiedName().toString())); + } + } + if (boundOp == null) { throw new IllegalArgumentException(String.format("Could not find any matching operation '%s' bound to %s", operation.name(), entity.getTypeName())); }
