You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2015/10/22 10:40:20 UTC

[37/48] olingo-odata4 git commit: [OLINGO-786] Annotation metadata serialization and tests

[OLINGO-786] Annotation metadata serialization and tests


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

Branch: refs/heads/master
Commit: d00e3881dcf44611ac1f778168ba95a18df6ca33
Parents: 4121024
Author: Christian Amend <ch...@sap.com>
Authored: Tue Oct 20 15:27:11 2015 +0200
Committer: Christian Amend <ch...@sap.com>
Committed: Tue Oct 20 15:27:11 2015 +0200

----------------------------------------------------------------------
 .../olingo/fit/base/MetadataTestITCase.java     |   2 +-
 .../apache/olingo/client/core/MetadataTest.java |   6 +-
 .../edm/annotation/EdmConstantExpression.java   |  37 ++-
 .../api/edm/annotation/EdmExpression.java       |  49 +++
 .../EdmLogicalOrComparisonExpression.java       |   4 +-
 .../api/edm/annotation/EdmPropertyValue.java    |   2 +-
 .../commons/api/edm/annotation/EdmUrlRef.java   |   4 +-
 .../api/edm/provider/annotation/CsdlCast.java   |  24 +-
 .../annotation/CsdlDynamicExpression.java       |  16 -
 .../provider/annotation/CsdlPropertyValue.java  |   3 +-
 .../edm/annotation/AbstractEdmExpression.java   |   2 -
 ...bstractEdmLogicalOrComparisonExpression.java |  26 ++
 .../edm/annotation/EdmAnnotationPathImpl.java   |   5 +
 .../core/edm/annotation/EdmApplyImpl.java       |   5 +
 .../core/edm/annotation/EdmCastImpl.java        |   4 +
 .../core/edm/annotation/EdmCollectionImpl.java  |   5 +
 .../annotation/EdmConstantExpressionImpl.java   | 147 ++++----
 .../commons/core/edm/annotation/EdmIfImpl.java  |   4 +
 .../core/edm/annotation/EdmIsOfImpl.java        |   4 +
 .../edm/annotation/EdmLabeledElementImpl.java   |   4 +
 .../EdmLabeledElementReferenceImpl.java         |   5 +
 .../EdmNavigationPropertyPathImpl.java          |   5 +
 .../core/edm/annotation/EdmNullImpl.java        |   5 +
 .../core/edm/annotation/EdmPathImpl.java        |   5 +
 .../edm/annotation/EdmPropertyPathImpl.java     |  11 +-
 .../edm/annotation/EdmPropertyValueImpl.java    |   9 +-
 .../core/edm/annotation/EdmRecordImpl.java      |   4 +
 .../core/edm/annotation/EdmUrlRefImpl.java      |   9 +-
 .../edm/annotations/EdmAnnotationPathTest.java  |   2 +
 .../core/edm/annotations/EdmApplyImplTest.java  |   2 +
 .../core/edm/annotations/EdmCastImplTest.java   |   2 +
 .../edm/annotations/EdmCollectionImplTest.java  |   2 +
 .../EdmConstantExpressionImplTest.java          |  13 +
 .../core/edm/annotations/EdmIfImplTest.java     |   2 +
 .../core/edm/annotations/EdmIsOfImplTest.java   |   2 +
 .../annotations/EdmLabeledElementImplTest.java  |   2 +
 .../EdmLabledElementReferenceImplTest.java      |   2 +
 .../EdmLogicalOrComparisonImplTest.java         |   2 +
 .../EdmNavigationPropertyPathImpTest.java       |   2 +
 .../core/edm/annotations/EdmPathImplTest.java   |   2 +
 .../annotations/EdmPropertyPathImplTest.java    |   2 +
 .../annotations/EdmPropertyValueImplTest.java   |  22 +-
 .../core/edm/annotations/EdmRecordImplTest.java |   2 +
 .../core/edm/annotations/EdmUrlRefImplTest.java |  15 +
 .../xml/MetadataDocumentXmlSerializer.java      | 298 +++++++++++++++--
 .../xml/MetadataDocumentXmlSerializerTest.java  | 331 +++++++++++++++++--
 46 files changed, 930 insertions(+), 181 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/fit/src/test/java/org/apache/olingo/fit/base/MetadataTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/base/MetadataTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/base/MetadataTestITCase.java
