You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by fm...@apache.org on 2014/03/29 15:19:58 UTC
git commit: [OLINGO-175,
OLINGO-205] provided parameter aliases support
Repository: olingo-odata4
Updated Branches:
refs/heads/olingo200 e0d1b6ffa -> 4931b30b4
[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/olingo200
Commit: 4931b30b41354a66805bb1bc55f09e3c2cfb1cd4
Parents: e0d1b6f
Author: fmartelli <fa...@gmail.com>
Authored: Sat Mar 29 15:19:40 2014 +0100
Committer: fmartelli <fa...@gmail.com>
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",