You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by il...@apache.org on 2014/04/01 16:18:55 UTC

[28/51] [abbrv] git commit: [OLINGO-175, OLINGO-205] provided parameter aliases support

[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/master
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",