index efcc41a..5509cb2 100644
--- a/fit/src/test/java/org/apache/olingo/fit/base/MetadataTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/base/MetadataTestITCase.java
@@ -68,7 +68,7 @@ public class MetadataTestITCase extends AbstractTestITCase {
     assertNotNull(record);
     assertEquals(3, record.getPropertyValues().size());
     assertTrue(record.getPropertyValues().get(0).getValue().isConstant());
-    assertTrue((Boolean) record.getPropertyValues().get(0).getValue().asConstant().getValue().asPrimitive());
+    assertTrue((Boolean) record.getPropertyValues().get(0).getValue().asConstant().asPrimitive());
     assertTrue(record.getPropertyValues().get(1).getValue().asDynamic().isCollection());
     assertEquals(1, record.getPropertyValues().get(1).getValue().asDynamic().asCollection().getItems().size());
     assertTrue(record.getPropertyValues().get(1).getValue().asDynamic().asCollection().getItems().get(0).isDynamic());

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java
index 99aa7bd..220f293 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/MetadataTest.java
@@ -174,7 +174,7 @@ public class MetadataTest extends AbstractTest {
     final EdmAnnotation annotation = annotationGroup.getAnnotations().get(0);
     assertNotNull(annotation);
     assertTrue(annotation.getExpression().isConstant());
-    assertEquals("String", annotation.getExpression().asConstant().getValue().getType());
+    assertEquals("String", annotation.getExpression().asConstant().getExpressionName());
 
     assertEquals(10, schema.getAnnotationGroups().get(3).getAnnotations().size());
   }
@@ -333,10 +333,10 @@ public class MetadataTest extends AbstractTest {
     assertNotNull(group);
 
     final EdmAnnotation time1 = group.getAnnotations().get(0);
-    assertEquals("TimeOfDay", time1.getExpression().asConstant().getValue().getType());
+    assertEquals("TimeOfDay", time1.getExpression().asConstant().getExpressionName());
 
     final EdmAnnotation time2 = group.getAnnotations().get(1);
-    assertEquals("TimeOfDay", time2.getExpression().asConstant().getValue().getType());
+    assertEquals("TimeOfDay", time2.getExpression().asConstant().getExpressionName());
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmConstantExpression.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmConstantExpression.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmConstantExpression.java
index fd2031f..7c9c69d 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmConstantExpression.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmConstantExpression.java
@@ -6,9 +6,9 @@
  * 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
@@ -18,19 +18,40 @@
  */
 package org.apache.olingo.commons.api.edm.annotation;
 
-import org.apache.olingo.commons.api.data.Valuable;
+import java.util.List;
+
+import org.apache.olingo.commons.api.edm.geo.Geospatial;
 
 /**
  * Represents a constant expression
  */
 public interface EdmConstantExpression extends EdmExpression {
-  
+
+  // TODO: Is methods
+
+  /**
+   * The value object of this expression or null if it is of type enum or geospatial.
+   * @return a value object or null
+   */
+  Object asPrimitive();
+
+  /**
+   * A list of enum members or empty list if this expression is of type primitve or geospatial.
+   * @return a list of all enum members or empty list
+   */
+  List<String> asEnumMembers();
+
+  /**
+   * Return the Enum type name or null if this expression is of type primitve or geospatial.
+   * @return enum type name or null
+   */
+  String getEnumTypeName();
+
   /**
-   * Value of the constant expression
-   * @return value of the constant expression
+   * Return the geospatial object or null if this expression is of type primitve or enum.
+   * @return geospatial object or null
    */
-  //TODO: Delete data package dependency
-  Valuable getValue();
+  Geospatial asGeospatial();
 
   /**
    * Returns the value of the expression as String

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmExpression.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmExpression.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmExpression.java
index 3f89b6f..2f6248b 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmExpression.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmExpression.java
@@ -24,6 +24,55 @@ package org.apache.olingo.commons.api.edm.annotation;
  */
 public interface EdmExpression {
 
+  enum EdmExpressionType {
+    //Constant
+    Binary,
+    Bool,
+    Date,
+    DateTimeOffset,
+    Decimal,
+    Duration,
+    EnumMember,
+    Float,
+    Guid,
+    Int,
+    String,
+    TimeOfDay,
+    //Dynamic
+    //Logical
+    And,
+    Or,
+    Not,
+    //Comparison
+    Eq,
+    Ne,
+    Gt,
+    Ge,
+    Lt,
+    Le,
+    //Other
+    AnnotationPath,
+    Apply,
+    Cast,
+    Collection,
+    If,
+    IsOf,
+    LabeledElement,
+    LabeledElementReference,
+    Null,
+    NavigationPropertyPath,
+    Path,
+    PropertyPath,
+    Record,
+    UrlRef;
+  }
+  
+  /**
+   * See {@link EdmExpressionType} for details.
+   * @return the type of this expression
+   */
+  EdmExpressionType getExpressionType();
+  
   /**
    * Will return the name of the expression e.g. Apply or Cast.
    * @return the name of the expression

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmLogicalOrComparisonExpression.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmLogicalOrComparisonExpression.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmLogicalOrComparisonExpression.java
index 4db2eab..c44cf3a 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmLogicalOrComparisonExpression.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmLogicalOrComparisonExpression.java
@@ -18,10 +18,12 @@
  */
 package org.apache.olingo.commons.api.edm.annotation;
 
+import org.apache.olingo.commons.api.edm.EdmAnnotatable;
+
 /**
  * Represents a generic expression with two child exprssions
  */
-public interface EdmLogicalOrComparisonExpression extends EdmDynamicExpression {
+public interface EdmLogicalOrComparisonExpression extends EdmDynamicExpression, EdmAnnotatable {
 
   /**
    * Returns the first expression (left child)

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmPropertyValue.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmPropertyValue.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmPropertyValue.java
index 667f849..67aeae9 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmPropertyValue.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmPropertyValue.java
@@ -24,7 +24,7 @@ import org.apache.olingo.commons.api.edm.EdmAnnotatable;
  * The edm:PropertyValue element supplies a value to a property on the type instantiated by an 
  * edm:Record expression (See {@link EdmRecord}). The value is obtained by evaluating an expression.
  */
-public interface EdmPropertyValue extends EdmDynamicExpression, EdmAnnotatable {
+public interface EdmPropertyValue extends EdmAnnotatable {
   /**
    * Property name
    * @return Property name

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmUrlRef.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmUrlRef.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmUrlRef.java
index 1fbc63a..ff7ff17 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmUrlRef.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/annotation/EdmUrlRef.java
@@ -18,11 +18,13 @@
  */
 package org.apache.olingo.commons.api.edm.annotation;
 
+import org.apache.olingo.commons.api.edm.EdmAnnotatable;
+
 /**
  * The edm:UrlRef expression enables a value to be obtained by sending a GET request to the value of 
  * the UrlRef expression. 
  */
-public interface EdmUrlRef extends EdmDynamicExpression {
+public interface EdmUrlRef extends EdmDynamicExpression, EdmAnnotatable {
   
   /**
    * Returns a expression of type Edm.String

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlCast.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlCast.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlCast.java
index 2545f3f..6edbb3d 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlCast.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlCast.java
@@ -29,7 +29,7 @@ import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation;
  * Represents an edm:Cast expression.
  * Casts the value obtained from its single child expression to the specified type
  */
-public class CsdlCast extends CsdlDynamicExpression implements CsdlAnnotatable{
+public class CsdlCast extends CsdlDynamicExpression implements CsdlAnnotatable {
   private static final long serialVersionUID = 7664148202663405946L;
 
   private String type;
@@ -44,12 +44,12 @@ public class CsdlCast extends CsdlDynamicExpression implements CsdlAnnotatable{
   public List<CsdlAnnotation> getAnnotations() {
     return annotations;
   }
-  
+
   public CsdlCast setAnnotations(List<CsdlAnnotation> annotations) {
     this.annotations = annotations;
     return this;
   }
-  
+
   /**
    * Value cast to
    * @return value cast to
@@ -58,8 +58,9 @@ public class CsdlCast extends CsdlDynamicExpression implements CsdlAnnotatable{
     return type;
   }
 
-  public void setType(final String type) {
+  public CsdlCast setType(final String type) {
     this.type = type;
+    return this;
   }
 
   /**
@@ -70,8 +71,9 @@ public class CsdlCast extends CsdlDynamicExpression implements CsdlAnnotatable{
     return maxLength;
   }
 
-  public void setMaxLength(final Integer maxLength) {
+  public CsdlCast setMaxLength(final Integer maxLength) {
     this.maxLength = maxLength;
+    return this;
   }
 
   /**
@@ -82,8 +84,9 @@ public class CsdlCast extends CsdlDynamicExpression implements CsdlAnnotatable{
     return precision;
   }
 
-  public void setPrecision(final Integer precision) {
+  public CsdlCast setPrecision(final Integer precision) {
     this.precision = precision;
+    return this;
   }
 
   /**
@@ -94,8 +97,9 @@ public class CsdlCast extends CsdlDynamicExpression implements CsdlAnnotatable{
     return scale;
   }
 
-  public void setScale(final Integer scale) {
+  public CsdlCast setScale(final Integer scale) {
     this.scale = scale;
+    return this;
   }
 
   /**
@@ -106,8 +110,9 @@ public class CsdlCast extends CsdlDynamicExpression implements CsdlAnnotatable{
     return srid;
   }
 
-  public void setSrid(final SRID srid) {
+  public CsdlCast setSrid(final SRID srid) {
     this.srid = srid;
+    return this;
   }
 
   /**
@@ -118,7 +123,8 @@ public class CsdlCast extends CsdlDynamicExpression implements CsdlAnnotatable{
     return value;
   }
 
-  public void setValue(final CsdlExpression value) {
+  public CsdlCast setValue(final CsdlExpression value) {
     this.value = value;
+    return this;
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlDynamicExpression.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlDynamicExpression.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlDynamicExpression.java
index 3ee1468..c298f01 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlDynamicExpression.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlDynamicExpression.java
@@ -233,22 +233,6 @@ public abstract class CsdlDynamicExpression extends CsdlExpression {
   }
 
   /**
-   * Returns true if the expression is a edm:PropertyValue expression
-   * @return true if the expression is a edm:PropertyValue expression
-   */
-  public boolean isPropertyValue() {
-    return this instanceof CsdlPropertyValue;
-  }
-
-  /**
-   * Casts the expression to a {@link CsdlPropertyValue} expression
-   * @return PropertyValue expression
-   */
-  public CsdlPropertyValue asPropertyValue() {
-    return isPropertyValue() ? (CsdlPropertyValue) this : null;
-  }
-
-  /**
    * Returns true if the expression is a edm:Record expression
    * @return true if the expression is a edm:Record expression
    */

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPropertyValue.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPropertyValue.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPropertyValue.java
index 2be2891..1aec97e 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPropertyValue.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/edm/provider/annotation/CsdlPropertyValue.java
@@ -21,6 +21,7 @@ package org.apache.olingo.commons.api.edm.provider.annotation;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.olingo.commons.api.edm.provider.CsdlAbstractEdmItem;
 import org.apache.olingo.commons.api.edm.provider.CsdlAnnotatable;
 import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation;
 
@@ -30,7 +31,7 @@ import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation;
  * edm:Record expression (See {@link org.apache.olingo.commons.api.edm.annotation.EdmRecord}). 
  * The value is obtained by evaluating an expression.
  */
-public class CsdlPropertyValue extends CsdlDynamicExpression implements CsdlAnnotatable{
+public class CsdlPropertyValue extends CsdlAbstractEdmItem implements CsdlAnnotatable{
 
   private static final long serialVersionUID = -6671376680245613990L;
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/AbstractEdmExpression.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/AbstractEdmExpression.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/AbstractEdmExpression.java
index 89469df..c21c40e 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/AbstractEdmExpression.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/AbstractEdmExpression.java
@@ -141,8 +141,6 @@ public abstract class AbstractEdmExpression implements EdmExpression {
       _expression = new EdmPathImpl(edm, exp.asPath());
     } else if (exp.isPropertyPath()) {
       _expression = new EdmPropertyPathImpl(edm, exp.asPropertyPath());
-    } else if (exp.isPropertyValue()) {
-      _expression = new EdmPropertyValueImpl(edm, exp.asPropertyValue());
     } else if (exp.isRecord()) {
       _expression = new EdmRecordImpl(edm, exp.asRecord());
     } else if (exp.isUrlRef()) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/AbstractEdmLogicalOrComparisonExpression.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/AbstractEdmLogicalOrComparisonExpression.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/AbstractEdmLogicalOrComparisonExpression.java
index 9aa8b00..e79510e 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/AbstractEdmLogicalOrComparisonExpression.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/AbstractEdmLogicalOrComparisonExpression.java
@@ -41,6 +41,32 @@ public abstract class AbstractEdmLogicalOrComparisonExpression
   }
 
   @Override
+  public EdmExpressionType getExpressionType() {
+    switch (csdlExp.getType()) {
+    case And:
+      return EdmExpressionType.And;
+    case Or:
+      return EdmExpressionType.Or;
+    case Not:
+      return EdmExpressionType.Not;
+    case Eq:
+      return EdmExpressionType.Eq;
+    case Ne:
+      return EdmExpressionType.Ne;
+    case Gt:
+      return EdmExpressionType.Gt;
+    case Ge:
+      return EdmExpressionType.Ge;
+    case Lt:
+      return EdmExpressionType.Lt;
+    case Le:
+      return EdmExpressionType.Le;
+    default:
+      throw new EdmException("Invalid Expressiontype for logical or comparison expression: " + csdlExp.getType());
+    }
+  }
+
+  @Override
   public EdmExpression getLeftExpression() {
     if (left == null) {
       if (csdlExp.getLeft() == null) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmAnnotationPathImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmAnnotationPathImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmAnnotationPathImpl.java
index 2c6cf50..65b2248 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmAnnotationPathImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmAnnotationPathImpl.java
@@ -35,4 +35,9 @@ public class EdmAnnotationPathImpl extends AbstractEdmDynamicExpression implemen
   public String getValue() {
     return csdlExp.getValue();
   }
+
+  @Override
+  public EdmExpressionType getExpressionType() {
+    return EdmExpressionType.AnnotationPath;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmApplyImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmApplyImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmApplyImpl.java
index a185a55..7562b22 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmApplyImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmApplyImpl.java
@@ -65,4 +65,9 @@ public class EdmApplyImpl extends AbstractEdmAnnotatableDynamicExpression implem
     }
     return parameters;
   }
+
+  @Override
+  public EdmExpressionType getExpressionType() {
+    return EdmExpressionType.Apply;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmCastImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmCastImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmCastImpl.java
index ce793cf..830fd95 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmCastImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmCastImpl.java
@@ -81,4 +81,8 @@ public class EdmCastImpl extends AbstractEdmAnnotatableDynamicExpression impleme
     return value;
   }
 
+  @Override
+  public EdmExpressionType getExpressionType() {
+    return EdmExpressionType.Cast;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmCollectionImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmCollectionImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmCollectionImpl.java
index e8d5fca..d7b9087 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmCollectionImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmCollectionImpl.java
@@ -51,4 +51,9 @@ public class EdmCollectionImpl extends AbstractEdmDynamicExpression implements E
     }
     return items;
   }
+
+  @Override
+  public EdmExpressionType getExpressionType() {
+    return EdmExpressionType.Collection;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmConstantExpressionImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmConstantExpressionImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmConstantExpressionImpl.java
index 8e199ec..99e32fa 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmConstantExpressionImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmConstantExpressionImpl.java
@@ -19,87 +19,58 @@
 package org.apache.olingo.commons.core.edm.annotation;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
-import org.apache.commons.lang3.StringUtils;
-import org.apache.olingo.commons.api.Constants;
-import org.apache.olingo.commons.api.data.Property;
-import org.apache.olingo.commons.api.data.Valuable;
-import org.apache.olingo.commons.api.data.ValueType;
 import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
 import org.apache.olingo.commons.api.edm.annotation.EdmConstantExpression;
+import org.apache.olingo.commons.api.edm.geo.Geospatial;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression;
 import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
 
 public class EdmConstantExpressionImpl extends AbstractEdmExpression implements EdmConstantExpression {
 
-  private Valuable value;
   private EdmPrimitiveType type;
-  private final CsdlConstantExpression constExprConstruct;
+  private final CsdlConstantExpression csdlExp;
+
+  private boolean built = false;
+  private Object primitive;
+  private String enumTypeName;
+  private List<String> enumMembers;
+  private Geospatial geospatial;
 
   public EdmConstantExpressionImpl(Edm edm, final CsdlConstantExpression constExprConstruct) {
     super(edm, constExprConstruct.getType().toString());
-    this.constExprConstruct = constExprConstruct;
-  }
-
-  @Override
-  public Valuable getValue() {
-    if(value == null){
-      build();
-    }
-    return value;
+    this.csdlExp = constExprConstruct;
   }
 
   @Override
   public String getValueAsString() {
-    return constExprConstruct.getValue();
-    
-//    if (value == null) {
-//      build();
-//    }
-//    if (value == null) {
-//      return "";
-//    } else if (value.isEnum()) {
-//      return value.getValue().toString();
-//    } else if (value.isGeospatial()) {
-//      return value.toString();
-//    } else {
-//      // TODO: check after copied from ClientPrimitiveValueImpl
-//      try {
-//        return type.valueToString(value.getValue(), null, null,
-//            Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null);
-//      } catch (EdmPrimitiveTypeException e) {
-//        throw new IllegalArgumentException(e);
-//      }
-//    }
+    return csdlExp.getValue();
   }
 
   private void build() {
-    if (constExprConstruct.getType() == CsdlConstantExpression.ConstantExpressionType.EnumMember) {
-      // TODO: Delete ProeprtyValue here
-      final List<Property> enumValues = new ArrayList<Property>();
-      String enumTypeName = null;
-      for (String split : StringUtils.split(constExprConstruct.getValue(), ' ')) {
-        final String[] enumSplit = StringUtils.split(split, '/');
-        enumTypeName = enumSplit[0];
-        enumValues.add(new Property(enumSplit[0], null, ValueType.ENUM, enumSplit[1]));
+    if (csdlExp.getType() == CsdlConstantExpression.ConstantExpressionType.EnumMember) {
+      if (csdlExp.getValue() == null) {
+        throw new EdmException("Expression value must not be null");
       }
-      if (enumValues.size() == 1) {
-        value = enumValues.get(0);
-      } else {
-        final List<Property> collValue = new ArrayList<Property>();
-        for (Property enumValue : enumValues) {
-          collValue.add(enumValue);
+      final List<String> localEnumValues = new ArrayList<String>();
+      for (String split : csdlExp.getValue().split(" ")) {
+        final String[] enumSplit = split.split("/");
+        if (enumSplit.length != 2) {
+          throw new EdmException("Enum expression value must consist of enumTypeName/EnumMember.");
         }
-        value = new Property(enumTypeName, null, ValueType.COLLECTION_ENUM, collValue);
+        enumTypeName = enumSplit[0];
+        localEnumValues.add(enumSplit[1]);
       }
-      type = null;
+      enumMembers = Collections.unmodifiableList(localEnumValues);
     } else {
       EdmPrimitiveTypeKind kind;
-      switch (constExprConstruct.getType()) {
+      switch (csdlExp.getType()) {
       case Binary:
         kind = EdmPrimitiveTypeKind.Binary;
         break;
@@ -136,13 +107,75 @@ public class EdmConstantExpressionImpl extends AbstractEdmExpression implements
       }
       type = EdmPrimitiveTypeFactory.getInstance(kind);
       try {
-        final Object valueOfString = type.valueOfString(constExprConstruct.getValue(),
-            null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null,
-            type.getDefaultType());
-        value = new Property(kind.getFullQualifiedName().getName(), null, ValueType.PRIMITIVE, valueOfString);
+        primitive = type.valueOfString(csdlExp.getValue(), null, null, null, null, null, type.getDefaultType());
       } catch (EdmPrimitiveTypeException e) {
         throw new IllegalArgumentException(e);
       }
     }
+    built = true;
+  }
+
+  @Override
+  public EdmExpressionType getExpressionType() {
+    switch (csdlExp.getType()) {
+    case Binary:
+      return EdmExpressionType.Binary;
+    case Bool:
+      return EdmExpressionType.Bool;
+    case Date:
+      return EdmExpressionType.Date;
+    case DateTimeOffset:
+      return EdmExpressionType.DateTimeOffset;
+    case Decimal:
+      return EdmExpressionType.Decimal;
+    case Duration:
+      return EdmExpressionType.Duration;
+    case EnumMember:
+      return EdmExpressionType.EnumMember;
+    case Float:
+      return EdmExpressionType.Float;
+    case Guid:
+      return EdmExpressionType.Guid;
+    case Int:
+      return EdmExpressionType.Int;
+    case String:
+      return EdmExpressionType.String;
+    case TimeOfDay:
+      return EdmExpressionType.TimeOfDay;
+    default:
+      throw new EdmException("Invalid Expressiontype for constant expression: " + csdlExp.getType());
+    }
+  }
+
+  @Override
+  public Object asPrimitive() {
+    if (!built) {
+      build();
+    }
+    return primitive;
+  }
+
+  @Override
+  public List<String> asEnumMembers() {
+    if (!built) {
+      build();
+    }
+    return enumMembers;
+  }
+
+  @Override
+  public String getEnumTypeName() {
+    if (!built) {
+      build();
+    }
+    return enumTypeName;
+  }
+
+  @Override
+  public Geospatial asGeospatial() {
+    if (!built) {
+      build();
+    }
+    return geospatial;
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmIfImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmIfImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmIfImpl.java
index e33bd11..eaaeba0 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmIfImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmIfImpl.java
@@ -67,4 +67,8 @@ public class EdmIfImpl extends AbstractEdmAnnotatableDynamicExpression implement
     return _else;
   }
 
+  @Override
+  public EdmExpressionType getExpressionType() {
+    return EdmExpressionType.If;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmIsOfImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmIsOfImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmIsOfImpl.java
index aa4ed16..a6b189f 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmIsOfImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmIsOfImpl.java
@@ -83,4 +83,8 @@ public class EdmIsOfImpl extends AbstractEdmAnnotatableDynamicExpression impleme
     return value;
   }
 
+  @Override
+  public EdmExpressionType getExpressionType() {
+    return EdmExpressionType.IsOf;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmLabeledElementImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmLabeledElementImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmLabeledElementImpl.java
index babe388..64755c3 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmLabeledElementImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmLabeledElementImpl.java
@@ -54,4 +54,8 @@ public class EdmLabeledElementImpl
     return value;
   }
 
+  @Override
+  public EdmExpressionType getExpressionType() {
+    return EdmExpressionType.LabeledElement;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmLabeledElementReferenceImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmLabeledElementReferenceImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmLabeledElementReferenceImpl.java
index 5c1887c..971872a 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmLabeledElementReferenceImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmLabeledElementReferenceImpl.java
@@ -35,4 +35,9 @@ public class EdmLabeledElementReferenceImpl extends AbstractEdmDynamicExpression
   public String getValue() {
     return csdlExp.getValue();
   }
+  
+  @Override
+  public EdmExpressionType getExpressionType() {
+    return EdmExpressionType.LabeledElementReference;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmNavigationPropertyPathImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmNavigationPropertyPathImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmNavigationPropertyPathImpl.java
index 7d09276..dae9749 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmNavigationPropertyPathImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmNavigationPropertyPathImpl.java
@@ -35,4 +35,9 @@ public class EdmNavigationPropertyPathImpl extends AbstractEdmDynamicExpression
   public String getValue() {
     return csdlExp.getValue();
   }
+  
+  @Override
+  public EdmExpressionType getExpressionType() {
+    return EdmExpressionType.NavigationPropertyPath;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmNullImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmNullImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmNullImpl.java
index b1151fc..1f7222b 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmNullImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmNullImpl.java
@@ -27,4 +27,9 @@ public class EdmNullImpl extends AbstractEdmAnnotatableDynamicExpression impleme
   public EdmNullImpl(Edm edm, CsdlNull csdlExp) {
     super(edm, "Null", csdlExp);
   }
+  
+  @Override
+  public EdmExpressionType getExpressionType() {
+    return EdmExpressionType.Null;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmPathImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmPathImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmPathImpl.java
index 35c7d30..8fb662b 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmPathImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmPathImpl.java
@@ -35,4 +35,9 @@ public class EdmPathImpl extends AbstractEdmDynamicExpression implements EdmPath
   public String getValue() {
     return csdlExp.getValue();
   }
+  
+  @Override
+  public EdmExpressionType getExpressionType() {
+    return EdmExpressionType.Path;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmPropertyPathImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmPropertyPathImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmPropertyPathImpl.java
index 1f18616..efab5d5 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmPropertyPathImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmPropertyPathImpl.java
@@ -6,9 +6,9 @@
  * 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
@@ -26,7 +26,7 @@ public class EdmPropertyPathImpl extends AbstractEdmDynamicExpression implements
 
   private final CsdlPropertyPath csdlExp;
 
-  public EdmPropertyPathImpl(Edm edm, CsdlPropertyPath  csdlExp) {
+  public EdmPropertyPathImpl(Edm edm, CsdlPropertyPath csdlExp) {
     super(edm, "PropertyPath");
     this.csdlExp = csdlExp;
   }
@@ -35,4 +35,9 @@ public class EdmPropertyPathImpl extends AbstractEdmDynamicExpression implements
   public String getValue() {
     return csdlExp.getValue();
   }
+
+  @Override
+  public EdmExpressionType getExpressionType() {
+    return EdmExpressionType.PropertyPath;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmPropertyValueImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmPropertyValueImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmPropertyValueImpl.java
index 97406d4..214f528 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmPropertyValueImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmPropertyValueImpl.java
@@ -23,15 +23,15 @@ import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmPropertyValue;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlPropertyValue;
+import org.apache.olingo.commons.core.edm.AbstractEdmAnnotatable;
 
-public class EdmPropertyValueImpl
-    extends AbstractEdmAnnotatableDynamicExpression implements EdmPropertyValue {
+public class EdmPropertyValueImpl extends AbstractEdmAnnotatable implements EdmPropertyValue {
 
   private EdmExpression value;
   private CsdlPropertyValue csdlExp;
 
   public EdmPropertyValueImpl(Edm edm, CsdlPropertyValue csdlExp) {
-    super(edm, "PropertyValue", csdlExp);
+    super(edm, csdlExp);
     this.csdlExp = csdlExp;
   }
 
@@ -49,9 +49,8 @@ public class EdmPropertyValueImpl
       if (csdlExp.getValue() == null) {
         throw new EdmException("PropertyValue expressions require an expression value.");
       }
-      value = getExpression(edm, csdlExp.getValue());
+      value = AbstractEdmExpression.getExpression(edm, csdlExp.getValue());
     }
     return value;
   }
-
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmRecordImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmRecordImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmRecordImpl.java
index d4af2ee..919f189 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmRecordImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmRecordImpl.java
@@ -72,4 +72,8 @@ public class EdmRecordImpl extends AbstractEdmAnnotatableDynamicExpression imple
     return type;
   }
 
+  @Override
+  public EdmExpressionType getExpressionType() {
+    return EdmExpressionType.Record;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmUrlRefImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmUrlRefImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmUrlRefImpl.java
index 1210dbc..3803816 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmUrlRefImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/annotation/EdmUrlRefImpl.java
@@ -24,13 +24,13 @@ import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmUrlRef;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlUrlRef;
 
-public class EdmUrlRefImpl extends AbstractEdmDynamicExpression implements EdmUrlRef {
+public class EdmUrlRefImpl extends AbstractEdmAnnotatableDynamicExpression implements EdmUrlRef {
 
   private final CsdlUrlRef csdlExp;
   private EdmExpression value;
 
   public EdmUrlRefImpl(Edm edm, CsdlUrlRef csdlExp) {
-    super(edm, "UrlRef");
+    super(edm, "UrlRef", csdlExp);
     this.csdlExp = csdlExp;
   }
 
@@ -44,4 +44,9 @@ public class EdmUrlRefImpl extends AbstractEdmDynamicExpression implements EdmUr
     }
     return value;
   }
+  
+  @Override
+  public EdmExpressionType getExpressionType() {
+    return EdmExpressionType.UrlRef;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmAnnotationPathTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmAnnotationPathTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmAnnotationPathTest.java
index 122abd7..071e067 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmAnnotationPathTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmAnnotationPathTest.java
@@ -27,6 +27,7 @@ import static org.mockito.Mockito.mock;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.annotation.EdmDynamicExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
+import org.apache.olingo.commons.api.edm.annotation.EdmExpression.EdmExpressionType;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlAnnotationPath;
 import org.apache.olingo.commons.core.edm.annotation.AbstractEdmExpression;
 import org.junit.Test;
@@ -42,6 +43,7 @@ public class EdmAnnotationPathTest extends AbstractAnnotationTest {
     assertNotNull(dynExp.asAnnotationPath());
 
     assertEquals("AnnotationPath", dynExp.getExpressionName());
+    assertEquals(EdmExpressionType.AnnotationPath, dynExp.getExpressionType());
     assertNull(dynExp.asAnnotationPath().getValue());
 
     assertSingleKindDynamicExpression(dynExp);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmApplyImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmApplyImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmApplyImplTest.java
index 459536a..96706e2 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmApplyImplTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmApplyImplTest.java
@@ -32,6 +32,7 @@ import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.annotation.EdmApply;
 import org.apache.olingo.commons.api.edm.annotation.EdmDynamicExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
+import org.apache.olingo.commons.api.edm.annotation.EdmExpression.EdmExpressionType;
 import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlApply;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression;
@@ -55,6 +56,7 @@ public class EdmApplyImplTest extends AbstractAnnotationTest {
     assertNotNull(dynExp.asApply());
 
     assertEquals("Apply", dynExp.getExpressionName());
+    assertEquals(EdmExpressionType.Apply, dynExp.getExpressionType());
     assertSingleKindDynamicExpression(dynExp);
 
     EdmApply asApply = dynExp.asApply();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmCastImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmCastImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmCastImplTest.java
index 1427e18..524a8c9 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmCastImplTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmCastImplTest.java
@@ -34,6 +34,7 @@ import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
 import org.apache.olingo.commons.api.edm.annotation.EdmCast;
 import org.apache.olingo.commons.api.edm.annotation.EdmDynamicExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
+import org.apache.olingo.commons.api.edm.annotation.EdmExpression.EdmExpressionType;
 import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlCast;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression;
@@ -52,6 +53,7 @@ public class EdmCastImplTest extends AbstractAnnotationTest{
     assertNotNull(dynExp.asCast());
 
     assertEquals("Cast", dynExp.getExpressionName());
+    assertEquals(EdmExpressionType.Cast, dynExp.getExpressionType());
     assertSingleKindDynamicExpression(dynExp);
     try {
       dynExp.asCast().getValue();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmCollectionImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmCollectionImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmCollectionImplTest.java
index 0d7e72d..f8c7329 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmCollectionImplTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmCollectionImplTest.java
@@ -30,6 +30,7 @@ import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.annotation.EdmCollection;
 import org.apache.olingo.commons.api.edm.annotation.EdmDynamicExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
+import org.apache.olingo.commons.api.edm.annotation.EdmExpression.EdmExpressionType;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlCollection;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression.ConstantExpressionType;
@@ -52,6 +53,7 @@ public class EdmCollectionImplTest extends AbstractAnnotationTest {
     assertNotNull(dynExp.asCollection());
 
     assertEquals("Collection", dynExp.getExpressionName());
+    assertEquals(EdmExpressionType.Collection, dynExp.getExpressionType());
     assertSingleKindDynamicExpression(dynExp);
 
     EdmCollection asCollection = dynExp.asCollection();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmConstantExpressionImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmConstantExpressionImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmConstantExpressionImplTest.java
index e45c760..a77dc98 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmConstantExpressionImplTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmConstantExpressionImplTest.java
@@ -23,6 +23,7 @@ import static org.mockito.Mockito.mock;
 
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
+import org.apache.olingo.commons.api.edm.annotation.EdmExpression.EdmExpressionType;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression.ConstantExpressionType;
 import org.apache.olingo.commons.core.edm.annotation.AbstractEdmExpression;
@@ -37,6 +38,7 @@ public class EdmConstantExpressionImplTest extends AbstractAnnotationTest {
 
     assertConstant(exp);
 
+    assertEquals(EdmExpressionType.Binary, exp.getExpressionType());
     assertEquals("Binary", exp.asConstant().getExpressionName());
     assertEquals("qrvM3e7_", exp.asConstant().getValueAsString());
   }
@@ -48,6 +50,7 @@ public class EdmConstantExpressionImplTest extends AbstractAnnotationTest {
 
     assertConstant(exp);
 
+    assertEquals(EdmExpressionType.Bool, exp.getExpressionType());
     assertEquals("Bool", exp.asConstant().getExpressionName());
     assertEquals("true", exp.asConstant().getValueAsString());
   }
@@ -59,6 +62,7 @@ public class EdmConstantExpressionImplTest extends AbstractAnnotationTest {
 
     assertConstant(exp);
 
+    assertEquals(EdmExpressionType.Date, exp.getExpressionType());
     assertEquals("Date", exp.asConstant().getExpressionName());
     assertEquals("2012-02-29", exp.asConstant().getValueAsString());
   }
@@ -71,6 +75,7 @@ public class EdmConstantExpressionImplTest extends AbstractAnnotationTest {
 
     assertConstant(exp);
 
+    assertEquals(EdmExpressionType.DateTimeOffset, exp.getExpressionType());
     assertEquals("DateTimeOffset", exp.asConstant().getExpressionName());
     assertEquals("2012-02-29T01:02:03Z", exp.asConstant().getValueAsString());
   }
@@ -83,6 +88,7 @@ public class EdmConstantExpressionImplTest extends AbstractAnnotationTest {
 
     assertConstant(exp);
 
+    assertEquals(EdmExpressionType.Decimal, exp.getExpressionType());
     assertEquals("Decimal", exp.asConstant().getExpressionName());
     assertEquals("-123456789012345678901234567890", exp.asConstant().getValueAsString());
   }
@@ -94,6 +100,7 @@ public class EdmConstantExpressionImplTest extends AbstractAnnotationTest {
 
     assertConstant(exp);
 
+    assertEquals(EdmExpressionType.Duration, exp.getExpressionType());
     assertEquals("Duration", exp.asConstant().getExpressionName());
     assertEquals("PT10S", exp.asConstant().getValueAsString());
   }
@@ -105,6 +112,7 @@ public class EdmConstantExpressionImplTest extends AbstractAnnotationTest {
 
     assertConstant(exp);
 
+    assertEquals(EdmExpressionType.EnumMember, exp.getExpressionType());
     assertEquals("EnumMember", exp.asConstant().getExpressionName());
     assertEquals("Enum/enumMember", exp.asConstant().getValueAsString());
   }
@@ -116,6 +124,7 @@ public class EdmConstantExpressionImplTest extends AbstractAnnotationTest {
 
     assertConstant(exp);
 
+    assertEquals(EdmExpressionType.Float, exp.getExpressionType());
     assertEquals("Float", exp.asConstant().getExpressionName());
     assertEquals("1.42", exp.asConstant().getValueAsString());
   }
@@ -128,6 +137,7 @@ public class EdmConstantExpressionImplTest extends AbstractAnnotationTest {
 
     assertConstant(exp);
 
+    assertEquals(EdmExpressionType.Guid, exp.getExpressionType());
     assertEquals("Guid", exp.asConstant().getExpressionName());
     assertEquals("aabbccdd-aabb-ccdd-eeff-aabbccddeeff", exp.asConstant().getValueAsString());
   }
@@ -139,6 +149,7 @@ public class EdmConstantExpressionImplTest extends AbstractAnnotationTest {
 
     assertConstant(exp);
 
+    assertEquals(EdmExpressionType.Int, exp.getExpressionType());
     assertEquals("Int", exp.asConstant().getExpressionName());
     assertEquals("42", exp.asConstant().getValueAsString());
   }
@@ -150,6 +161,7 @@ public class EdmConstantExpressionImplTest extends AbstractAnnotationTest {
 
     assertConstant(exp);
 
+    assertEquals(EdmExpressionType.String, exp.getExpressionType());
     assertEquals("String", exp.asConstant().getExpressionName());
     assertEquals("ABCD", exp.asConstant().getValueAsString());
   }
@@ -161,6 +173,7 @@ public class EdmConstantExpressionImplTest extends AbstractAnnotationTest {
 
     assertConstant(exp);
 
+    assertEquals(EdmExpressionType.TimeOfDay, exp.getExpressionType());
     assertEquals("TimeOfDay", exp.asConstant().getExpressionName());
     assertEquals("00:00:00.999", exp.asConstant().getValueAsString());
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmIfImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmIfImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmIfImplTest.java
index fa41522..0fd94ba 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmIfImplTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmIfImplTest.java
@@ -33,6 +33,7 @@ import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.annotation.EdmDynamicExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmIf;
+import org.apache.olingo.commons.api.edm.annotation.EdmExpression.EdmExpressionType;
 import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression.ConstantExpressionType;
@@ -55,6 +56,7 @@ public class EdmIfImplTest extends AbstractAnnotationTest {
     assertNotNull(dynExp.asIf());
 
     assertEquals("If", dynExp.getExpressionName());
+    assertEquals(EdmExpressionType.If, dynExp.getExpressionType());
     assertSingleKindDynamicExpression(dynExp);
 
     EdmIf asIf = dynExp.asIf();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmIsOfImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmIsOfImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmIsOfImplTest.java
index cba3abf..256d590 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmIsOfImplTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmIsOfImplTest.java
@@ -34,6 +34,7 @@ import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
 import org.apache.olingo.commons.api.edm.annotation.EdmDynamicExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmIsOf;
+import org.apache.olingo.commons.api.edm.annotation.EdmExpression.EdmExpressionType;
 import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression.ConstantExpressionType;
@@ -52,6 +53,7 @@ public class EdmIsOfImplTest extends AbstractAnnotationTest {
     assertNotNull(dynExp.asIsOf());
 
     assertEquals("IsOf", dynExp.getExpressionName());
+    assertEquals(EdmExpressionType.IsOf, dynExp.getExpressionType());
     assertSingleKindDynamicExpression(dynExp);
     try {
       dynExp.asIsOf().getValue();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmLabeledElementImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmLabeledElementImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmLabeledElementImplTest.java
index 3a5a6a0..f9a297e 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmLabeledElementImplTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmLabeledElementImplTest.java
@@ -32,6 +32,7 @@ import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.annotation.EdmDynamicExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmLabeledElement;
+import org.apache.olingo.commons.api.edm.annotation.EdmExpression.EdmExpressionType;
 import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlLabeledElement;
@@ -50,6 +51,7 @@ public class EdmLabeledElementImplTest extends AbstractAnnotationTest {
     assertNotNull(dynExp.asLabeledElement());
 
     assertEquals("LabeledElement", dynExp.getExpressionName());
+    assertEquals(EdmExpressionType.LabeledElement, dynExp.getExpressionType());
     assertSingleKindDynamicExpression(dynExp);
 
     EdmLabeledElement asLabeled = dynExp.asLabeledElement();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmLabledElementReferenceImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmLabledElementReferenceImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmLabledElementReferenceImplTest.java
index 0fa2e64..c57af8d 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmLabledElementReferenceImplTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmLabledElementReferenceImplTest.java
@@ -27,6 +27,7 @@ import static org.mockito.Mockito.mock;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.annotation.EdmDynamicExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
+import org.apache.olingo.commons.api.edm.annotation.EdmExpression.EdmExpressionType;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlLabeledElementReference;
 import org.apache.olingo.commons.core.edm.annotation.AbstractEdmExpression;
 import org.junit.Test;
@@ -41,6 +42,7 @@ public class EdmLabledElementReferenceImplTest extends AbstractAnnotationTest {
     assertNotNull(dynExp.asLabeledElementReference());
 
     assertEquals("LabeledElementReference", dynExp.getExpressionName());
+    assertEquals(EdmExpressionType.LabeledElementReference, dynExp.getExpressionType());
     assertNull(dynExp.asLabeledElementReference().getValue());
     assertSingleKindDynamicExpression(dynExp);
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmLogicalOrComparisonImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmLogicalOrComparisonImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmLogicalOrComparisonImplTest.java
index e5a4cf9..e39f0e2 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmLogicalOrComparisonImplTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmLogicalOrComparisonImplTest.java
@@ -29,6 +29,7 @@ import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.annotation.EdmConstantExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmDynamicExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
+import org.apache.olingo.commons.api.edm.annotation.EdmExpression.EdmExpressionType;
 import org.apache.olingo.commons.api.edm.annotation.EdmLogicalOrComparisonExpression;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression.ConstantExpressionType;
@@ -50,6 +51,7 @@ public class EdmLogicalOrComparisonImplTest extends AbstractAnnotationTest {
 
       EdmDynamicExpression dynExp = assertDynamic(path);
       assertEquals(type.toString(), dynExp.getExpressionName());
+      assertEquals(EdmExpressionType.valueOf(type.toString()), dynExp.getExpressionType());
       assertSingleKindDynamicExpression(dynExp);
 
       EdmLogicalOrComparisonExpression logicOrComparisonExp = (EdmLogicalOrComparisonExpression) dynExp;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmNavigationPropertyPathImpTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmNavigationPropertyPathImpTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmNavigationPropertyPathImpTest.java
index d4fe6f1..5927cd9 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmNavigationPropertyPathImpTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmNavigationPropertyPathImpTest.java
@@ -27,6 +27,7 @@ import static org.mockito.Mockito.mock;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.annotation.EdmDynamicExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
+import org.apache.olingo.commons.api.edm.annotation.EdmExpression.EdmExpressionType;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlNavigationPropertyPath;
 import org.apache.olingo.commons.core.edm.annotation.AbstractEdmExpression;
 import org.junit.Test;
@@ -41,6 +42,7 @@ public class EdmNavigationPropertyPathImpTest extends AbstractAnnotationTest {
     assertNotNull(dynExp.asNavigationPropertyPath());
 
     assertEquals("NavigationPropertyPath", dynExp.getExpressionName());
+    assertEquals(EdmExpressionType.NavigationPropertyPath, dynExp.getExpressionType());
     assertNull(dynExp.asNavigationPropertyPath().getValue());
 
     assertSingleKindDynamicExpression(dynExp);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmPathImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmPathImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmPathImplTest.java
index 5f32f07..df73c10 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmPathImplTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmPathImplTest.java
@@ -27,6 +27,7 @@ import static org.mockito.Mockito.mock;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.annotation.EdmDynamicExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
+import org.apache.olingo.commons.api.edm.annotation.EdmExpression.EdmExpressionType;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlPath;
 import org.apache.olingo.commons.core.edm.annotation.AbstractEdmExpression;
 import org.junit.Test;
@@ -41,6 +42,7 @@ public class EdmPathImplTest extends AbstractAnnotationTest{
     assertNotNull(dynExp.asPath());
 
     assertEquals("Path", dynExp.getExpressionName());
+    assertEquals(EdmExpressionType.Path, dynExp.getExpressionType());
     assertNull(dynExp.asPath().getValue());
 
     assertSingleKindDynamicExpression(dynExp);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmPropertyPathImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmPropertyPathImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmPropertyPathImplTest.java
index eb0228e..8deda28 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmPropertyPathImplTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmPropertyPathImplTest.java
@@ -27,6 +27,7 @@ import static org.mockito.Mockito.mock;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.annotation.EdmDynamicExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
+import org.apache.olingo.commons.api.edm.annotation.EdmExpression.EdmExpressionType;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlPropertyPath;
 import org.apache.olingo.commons.core.edm.annotation.AbstractEdmExpression;
 import org.junit.Test;
@@ -42,6 +43,7 @@ public class EdmPropertyPathImplTest extends AbstractAnnotationTest {
     assertNotNull(dynExp.asPropertyPath());
 
     assertEquals("PropertyPath", dynExp.getExpressionName());
+    assertEquals(EdmExpressionType.PropertyPath, dynExp.getExpressionType());
     assertNull(dynExp.asPropertyPath().getValue());
 
     assertSingleKindDynamicExpression(dynExp);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmPropertyValueImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmPropertyValueImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmPropertyValueImplTest.java
index 28d1740..f4fd0e3 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmPropertyValueImplTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmPropertyValueImplTest.java
@@ -29,29 +29,18 @@ import java.util.List;
 
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmException;
-import org.apache.olingo.commons.api.edm.annotation.EdmDynamicExpression;
-import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmPropertyValue;
 import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression;
-import org.apache.olingo.commons.api.edm.provider.annotation.CsdlPropertyValue;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression.ConstantExpressionType;
-import org.apache.olingo.commons.core.edm.annotation.AbstractEdmExpression;
+import org.apache.olingo.commons.api.edm.provider.annotation.CsdlPropertyValue;
+import org.apache.olingo.commons.core.edm.annotation.EdmPropertyValueImpl;
 import org.junit.Test;
 
 public class EdmPropertyValueImplTest extends AbstractAnnotationTest {
   @Test
   public void initialPropertyValue() {
-    EdmExpression exp = AbstractEdmExpression.getExpression(mock(Edm.class), new CsdlPropertyValue());
-
-    EdmDynamicExpression dynExp = assertDynamic(exp);
-    assertTrue(dynExp.isPropertyValue());
-    assertNotNull(dynExp.asPropertyValue());
-
-    assertEquals("PropertyValue", dynExp.getExpressionName());
-    assertSingleKindDynamicExpression(dynExp);
-
-    EdmPropertyValue asPropValue = dynExp.asPropertyValue();
+    EdmPropertyValue asPropValue = new EdmPropertyValueImpl(mock(Edm.class), new CsdlPropertyValue());
     try {
       asPropValue.getProperty();
       fail("EdmException expected");
@@ -78,14 +67,13 @@ public class EdmPropertyValueImplTest extends AbstractAnnotationTest {
     List<CsdlAnnotation> csdlAnnotations = new ArrayList<CsdlAnnotation>();
     csdlAnnotations.add(new CsdlAnnotation().setTerm("ns.term"));
     csdlPropertyValue.setAnnotations(csdlAnnotations);
-    EdmExpression exp = AbstractEdmExpression.getExpression(mock(Edm.class), csdlPropertyValue);
-    EdmPropertyValue asPropValue = exp.asDynamic().asPropertyValue();
+    EdmPropertyValue asPropValue = new EdmPropertyValueImpl(mock(Edm.class), csdlPropertyValue);
 
     assertNotNull(asPropValue.getProperty());
     assertEquals("property", asPropValue.getProperty());
     assertNotNull(asPropValue.getValue());
     assertTrue(asPropValue.getValue().isConstant());
-    
+
     assertNotNull(asPropValue.getAnnotations());
     assertEquals(1, asPropValue.getAnnotations().size());
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmRecordImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmRecordImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmRecordImplTest.java
index 2f3bc1b..bdaca51 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmRecordImplTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmRecordImplTest.java
@@ -38,6 +38,7 @@ import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.edm.annotation.EdmDynamicExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmRecord;
+import org.apache.olingo.commons.api.edm.annotation.EdmExpression.EdmExpressionType;
 import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlPropertyValue;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlRecord;
@@ -55,6 +56,7 @@ public class EdmRecordImplTest extends AbstractAnnotationTest {
     assertNotNull(dynExp.asRecord());
 
     assertEquals("Record", dynExp.getExpressionName());
+    assertEquals(EdmExpressionType.Record, dynExp.getExpressionType());
     assertNotNull(dynExp.asRecord().getPropertyValues());
     assertTrue(dynExp.asRecord().getPropertyValues().isEmpty());
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d00e3881/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmUrlRefImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmUrlRefImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmUrlRefImplTest.java
index 1f6d703..f27847c 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmUrlRefImplTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/annotations/EdmUrlRefImplTest.java
@@ -24,11 +24,16 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.mock;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmException;
 import org.apache.olingo.commons.api.edm.annotation.EdmDynamicExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmExpression;
 import org.apache.olingo.commons.api.edm.annotation.EdmUrlRef;
+import org.apache.olingo.commons.api.edm.annotation.EdmExpression.EdmExpressionType;
+import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlConstantExpression.ConstantExpressionType;
 import org.apache.olingo.commons.api.edm.provider.annotation.CsdlNull;
@@ -47,6 +52,7 @@ public class EdmUrlRefImplTest extends AbstractAnnotationTest {
     assertNotNull(dynExp.asUrlRef());
 
     assertEquals("UrlRef", dynExp.getExpressionName());
+    assertEquals(EdmExpressionType.UrlRef, dynExp.getExpressionType());
     assertSingleKindDynamicExpression(dynExp);
 
     EdmUrlRef asUrlRef = dynExp.asUrlRef();
@@ -56,16 +62,25 @@ public class EdmUrlRefImplTest extends AbstractAnnotationTest {
     } catch (EdmException e) {
       assertEquals("URLRef expressions require an expression value.", e.getMessage());
     }
+
+    assertNotNull(asUrlRef.getAnnotations());
+    assertTrue(asUrlRef.getAnnotations().isEmpty());
   }
 
   @Test
   public void urlRefWithValue() {
     CsdlUrlRef csdlUrlRef = new CsdlUrlRef();
     csdlUrlRef.setValue(new CsdlConstantExpression(ConstantExpressionType.String));
+    List<CsdlAnnotation> csdlAnnotations = new ArrayList<CsdlAnnotation>();
+    csdlAnnotations.add(new CsdlAnnotation().setTerm("ns.term"));
+    csdlUrlRef.setAnnotations(csdlAnnotations);
     EdmExpression exp = AbstractEdmExpression.getExpression(mock(Edm.class), csdlUrlRef);
     EdmUrlRef asUrlRef = exp.asDynamic().asUrlRef();
     assertNotNull(asUrlRef.getValue());
     assertTrue(asUrlRef.getValue().isConstant());
+
+    assertNotNull(asUrlRef.getAnnotations());
+    assertEquals(1, asUrlRef.getAnnotations().size());
   }
 
   @Test