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 2016/01/12 14:08:09 UTC

[08/30] olingo-odata4 git commit: [OLINGO-834] $select parser in Java + clean-up

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d7e23bf8/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriTokenizer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriTokenizer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriTokenizer.java
index 87e09ad..8051573 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriTokenizer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriTokenizer.java
@@ -39,7 +39,11 @@ public class UriTokenizer {
     CLOSE,
     COMMA,
     SEMI,
+    DOT,
+    SLASH,
     EQ,
+    STAR,
+    PLUS,
     NULL,
 
     // variable-value tokens (convention: mixed case)
@@ -63,18 +67,18 @@ public class UriTokenizer {
     jsonArrayOrObject
   }
 
-  private final String pathSegment;
+  private final String parseString;
 
   private int startIndex = 0;
   private int index = 0;
 
-  public UriTokenizer(final String pathSegment) {
-    this.pathSegment = pathSegment == null ? "" : pathSegment;
+  public UriTokenizer(final String parseString) {
+    this.parseString = parseString == null ? "" : parseString;
   }
 
   /** Returns the string value corresponding to the last successful {@link #next(TokenKind)} call. */
   public String getText() {
-    return pathSegment.substring(startIndex, index);
+    return parseString.substring(startIndex, index);
   }
 
   /**
@@ -119,14 +123,26 @@ public class UriTokenizer {
     case SEMI:
       found = nextCharacter(';');
       break;
+    case DOT:
+      found = nextCharacter('.');
+      break;
+    case SLASH:
+      found = nextCharacter('/');
+      break;
     case EQ:
       found = nextCharacter('=');
       break;
+    case STAR:
+      found = nextCharacter('*');
+      break;
+    case PLUS:
+      found = nextCharacter('+');
+      break;
     case NULL:
       found = nextConstant("null");
       break;
     case EOF:
-      found = index >= pathSegment.length();
+      found = index >= parseString.length();
       break;
 
     // Identifiers
@@ -192,8 +208,12 @@ public class UriTokenizer {
     return found;
   }
 
+  /**
+   * Moves past the given string constant if found; otherwise leaves the index unchanged.
+   * @return whether the constant has been found at the current index
+   */
   private boolean nextConstant(final String constant) {
-    if (pathSegment.startsWith(constant, index)) {
+    if (parseString.startsWith(constant, index)) {
       index += constant.length();
       return true;
     } else {
@@ -201,10 +221,14 @@ public class UriTokenizer {
     }
   }
 
+  /**
+   * Moves past the given string constant, ignoring case, if found; otherwise leaves the index unchanged.
+   * @return whether the constant has been found at the current index
+   */
   private boolean nextConstantIgnoreCase(final String constant) {
     final int length = constant.length();
-    if (index + length <= pathSegment.length()
-        && constant.equalsIgnoreCase(pathSegment.substring(index, index + length))) {
+    if (index + length <= parseString.length()
+        && constant.equalsIgnoreCase(parseString.substring(index, index + length))) {
       index += length;
       return true;
     } else {
@@ -217,7 +241,7 @@ public class UriTokenizer {
    * @return whether the given character has been found at the current index
    */
   private boolean nextCharacter(final char character) {
-    if (index < pathSegment.length() && pathSegment.charAt(index) == character) {
+    if (index < parseString.length() && parseString.charAt(index) == character) {
       index++;
       return true;
     } else {
@@ -231,8 +255,8 @@ public class UriTokenizer {
    * @return whether the given character has been found at the current index
    */
   private boolean nextCharacterRange(final char from, final char to) {
-    if (index < pathSegment.length()) {
-      final char code = pathSegment.charAt(index);
+    if (index < parseString.length()) {
+      final char code = parseString.charAt(index);
       if (code >= from && code <= to) {
         index++;
         return true;
@@ -276,16 +300,20 @@ public class UriTokenizer {
     return nextCharacter('+') || nextCharacter('-');
   }
 
+  /**
+   * Moves past an OData identifier if found; otherwise leaves the index unchanged.
+   * @return whether an OData identifier has been found at the current index
+   */
   private boolean nextODataIdentifier() {
     int count = 0;
-    if (index < pathSegment.length()) {
-      int code = pathSegment.codePointAt(index);
+    if (index < parseString.length()) {
+      int code = parseString.codePointAt(index);
       if (Character.isUnicodeIdentifierStart(code) || code == '_') {
         count++;
         // Unicode characters outside of the Basic Multilingual Plane are represented as two Java characters.
         index += Character.isSupplementaryCodePoint(code) ? 2 : 1;
-        while (index < pathSegment.length() && count < 128) {
-          code = pathSegment.codePointAt(index);
+        while (index < parseString.length() && count < 128) {
+          code = parseString.codePointAt(index);
           if (Character.isUnicodeIdentifierPart(code) && !Character.isISOControl(code)) {
             count++;
             // Unicode characters outside of the Basic Multilingual Plane are represented as two Java characters.
@@ -299,16 +327,30 @@ public class UriTokenizer {
     return count > 0;
   }
 
+  /**
+   * Moves past a qualified name if found; otherwise leaves the index unchanged.
+   * @return whether a qualified name has been found at the current index
+   */
   private boolean nextQualifiedName() {
-    int count = 0;
-    do {
+    final int lastGoodIndex = index;
+    if (!nextODataIdentifier()) {
+      return false;
+    }
+    int count = 1;
+    while (nextCharacter('.')) {
       if (nextODataIdentifier()) {
         count++;
       } else {
-        return false;
+        index--;
+        break;
       }
-    } while (nextCharacter('.'));
-    return count >= 2;
+    }
+    if (count >= 2) {
+      return true;
+    } else {
+      index = lastGoodIndex;
+      return false;
+    }
   }
 
   private boolean nextParameterAliasName() {
@@ -323,12 +365,12 @@ public class UriTokenizer {
     if (!nextCharacter('\'')) {
       return false;
     }
-    while (index < pathSegment.length()) {
-      if (pathSegment.charAt(index) == '\'') {
+    while (index < parseString.length()) {
+      if (parseString.charAt(index) == '\'') {
         // If a single quote is followed by another single quote,
         // it represents one single quote within the string literal,
         // otherwise it marks the end of the string literal.
-        if (index + 1 < pathSegment.length() && pathSegment.charAt(index + 1) == '\'') {
+        if (index + 1 < parseString.length() && parseString.charAt(index + 1) == '\'') {
           index++;
         } else {
           break;
@@ -339,7 +381,13 @@ public class UriTokenizer {
     return nextCharacter('\'');
   }
 
+  /**
+   * Moves past an integer value if found; otherwise leaves the index unchanged.
+   * @param signed whether a sign character ('+' or '-') at the beginning is allowed
+   * @return whether an integer value has been found at the current index
+   */
   private boolean nextIntegerValue(final boolean signed) {
+    final int lastGoodIndex = index;
     if (signed) {
       nextSign();
     }
@@ -347,33 +395,53 @@ public class UriTokenizer {
     while (nextDigit()) {
       hasDigits = true;
     }
-    return hasDigits;
+    if (hasDigits) {
+      return true;
+    } else {
+      index = lastGoodIndex;
+      return false;
+    }
   }
 
-  /** Finds and returns only decimal-number tokens with a fractional part.
-   *  Whole numbers must be found with {@link #nextIntegerValue()}.
+  /**
+   * Moves past a decimal value with a fractional part if found; otherwise leaves the index unchanged.
+   * Whole numbers must be found with {@link #nextIntegerValue()}.
    */
   private boolean nextDecimalValue() {
-    return nextIntegerValue(true) && nextCharacter('.') && nextIntegerValue(false);
+    final int lastGoodIndex = index;
+    if (nextIntegerValue(true) && nextCharacter('.') && nextIntegerValue(false)) {
+      return true;
+    } else {
+      index = lastGoodIndex;
+      return false;
+    }
   }
 
   /**
-   * Finds and returns only floating-point-number tokens with an exponential part
-   * and the special three constants "NaN", "-INF", and "INF".
-   *  Whole numbers must be found with {@link #nextIntegerValue()}.
-   *  Decimal numbers must be found with {@link #nextDecimalValue()}.
+   * Moves past a floating-point-number value with an exponential part
+   * or one of the special constants "NaN", "-INF", and "INF"
+   * if found; otherwise leaves the index unchanged.
+   * Whole numbers must be found with {@link #nextIntegerValue()}.
+   * Decimal numbers must be found with {@link #nextDecimalValue()}.
    */
   private boolean nextDoubleValue() {
     if (nextConstant("NaN") || nextConstant("-INF") || nextConstant("INF")) {
       return true;
     } else {
+      final int lastGoodIndex = index;
       if (!nextIntegerValue(true)) {
         return false;
       }
       if (nextCharacter('.') && !nextIntegerValue(false)) {
+        index = lastGoodIndex;
+        return false;
+      }
+      if ((nextCharacter('E') || nextCharacter('e')) && nextIntegerValue(true)) {
+        return true;
+      } else {
+        index = lastGoodIndex;
         return false;
       }
-      return (nextCharacter('E') || nextCharacter('e')) && nextIntegerValue(true);
     }
   }
 
@@ -533,7 +601,12 @@ public class UriTokenizer {
     return false;
   }
 
+  /**
+   * Moves past a JSON string if found; otherwise leaves the index unchanged.
+   * @return whether a JSON string has been found at the current index
+   */
   private boolean nextJsonString() {
+    final int lastGoodIndex = index;
     if (nextCharacter('"')) {
       do {
         if (nextCharacter('\\')) {
@@ -541,6 +614,7 @@ public class UriTokenizer {
               || nextCharacter('n') || nextCharacter('f') || nextCharacter('r')
               || nextCharacter('"') || nextCharacter('/') || nextCharacter('\\')
               || nextCharacter('u') && nextHexDigit() && nextHexDigit() && nextHexDigit() && nextHexDigit())) {
+            index = lastGoodIndex;
             return false;
           }
         } else if (nextCharacter('"')) {
@@ -548,16 +622,17 @@ public class UriTokenizer {
         } else {
           index++;
         }
-      } while (index < pathSegment.length());
+      } while (index < parseString.length());
+      index = lastGoodIndex;
       return false;
     }
+    index = lastGoodIndex;
     return false;
   }
 
   private boolean nextJsonValue() {
     return nextConstant("null") || nextConstant("true") || nextConstant("false")
-        // If a double or decimal number is not found, the index must be reset; the internal methods don't do that.
-        || next(TokenKind.PrimitiveDoubleValue) || next(TokenKind.PrimitiveDecimalValue) || nextIntegerValue(true)
+        || nextDoubleValue() || nextDecimalValue() || nextIntegerValue(true)
         || nextJsonString()
         || nextJsonArrayOrObject();
   }
@@ -566,25 +641,42 @@ public class UriTokenizer {
     return nextJsonString() && nextCharacter(':') && nextJsonValue();
   }
 
+  /**
+   * Moves past a JSON array or object if found; otherwise leaves the index unchanged.
+   * @return whether a JSON array or object has been found at the current index
+   */
   private boolean nextJsonArrayOrObject() {
+    final int lastGoodIndex = index;
     if (nextCharacter('[')) {
       if (nextJsonValue()) {
         while (nextCharacter(',')) {
           if (!nextJsonValue()) {
+            index = lastGoodIndex;
             return false;
           }
         }
       }
-      return nextCharacter(']');
+      if (nextCharacter(']')) {
+        return true;
+      } else {
+        index = lastGoodIndex;
+        return false;
+      }
     } else if (nextCharacter('{')) {
       if (nextJsonMember()) {
         while (nextCharacter(',')) {
           if (!nextJsonMember()) {
+            index = lastGoodIndex;
             return false;
           }
         }
       }
-      return nextCharacter('}');
+      if (nextCharacter('}')) {
+        return true;
+      } else {
+        index = lastGoodIndex;
+        return false;
+      }
     } else {
       return false;
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d7e23bf8/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriInfoImplTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriInfoImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriInfoImplTest.java
new file mode 100644
index 0000000..4c76e96
--- /dev/null
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/UriInfoImplTest.java
@@ -0,0 +1,204 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.uri;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+
+import org.apache.olingo.commons.api.edm.EdmEntityType;
+import org.apache.olingo.commons.api.ex.ODataRuntimeException;
+import org.apache.olingo.server.api.uri.UriInfo;
+import org.apache.olingo.server.api.uri.UriInfoKind;
+import org.apache.olingo.server.api.uri.UriResourceAction;
+import org.apache.olingo.server.api.uri.UriResourceEntitySet;
+import org.apache.olingo.server.api.uri.queryoption.AliasQueryOption;
+import org.apache.olingo.server.api.uri.queryoption.QueryOption;
+import org.apache.olingo.server.core.uri.UriInfoImpl;
+import org.apache.olingo.server.core.uri.UriResourceActionImpl;
+import org.apache.olingo.server.core.uri.UriResourceEntitySetImpl;
+import org.apache.olingo.server.core.uri.queryoption.AliasQueryOptionImpl;
+import org.apache.olingo.server.core.uri.queryoption.CountOptionImpl;
+import org.apache.olingo.server.core.uri.queryoption.CustomQueryOptionImpl;
+import org.apache.olingo.server.core.uri.queryoption.ExpandOptionImpl;
+import org.apache.olingo.server.core.uri.queryoption.FilterOptionImpl;
+import org.apache.olingo.server.core.uri.queryoption.FormatOptionImpl;
+import org.apache.olingo.server.core.uri.queryoption.IdOptionImpl;
+import org.apache.olingo.server.core.uri.queryoption.LevelsOptionImpl;
+import org.apache.olingo.server.core.uri.queryoption.OrderByOptionImpl;
+import org.apache.olingo.server.core.uri.queryoption.SearchOptionImpl;
+import org.apache.olingo.server.core.uri.queryoption.SelectOptionImpl;
+import org.apache.olingo.server.core.uri.queryoption.SkipOptionImpl;
+import org.apache.olingo.server.core.uri.queryoption.SkipTokenOptionImpl;
+import org.apache.olingo.server.core.uri.queryoption.TopOptionImpl;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class UriInfoImplTest {
+
+  @Test
+  public void kind() {
+    final UriInfo uriInfo = new UriInfoImpl().setKind(UriInfoKind.all);
+    assertEquals(UriInfoKind.all, uriInfo.getKind());
+  }
+
+  @Test
+  public void casts() {
+    final UriInfo uriInfo = new UriInfoImpl();
+
+    assertEquals(uriInfo, uriInfo.asUriInfoAll());
+    assertEquals(uriInfo, uriInfo.asUriInfoBatch());
+    assertEquals(uriInfo, uriInfo.asUriInfoCrossjoin());
+    assertEquals(uriInfo, uriInfo.asUriInfoEntityId());
+    assertEquals(uriInfo, uriInfo.asUriInfoMetadata());
+    assertEquals(uriInfo, uriInfo.asUriInfoResource());
+    assertEquals(uriInfo, uriInfo.asUriInfoService());
+  }
+
+  @Test
+  public void entityNames() {
+    final UriInfo uriInfo = new UriInfoImpl()
+        .addEntitySetName("A")
+        .addEntitySetName("B");
+    assertArrayEquals(new String[] { "A", "B" }, uriInfo.getEntitySetNames().toArray());
+  }
+
+  @Test
+  public void resourceParts() {
+    UriInfoImpl uriInfo = new UriInfoImpl();
+
+    final UriResourceAction action = new UriResourceActionImpl();
+    final UriResourceEntitySet entitySet0 = new UriResourceEntitySetImpl();
+    final UriResourceEntitySet entitySet1 = new UriResourceEntitySetImpl();
+
+    uriInfo.addResourcePart(action);
+    uriInfo.addResourcePart(entitySet0);
+
+    assertEquals(action, uriInfo.getUriResourceParts().get(0));
+    assertEquals(entitySet0, uriInfo.getUriResourceParts().get(1));
+
+    assertEquals(entitySet0, uriInfo.getLastResourcePart());
+
+    uriInfo.addResourcePart(entitySet1);
+    assertEquals(entitySet1, uriInfo.getLastResourcePart());
+  }
+
+  @Test(expected = ODataRuntimeException.class)
+  public void doubleSystemQueryOptions() {
+    new UriInfoImpl()
+        .setSystemQueryOption(new FormatOptionImpl())
+        .setSystemQueryOption(new FormatOptionImpl());
+  }
+
+  @Test
+  public void customQueryOption() {
+    final QueryOption expand = new ExpandOptionImpl().setName("");
+    final QueryOption filter = new FilterOptionImpl().setName("");
+    final QueryOption format = new FormatOptionImpl().setName("");
+    final QueryOption id = new IdOptionImpl().setName("");
+    final QueryOption inlinecount = new CountOptionImpl().setName("");
+    final QueryOption orderby = new OrderByOptionImpl().setName("");
+    final QueryOption search = new SearchOptionImpl().setName("");
+    final QueryOption select = new SelectOptionImpl().setName("");
+    final QueryOption skip = new SkipOptionImpl().setName("");
+    final QueryOption skipToken = new SkipTokenOptionImpl().setName("");
+    final QueryOption top = new TopOptionImpl().setName("");
+    final QueryOption levels = new LevelsOptionImpl().setName("");
+
+    final QueryOption customOption0 = new CustomQueryOptionImpl().setName("").setText("A");
+    final QueryOption customOption1 = new CustomQueryOptionImpl().setName("").setText("B");
+
+    final QueryOption initialQueryOption = new CustomQueryOptionImpl();
+
+    final QueryOption alias = new AliasQueryOptionImpl().setName("alias").setText("C");
+
+    final UriInfo uriInfo = new UriInfoImpl()
+        .setQueryOptions(Arrays.asList(
+            expand,
+            filter,
+            format,
+            id,
+            inlinecount,
+            orderby,
+            search,
+            select,
+            skip,
+            skipToken,
+            top,
+            customOption0,
+            customOption1,
+            levels,
+            initialQueryOption,
+            alias));
+
+    assertEquals(12, uriInfo.getSystemQueryOptions().size());
+    assertEquals(expand, uriInfo.getExpandOption());
+    assertEquals(filter, uriInfo.getFilterOption());
+    assertEquals(format, uriInfo.getFormatOption());
+    assertEquals(id, uriInfo.getIdOption());
+    assertEquals(inlinecount, uriInfo.getCountOption());
+    assertEquals(orderby, uriInfo.getOrderByOption());
+    assertEquals(search, uriInfo.getSearchOption());
+    assertEquals(select, uriInfo.getSelectOption());
+    assertEquals(skip, uriInfo.getSkipOption());
+    assertEquals(skipToken, uriInfo.getSkipTokenOption());
+    assertEquals(top, uriInfo.getTopOption());
+
+    assertArrayEquals(new QueryOption[] { alias }, uriInfo.getAliases().toArray());
+    assertEquals("C", uriInfo.getValueForAlias("alias"));
+
+    assertArrayEquals(new QueryOption[] { customOption0, customOption1, initialQueryOption },
+        uriInfo.getCustomQueryOptions().toArray());
+  }
+
+  @Test
+  public void fragment() {
+    final UriInfo uriInfo = new UriInfoImpl().setFragment("F");
+    assertEquals("F", uriInfo.getFragment());
+  }
+
+  @Test
+  public void entityTypeCast() {
+    final EdmEntityType entityType = Mockito.mock(EdmEntityType.class);
+    final UriInfo uriInfo = new UriInfoImpl()
+        .setEntityTypeCast(entityType);
+    assertEquals(entityType, uriInfo.getEntityTypeCast());
+  }
+
+  @Test
+  public void alias() {
+    final UriInfo uriInfo = new UriInfoImpl()
+        .addAlias((AliasQueryOption) new AliasQueryOptionImpl().setName("A").setText("notUsed"))
+        .addAlias((AliasQueryOption) new AliasQueryOptionImpl().setName("A").setText("X"))
+        .addAlias((AliasQueryOption) new AliasQueryOptionImpl().setName("B").setText("Y"))
+        .addAlias((AliasQueryOption) new AliasQueryOptionImpl().setName("C").setText("Z"));
+
+    assertEquals(3, uriInfo.getAliases().size());
+    assertEquals("X", uriInfo.getValueForAlias("A"));
+    assertEquals("Y", uriInfo.getValueForAlias("B"));
+    assertEquals("Z", uriInfo.getValueForAlias("C"));
+    assertNull(uriInfo.getValueForAlias("D"));
+
+    assertTrue(uriInfo.getSystemQueryOptions().isEmpty());
+    assertTrue(uriInfo.getCustomQueryOptions().isEmpty());
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d7e23bf8/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/UriDecoderTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/UriDecoderTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/UriDecoderTest.java
new file mode 100644
index 0000000..20ab94f
--- /dev/null
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/UriDecoderTest.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.uri.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.olingo.server.api.uri.queryoption.QueryOption;
+import org.junit.Test;
+
+public class UriDecoderTest {
+
+  @Test
+  public void split() throws Exception {
+    assertTrue(UriDecoder.splitAndDecodePath("").isEmpty());
+    assertTrue(UriDecoder.splitAndDecodePath("/").isEmpty());
+    assertEquals(Arrays.asList("a"), UriDecoder.splitAndDecodePath("a"));
+    assertEquals(Arrays.asList("a"), UriDecoder.splitAndDecodePath("a/"));
+    assertEquals(Arrays.asList("a"), UriDecoder.splitAndDecodePath("/a"));
+    assertEquals(Arrays.asList("a", "a"), UriDecoder.splitAndDecodePath("a/a"));
+    assertEquals(Arrays.asList("a", "a"), UriDecoder.splitAndDecodePath("/a/a"));
+  }
+
+  @Test
+  public void path() throws Exception {
+    assertEquals(Arrays.asList("a", "entitySet('/')", "bcd"),
+        UriDecoder.splitAndDecodePath("a/entitySet('%2F')/b%63d"));
+  }
+
+  @Test
+  public void options() throws Exception {
+    assertTrue(UriDecoder.splitAndDecodeOptions("").isEmpty());
+
+    checkOption("a", "a", "");
+    checkOption("a=b", "a", "b");
+    checkOption("=", "", "");
+    checkOption("=b", "", "b");
+
+    checkOption("a&c", "a", "");
+    checkOption("a&c", "c", "");
+
+    checkOption("a=b&c", "a", "b");
+    checkOption("a=b&c", "c", "");
+
+    checkOption("a=b&c=d", "a", "b");
+    checkOption("a=b&c=d", "c", "d");
+
+    checkOption("=&=", "", "");
+    assertEquals(2, UriDecoder.splitAndDecodeOptions("=&=").size());
+
+    checkOption("=&c=d", "", "");
+    checkOption("=&c=d", "c", "d");
+
+    checkOption("a%62c=d%65f", "abc", "def");
+    checkOption("a='%26%3D'", "a", "'&='");
+  }
+
+  @Test(expected = UriParserSyntaxException.class)
+  public void wrongPercentEncoding() throws Exception {
+    UriDecoder.splitAndDecodePath("%wrong");
+  }
+
+  private void checkOption(final String query, final String name, final String value)
+      throws UriParserSyntaxException {
+    final List<QueryOption> options = UriDecoder.splitAndDecodeOptions(query);
+    for (final QueryOption option : options) {
+      if (option.getName().equals(name)) {
+        assertEquals(value, option.getText());
+        return;
+      }
+    }
+    fail("Option " + name + " not found!");
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d7e23bf8/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/UriTokenizerTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/UriTokenizerTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/UriTokenizerTest.java
index a9e97ce..177a396 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/UriTokenizerTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/UriTokenizerTest.java
@@ -51,7 +51,7 @@ public class UriTokenizerTest {
 
   @Test
   public void sequence() {
-    final UriTokenizer tokenizer = new UriTokenizer("(A=1,B=2);");
+    final UriTokenizer tokenizer = new UriTokenizer("(A=1,B=2);.*/+");
     assertTrue(tokenizer.next(TokenKind.OPEN));
     assertFalse(tokenizer.next(TokenKind.OPEN));
     assertTrue(tokenizer.next(TokenKind.ODataIdentifier));
@@ -68,6 +68,10 @@ public class UriTokenizerTest {
     assertFalse(tokenizer.next(TokenKind.EOF));
     assertTrue(tokenizer.next(TokenKind.CLOSE));
     assertTrue(tokenizer.next(TokenKind.SEMI));
+    assertTrue(tokenizer.next(TokenKind.DOT));
+    assertTrue(tokenizer.next(TokenKind.STAR));
+    assertTrue(tokenizer.next(TokenKind.SLASH));
+    assertTrue(tokenizer.next(TokenKind.PLUS));
     assertTrue(tokenizer.next(TokenKind.EOF));
   }
 
@@ -100,8 +104,10 @@ public class UriTokenizerTest {
   public void qualifiedName() {
     assertTrue(new UriTokenizer("namespace.name").next(TokenKind.QualifiedName));
 
-    final UriTokenizer tokenizer = new UriTokenizer("multi.part.namespace.name");
+    final UriTokenizer tokenizer = new UriTokenizer("multi.part.namespace.name.1");
     assertTrue(tokenizer.next(TokenKind.QualifiedName));
+    assertTrue(tokenizer.next(TokenKind.DOT));
+    assertTrue(tokenizer.next(TokenKind.PrimitiveIntegerValue));
     assertTrue(tokenizer.next(TokenKind.EOF));
 
     assertFalse(new UriTokenizer("name").next(TokenKind.QualifiedName));
@@ -334,6 +340,7 @@ public class UriTokenizerTest {
     assertFalse(new UriTokenizer("[,1]").next(TokenKind.jsonArrayOrObject));
     assertFalse(new UriTokenizer("[1,,2]").next(TokenKind.jsonArrayOrObject));
     assertFalse(new UriTokenizer("[1,x]").next(TokenKind.jsonArrayOrObject));
+    assertFalse(new UriTokenizer("[+\"x\"]").next(TokenKind.jsonArrayOrObject));
     assertFalse(new UriTokenizer("{\"name\":1,}").next(TokenKind.jsonArrayOrObject));
     assertFalse(new UriTokenizer("{,\"name\":1}").next(TokenKind.jsonArrayOrObject));
     assertFalse(new UriTokenizer("{\"name\":1,,\"name2\":2}").next(TokenKind.jsonArrayOrObject));
@@ -350,6 +357,7 @@ public class UriTokenizerTest {
     assertFalse(new UriTokenizer("[\"\\u1\"]").next(TokenKind.jsonArrayOrObject));
     assertFalse(new UriTokenizer("[\"\\u12x\"]").next(TokenKind.jsonArrayOrObject));
     assertFalse(new UriTokenizer("[\"\\u123x\"]").next(TokenKind.jsonArrayOrObject));
+    wrongToken(TokenKind.jsonArrayOrObject, "[{\"name\":+123.456},null]", '\\');
   }
 
   private void wrongToken(final TokenKind kind, final String value, final char disturbCharacter) {
@@ -358,6 +366,7 @@ public class UriTokenizerTest {
     final UriTokenizer tokenizer = new UriTokenizer(value + disturbCharacter);
     assertTrue(tokenizer.next(kind));
     assertEquals(value, tokenizer.getText());
+    assertFalse(tokenizer.next(TokenKind.EOF));
 
     // Place the disturbing character at every position in the value string
     // and check that this leads to a failed token recognition.

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d7e23bf8/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/UriInfoImplTest.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/UriInfoImplTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/UriInfoImplTest.java
deleted file mode 100644
index 20bdade..0000000
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/UriInfoImplTest.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.olingo.server.core.uri;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Arrays;
-import java.util.Collections;
-
-import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmEntityType;
-import org.apache.olingo.commons.api.ex.ODataRuntimeException;
-import org.apache.olingo.server.api.OData;
-import org.apache.olingo.server.api.edmx.EdmxReference;
-import org.apache.olingo.server.api.uri.UriInfo;
-import org.apache.olingo.server.api.uri.UriInfoKind;
-import org.apache.olingo.server.api.uri.UriResourceAction;
-import org.apache.olingo.server.api.uri.UriResourceEntitySet;
-import org.apache.olingo.server.api.uri.queryoption.AliasQueryOption;
-import org.apache.olingo.server.api.uri.queryoption.QueryOption;
-import org.apache.olingo.server.core.uri.queryoption.AliasQueryOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.CountOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.CustomQueryOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.ExpandOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.FilterOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.FormatOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.IdOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.LevelsOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.OrderByOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.SearchOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.SelectOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.SkipOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.SkipTokenOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.TopOptionImpl;
-import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
-import org.apache.olingo.server.tecsvc.provider.EntityTypeProvider;
-import org.junit.Test;
-
-public class UriInfoImplTest {
-
-  private static final Edm edm = OData.newInstance().createServiceMetadata(
-      new EdmTechProvider(), Collections.<EdmxReference> emptyList()).getEdm();
-
-  @Test
-  public void kind() {
-    final UriInfo uriInfo = new UriInfoImpl().setKind(UriInfoKind.all);
-    assertEquals(UriInfoKind.all, uriInfo.getKind());
-  }
-
-  @Test
-  public void casts() {
-    final UriInfo uriInfo = new UriInfoImpl();
-
-    assertEquals(uriInfo, uriInfo.asUriInfoAll());
-    assertEquals(uriInfo, uriInfo.asUriInfoBatch());
-    assertEquals(uriInfo, uriInfo.asUriInfoCrossjoin());
-    assertEquals(uriInfo, uriInfo.asUriInfoEntityId());
-    assertEquals(uriInfo, uriInfo.asUriInfoMetadata());
-    assertEquals(uriInfo, uriInfo.asUriInfoResource());
-    assertEquals(uriInfo, uriInfo.asUriInfoService());
-  }
-
-  @Test
-  public void entityNames() {
-    final UriInfo uriInfo = new UriInfoImpl()
-        .addEntitySetName("A")
-        .addEntitySetName("B");
-    assertArrayEquals(new String[] { "A", "B" }, uriInfo.getEntitySetNames().toArray());
-  }
-
-  @Test
-  public void resourceParts() {
-    UriInfoImpl uriInfo = new UriInfoImpl();
-
-    final UriResourceAction action = new UriResourceActionImpl();
-    final UriResourceEntitySet entitySet0 = new UriResourceEntitySetImpl();
-    final UriResourceEntitySet entitySet1 = new UriResourceEntitySetImpl();
-
-    uriInfo.addResourcePart(action);
-    uriInfo.addResourcePart(entitySet0);
-
-    assertEquals(action, uriInfo.getUriResourceParts().get(0));
-    assertEquals(entitySet0, uriInfo.getUriResourceParts().get(1));
-
-    assertEquals(entitySet0, uriInfo.getLastResourcePart());
-
-    uriInfo.addResourcePart(entitySet1);
-    assertEquals(entitySet1, uriInfo.getLastResourcePart());
-  }
-
-  @Test(expected = ODataRuntimeException.class)
-  public void doubleSystemQueryOptions() {
-    new UriInfoImpl()
-        .setSystemQueryOption(new FormatOptionImpl())
-        .setSystemQueryOption(new FormatOptionImpl());
-  }
-
-  @Test
-  public void customQueryOption() {
-    final QueryOption expand = new ExpandOptionImpl().setName("");
-    final QueryOption filter = new FilterOptionImpl().setName("");
-    final QueryOption format = new FormatOptionImpl().setName("");
-    final QueryOption id = new IdOptionImpl().setName("");
-    final QueryOption inlinecount = new CountOptionImpl().setName("");
-    final QueryOption orderby = new OrderByOptionImpl().setName("");
-    final QueryOption search = new SearchOptionImpl().setName("");
-    final QueryOption select = new SelectOptionImpl().setName("");
-    final QueryOption skip = new SkipOptionImpl().setName("");
-    final QueryOption skipToken = new SkipTokenOptionImpl().setName("");
-    final QueryOption top = new TopOptionImpl().setName("");
-    final QueryOption levels = new LevelsOptionImpl().setName("");
-
-    final QueryOption customOption0 = new CustomQueryOptionImpl().setName("").setText("A");
-    final QueryOption customOption1 = new CustomQueryOptionImpl().setName("").setText("B");
-
-    final QueryOption initialQueryOption = new CustomQueryOptionImpl();
-
-    final QueryOption alias = new AliasQueryOptionImpl().setName("alias").setText("C");
-
-    final UriInfo uriInfo = new UriInfoImpl()
-        .setQueryOptions(Arrays.asList(
-            expand,
-            filter,
-            format,
-            id,
-            inlinecount,
-            orderby,
-            search,
-            select,
-            skip,
-            skipToken,
-            top,
-            customOption0,
-            customOption1,
-            levels,
-            initialQueryOption,
-            alias));
-
-    assertEquals(12, uriInfo.getSystemQueryOptions().size());
-    assertEquals(expand, uriInfo.getExpandOption());
-    assertEquals(filter, uriInfo.getFilterOption());
-    assertEquals(format, uriInfo.getFormatOption());
-    assertEquals(id, uriInfo.getIdOption());
-    assertEquals(inlinecount, uriInfo.getCountOption());
-    assertEquals(orderby, uriInfo.getOrderByOption());
-    assertEquals(search, uriInfo.getSearchOption());
-    assertEquals(select, uriInfo.getSelectOption());
-    assertEquals(skip, uriInfo.getSkipOption());
-    assertEquals(skipToken, uriInfo.getSkipTokenOption());
-    assertEquals(top, uriInfo.getTopOption());
-
-    assertArrayEquals(new QueryOption[] { alias }, uriInfo.getAliases().toArray());
-    assertEquals("C", uriInfo.getValueForAlias("alias"));
-
-    assertArrayEquals(new QueryOption[] { customOption0, customOption1, initialQueryOption },
-        uriInfo.getCustomQueryOptions().toArray());
-  }
-
-  @Test
-  public void fragment() {
-    final UriInfo uriInfo = new UriInfoImpl().setFragment("F");
-    assertEquals("F", uriInfo.getFragment());
-  }
-
-  @Test
-  public void entityTypeCast() {
-    final EdmEntityType entityType = edm.getEntityType(EntityTypeProvider.nameETKeyNav);
-    assertNotNull(entityType);
-
-    final UriInfo uriInfo = new UriInfoImpl()
-        .setEntityTypeCast(entityType);
-    assertEquals(entityType, uriInfo.getEntityTypeCast());
-  }
-
-  @Test
-  public void alias() {
-    final UriInfo uriInfo = new UriInfoImpl()
-        .addAlias((AliasQueryOption) new AliasQueryOptionImpl().setName("A").setText("notUsed"))
-        .addAlias((AliasQueryOption) new AliasQueryOptionImpl().setName("A").setText("X"))
-        .addAlias((AliasQueryOption) new AliasQueryOptionImpl().setName("B").setText("Y"))
-        .addAlias((AliasQueryOption) new AliasQueryOptionImpl().setName("C").setText("Z"));
-
-    assertEquals(3, uriInfo.getAliases().size());
-    assertEquals("X", uriInfo.getValueForAlias("A"));
-    assertEquals("Y", uriInfo.getValueForAlias("B"));
-    assertEquals("Z", uriInfo.getValueForAlias("C"));
-    assertNull(uriInfo.getValueForAlias("D"));
-
-    assertTrue(uriInfo.getSystemQueryOptions().isEmpty());
-    assertTrue(uriInfo.getCustomQueryOptions().isEmpty());
-  }
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d7e23bf8/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java
index 11acede..e9f1c07 100644
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestFullResourcePath.java
@@ -40,18 +40,19 @@ import org.apache.olingo.server.api.uri.UriResourceKind;
 import org.apache.olingo.server.api.uri.queryoption.expression.BinaryOperatorKind;
 import org.apache.olingo.server.api.uri.queryoption.expression.MethodKind;
 import org.apache.olingo.server.core.uri.parser.UriParserException;
-import org.apache.olingo.server.core.uri.parser.UriParserSemanticException;
 import org.apache.olingo.server.core.uri.parser.UriParserSemanticException.MessageKeys;
 import org.apache.olingo.server.core.uri.parser.UriParserSyntaxException;
 import org.apache.olingo.server.core.uri.parser.search.SearchParserException;
 import org.apache.olingo.server.core.uri.testutil.FilterValidator;
 import org.apache.olingo.server.core.uri.testutil.TestUriValidator;
 import org.apache.olingo.server.core.uri.validator.UriValidationException;
+import org.apache.olingo.server.tecsvc.provider.ActionProvider;
 import org.apache.olingo.server.tecsvc.provider.ComplexTypeProvider;
 import org.apache.olingo.server.tecsvc.provider.ContainerProvider;
 import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
 import org.apache.olingo.server.tecsvc.provider.EntityTypeProvider;
 import org.apache.olingo.server.tecsvc.provider.EnumTypeProvider;
+import org.apache.olingo.server.tecsvc.provider.FunctionProvider;
 import org.apache.olingo.server.tecsvc.provider.PropertyProvider;
 import org.apache.olingo.server.tecsvc.provider.TypeDefinitionProvider;
 import org.junit.Ignore;
@@ -2731,17 +2732,6 @@ public class TestFullResourcePath {
         .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false)
         .isType(EntityTypeProvider.nameETKeyNav);
 
-    testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')", "$select=olingo.odata.test1.ETBaseTwoKeyNav"
-        + "/PropertyInt16")
-        .isKind(UriInfoKind.resource).goPath()
-        .first()
-        .isKeyPredicate(0, "PropertyInt16", "1")
-        .isKeyPredicate(1, "PropertyString", "'2'")
-        .isSelectStartType(0, EntityTypeProvider.nameETBaseTwoKeyNav)
-        .goSelectItem(0)
-        .first()
-        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
-
     testUri.run("ESKeyNav", "$expand=NavPropertyETKeyNavOne($select=PropertyInt16)")
         .isKind(UriInfoKind.resource)
         .goPath().first()
@@ -2763,17 +2753,6 @@ public class TestFullResourcePath {
         .goUpExpandValidator()
         .isSelectText("PropertyCompNav/PropertyInt16");
 
-    testUri.run("ESMixEnumDefCollComp",
-        "$select=PropertyEnumString,PropertyDefString,CollPropertyEnumString,CollPropertyDefString")
-        .isKind(UriInfoKind.resource)
-        .goSelectItemPath(0).isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false)
-        .goUpUriValidator()
-        .goSelectItemPath(1).isPrimitiveProperty("PropertyDefString", TypeDefinitionProvider.nameTDString, false)
-        .goUpUriValidator()
-        .goSelectItemPath(2).isPrimitiveProperty("CollPropertyEnumString", EnumTypeProvider.nameENString, true)
-        .goUpUriValidator()
-        .goSelectItemPath(3).isPrimitiveProperty("CollPropertyDefString", TypeDefinitionProvider.nameTDString, true);
-
     testUri.runEx("ESKeyNav", "$expand=undefined")
         .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE);
     testUri.runEx("ESTwoKeyNav", "$expand=PropertyCompNav/undefined")
@@ -2815,6 +2794,134 @@ public class TestFullResourcePath {
   }
 
   @Test
+  public void select() throws Exception {
+    testUri.run("ESTwoKeyNav", "$select=*")
+        .isSelectItemStar(0);
+
+    testUri.run("ESTwoKeyNav", "$select=olingo.odata.test1.*")
+        .isSelectItemAllOp(0, new FullQualifiedName("olingo.odata.test1", "*"));
+    testUri.run("ESTwoKeyNav", "$select=Namespace1_Alias.*")
+        .isSelectItemAllOp(0, new FullQualifiedName("Namespace1_Alias", "*"));
+
+    testUri.run("ESTwoKeyNav", "$select=PropertyString")
+        .goSelectItemPath(0).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
+
+    testUri.run("ESTwoKeyNav", "$select=PropertyComp")
+        .goSelectItemPath(0).isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false);
+
+    testUri.run("ESAllPrim", "$select=PropertyTimeOfDay,PropertyDate,NavPropertyETTwoPrimOne")
+        .isKind(UriInfoKind.resource)
+        .goSelectItemPath(0).first().isPrimitiveProperty("PropertyTimeOfDay", PropertyProvider.nameTimeOfDay, false)
+        .goUpUriValidator()
+        .goSelectItemPath(1).first().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false)
+        .goUpUriValidator()
+        .goSelectItemPath(2).first().isNavProperty("NavPropertyETTwoPrimOne", EntityTypeProvider.nameETTwoPrim, false);
+
+    testUri.run("ESMixEnumDefCollComp",
+        "$select=PropertyEnumString,PropertyDefString,CollPropertyEnumString,CollPropertyDefString")
+        .isKind(UriInfoKind.resource)
+        .goSelectItemPath(0).isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false)
+        .goUpUriValidator()
+        .goSelectItemPath(1).isPrimitiveProperty("PropertyDefString", TypeDefinitionProvider.nameTDString, false)
+        .goUpUriValidator()
+        .goSelectItemPath(2).isPrimitiveProperty("CollPropertyEnumString", EnumTypeProvider.nameENString, true)
+        .goUpUriValidator()
+        .goSelectItemPath(3).isPrimitiveProperty("CollPropertyDefString", TypeDefinitionProvider.nameTDString, true);
+
+    testUri.run("ESTwoKeyNav", "$select=PropertyComp/PropertyInt16")
+        .goSelectItemPath(0)
+        .first()
+        .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false)
+        .n()
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
+
+    testUri.run("ESTwoKeyNav", "$select=PropertyComp/PropertyComp")
+        .goSelectItemPath(0)
+        .first()
+        .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false)
+        .n()
+        .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false);
+
+    testUri.run("ESTwoKeyNav", "$select=olingo.odata.test1.ETBaseTwoKeyNav")
+        .isSelectStartType(0, EntityTypeProvider.nameETBaseTwoKeyNav);
+
+    testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')",
+        "$select=olingo.odata.test1.ETBaseTwoKeyNav/PropertyInt16")
+        .isKind(UriInfoKind.resource).goPath()
+        .first()
+        .isKeyPredicate(0, "PropertyInt16", "1")
+        .isKeyPredicate(1, "PropertyString", "'2'")
+        .isSelectStartType(0, EntityTypeProvider.nameETBaseTwoKeyNav)
+        .goSelectItem(0)
+        .first()
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
+
+    testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='1')/PropertyCompNav",
+        "$select=olingo.odata.test1.CTTwoBasePrimCompNav")
+        .isSelectStartType(0, ComplexTypeProvider.nameCTTwoBasePrimCompNav);
+
+    testUri.run("ESTwoKeyNav", "$select=PropertyCompNav/olingo.odata.test1.CTTwoBasePrimCompNav")
+        .goSelectItemPath(0)
+        .first()
+        .isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTBasePrimCompNav, false)
+        .isTypeFilter(ComplexTypeProvider.nameCTTwoBasePrimCompNav);
+
+    testUri.run("ESTwoKeyNav", "$select=PropertyCompNav/Namespace1_Alias.CTTwoBasePrimCompNav/PropertyInt16")
+        .goSelectItemPath(0)
+        .first()
+        .isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTBasePrimCompNav, false)
+        .isTypeFilter(ComplexTypeProvider.nameCTTwoBasePrimCompNav)
+        .n()
+        .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
+
+    testUri.run("ESAllPrim", "$select=olingo.odata.test1.BAESAllPrimRTETAllPrim")
+        .goSelectItemPath(0)
+        .first()
+        .isAction(ActionProvider.nameBAESAllPrimRTETAllPrim.getName());
+    testUri.run("ESTwoKeyNav", "$select=Namespace1_Alias.BFCESTwoKeyNavRTString")
+        .goSelectItemPath(0)
+        .first()
+        .isFunction(FunctionProvider.nameBFCESTwoKeyNavRTString.getName());
+    testUri.run("ESTwoKeyNav", "$select=olingo.odata.test1.BFCESTwoKeyNavRTStringParam(ParameterComp)")
+        .goSelectItemPath(0)
+        .first()
+        .isFunction(FunctionProvider.nameBFCESTwoKeyNavRTStringParam.getName());
+
+    testUri.runEx("ESMixPrimCollComp", "$select=wrong")
+        .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE);
+    testUri.runEx("ESMixPrimCollComp", "$select=PropertyComp/wrong")
+        .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE);
+    testUri.runEx("ESMixPrimCollComp", "$select=PropertyComp///PropertyInt16")
+        .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX);
+    testUri.runEx("ESMixPrimCollComp", "$select=/PropertyInt16")
+        .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX);
+    testUri.runEx("ESMixPrimCollComp", "$select=PropertyInt16+")
+        .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION);
+    testUri.runEx("ESTwoKeyNav", "$select=olingo.odata.test1.1")
+        .isExSemantic(MessageKeys.UNKNOWN_PART);
+    testUri.runEx("ESTwoKeyNav", "$select=olingo.odata.test1.ETKeyNav")
+        .isExSemantic(MessageKeys.INCOMPATIBLE_TYPE_FILTER);
+    testUri.runEx("ESTwoKeyNav", "$select=PropertyCompNav/olingo.odata.test1.CTTwoPrim")
+        .isExSemantic(MessageKeys.INCOMPATIBLE_TYPE_FILTER);
+    testUri.runEx("ESTwoKeyNav", "$select=PropertyCompNav/olingo.odata.test1.CTwrong")
+        .isExSemantic(MessageKeys.UNKNOWN_TYPE);
+    testUri.runEx("ESTwoKeyNav", "$select=PropertyCompNav/.")
+        .isExSemantic(MessageKeys.UNKNOWN_PART);
+    testUri.runEx("ESTwoKeyNav", "$select=PropertyCompNav/olingo.odata.test1.CTTwoBasePrimCompNav/.")
+        .isExSemantic(MessageKeys.UNKNOWN_PART);
+    testUri.runEx("AIRT", "$select=wrong")
+        .isExSemantic(MessageKeys.ONLY_FOR_TYPED_PARTS);
+    testUri.runEx("AIRT", "$select=olingo.odata.test1.BAESAllPrimRT")
+        .isExSemantic(MessageKeys.ONLY_FOR_TYPED_PARTS);
+    testUri.runEx("ESTwoKeyNav", "$select=olingo.odata.test1.BFwrong")
+        .isExSemantic(MessageKeys.UNKNOWN_PART);
+    testUri.runEx("ESTwoKeyNav", "$select=olingo.odata.test1.BFCESTwoKeyNavRTStringParam()")
+        .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX);
+    testUri.runEx("ESTwoKeyNav", "$select=Namespace1_Alias.BFCESTwoKeyNavRTStringParam(ParameterComp,...)")
+        .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX);
+  }
+
+  @Test
   public void runTop() throws Exception {
     // top
     testUri.run("ESKeyNav", "$top=1")
@@ -5950,7 +6057,7 @@ public class TestFullResourcePath {
 
     testUri.runEx("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTStringParam"
         + "(ParameterComp={\"PropertyInt16\":1,\"PropertyString\":\"Test\"})")
-        .isExSemantic(UriParserSemanticException.MessageKeys.INVALID_KEY_VALUE);
+        .isExSemantic(MessageKeys.INVALID_KEY_VALUE);
 
     testUri.runEx("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=null)")
         .isExValidation(UriValidationException.MessageKeys.MISSING_PARAMETER);
@@ -5964,7 +6071,7 @@ public class TestFullResourcePath {
     testUri.run("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)", "@test='null'");
 
     testUri.runEx("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test,UnknownParam=1)", "@test='null'")
-        .isExSemantic(UriParserSemanticException.MessageKeys.FUNCTION_NOT_FOUND);
+        .isExSemantic(MessageKeys.FUNCTION_NOT_FOUND);
 
     testUri.run("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)", "@test='null'");
     testUri.run("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)", "@test=null");
@@ -5975,7 +6082,7 @@ public class TestFullResourcePath {
         .isExSyntax(UriParserSyntaxException.MessageKeys.DUPLICATED_ALIAS);
 
     testUri.runEx("ESAllPrim", "$filter=FINRTInt16() eq 0")
-        .isExSemantic(UriParserSemanticException.MessageKeys.FUNCTION_IMPORT_NOT_ALLOWED);
+        .isExSemantic(MessageKeys.FUNCTION_IMPORT_NOT_ALLOWED);
 
     testUri.runEx("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam"
         + "(ParameterComp=@p1) eq 0&@p1={\"PropertyInt16\":1,\"PropertyString\":\"1\"")

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d7e23bf8/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestUriParserImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestUriParserImpl.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestUriParserImpl.java
index e6612ff..19f5946 100644
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestUriParserImpl.java
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/antlr/TestUriParserImpl.java
@@ -22,13 +22,11 @@ import java.util.Arrays;
 import java.util.Collections;
 
 import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.server.api.OData;
 import org.apache.olingo.server.api.edmx.EdmxReference;
 import org.apache.olingo.server.api.uri.UriInfoKind;
 import org.apache.olingo.server.api.uri.UriResourceKind;
 import org.apache.olingo.server.api.uri.queryoption.expression.MethodKind;
-import org.apache.olingo.server.core.uri.parser.UriParserSemanticException;
 import org.apache.olingo.server.core.uri.parser.UriParserSyntaxException;
 import org.apache.olingo.server.core.uri.testutil.FilterValidator;
 import org.apache.olingo.server.core.uri.testutil.ResourceValidator;
@@ -1112,64 +1110,6 @@ public class TestUriParserImpl {
     .isMethod(MethodKind.GEOINTERSECTS, 2);
   }
 
-  @Test
-  public void testSelect() throws Exception {
-    testUri.run("ESTwoKeyNav", "$select=*")
-    .isSelectItemStar(0);
-
-    testUri.run("ESTwoKeyNav", "$select=olingo.odata.test1.*")
-    .isSelectItemAllOp(0, new FullQualifiedName("olingo.odata.test1", "*"));
-
-    testUri.run("ESTwoKeyNav", "$select=PropertyString")
-    .goSelectItemPath(0).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false);
-
-    testUri.run("ESTwoKeyNav", "$select=PropertyComp")
-    .goSelectItemPath(0).isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false);
-
-    testUri.run("ESTwoKeyNav", "$select=PropertyComp/PropertyInt16")
-    .goSelectItemPath(0)
-    .first()
-    .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false)
-    .n()
-    .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
-
-    testUri.run("ESTwoKeyNav", "$select=PropertyComp/PropertyComp")
-    .goSelectItemPath(0)
-    .first()
-    .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false)
-    .n()
-    .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false);
-
-    testUri.run("ESTwoKeyNav", "$select=olingo.odata.test1.ETBaseTwoKeyNav")
-    .isSelectStartType(0, EntityTypeProvider.nameETBaseTwoKeyNav);
-
-    testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='1')/PropertyCompNav",
-        "$select=olingo.odata.test1.CTTwoBasePrimCompNav")
-        .isSelectStartType(0, ComplexTypeProvider.nameCTTwoBasePrimCompNav);
-
-    testUri.run("ESTwoKeyNav", "$select=PropertyCompNav/olingo.odata.test1.CTTwoBasePrimCompNav")
-    .goSelectItemPath(0)
-    .first()
-    .isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTBasePrimCompNav, false)
-    .n()
-    .isTypeFilterOnCollection(ComplexTypeProvider.nameCTTwoBasePrimCompNav);
-
-    testUri.run("ESAllPrim", "$select=PropertyTimeOfDay,PropertyDate,PropertyTimeOfDay")
-    .isKind(UriInfoKind.resource)
-    .goSelectItemPath(0).first().isPrimitiveProperty("PropertyTimeOfDay", PropertyProvider.nameTimeOfDay, false)
-    .goUpUriValidator()
-    .goSelectItemPath(1).first().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false);
-
-    testUri.runEx("ESMixPrimCollComp", "$select=wrong")
-    .isExSemantic(UriParserSemanticException.MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE);
-    testUri.runEx("ESMixPrimCollComp", "$select=PropertyComp/wrong")
-    .isExSemantic(UriParserSemanticException.MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE);
-    testUri.runEx("ESMixPrimCollComp", "$select=PropertyComp///PropertyInt16")
-    .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX);
-    testUri.runEx("ESMixPrimCollComp", "$select=/PropertyInt16")
-    .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX);
-  }
-
   private final String encode(final String uriPart) {
     return uriPart.replaceAll(":", "%3A");
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d7e23bf8/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/RawUriTest.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/RawUriTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/RawUriTest.java
deleted file mode 100644
index c897400..0000000
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/RawUriTest.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.olingo.server.core.uri.parser;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.junit.Test;
-
-public class RawUriTest {
-
-  private RawUri runRawParser(final String path, final String query, final int skipSegments)
-      throws UriParserSyntaxException {
-    return UriDecoder.decodeUri(path, query, null, skipSegments);
-  }
-
-  @Test
-  public void testOption() throws Exception {
-    RawUri rawUri;
-    rawUri = runRawParser("", "", 0);
-    checkOptionCount(rawUri, 0);
-
-    rawUri = runRawParser("", "a", 0);
-    checkOption(rawUri, 0, "a", "");
-
-    rawUri = runRawParser("", "a=b", 0);
-    checkOption(rawUri, 0, "a", "b");
-
-    rawUri = runRawParser("", "=", 0);
-    checkOption(rawUri, 0, "", "");
-
-    rawUri = runRawParser("", "=b", 0);
-    checkOption(rawUri, 0, "", "b");
-
-    rawUri = runRawParser("", "a&c", 0);
-    checkOption(rawUri, 0, "a", "");
-    checkOption(rawUri, 1, "c", "");
-
-    rawUri = runRawParser("", "a=b&c", 0);
-    checkOption(rawUri, 0, "a", "b");
-    checkOption(rawUri, 1, "c", "");
-
-    rawUri = runRawParser("", "a=b&c=d", 0);
-    checkOption(rawUri, 0, "a", "b");
-    checkOption(rawUri, 1, "c", "d");
-
-    rawUri = runRawParser("", "=&=", 0);
-    checkOption(rawUri, 0, "", "");
-    checkOption(rawUri, 1, "", "");
-
-    rawUri = runRawParser("", "=&c=d", 0);
-    checkOption(rawUri, 0, "", "");
-    checkOption(rawUri, 1, "c", "d");
-  }
-
-  private void checkOption(final RawUri rawUri, final int index, final String name, final String value) {
-    RawUri.QueryOption option = rawUri.queryOptionListDecoded.get(index);
-
-    assertEquals(name, option.name);
-    assertEquals(value, option.value);
-  }
-
-  private void checkOptionCount(final RawUri rawUri, final int count) {
-    assertEquals(count, rawUri.queryOptionListDecoded.size());
-  }
-
-  @Test
-  public void testPath() throws Exception {
-    RawUri rawUri;
-
-    rawUri = runRawParser("", null, 0);
-    checkPath(rawUri, "", Collections.<String> emptyList());
-
-    rawUri = runRawParser("/", null, 0);
-    checkPath(rawUri, "/", Collections.<String> emptyList());
-
-    rawUri = runRawParser("/entitySet", null, 0);
-    checkPath(rawUri, "/entitySet", Arrays.asList("entitySet"));
-
-    rawUri = runRawParser("//entitySet", null, 0);
-    checkPath(rawUri, "//entitySet", Arrays.asList("entitySet"));
-
-    rawUri = runRawParser("entitySet", null, 0);
-    checkPath(rawUri, "entitySet", Arrays.asList("entitySet"));
-
-    rawUri = runRawParser("/nonServiceSegment/entitySet", null, 0);
-    checkPath(rawUri, "/nonServiceSegment/entitySet", Arrays.asList("nonServiceSegment", "entitySet"));
-
-    rawUri = runRawParser("/nonServiceSegment/entitySet", null, 1);
-    checkPath(rawUri, "/nonServiceSegment/entitySet", Arrays.asList("entitySet"));
-
-    rawUri = runRawParser("nonServiceSegment/entitySet", null, 0);
-    checkPath(rawUri, "nonServiceSegment/entitySet", Arrays.asList("nonServiceSegment", "entitySet"));
-
-    rawUri = runRawParser("nonServiceSegment/entitySet", null, 1);
-    checkPath(rawUri, "nonServiceSegment/entitySet", Arrays.asList("entitySet"));
-
-    rawUri = runRawParser("non//Service/Segment///entitySet/", null, 3);
-    checkPath(rawUri, "non//Service/Segment///entitySet/", Arrays.asList("entitySet"));
-
-    rawUri = runRawParser("/a", "abc=xx+yz", 0);
-    checkPath(rawUri, "/a", Arrays.asList("a"));
-  }
-
-  @Test
-  public void testSplit() {
-    assertTrue(UriDecoder.splitSkipEmpty("", '/').isEmpty());
-    assertTrue(UriDecoder.splitSkipEmpty("/", '/').isEmpty());
-    assertEquals(Arrays.asList("a"), UriDecoder.splitSkipEmpty("a", '/'));
-    assertEquals(Arrays.asList("a"), UriDecoder.splitSkipEmpty("a/", '/'));
-    assertEquals(Arrays.asList("a"), UriDecoder.splitSkipEmpty("/a", '/'));
-    assertEquals(Arrays.asList("a", "a"), UriDecoder.splitSkipEmpty("a/a", '/'));
-    assertEquals(Arrays.asList("a", "a"), UriDecoder.splitSkipEmpty("/a/a", '/'));
-  }
-
-  private void checkPath(final RawUri rawUri, final String path, final List<String> list) {
-    assertEquals(path, rawUri.path);
-
-    assertEquals(list.size(), rawUri.pathSegmentListDecoded.size());
-
-    for (int i = 0; i < list.size(); i++) {
-      assertEquals(list.get(i), rawUri.pathSegmentListDecoded.get(i));
-    }
-  }
-
-  @Test(expected = UriParserSyntaxException.class)
-  public void wrongPercentEncoding() throws Exception {
-    runRawParser("%wrong", null, 0);
-  }
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d7e23bf8/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/ParserWithLogging.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/ParserWithLogging.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/ParserWithLogging.java
deleted file mode 100644
index 5ebc57e..0000000
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/ParserWithLogging.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.olingo.server.core.uri.testutil;
-
-import org.antlr.v4.runtime.DefaultErrorStrategy;
-import org.antlr.v4.runtime.DiagnosticErrorListener;
-import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.server.api.OData;
-import org.apache.olingo.server.core.uri.antlr.UriParserParser;
-import org.apache.olingo.server.core.uri.parser.Parser;
-
-public class ParserWithLogging extends Parser {
-  TestErrorLogger errorCollector1;
-  TestErrorLogger errorCollector2;
-
-  public ParserWithLogging(final Edm edm, final OData odata) {
-    super(edm, odata);
-    errorCollector1 = new TestErrorLogger("Stage 1", 1);
-    errorCollector2 = new TestErrorLogger("Stage 2", 1);
-  }
-
-  @Override
-  protected void addStage2ErrorStategy(final UriParserParser parser) {
-    // Don't throw an at first syntax error, so the error listener will be called
-    parser.setErrorHandler(new DefaultErrorStrategy());
-  }
-
-  @Override
-  protected void addStage1ErrorListener(final UriParserParser parser) {
-    // Log error to console
-    parser.removeErrorListeners();
-    parser.addErrorListener(errorCollector1);
-    parser.addErrorListener(new DiagnosticErrorListener());
-  }
-
-  @Override
-  protected void addStage2ErrorListener(final UriParserParser parser) {
-    // Log error to console
-    parser.removeErrorListeners();
-    parser.addErrorListener(errorCollector2);
-    parser.addErrorListener(new DiagnosticErrorListener());
-  }
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d7e23bf8/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/ResourceValidator.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/ResourceValidator.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/ResourceValidator.java
index d70b204..a9d25be 100644
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/ResourceValidator.java
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/ResourceValidator.java
@@ -52,6 +52,7 @@ import org.apache.olingo.server.api.uri.queryoption.ExpandOption;
 import org.apache.olingo.server.api.uri.queryoption.SelectItem;
 import org.apache.olingo.server.api.uri.queryoption.SelectOption;
 import org.apache.olingo.server.core.uri.UriResourceWithKeysImpl;
+import org.apache.olingo.server.core.uri.parser.Parser;
 import org.apache.olingo.server.core.uri.validator.UriValidationException;
 import org.apache.olingo.server.core.uri.validator.UriValidator;
 
@@ -85,7 +86,7 @@ public class ResourceValidator implements TestValidator {
   // --- Execution ---
 
   public ResourceValidator run(final String path) {
-    ParserWithLogging testParser = new ParserWithLogging(edm, odata);
+    Parser testParser = new Parser(edm, odata);
 
     UriInfo uriInfoTmp = null;
     uriPathInfo = null;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d7e23bf8/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/TestErrorLogger.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/TestErrorLogger.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/TestErrorLogger.java
deleted file mode 100644
index 76b0d38..0000000
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/TestErrorLogger.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.olingo.server.core.uri.testutil;
-
-import java.util.BitSet;
-import java.util.Collections;
-import java.util.List;
-
-import org.antlr.v4.runtime.ANTLRErrorListener;
-import org.antlr.v4.runtime.Parser;
-import org.antlr.v4.runtime.RecognitionException;
-import org.antlr.v4.runtime.Recognizer;
-import org.antlr.v4.runtime.atn.ATNConfigSet;
-import org.antlr.v4.runtime.dfa.DFA;
-import org.apache.olingo.server.core.uri.antlr.UriLexer;
-
-class TestErrorLogger implements ANTLRErrorListener {
-
-  private String prefix;
-  private int logLevel = 0;
-
-  public TestErrorLogger(final String prefix, final int logLevel) {
-    this.prefix = prefix;
-    this.logLevel = logLevel;
-  }
-
-  @Override
-  public void syntaxError(final Recognizer<?, ?> recognizer, final Object offendingSymbol, final int line,
-      final int charPositionInLine,
-      final String msg, final RecognitionException e) {
-
-    if (logLevel > 0) {
-      System.out.println("\n" + prefix + " -- SyntaxError");
-      trace(recognizer, offendingSymbol, line, charPositionInLine, msg, e);
-    }
-
-  }
-
-  @Override
-  public void reportAmbiguity(final Parser recognizer, final DFA dfa, final int startIndex, final int stopIndex,
-      final boolean exact,
-      final BitSet ambigAlts, final ATNConfigSet configs) {
-    // Test
-  }
-
-  @Override
-  public void reportAttemptingFullContext(final Parser recognizer, final DFA dfa, final int startIndex,
-      final int stopIndex,
-      final BitSet conflictingAlts, final ATNConfigSet configs) {
-    // Test
-  }
-
-  @Override
-  public void reportContextSensitivity(final Parser recognizer, final DFA dfa, final int startIndex,
-      final int stopIndex, final int prediction,
-      final ATNConfigSet configs) {
-    // Test
-  }
-
-  private void printStack(final Recognizer<?, ?> recognizer) {
-    List<String> stack = ((Parser) recognizer).getRuleInvocationStack();
-    Collections.reverse(stack);
-    System.out.println(" rule stack: " + stack);
-  }
-
-  public void trace(final Recognizer<?, ?> recognizer, final Object offendingSymbol,
-      final int line, final int charPositionInLine, final String msg, final RecognitionException e) {
-
-    System.out.println("Error message: " + msg);
-
-    printStack(recognizer);
-
-    System.out.println(" line/char :" + line + " / " + charPositionInLine);
-    System.out.println(" sym       :" + offendingSymbol);
-    if (e != null && e.getOffendingToken() != null) {
-
-      String lexerTokenName = "";
-      try {
-        lexerTokenName = UriLexer.VOCABULARY.getDisplayName(e.getOffendingToken().getType());
-      } catch (ArrayIndexOutOfBoundsException es) {
-        lexerTokenName = "token error";
-      }
-
-      System.out.println(" tokenname:" + lexerTokenName);
-    }
-
-  }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d7e23bf8/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/TokenValidator.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/TokenValidator.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/TokenValidator.java
index 3ec6229..547c2ea 100644
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/TokenValidator.java
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/TokenValidator.java
@@ -29,35 +29,18 @@ import org.apache.olingo.server.core.uri.antlr.UriLexer;
 public class TokenValidator {
 
   private String input = null;
-
   private List<? extends Token> tokens = null;
   private Token curToken = null;
   private Exception curException = null;
 
   private int startMode;
-  private int logLevel = 0;
-
-  // --- Setup ---
-
-  public TokenValidator log(final int logLevel) {
-    this.logLevel = logLevel;
-    return this;
-  }
 
   // --- Execution ---
 
   public TokenValidator run(final String uri) {
     input = uri;
-
     tokens = parseInput(uri);
-    if (logLevel > 0) {
-      showTokens();
-    }
-
     first();
-    exFirst();
-    logLevel = 0;
-
     return this;
   }
 
@@ -87,31 +70,6 @@ public class TokenValidator {
     return this;
   }
 
-  public TokenValidator exLast() {
-    // curException = exceptions.get(exceptions.size() - 1);
-    return this;
-  }
-
-  // navigate within the exception list
-  public TokenValidator exFirst() {
-    try {
-      // curException = exceptions.get(0);
-    } catch (IndexOutOfBoundsException ex) {
-      curException = null;
-    }
-    return this;
-
-  }
-
-  public TokenValidator exAt(final int index) {
-    try {
-      // curException = exceptions.get(index);
-    } catch (IndexOutOfBoundsException ex) {
-      curException = null;
-    }
-    return this;
-  }
-
   // --- Validation ---
 
   public TokenValidator isText(final String expected) {
@@ -162,32 +120,8 @@ public class TokenValidator {
 
   private List<? extends Token> parseInput(final String input) {
     ANTLRInputStream inputStream = new ANTLRInputStream(input);
-
-    UriLexer lexer = new UriLexerWithTrace(inputStream, logLevel, startMode);
-    // lexer.addErrorListener(new ErrorCollector(this));
+    UriLexer lexer = new UriLexer(inputStream);
+    lexer.mode(startMode);
     return lexer.getAllTokens();
   }
-
-  public TokenValidator showTokens() {
-    boolean first = true;
-    System.out.println("input: " + input);
-    String nL = "\n";
-    String out = "[" + nL;
-    for (Token token : tokens) {
-      if (!first) {
-        out += ",";
-        first = false;
-      }
-      int index = token.getType();
-      if (index != -1) {
-        out += "\"" + token.getText() + "\"" + "     " + UriLexer.VOCABULARY.getDisplayName(index) + nL;
-      } else {
-        out += "\"" + token.getText() + "\"" + "     " + index + nL;
-      }
-    }
-    out += ']';
-    System.out.println("tokens: " + out);
-    return this;
-  }
-
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/d7e23bf8/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/UriLexerWithTrace.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/UriLexerWithTrace.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/UriLexerWithTrace.java
deleted file mode 100644
index c067394..0000000
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/UriLexerWithTrace.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.olingo.server.core.uri.testutil;
-
-import org.antlr.v4.runtime.ANTLRInputStream;
-import org.antlr.v4.runtime.Token;
-import org.apache.olingo.server.core.uri.antlr.UriLexer;
-
-public class UriLexerWithTrace extends UriLexer {
-  int logLevel = 0;
-
-  public UriLexerWithTrace(final ANTLRInputStream antlrInputStream, final int logLevel) {
-    super(antlrInputStream);
-    this.logLevel = logLevel;
-  }
-
-  public UriLexerWithTrace(final ANTLRInputStream antlrInputStream, final int logLevel, final int mode) {
-    super(antlrInputStream);
-    super.mode(mode);
-    this.logLevel = logLevel;
-  }
-
-  @Override
-  public void emit(final Token token) {
-    if (logLevel > 1) {
-      String out = String.format("%1$-" + 20 + "s", token.getText());
-
-      int tokenType = token.getType();
-      if (tokenType == -1) {
-        out += "-1/EOF";
-      } else {
-        out += UriLexer.VOCABULARY.getDisplayName(tokenType);
-      }
-      System.out.println("Lexer.emit(...):" + out);
-    }
-
-    super.emit(token);
-  }
-
-  @Override
-  public void pushMode(final int m) {
-
-    String out = UriLexer.modeNames[_mode] + "-->";
-
-    super.pushMode(m);
-
-    out += UriLexer.modeNames[_mode];
-
-    if (logLevel > 1) {
-      System.out.println(out + "            ");
-    }
-  }
-
-  @Override
-  public int popMode() {
-
-    String out = UriLexer.modeNames[_mode] + "-->";
-
-    int m = super.popMode();
-
-    out += UriLexer.modeNames[_mode];
-
-    if (logLevel > 1) {
-      System.out.println(out + "            ");
-    }
-
-    return m;
-  }
-}