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 <[email protected]> Authored: Tue Dec 19 13:33:10 2017 +0530 Committer: ramya vasanth <[email protected]> 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()); + } }
