You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2017/04/27 11:19:12 UTC

olingo-odata4 git commit: [OLINGO-753] Incorrect uri formed when the uri parameter contains /$count in URIUtils class

Repository: olingo-odata4
Updated Branches:
  refs/heads/master f55205561 -> 74a2da7d5


[OLINGO-753] Incorrect uri formed when the uri parameter contains /$count in URIUtils class

Signed-off-by: Christian Amend <ch...@sap.com>


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

Branch: refs/heads/master
Commit: 74a2da7d5eefd99d10a4d21fe076c2fa33e1e4a4
Parents: f552055
Author: i050510 <ra...@sap.com>
Authored: Thu Apr 27 15:50:00 2017 +0530
Committer: Christian Amend <ch...@sap.com>
Committed: Thu Apr 27 13:15:26 2017 +0200

----------------------------------------------------------------------
 .../fit/tecsvc/client/FunctionImportITCase.java | 133 ++++++++++++++
 .../apache/olingo/client/core/uri/URIUtils.java |  30 +++-
 .../olingo/client/core/uri/URIBuilderTest.java  | 174 +++++++++++++++++++
 3 files changed, 335 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/74a2da7d/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java
index 1e67a48..1125263 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FunctionImportITCase.java
@@ -41,6 +41,7 @@ import org.apache.olingo.client.api.domain.ClientValue;
 import org.apache.olingo.client.core.uri.ParameterAlias;
 import org.apache.olingo.commons.api.http.HttpStatusCode;
 import org.apache.olingo.fit.tecsvc.TecSvcConst;
