[OLINGO-175, OLINGO-205] provided parameter aliases support
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/4931b30b Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/4931b30b Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/4931b30b Branch: refs/heads/olingo-206-validator Commit: 4931b30b41354a66805bb1bc55f09e3c2cfb1cd4 Parents: e0d1b6f Author: fmartelli <[email protected]> Authored: Sat Mar 29 15:19:40 2014 +0100 Committer: fmartelli <[email protected]> Committed: Sat Mar 29 15:19:40 2014 +0100 ---------------------------------------------------------------------- .../olingo/client/api/uri/CommonURIBuilder.java | 13 ++++-- .../client/core/uri/AbstractURIBuilder.java | 24 +++++++++- .../olingo/client/core/uri/ParameterAlias.java | 48 ++++++++++++++++++++ .../apache/olingo/client/core/uri/URIUtils.java | 40 ++++++++-------- .../client/core/uri/v3/URIBuilderTest.java | 13 ++++++ 5 files changed, 115 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4931b30b/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/CommonURIBuilder.java ---------------------------------------------------------------------- diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/CommonURIBuilder.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/CommonURIBuilder.java index 3f10262..6a8ce0e 100644 --- a/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/CommonURIBuilder.java +++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/CommonURIBuilder.java @@ -18,7 +18,6 @@ */ package org.apache.olingo.client.api.uri; - import java.net.URI; import java.util.Map; @@ -41,11 +40,20 @@ public interface CommonURIBuilder<UB extends CommonURIBuilder<?>> { * * @param option query option. * @param value query option value. - * @return current URIBuilder instance + * @return current URIBuilder instance. */ UB addQueryOption(String option, String value); /** + * Adds the specified (custom) parameter alias to the URI. + * + * @param alias parameter alias. + * @param exp expression value. + * @return current URIBuilder instance. + */ + UB addParameterAlias(final String alias, final String exp); + + /** * Appends EntitySet segment to the URI. * * @param segmentValue segment value. @@ -220,5 +228,4 @@ public interface CommonURIBuilder<UB extends CommonURIBuilder<?>> { * @return OData URI. */ URI build(); - } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4931b30b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractURIBuilder.java ---------------------------------------------------------------------- diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractURIBuilder.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractURIBuilder.java index 906b62c..10feb7e 100644 --- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractURIBuilder.java +++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractURIBuilder.java @@ -18,8 +18,10 @@ */ package org.apache.olingo.client.core.uri; +import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; +import java.net.URLDecoder; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; @@ -73,6 +75,11 @@ public abstract class AbstractURIBuilder<UB extends CommonURIBuilder<?>> impleme protected final Map<String, String> queryOptions = new LinkedHashMap<String, String>(); /** + * Insertion-order map of parameter aliases. + */ + protected final Map<String, String> parameters = new LinkedHashMap<String, String>(); + + /** * Constructor. * * @param serviceRoot absolute URL (schema, host and port included) representing the location of the root of the data @@ -97,6 +104,12 @@ public abstract class AbstractURIBuilder<UB extends CommonURIBuilder<?>> impleme } @Override + public UB addParameterAlias(final String alias, final String exp) { + parameters.put(alias, exp); + return getThis(); + } + + @Override public UB appendEntitySetSegment(final String segmentValue) { segments.add(new Segment(SegmentType.ENTITYSET, segmentValue)); return getThis(); @@ -193,7 +206,12 @@ public abstract class AbstractURIBuilder<UB extends CommonURIBuilder<?>> impleme @Override public UB filter(final URIFilter filter) { - return addQueryOption(QueryOption.FILTER, filter.build()); + try { + // decode in order to support @ in parameter aliases + return addQueryOption(QueryOption.FILTER, URLDecoder.decode(filter.build(), "UTF-8")); + } catch (UnsupportedEncodingException ex) { + return addQueryOption(QueryOption.FILTER, filter.build()); + } } @Override @@ -271,6 +289,10 @@ public abstract class AbstractURIBuilder<UB extends CommonURIBuilder<?>> impleme builder.addParameter("$" + option.getKey(), option.getValue()); } + for (Map.Entry<String, String> parameter : parameters.entrySet()) { + builder.addParameter("@" + parameter.getKey(), parameter.getValue()); + } + return builder.build().normalize(); } catch (URISyntaxException e) { throw new IllegalArgumentException("Could not build valid URI", e); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4931b30b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/ParameterAlias.java ---------------------------------------------------------------------- diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/ParameterAlias.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/ParameterAlias.java new file mode 100644 index 0000000..dd3d67b --- /dev/null +++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/ParameterAlias.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.olingo.client.core.uri; + +/** + * Object to be used to communicate parameter alias into filter or orderBy expression. + */ +public class ParameterAlias { + + /** + * Parameter alias. + */ + final String alias; + + /** + * Constructor. + * + * @param alias parameter alias. + */ + public ParameterAlias(final String alias) { + this.alias = alias; + } + + /** + * Gets parameter alias. + * + * @return + */ + public String getAlias() { + return alias; + } +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4931b30b/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 8dce061..4159e76 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 @@ -225,12 +225,12 @@ public final class URIUtils { return version == ODataServiceVersion.V30 ? prefix(version, EdmPrimitiveTypeKind.DateTime) + URLEncoder.encode(EdmDateTime.getInstance(). - valueToString(timestamp, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), - Constants.UTF8) + valueToString(timestamp, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), + Constants.UTF8) + suffix(version, EdmPrimitiveTypeKind.DateTime) : URLEncoder.encode(EdmDateTimeOffset.getInstance(). - valueToString(timestamp, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), - Constants.UTF8); + valueToString(timestamp, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), + Constants.UTF8); } private static String calendar(final ODataServiceVersion version, final Calendar calendar) @@ -241,8 +241,8 @@ public final class URIUtils { if (version == ODataServiceVersion.V30) { result = prefix(version, EdmPrimitiveTypeKind.DateTime) + URLEncoder.encode(EdmDateTime.getInstance(). - valueToString(calendar, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), - Constants.UTF8) + valueToString(calendar, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), + Constants.UTF8) + suffix(version, EdmPrimitiveTypeKind.DateTime); } else { if (calendar.get(Calendar.YEAR) == 0 && calendar.get(Calendar.MONTH) == 0 @@ -260,8 +260,8 @@ public final class URIUtils { } else { result = prefix(version, EdmPrimitiveTypeKind.DateTimeOffset) + URLEncoder.encode(EdmDateTimeOffset.getInstance(). - valueToString(calendar, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), - Constants.UTF8) + valueToString(calendar, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), + Constants.UTF8) + suffix(version, EdmPrimitiveTypeKind.DateTimeOffset); } @@ -273,11 +273,11 @@ public final class URIUtils { return version == ODataServiceVersion.V30 ? EdmTime.getInstance().toUriLiteral(URLEncoder.encode(EdmTime.getInstance(). - valueToString(duration, null, null, - Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), Constants.UTF8)) + valueToString(duration, null, null, + Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), Constants.UTF8)) : EdmDuration.getInstance().toUriLiteral(URLEncoder.encode(EdmDuration.getInstance(). - valueToString(duration, null, null, - Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), Constants.UTF8)); + valueToString(duration, null, null, + Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), Constants.UTF8)); } private static String quoteString(final String string, final boolean singleQuoteEscape) @@ -338,7 +338,9 @@ public final class URIUtils { value = buffer.toString(); } else { - value = (obj instanceof Boolean) + value = (obj instanceof ParameterAlias) + ? "@" + ((ParameterAlias) obj).getAlias().toString() + : (obj instanceof Boolean) ? BooleanUtils.toStringTrueFalse((Boolean) obj) : (obj instanceof UUID) ? prefix(version, EdmPrimitiveTypeKind.Guid) @@ -354,24 +356,24 @@ public final class URIUtils { ? duration(version, (Duration) obj) : (obj instanceof BigDecimal) ? EdmDecimal.getInstance().valueToString(obj, null, null, - Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null) + Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null) + suffix(version, EdmPrimitiveTypeKind.Decimal) : (obj instanceof Double) ? EdmDouble.getInstance().valueToString(obj, null, null, - Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null) + Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null) + suffix(version, EdmPrimitiveTypeKind.Double) : (obj instanceof Float) ? EdmSingle.getInstance().valueToString(obj, null, null, - Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null) + Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null) + suffix(version, EdmPrimitiveTypeKind.Single) : (obj instanceof Long) ? EdmInt64.getInstance().valueToString(obj, null, null, - Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null) + Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null) + suffix(version, EdmPrimitiveTypeKind.Int64) : (obj instanceof Geospatial) ? URLEncoder.encode(EdmPrimitiveTypeFactory.getInstance(((Geospatial) obj).getEdmPrimitiveTypeKind()). - valueToString(obj, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), - Constants.UTF8) + valueToString(obj, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), + Constants.UTF8) : (obj instanceof String) ? quoteString((String) obj, singleQuoteEscape) : obj.toString(); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4931b30b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v3/URIBuilderTest.java ---------------------------------------------------------------------- diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v3/URIBuilderTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v3/URIBuilderTest.java index e949780..6bfe116 100644 --- a/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v3/URIBuilderTest.java +++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v3/URIBuilderTest.java @@ -29,6 +29,7 @@ import java.util.Map; import org.apache.olingo.client.api.v3.ODataClient; import org.apache.olingo.client.api.uri.v3.URIBuilder; import org.apache.olingo.client.core.AbstractTest; +import org.apache.olingo.client.core.uri.ParameterAlias; import org.junit.Test; public class URIBuilderTest extends AbstractTest { @@ -101,6 +102,18 @@ public class URIBuilderTest extends AbstractTest { } @Test + public void filterWithParameter() throws URISyntaxException { + // http://host/service.svc/Employees?$filter=Region eq @p1&@p1='WA' + final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).appendEntitySetSegment("Employees"). + filter(getClient().getFilterFactory().eq("Region", new ParameterAlias("p1"))). + addParameterAlias("p1", "'WA'"); + + assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/Employees"). + addParameter("$filter", "(Region eq @p1)").addParameter("@p1", "'WA'").build(), + uriBuilder.build()); + } + + @Test public void unboundAction() throws URISyntaxException { final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT). appendOperationCallSegment("ProductsByCategoryId",
