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/03/24 13:32:20 UTC

[3/3] git commit: [OLINGO-194] Using enum values as key or in search filters

[OLINGO-194] Using enum values as key or in search filters


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

Branch: refs/heads/olingo200
Commit: c1b8976e9bb866e9e226ff34250f8a34d141e57e
Parents: 4a19c8d
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Mon Mar 24 13:32:09 2014 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Mon Mar 24 13:32:09 2014 +0100

----------------------------------------------------------------------
 .../olingo/client/api/uri/v4/URIBuilder.java    |  22 +++
 .../core/uri/AbstractFilterArgFactory.java      |   9 +-
 .../client/core/uri/AbstractFilterFactory.java  |   7 +
 .../client/core/uri/AbstractURIBuilder.java     |  10 +-
 .../olingo/client/core/uri/FilterLiteral.java   |  10 +-
 .../apache/olingo/client/core/uri/URIUtils.java | 184 +++++++++++++++++--
 .../core/uri/v3/FilterArgFactoryImpl.java       |   5 +
 .../client/core/uri/v3/FilterFactoryImpl.java   |   7 +-
 .../client/core/uri/v3/URIBuilderImpl.java      |  12 +-
 .../core/uri/v4/FilterArgFactoryImpl.java       |   5 +
 .../client/core/uri/v4/FilterFactoryImpl.java   |   7 +-
 .../client/core/uri/v4/URIBuilderImpl.java      |  27 ++-
 .../olingo/client/core/v3/ODataClientImpl.java  |   4 +-
 .../olingo/client/core/v4/ODataClientImpl.java  |   4 +-
 14 files changed, 280 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/c1b8976e/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/v4/URIBuilder.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/v4/URIBuilder.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/v4/URIBuilder.java
index 5fc8a1d..63d3a01 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/v4/URIBuilder.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/v4/URIBuilder.java
@@ -18,11 +18,33 @@
  */
 package org.apache.olingo.client.api.uri.v4;
 