+import org.apache.olingo.fit.util.StringHelper;
 import org.junit.Test;
 
 public class FunctionImportITCase extends AbstractParamTecSvcITCase {
@@ -388,4 +389,136 @@ public class FunctionImportITCase extends AbstractParamTecSvcITCase {
     parameters.put("ParameterString", getFactory().newPrimitiveValueBuilder().buildString(parameterString));
     return parameters;
   }
+  
+  @Test
+  public void test1OLINGO753() throws Exception {
+    final Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    String parameterString = "1";
+    final ClientPrimitiveValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
+        buildString(parameterString);
+    parameters.put("ParameterString", value);
+    
+    ODataInvokeRequest<ClientEntitySet> request = getClient().getInvokeRequestFactory()
+        .getFunctionInvokeRequest(
+            getClient().newURIBuilder(TecSvcConst.BASE_URI).appendEntitySetSegment("ESKeyNav").
+            appendOperationCallSegment("olingo.odata.test1.BFCESKeyNavRTETKeyNavParam").
+            appendNavigationSegment("NavPropertyETTwoKeyNavMany").build(),
+            ClientEntitySet.class, parameters);
+    assertNotNull(request);
+    setCookieHeader(request);
+
+    final ODataInvokeResponse<ClientEntitySet> response = request.execute();
+    saveCookieHeader(response);
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
+
+    final ClientEntitySet entity = response.getBody();
+    assertNotNull(entity);
+    assertEquals(3, entity.getEntities().size());
+  }
+  
+  @Test
+  public void test2OLINGO753() throws Exception {
+    final Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    Short parameterInt = 1;
+    final ClientPrimitiveValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
+        buildInt16(parameterInt);
+    parameters.put("ParameterInt16", value);
+    
+    ODataInvokeRequest<ClientProperty> request = getClient().getInvokeRequestFactory()
+        .getFunctionInvokeRequest(
+            getClient().newURIBuilder(TecSvcConst.BASE_URI).
+            appendOperationCallSegment("FICRTETTwoKeyNavParam").appendPropertySegment("PropertyString").
+            appendValueSegment().build(),
+            ClientProperty.class, parameters);
+    assertNotNull(request);
+    request.setAccept("text/plain");
+    setCookieHeader(request);
+
+    final ODataInvokeResponse<ClientProperty> response = request.execute();
+    saveCookieHeader(response);
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
+    String result = StringHelper.asString(response.getRawResponse());
+    assertNotNull(result);
+    assertEquals(2, Integer.parseInt(result));
+  }
+  
+  @Test
+  public void test3OLINGO753() throws Exception {
+    final Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    String parameterString = "1";
+    final ClientPrimitiveValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
+        buildString(parameterString);
+    parameters.put("ParameterString", value);
+    
+    ODataInvokeRequest<ClientProperty> request = getClient().getInvokeRequestFactory()
+        .getFunctionInvokeRequest(
+            getClient().newURIBuilder(TecSvcConst.BASE_URI).appendEntitySetSegment("ESKeyNav").
+            appendOperationCallSegment("olingo.odata.test1.BFCESKeyNavRTETKeyNavParam").
+            appendNavigationSegment("NavPropertyETTwoKeyNavMany").count().build(),
+            ClientProperty.class, parameters);
+    assertNotNull(request);
+    request.setAccept("text/plain");
+    setCookieHeader(request);
+
+    final ODataInvokeResponse<ClientProperty> response = request.execute();
+    saveCookieHeader(response);
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
+    String result = StringHelper.asString(response.getRawResponse());
+    assertNotNull(result);
+    assertEquals(3, Integer.parseInt(result));    
+  }
+  
+  @Test
+  public void test4OLINGO753() throws Exception {
+    final Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    String parameterString = "1";
+    final ClientPrimitiveValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
+        buildString(parameterString);
+    parameters.put("ParameterString", value);
+    
+    ODataInvokeRequest<ClientProperty> request = getClient().getInvokeRequestFactory()
+        .getFunctionInvokeRequest(
+            getClient().newURIBuilder(TecSvcConst.BASE_URI).appendEntitySetSegment("ESKeyNav").
+            appendOperationCallSegment("olingo.odata.test1.BFCESKeyNavRTETKeyNavParam").
+            appendNavigationSegment("NavPropertyETTwoKeyNavMany").count().
+            filter("substring(PropertyString,2) eq 'am String Property 1'").build(),
+            ClientProperty.class, parameters);
+    assertNotNull(request);
+    request.setAccept("text/plain");
+    setCookieHeader(request);
+
+    final ODataInvokeResponse<ClientProperty> response = request.execute();
+    saveCookieHeader(response);
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
+    String result = StringHelper.asString(response.getRawResponse());
+    assertNotNull(result);
+    assertEquals(1, Integer.parseInt(result));    
+  }
+  
+  @Test
+  public void test5OLINGO753() throws Exception {
+    final Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    String parameterString = "'1'";
+    parameters.put("ParameterString", getFactory().newPrimitiveValueBuilder().setValue(
+        new ParameterAlias("first")).build());
+    
+    ODataInvokeRequest<ClientProperty> request = getClient().getInvokeRequestFactory()
+        .getFunctionInvokeRequest(
+            getClient().newURIBuilder(TecSvcConst.BASE_URI).appendEntitySetSegment("ESKeyNav").
+            appendOperationCallSegment("olingo.odata.test1.BFCESKeyNavRTETKeyNavParam").
+            appendNavigationSegment("NavPropertyETTwoKeyNavMany").count().
+            addParameterAlias("first", parameterString).
+            filter("substring(PropertyString,2) eq 'am String Property 1'").build(),
+            ClientProperty.class, parameters);
+    assertNotNull(request);
+    request.setAccept("text/plain");
+    setCookieHeader(request);
+
+    final ODataInvokeResponse<ClientProperty> response = request.execute();
+    saveCookieHeader(response);
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
+    String result = StringHelper.asString(response.getRawResponse());
+    assertNotNull(result);
+    assertEquals(1, Integer.parseInt(result));    
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/74a2da7d/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIUtils.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIUtils.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIUtils.java
index 9a02c18..4553597 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIUtils.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIUtils.java
@@ -74,6 +74,7 @@ public final class URIUtils {
 //  private static final Logger LOG = LoggerFactory.getLogger(URIUtils.class);
 
   private static final Pattern ENUM_VALUE = Pattern.compile("(.+\\.)?.+'.+'");
+  private static final String URI_OPTIONS = "/$";
 
   private URIUtils() {
     // Empty private constructor for static utility classes
@@ -325,11 +326,34 @@ public final class URIUtils {
 
   public static URI buildFunctionInvokeURI(final URI uri, final Map<String, ClientValue> parameters) {
     final String rawQuery = uri.getRawQuery();
-    String baseURI = StringUtils.substringBefore(uri.toASCIIString(), "?" + rawQuery);
+    String baseURI = null;
+    String uriOption = "";
+    String pathSegments = null;
+    // Check if Query contains /$ and extract options like /$count, /$value and /$ref
+    if (uri.toASCIIString().indexOf(URI_OPTIONS) != -1) {
+      uriOption = uri.toASCIIString().substring(uri.toASCIIString().indexOf(URI_OPTIONS), 
+          (rawQuery == null ? uri.toASCIIString().length() : uri.toASCIIString().indexOf(rawQuery) - 1));
+    }
+    if (rawQuery != null) {
+      baseURI = StringUtils.substringBefore(uri.toASCIIString(), uriOption + "?" + rawQuery);
+    } else if (uriOption.length() > 0) {
+      baseURI = StringUtils.substringBefore(uri.toASCIIString(), uriOption);
+    } else {
+      baseURI = StringUtils.substringBefore(uri.toASCIIString(), null);
+    }
     if (baseURI.endsWith("()")) {
       baseURI = baseURI.substring(0, baseURI.length() - 2);
+    } else {
+      /**
+       * If FunctionName is followed by a Navigation segment or Actions, 
+       * then get the substring till function name so that parameters can be appended to it.
+       */
+      int bracIndex = baseURI.indexOf("()");
+      if (bracIndex != -1) {
+        pathSegments = baseURI.substring(bracIndex + 2);
+        baseURI = baseURI.substring(0, bracIndex);
+      }
     }
-
     final StringBuilder inlineParams = new StringBuilder();
     for (Map.Entry<String, ClientValue> param : parameters.entrySet()) {
       inlineParams.append(param.getKey()).append("=");
@@ -353,6 +377,8 @@ public final class URIUtils {
     }
 
     return URI.create(baseURI + "(" + Encoder.encode(inlineParams.toString()) + ")"
+        + (pathSegments == null ? StringUtils.EMPTY : pathSegments)
+        + (!uriOption.equals(StringUtils.EMPTY) ? "/" + Encoder.encode(uriOption.substring(1)) : StringUtils.EMPTY)
         + (StringUtils.isNotBlank(rawQuery) ? "?" + rawQuery : StringUtils.EMPTY));
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/74a2da7d/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/URIBuilderTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/URIBuilderTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/URIBuilderTest.java
index ff0be56..2c47b3f 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/URIBuilderTest.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/URIBuilderTest.java
@@ -19,16 +19,23 @@
 package org.apache.olingo.client.core.uri;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+import org.apache.olingo.client.api.ODataClient;
+import org.apache.olingo.client.api.domain.ClientPrimitiveValue;
+import org.apache.olingo.client.api.domain.ClientValue;
+import org.apache.olingo.client.api.serialization.ODataDeserializerException;
 import org.apache.olingo.client.api.uri.QueryOption;
 import org.apache.olingo.client.api.uri.URIBuilder;
 import org.apache.olingo.client.core.AbstractTest;
+import org.apache.olingo.client.core.ODataClientFactory;
 import org.junit.Test;
 
 public class URIBuilderTest extends AbstractTest {
@@ -260,4 +267,171 @@ public class URIBuilderTest extends AbstractTest {
 
     assertEquals(new URI("http://host/service/Products?%24search=blue%20OR%20green"), uriBuilder.build());
   }
+  
+  @Test
+  public void test1OLINGO753() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).
+        appendOperationCallSegment("functionName").count().build();
+    final Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    final ClientPrimitiveValue value = client.getObjectFactory().
+        newPrimitiveValueBuilder().buildString("parameterValue");
+    parameters.put("parameterName", value);
+    URI newUri = URIUtils.buildFunctionInvokeURI(uri, parameters);
+    assertNotNull(newUri);
+    assertEquals("http://host/service/functionName(parameterName%3D'parameterValue')"
+        + "/%24count", newUri.toASCIIString());
+  }
+  
+  @Test
+  public void test2OLINGO753() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).appendOperationCallSegment("functionName").
+        filter("paramName eq 1").format("json").count().build();
+    final Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    final ClientPrimitiveValue value = client.getObjectFactory().
+        newPrimitiveValueBuilder().buildString("parameterValue");
+    parameters.put("parameterName", value);
+    URI newUri = URIUtils.buildFunctionInvokeURI(uri, parameters);
+    assertNotNull(newUri);
+    assertEquals("http://host/service/functionName(parameterName%3D'parameterValue')"
+        + "/%24count?%24filter=paramName%20eq%201&%24format=json", newUri.toASCIIString());
+  }
+  
+  @Test
+  public void test3OLINGO753() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).appendOperationCallSegment("functionName").
+        filter("paramName eq 1").format("json").build();
+    final Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    final ClientPrimitiveValue value = client.getObjectFactory().
+        newPrimitiveValueBuilder().buildString("parameterValue");
+    parameters.put("parameterName", value);
+    URI newUri = URIUtils.buildFunctionInvokeURI(uri, parameters);
+    assertNotNull(newUri);
+    assertEquals("http://host/service/functionName(parameterName%3D'parameterValue')"
+        + "?%24filter=paramName%20eq%201&%24format=json", newUri.toASCIIString());
+  }
+  
+  @Test
+  public void test4OLINGO753() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).appendEntitySetSegment("EntitySet").
+        appendOperationCallSegment("functionName").count().build();
+    final Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    final ClientPrimitiveValue value = client.getObjectFactory().
+        newPrimitiveValueBuilder().buildString("parameterValue");
+    parameters.put("parameterName", value);
+    URI newUri = URIUtils.buildFunctionInvokeURI(uri, parameters);
+    assertNotNull(newUri);
+    assertEquals("http://host/service/EntitySet/functionName(parameterName%3D'parameterValue')"
+        + "/%24count", newUri.toASCIIString());
+  }
+  
+  @Test
+  public void test5OLINGO753() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).appendEntitySetSegment("EntitySet").
+        appendOperationCallSegment("functionName").count().filter("PropertyString eq '1'").build();
+    final Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    final ClientPrimitiveValue value = client.getObjectFactory().
+        newPrimitiveValueBuilder().buildString("parameterValue");
+    parameters.put("parameterName", value);
+    URI newUri = URIUtils.buildFunctionInvokeURI(uri, parameters);
+    assertNotNull(newUri);
+    assertEquals("http://host/service/EntitySet/functionName(parameterName%3D'parameterValue')"
+        + "/%24count?%24filter=PropertyString%20eq%20'1'", newUri.toASCIIString());
+  }
+  
+  @Test
+  public void test6OLINGO753() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).
+        appendOperationCallSegment("functionName").count().filter("PropertyString eq '1'").build();
+    final Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    URI newUri = URIUtils.buildFunctionInvokeURI(uri, parameters);
+    assertNotNull(newUri);
+    assertEquals("http://host/service/functionName()"
+        + "/%24count?%24filter=PropertyString%20eq%20'1'", newUri.toASCIIString());
+  }
+  
+  @Test
+  public void test7OLINGO753() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).appendEntitySetSegment("EntitySet").
+        appendOperationCallSegment("functionName").filter("PropertyString eq '1'").
+        appendNavigationSegment("NavSeg").count().build();
+    final Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    final ClientPrimitiveValue value = client.getObjectFactory().
+        newPrimitiveValueBuilder().buildString("parameterValue");
+    parameters.put("parameterName", value);
+    URI newUri = URIUtils.buildFunctionInvokeURI(uri, parameters);
+    assertNotNull(newUri);
+    assertEquals("http://host/service/EntitySet/functionName(parameterName%3D'parameterValue')/NavSeg"
+        + "/%24count?%24filter=PropertyString%20eq%20'1'", newUri.toASCIIString());
+  }
+  
+  @Test
+  public void test8OLINGO753() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).appendEntitySetSegment("EntitySet").
+        appendOperationCallSegment("functionName").filter("PropertyString eq '1'").
+        appendNavigationSegment("NavSeg").appendActionCallSegment("ActionName").count().build();
+    final Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    final ClientPrimitiveValue value = client.getObjectFactory().
+        newPrimitiveValueBuilder().buildString("parameterValue");
+    parameters.put("parameterName", value);
+    URI newUri = URIUtils.buildFunctionInvokeURI(uri, parameters);
+    assertNotNull(newUri);
+    assertEquals("http://host/service/EntitySet/functionName(parameterName%3D'parameterValue')/NavSeg/ActionName"
+        + "/%24count?%24filter=PropertyString%20eq%20'1'", newUri.toASCIIString());
+  }
+  
+  @Test
+  public void test9OLINGO753() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).appendEntitySetSegment("EntitySet").
+        appendOperationCallSegment("functionName").
+        appendNavigationSegment("NavSeg").appendActionCallSegment("ActionName").appendValueSegment().build();
+    final Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    final ClientPrimitiveValue value = client.getObjectFactory().
+        newPrimitiveValueBuilder().buildString("parameterValue");
+    parameters.put("parameterName", value);
+    URI newUri = URIUtils.buildFunctionInvokeURI(uri, parameters);
+    assertNotNull(newUri);
+    assertEquals("http://host/service/EntitySet/functionName(parameterName%3D'parameterValue')"
+        + "/NavSeg/ActionName/%24value", newUri.toASCIIString());
+  }
+  
+  @Test
+  public void test10OLINGO753() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).appendEntitySetSegment("EntitySet").
+        appendOperationCallSegment("functionName").
+        appendNavigationSegment("NavSeg").appendRefSegment().build();
+    final Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    final ClientPrimitiveValue value = client.getObjectFactory().
+        newPrimitiveValueBuilder().buildString("parameterValue");
+    parameters.put("parameterName", value);
+    URI newUri = URIUtils.buildFunctionInvokeURI(uri, parameters);
+    assertNotNull(newUri);
+    assertEquals("http://host/service/EntitySet/functionName(parameterName%3D'parameterValue')"
+        + "/NavSeg/%24ref", newUri.toASCIIString());
+  }
+  
+  @Test
+  public void test11OLINGO753() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).appendEntitySetSegment("EntitySet").
+        appendOperationCallSegment("functionName").
+        appendNavigationSegment("NavSeg").count().addParameterAlias("first", "'1'").build();
+    final Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
+    final ClientPrimitiveValue value = client.getObjectFactory().
+        newPrimitiveValueBuilder().setValue(new ParameterAlias("first")).build();
+    parameters.put("parameterName", value);
+    URI newUri = URIUtils.buildFunctionInvokeURI(uri, parameters);
+    assertNotNull(newUri);
+    assertEquals("http://host/service/EntitySet/functionName(parameterName%3D%40first)/"
+        + "NavSeg/%24count?%40first='1'", newUri.toASCIIString());
+  }
 }