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

olingo-odata4 git commit: [OLINGO-1170] Olingo v4 client api does not support custom query options in URIBuilder

Repository: olingo-odata4
Updated Branches:
  refs/heads/master ee919d812 -> 9dfe49951


[OLINGO-1170] Olingo v4 client api does not support custom query options in URIBuilder


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

Branch: refs/heads/master
Commit: 9dfe499517d0ef65af755b501f8d8eb6e21c8fa0
Parents: ee919d8
Author: ramya vasanth <ra...@sap.com>
Authored: Tue Dec 19 13:33:10 2017 +0530
Committer: ramya vasanth <ra...@sap.com>
Committed: Tue Dec 19 13:33:10 2017 +0530

----------------------------------------------------------------------
 .../olingo/client/api/uri/URIBuilder.java       |  9 +++
 .../olingo/client/core/uri/URIBuilderImpl.java  | 17 +++-
 .../olingo/client/core/uri/URIBuilderTest.java  | 81 ++++++++++++++++++++
 3 files changed, 105 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/9dfe4995/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/URIBuilder.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/URIBuilder.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/URIBuilder.java
index b73c68f..139abf3 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/URIBuilder.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/URIBuilder.java
@@ -384,4 +384,13 @@ public interface URIBuilder {
    * @return current URIBuilder instance
    */
   URIBuilder appendActionCallSegment(String action);
+  
+  /**
+   * Adds/Replaces the specified custom query option to the URI.
+   *
+   * @param option.
+   * @param value.
+   * @return current URIBuilder instance.
+   */
+  URIBuilder addCustomQueryOption(String customName, String customValue);
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/9dfe4995/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIBuilderImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIBuilderImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIBuilderImpl.java
index a328360..7071d37 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIBuilderImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIBuilderImpl.java
@@ -90,6 +90,11 @@ public class URIBuilderImpl implements URIBuilder {
   protected final Map<String, String> queryOptions = new LinkedHashMap<String, String>();
 
   /**
+   * Insertion-order map of custom query options.
+   */
+  protected final Map<String, String> customQueryOptions = new LinkedHashMap<String, String>();
+  
+  /**
    * Insertion-order map of parameter aliases.
    */
   protected final Map<String, String> parameters = new LinkedHashMap<String, String>();
@@ -294,7 +299,7 @@ public class URIBuilderImpl implements URIBuilder {
     }
 
     try {
-      if ((queryOptions.size() + parameters.size()) > 0) {
+      if ((customQueryOptions.size() + queryOptions.size() + parameters.size()) > 0) {
         segmentsBuilder.append("?");
         List<NameValuePair> list1 = new LinkedList<NameValuePair>();
         for (Map.Entry<String, String> option : queryOptions.entrySet()) {
@@ -303,7 +308,9 @@ public class URIBuilderImpl implements URIBuilder {
         for (Map.Entry<String, String> parameter : parameters.entrySet()) {
           list1.add(new BasicNameValuePair("@" + parameter.getKey(), parameter.getValue()));
         }
-
+        for (Map.Entry<String, String> customOption : customQueryOptions.entrySet()) {
+          list1.add(new BasicNameValuePair(customOption.getKey(), customOption.getValue()));
+        }
         // don't use UriBuilder.build():
         // it will try to call URLEncodedUtils.format(Iterable<>,Charset) method,
         // which works in desktop java application, however, throws NoSuchMethodError in android OS,
@@ -458,4 +465,10 @@ public class URIBuilderImpl implements URIBuilder {
   public URIBuilder expandWithSelect(final String expandItem, final String... selectItems) {
     return expand(expandItem + "($select=" + StringUtils.join(selectItems, ",") + ")");
   }
+
+  @Override
+  public URIBuilder addCustomQueryOption(String customName, String customValue) {
+    customQueryOptions.put(customName, customValue);
+    return this;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/9dfe4995/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 2c47b3f..f4541c2 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
@@ -434,4 +434,85 @@ public class URIBuilderTest extends AbstractTest {
     assertEquals("http://host/service/EntitySet/functionName(parameterName%3D%40first)/"
         + "NavSeg/%24count?%40first='1'", newUri.toASCIIString());
   }
+  
+  @Test
+  public void testCustomQueryOption() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).appendEntitySetSegment("EntitySet").
+        addCustomQueryOption("x", "y").build();
+    assertEquals("http://host/service/EntitySet?x=y", uri.toASCIIString());
+  }
+  
+  @Test
+  public void testCustomQueryOptionWithFilter() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).appendEntitySetSegment("EntitySet").
+        filter("PropertyString eq '1'").
+        addCustomQueryOption("x", "y").build();
+    assertEquals("http://host/service/EntitySet?%24filter=PropertyString%20eq%20'1'&x=y", 
+        uri.toASCIIString());
+  }
+  
+  @Test
+  public void testDuplicateCustomQueryOption() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).appendEntitySetSegment("EntitySet").
+        addCustomQueryOption("x", "z").
+        addCustomQueryOption("x", "y").build();
+    assertEquals("http://host/service/EntitySet?x=y", uri.toASCIIString());
+  }
+  
+  @Test
+  public void testCustomQueryOptionWithFilterAndFunction() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).
+        appendOperationCallSegment("functionName").count().filter("PropertyString eq '1'").
+        addCustomQueryOption("x", "y").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'&x=y", newUri.toASCIIString());
+  }
+  
+  @Test
+  public void testCustomQueryOptionWithFunctionWithNavAndRef() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).appendEntitySetSegment("EntitySet").
+        appendOperationCallSegment("functionName").
+        appendNavigationSegment("NavSeg").appendRefSegment().addCustomQueryOption("x", "y").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?x=y", newUri.toASCIIString());
+  }
+  
+  @Test
+  public void testCustomQueryOptionOnRoot() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).
+        addCustomQueryOption("x", "y").build();
+    assertEquals("http://host/service?x=y", uri.toASCIIString());
+  }
+  
+  @Test
+  public void testTwoCustomQueryOption() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).
+        addCustomQueryOption("x", "y").
+        addCustomQueryOption("y", "z").build();
+    assertEquals("http://host/service?x=y&y=z", uri.toASCIIString());
+  }
+  
+  @Test
+  public void testCustomQueryOptionWithEncodedNameValue() throws ODataDeserializerException {
+    final ODataClient client = ODataClientFactory.getClient();
+    final URI uri = client.newURIBuilder(SERVICE_ROOT).
+        addCustomQueryOption("x!/?", "@?$").build();
+    assertEquals("http://host/service?x%21%2F%3F=%40%3F%24", uri.toASCIIString());
+  }
 }