+import java.util.Map;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.olingo.client.api.uri.CommonURIBuilder;
+import org.apache.olingo.client.api.uri.QueryOption;
+import org.apache.olingo.commons.api.edm.EdmEnumType;
 
 public interface URIBuilder extends CommonURIBuilder<URIBuilder> {
 
   /**
+   * Appends enum key segment to the URI.
+   *
+   * @param enumType enum type
+   * @param memberName enum member name
+   * @return current URIBuilder instance
+   */
+  URIBuilder appendKeySegment(EdmEnumType enumType, String memberName);
+
+  /**
+   * Appends key segment to the URI, for multiple keys.
+   *
+   * @param enumValues enum segment values.
+   * @param segmentValues segment values.
+   * @return current URIBuilder instance
+   */
+  URIBuilder appendKeySegment(Map<String, Pair<EdmEnumType, String>> enumValues, Map<String, Object> segmentValues);
+
+  /**
    * Appends Singleton segment to the URI.
    *
    * @param segmentValue segment value.

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/c1b8976e/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractFilterArgFactory.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractFilterArgFactory.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractFilterArgFactory.java
index 47100e8..e55b3a1 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractFilterArgFactory.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractFilterArgFactory.java
@@ -20,12 +20,19 @@ package org.apache.olingo.client.core.uri;
 
 import org.apache.olingo.client.api.uri.FilterArg;
 import org.apache.olingo.client.api.uri.CommonFilterArgFactory;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
 
 /**
  * OData filter arguments factory.
  */
 public abstract class AbstractFilterArgFactory implements CommonFilterArgFactory {
 
+  private final ODataServiceVersion version;
+
+  public AbstractFilterArgFactory(final ODataServiceVersion version) {
+    this.version = version;
+  }
+
   @Override
   public FilterArg _null() {
     return new FilterConst("null");
@@ -38,7 +45,7 @@ public abstract class AbstractFilterArgFactory implements CommonFilterArgFactory
 
   @Override
   public FilterArg literal(final Object value) {
-    return new FilterLiteral(value);
+    return new FilterLiteral(version, value);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/c1b8976e/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractFilterFactory.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractFilterFactory.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractFilterFactory.java
index eb6067e..108c1bf 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractFilterFactory.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractFilterFactory.java
@@ -21,11 +21,18 @@ package org.apache.olingo.client.core.uri;
 import org.apache.olingo.client.api.uri.FilterArg;
 import org.apache.olingo.client.api.uri.CommonFilterFactory;
 import org.apache.olingo.client.api.uri.URIFilter;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
 
 public abstract class AbstractFilterFactory implements CommonFilterFactory {
 
   private static final long serialVersionUID = -6141317149802621836L;
 
+  protected final ODataServiceVersion version;
+
+  public AbstractFilterFactory(final ODataServiceVersion version) {
+    this.version = version;
+  }
+
   @Override
   public URIFilter match(final FilterArg arg) {
     return new MatchFilter(arg);

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/c1b8976e/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 2beecb3..6cc27e3 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
@@ -30,6 +30,7 @@ import org.apache.olingo.client.api.uri.QueryOption;
 import org.apache.olingo.client.api.uri.SegmentType;
 import org.apache.olingo.client.api.uri.CommonURIBuilder;
 import org.apache.olingo.client.api.uri.URIFilter;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -63,6 +64,8 @@ public abstract class AbstractURIBuilder<UB extends CommonURIBuilder<?>> impleme
 
   }
 
+  private final ODataServiceVersion version;
+
   protected final List<Segment> segments = new ArrayList<Segment>();
 
   /**
@@ -76,7 +79,8 @@ public abstract class AbstractURIBuilder<UB extends CommonURIBuilder<?>> impleme
    * @param serviceRoot absolute URL (schema, host and port included) representing the location of the root of the data
    * service.
    */
-  protected AbstractURIBuilder(final String serviceRoot) {
+  protected AbstractURIBuilder(final ODataServiceVersion version, final String serviceRoot) {
+    this.version = version;
     segments.add(new Segment(SegmentType.SERVICEROOT, serviceRoot));
   }
 
@@ -101,7 +105,7 @@ public abstract class AbstractURIBuilder<UB extends CommonURIBuilder<?>> impleme
 
   @Override
   public UB appendKeySegment(final Object val) {
-    final String segValue = URIUtils.escape(val);
+    final String segValue = URIUtils.escape(version, val);
 
     segments.add(new Segment(SegmentType.KEY, "(" + segValue + ")"));
     return getThis();
@@ -116,7 +120,7 @@ public abstract class AbstractURIBuilder<UB extends CommonURIBuilder<?>> impleme
     } else {
       final StringBuilder keyBuilder = new StringBuilder().append('(');
       for (Map.Entry<String, Object> entry : segmentValues.entrySet()) {
-        keyBuilder.append(entry.getKey()).append('=').append(URIUtils.escape(entry.getValue()));
+        keyBuilder.append(entry.getKey()).append('=').append(URIUtils.escape(version, entry.getValue()));
         keyBuilder.append(',');
       }
       keyBuilder.deleteCharAt(keyBuilder.length() - 1).append(')');

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/c1b8976e/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/FilterLiteral.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/FilterLiteral.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/FilterLiteral.java
index cef0349..ad03934 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/FilterLiteral.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/FilterLiteral.java
@@ -19,22 +19,26 @@
 package org.apache.olingo.client.core.uri;
 
 import org.apache.olingo.client.api.uri.FilterArg;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
 
 /**
  * Filter value literals; obtain instances via <tt>FilterArgFactory</tt>.
  *
- * @see FilterArgFactory
+ * @see org.apache.olingo.client.api.uri.v3.FilterArgFactory
  */
 public class FilterLiteral implements FilterArg {
 
+  private final ODataServiceVersion version;
+
   private final Object value;
 
-  FilterLiteral(final Object value) {
+  FilterLiteral(final ODataServiceVersion version, final Object value) {
+    this.version = version;
     this.value = value;
   }
 
   @Override
   public String build() {
-    return URIUtils.escape(value);
+    return URIUtils.escape(version, value);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/c1b8976e/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 36bb1c2..831d0b1 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
@@ -21,6 +21,7 @@ package org.apache.olingo.client.core.uri;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
 import java.net.URI;
 import java.net.URLEncoder;
@@ -30,18 +31,26 @@ import java.util.UUID;
 import javax.xml.datatype.Duration;
 import org.apache.commons.codec.binary.Hex;
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.http.entity.InputStreamEntity;
 import org.apache.olingo.client.api.CommonODataClient;
 import org.apache.olingo.commons.api.Constants;
 import org.apache.olingo.commons.api.edm.EdmEntityContainer;
 import org.apache.olingo.commons.api.edm.EdmFunctionImport;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmDate;
 import org.apache.olingo.commons.core.edm.primitivetype.EdmDateTime;
 import org.apache.olingo.commons.core.edm.primitivetype.EdmDateTimeOffset;
 import org.apache.olingo.commons.core.edm.primitivetype.EdmDecimal;
 import org.apache.olingo.commons.core.edm.primitivetype.EdmDouble;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmDuration;
 import org.apache.olingo.commons.core.edm.primitivetype.EdmInt64;
 import org.apache.olingo.commons.core.edm.primitivetype.EdmSingle;
 import org.apache.olingo.commons.core.edm.primitivetype.EdmTime;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmTimeOfDay;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -141,41 +150,186 @@ public final class URIUtils {
     return result.toString();
   }
 
+  private static String prefix(final ODataServiceVersion version, final EdmPrimitiveTypeKind typeKind) {
+    String result = StringUtils.EMPTY;
+    if (version == ODataServiceVersion.V30) {
+      switch (typeKind) {
+        case Guid:
+          result = "guid'";
+          break;
+
+        case DateTime:
+          result = "datetime'";
+          break;
+
+        case DateTimeOffset:
+          result = "datetimeoffset'";
+          break;
+
+        case Binary:
+          result = "X'";
+          break;
+
+        default:
+      }
+    } else {
+      switch (typeKind) {
+        case Binary:
+          result = "binary'";
+          break;
+
+        default:
+      }
+    }
+
+    return result;
+  }
+
+  private static String suffix(final ODataServiceVersion version, final EdmPrimitiveTypeKind typeKind) {
+    String result = StringUtils.EMPTY;
+    if (version == ODataServiceVersion.V30) {
+      switch (typeKind) {
+        case Guid:
+        case DateTime:
+        case DateTimeOffset:
+        case Binary:
+          result = "'";
+          break;
+
+        case Decimal:
+          result = "M";
+          break;
+
+        case Double:
+          result = "D";
+          break;
+
+        case Single:
+          result = "f";
+          break;
+
+        case Int64:
+          result = "L";
+          break;
+
+        default:
+      }
+    } else {
+      switch (typeKind) {
+        case Binary:
+          result = "'";
+          break;
+
+        default:
+      }
+    }
+
+    return result;
+  }
+
+  private static String timestamp(final ODataServiceVersion version, final Timestamp timestamp)
+          throws UnsupportedEncodingException, EdmPrimitiveTypeException {
+
+    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)
+            + suffix(version, EdmPrimitiveTypeKind.DateTime)
+            : URLEncoder.encode(EdmDateTimeOffset.getInstance().
+                    valueToString(timestamp, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null),
+                    Constants.UTF8);
+  }
+
+  private static String calendar(final ODataServiceVersion version, final Calendar calendar)
+          throws UnsupportedEncodingException, EdmPrimitiveTypeException {
+
+    String result;
+    if (calendar.get(Calendar.ZONE_OFFSET) == 0) {
+      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)
+                + suffix(version, EdmPrimitiveTypeKind.DateTime);
+      } else {
+        if (calendar.get(Calendar.YEAR) == 0 && calendar.get(Calendar.MONTH) == 0
+                && calendar.get(Calendar.DAY_OF_MONTH) == 0) {
+
+          result = URLEncoder.encode(EdmTimeOfDay.getInstance().
+                  valueToString(calendar, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null),
+                  Constants.UTF8);
+        } else {
+          result = URLEncoder.encode(EdmDate.getInstance().
+                  valueToString(calendar, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null),
+                  Constants.UTF8);
+        }
+      }
+    } else {
+      result = prefix(version, EdmPrimitiveTypeKind.DateTimeOffset)
+              + URLEncoder.encode(EdmDateTimeOffset.getInstance().
+                      valueToString(calendar, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null),
+                      Constants.UTF8)
+              + suffix(version, EdmPrimitiveTypeKind.DateTimeOffset);
+    }
+
+    return result;
+  }
+
+  private static String duration(final ODataServiceVersion version, final Duration duration)
+          throws UnsupportedEncodingException, EdmPrimitiveTypeException {
+
+    return version == ODataServiceVersion.V30
+            ? "time'" + URLEncoder.encode(EdmTime.getInstance().
+                    valueToString(duration, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null),
+                    Constants.UTF8) + "'"
+            : "duration'" + URLEncoder.encode(EdmDuration.getInstance().
+                    valueToString(duration, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null),
+                    Constants.UTF8) + "'";
+  }
+
   /**
    * Turns primitive values into their respective URI representation.
    *
    * @param obj primitive value
    * @return URI representation
    */
-  public static String escape(final Object obj) {
+  public static String escape(final ODataServiceVersion version, final Object obj) {
     String value;
 
     try {
-      value = (obj instanceof UUID)
-              ? "guid'" + obj.toString() + "'"
+      value = (obj instanceof Boolean)
+              ? BooleanUtils.toStringTrueFalse((Boolean) obj)
+              : (obj instanceof UUID)
+              ? prefix(version, EdmPrimitiveTypeKind.Guid)
+              + obj.toString()
+              + suffix(version, EdmPrimitiveTypeKind.Guid)
               : (obj instanceof byte[])
-              ? "X'" + Hex.encodeHexString((byte[]) obj) + "'"
+              ? prefix(version, EdmPrimitiveTypeKind.Binary)
+              + Hex.encodeHexString((byte[]) obj)
+              + suffix(version, EdmPrimitiveTypeKind.Binary)
               : (obj instanceof Timestamp)
-              ? "datetime'" + URLEncoder.encode(EdmDateTime.getInstance().
-                      valueToString(obj, null, null, null, null, null), Constants.UTF8) + "'"
+              ? timestamp(version, (Timestamp) obj)
               : (obj instanceof Calendar)
-              ? "datetimeoffset'" + URLEncoder.encode(EdmDateTimeOffset.getInstance().
-                      valueToString(obj, null, null, null, null, null), Constants.UTF8) + "'"
+              ? calendar(version, (Calendar) obj)
               : (obj instanceof Duration)
-              ? "time'" + URLEncoder.encode(EdmTime.getInstance().
-                      valueToString(obj, null, null, null, null, null), Constants.UTF8) + "'"
+              ? duration(version, (Duration) obj)
               : (obj instanceof BigDecimal)
               ? EdmDecimal.getInstance().valueToString(obj, null, null,
-                      Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null) + "M"
+                      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) + "D"
+                      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) + "f"
+                      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) + "L"
+                      Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null)
+              + suffix(version, EdmPrimitiveTypeKind.Int64)
               : (obj instanceof String)
               ? "'" + URLEncoder.encode((String) obj, Constants.UTF8) + "'"
               : obj.toString();
@@ -186,7 +340,7 @@ public final class URIUtils {
 
     return value;
   }
-
+  
   public static InputStreamEntity buildInputStreamEntity(final CommonODataClient client, final InputStream input) {
     InputStreamEntity entity;
     if (client.getConfiguration().isUseChuncked()) {

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/c1b8976e/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v3/FilterArgFactoryImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v3/FilterArgFactoryImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v3/FilterArgFactoryImpl.java
index c4c176c..e5ed489 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v3/FilterArgFactoryImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v3/FilterArgFactoryImpl.java
@@ -22,9 +22,14 @@ import org.apache.olingo.client.api.uri.FilterArg;
 import org.apache.olingo.client.api.uri.v3.FilterArgFactory;
 import org.apache.olingo.client.core.uri.AbstractFilterArgFactory;
 import org.apache.olingo.client.core.uri.FilterFunction;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
 
 public class FilterArgFactoryImpl extends AbstractFilterArgFactory implements FilterArgFactory {
 
+  public FilterArgFactoryImpl(final ODataServiceVersion version) {
+    super(version);
+  }
+
   @Override
   public FilterArg substringof(final FilterArg first, final FilterArg second) {
     return new FilterFunction("substringof", first, second);

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/c1b8976e/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v3/FilterFactoryImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v3/FilterFactoryImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v3/FilterFactoryImpl.java
index a26cd51..a42a920 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v3/FilterFactoryImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v3/FilterFactoryImpl.java
@@ -21,14 +21,19 @@ package org.apache.olingo.client.core.uri.v3;
 import org.apache.olingo.client.api.uri.v3.FilterArgFactory;
 import org.apache.olingo.client.api.uri.v3.FilterFactory;
 import org.apache.olingo.client.core.uri.AbstractFilterFactory;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
 
 public class FilterFactoryImpl extends AbstractFilterFactory implements FilterFactory {
 
   private static final long serialVersionUID = 1092594961118334631L;
 
+  public FilterFactoryImpl(final ODataServiceVersion version) {
+    super(version);
+  }
+
   @Override
   public FilterArgFactory getArgFactory() {
-    return new FilterArgFactoryImpl();
+    return new FilterArgFactoryImpl(version);
   }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/c1b8976e/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v3/URIBuilderImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v3/URIBuilderImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v3/URIBuilderImpl.java
index b541579..f02c524 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v3/URIBuilderImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v3/URIBuilderImpl.java
@@ -27,15 +27,21 @@ import org.apache.olingo.client.api.uri.QueryOption;
 import org.apache.olingo.client.api.uri.SegmentType;
 import org.apache.olingo.client.api.uri.v3.URIBuilder;
 import org.apache.olingo.client.core.uri.AbstractURIBuilder;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
 
 public class URIBuilderImpl extends AbstractURIBuilder<URIBuilder> implements URIBuilder {
 
   private static final long serialVersionUID = -3506851722447870532L;
 
+  private final ODataServiceVersion version;
+
   private final Configuration configuration;
 
-  public URIBuilderImpl(final Configuration configuration, final String serviceRoot) {
-    super(serviceRoot);
+  public URIBuilderImpl(final ODataServiceVersion version, final Configuration configuration,
+          final String serviceRoot) {
+
+    super(version, serviceRoot);
+    this.version = version;
     this.configuration = configuration;
   }
 
@@ -70,7 +76,7 @@ public class URIBuilderImpl extends AbstractURIBuilder<URIBuilder> implements UR
   @Override
   public URIBuilder appendKeySegment(final Object val) {
     if (configuration.isKeyAsSegment()) {
-      final String segValue = URIUtils.escape(val);
+      final String segValue = URIUtils.escape(version, val);
       segments.add(new Segment(SegmentType.KEY_AS_SEGMENT, segValue));
     } else {
       super.appendKeySegment(val);

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/c1b8976e/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v4/FilterArgFactoryImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v4/FilterArgFactoryImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v4/FilterArgFactoryImpl.java
index 39298f3..15bb9e9 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v4/FilterArgFactoryImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v4/FilterArgFactoryImpl.java
@@ -24,9 +24,14 @@ import org.apache.olingo.client.api.uri.v4.FilterArgFactory;
 import org.apache.olingo.client.core.uri.AbstractFilterArgFactory;
 import org.apache.olingo.client.core.uri.FilterFunction;
 import org.apache.olingo.client.core.uri.FilterLambda;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
 
 public class FilterArgFactoryImpl extends AbstractFilterArgFactory implements FilterArgFactory {
 
+  public FilterArgFactoryImpl(final ODataServiceVersion version) {
+    super(version);
+  }
+
   @Override
   public FilterArg contains(final FilterArg first, final FilterArg second) {
     return new FilterFunction("contains", first, second);

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/c1b8976e/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v4/FilterFactoryImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v4/FilterFactoryImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v4/FilterFactoryImpl.java
index 2acf1c3..626a261 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v4/FilterFactoryImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v4/FilterFactoryImpl.java
@@ -26,14 +26,19 @@ import org.apache.olingo.client.core.uri.AbstractFilterFactory;
 import org.apache.olingo.client.core.uri.FilterProperty;
 import org.apache.olingo.client.core.uri.HasFilter;
 import org.apache.olingo.commons.api.edm.EdmEnumType;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
 
 public class FilterFactoryImpl extends AbstractFilterFactory implements FilterFactory {
 
   private static final long serialVersionUID = -5358934829490623191L;
 
+  public FilterFactoryImpl(ODataServiceVersion version) {
+    super(version);
+  }
+
   @Override
   public FilterArgFactory getArgFactory() {
-    return new FilterArgFactoryImpl();
+    return new FilterArgFactoryImpl(version);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/c1b8976e/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v4/URIBuilderImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v4/URIBuilderImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v4/URIBuilderImpl.java
index ae4284d..e996322 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v4/URIBuilderImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/v4/URIBuilderImpl.java
@@ -18,18 +18,41 @@
  */
 package org.apache.olingo.client.core.uri.v4;
 
+import java.util.LinkedHashMap;
+import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.olingo.client.api.uri.QueryOption;
 import org.apache.olingo.client.api.uri.SegmentType;
 import org.apache.olingo.client.api.uri.v4.URIBuilder;
 import org.apache.olingo.client.core.uri.AbstractURIBuilder;
+import org.apache.olingo.commons.api.edm.EdmEnumType;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
 
 public class URIBuilderImpl extends AbstractURIBuilder<URIBuilder> implements URIBuilder {
 
   private static final long serialVersionUID = -3506851722447870532L;
 
-  public URIBuilderImpl(final String serviceRoot) {
-    super(serviceRoot);
+  public URIBuilderImpl(final ODataServiceVersion version, final String serviceRoot) {
+    super(version, serviceRoot);
+  }
+
+  @Override
+  public URIBuilder appendKeySegment(final EdmEnumType enumType, final String memberName) {
+    return appendKeySegment(enumType.toUriLiteral(memberName));
+  }
+
+  @Override
+  public URIBuilder appendKeySegment(final Map<String, Pair<EdmEnumType, String>> enumValues,
+          final Map<String, Object> segmentValues) {
+
+    final Map<String, Object> values = new LinkedHashMap<String, Object>();
+    for (Map.Entry<String, Pair<EdmEnumType, String>> entry : enumValues.entrySet()) {
+      values.put(entry.getKey(), entry.getValue().getKey().toUriLiteral(entry.getValue().getValue()));
+    }
+    values.putAll(segmentValues);
+
+    return appendKeySegment(values);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/c1b8976e/lib/client-core/src/main/java/org/apache/olingo/client/core/v3/ODataClientImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/v3/ODataClientImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/v3/ODataClientImpl.java
index d10c874..d6d5e36 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/v3/ODataClientImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/v3/ODataClientImpl.java
@@ -54,7 +54,7 @@ public class ODataClientImpl extends AbstractODataClient implements ODataClient
 
   private final Configuration configuration = new ConfigurationImpl();
 
-  private final FilterFactory filterFactory = new FilterFactoryImpl();
+  private final FilterFactory filterFactory = new FilterFactoryImpl(getServiceVersion());
 
   private final ODataDeserializer deserializer = new ODataDeserializerImpl(getServiceVersion());
 
@@ -95,7 +95,7 @@ public class ODataClientImpl extends AbstractODataClient implements ODataClient
 
   @Override
   public URIBuilder getURIBuilder(final String serviceRoot) {
-    return new URIBuilderImpl(configuration, serviceRoot);
+    return new URIBuilderImpl(getServiceVersion(), configuration, serviceRoot);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/c1b8976e/lib/client-core/src/main/java/org/apache/olingo/client/core/v4/ODataClientImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/v4/ODataClientImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/v4/ODataClientImpl.java
index bb12f1a..834f6f0 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/v4/ODataClientImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/v4/ODataClientImpl.java
@@ -54,7 +54,7 @@ public class ODataClientImpl extends AbstractODataClient implements ODataClient
 
   private final Configuration configuration = new ConfigurationImpl();
 
-  private final FilterFactory filterFactory = new FilterFactoryImpl();
+  private final FilterFactory filterFactory = new FilterFactoryImpl(getServiceVersion());
 
   private final ODataDeserializer deserializer = new ODataDeserializerImpl(getServiceVersion());
 
@@ -94,7 +94,7 @@ public class ODataClientImpl extends AbstractODataClient implements ODataClient
 
   @Override
   public URIBuilder getURIBuilder(final String serviceRoot) {
-    return new URIBuilderImpl(serviceRoot);
+    return new URIBuilderImpl(getServiceVersion(), serviceRoot);
   }
 
   @Override