You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by sk...@apache.org on 2014/04/04 07:50:56 UTC

[02/21] git commit: [OLINGO-206] introduce decision matrix

[OLINGO-206] introduce decision matrix


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

Branch: refs/heads/master
Commit: c0db941b8529f224540062073f6466d2076696a3
Parents: df675e1
Author: Stephan Klevenz <st...@sap.com>
Authored: Mon Mar 17 17:14:27 2014 +0100
Committer: Stephan Klevenz <st...@sap.com>
Committed: Mon Mar 17 17:16:49 2014 +0100

----------------------------------------------------------------------
 .../apache/olingo/server/api/uri/UriInfo.java   |   7 +
 .../olingo/server/core/uri/UriInfoImpl.java     | 101 ++++++------
 .../uri/validator/SystemQueryValidator.java     | 159 +++++++++++++++++++
 .../uri/validator/UriValidationException.java   |   4 +
 .../server/core/uri/validator/Validator.java    |  37 -----
 .../core/uri/validator/UriEdmValidatorTest.java |  66 ++++----
 6 files changed, 254 insertions(+), 120 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0db941b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfo.java
----------------------------------------------------------------------
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfo.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfo.java
index 41d9c6c..c0a140c 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfo.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/UriInfo.java
@@ -18,6 +18,11 @@
  */
 package org.apache.olingo.server.api.uri;
 
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.olingo.server.api.uri.queryoption.SystemQueryOption;
+
 /**
  * Object acting as general access to URI information extracted from the request URI. Depending on
  * the URI info kind different interfaces are used to provide access to that information. </p>
@@ -43,4 +48,6 @@ public interface UriInfo extends
 
   public UriInfoResource asUriInfoResource();
 
+  public Collection<SystemQueryOption> getSystemQueryOptions();
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0db941b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriInfoImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriInfoImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriInfoImpl.java
index a04b55f..758d8d9 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriInfoImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriInfoImpl.java
@@ -1,27 +1,30 @@
-/* 
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
+ * or more contributor license agreements. See the NOTICE file
  * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
+ * 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
- *
+ * 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
+ * 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 java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 
+import org.apache.olingo.commons.api.ODataRuntimeException;
 import org.apache.olingo.commons.api.edm.EdmEntityType;
 import org.apache.olingo.server.api.uri.UriInfo;
 import org.apache.olingo.server.api.uri.UriInfoAll;
@@ -44,22 +47,12 @@ import org.apache.olingo.server.api.uri.queryoption.SearchOption;
 import org.apache.olingo.server.api.uri.queryoption.SelectOption;
 import org.apache.olingo.server.api.uri.queryoption.SkipOption;
 import org.apache.olingo.server.api.uri.queryoption.SkipTokenOption;
+import org.apache.olingo.server.api.uri.queryoption.SystemQueryOption;
 import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind;
 import org.apache.olingo.server.api.uri.queryoption.TopOption;
-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.OrderByOptionImpl;
 import org.apache.olingo.server.core.uri.queryoption.QueryOptionImpl;
-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.SystemQueryOptionImpl;
-import org.apache.olingo.server.core.uri.queryoption.TopOptionImpl;
 
 public class UriInfoImpl implements UriInfo {
 
@@ -68,19 +61,10 @@ public class UriInfoImpl implements UriInfo {
   private List<String> entitySetNames = new ArrayList<String>(); // for $entity
   private EdmEntityType entityTypeCast; // for $entity
 
-  // Query options
   private List<CustomQueryOptionImpl> customQueryOptions = new ArrayList<CustomQueryOptionImpl>();
-  private ExpandOptionImpl expandOption;
-  private FilterOptionImpl filterOption;
-  private FormatOptionImpl formatOption;
-  private IdOption idOption;
-  private CountOptionImpl inlineCountOption;
-  private OrderByOptionImpl orderByOption;
-  private SearchOptionImpl searchOption;
-  private SelectOptionImpl selectOption;
-  private SkipOptionImpl skipOption;
-  private SkipTokenOptionImpl skipTokenOption;
-  private TopOptionImpl topOption;
+
+  HashMap<SystemQueryOptionKind, SystemQueryOption> systemQueryOptions =
+      new HashMap<SystemQueryOptionKind, SystemQueryOption>();
 
   private String fragment;
 
@@ -162,27 +146,27 @@ public class UriInfoImpl implements UriInfo {
 
   @Override
   public ExpandOption getExpandOption() {
-    return expandOption;
+    return (ExpandOption) systemQueryOptions.get(SystemQueryOptionKind.EXPAND);
   }
 
   @Override
   public FilterOption getFilterOption() {
-    return filterOption;
+    return (FilterOption) systemQueryOptions.get(SystemQueryOptionKind.FILTER);
   }
 
   @Override
   public FormatOption getFormatOption() {
-    return formatOption;
+    return (FormatOption) systemQueryOptions.get(SystemQueryOptionKind.FORMAT);
   }
 
   @Override
   public IdOption getIdOption() {
-    return idOption;
+    return (IdOption) systemQueryOptions.get(SystemQueryOptionKind.ID);
   }
 
   @Override
   public CountOption getCountOption() {
-    return inlineCountOption;
+    return (CountOption) systemQueryOptions.get(SystemQueryOptionKind.COUNT);
   }
 
   @Override
@@ -201,33 +185,33 @@ public class UriInfoImpl implements UriInfo {
 
   @Override
   public OrderByOption getOrderByOption() {
-    return orderByOption;
+    return (OrderByOption) systemQueryOptions.get(SystemQueryOptionKind.ORDERBY);
   }
 
   @Override
   public SearchOption getSearchOption() {
 
-    return searchOption;
+    return (SearchOption) systemQueryOptions.get(SystemQueryOptionKind.SEARCH);
   }
 
   @Override
   public SelectOption getSelectOption() {
-    return selectOption;
+    return (SelectOption) systemQueryOptions.get(SystemQueryOptionKind.SELECT);
   }
 
   @Override
   public SkipOption getSkipOption() {
-    return skipOption;
+    return (SkipOption) systemQueryOptions.get(SystemQueryOptionKind.SKIP);
   }
 
   @Override
   public SkipTokenOption getSkipTokenOption() {
-    return skipTokenOption;
+    return (SkipTokenOption) systemQueryOptions.get(SystemQueryOptionKind.SKIPTOKEN);
   }
 
   @Override
   public TopOption getTopOption() {
-    return topOption;
+    return (TopOption) systemQueryOptions.get(SystemQueryOptionKind.TOP);
   }
 
   public UriInfoImpl setQueryOptions(final List<QueryOptionImpl> list) {
@@ -249,28 +233,33 @@ public class UriInfoImpl implements UriInfo {
   public UriInfoImpl setSystemQueryOption(final SystemQueryOptionImpl systemOption) {
 
     if (systemOption.getKind() == SystemQueryOptionKind.EXPAND) {
-      expandOption = (ExpandOptionImpl) systemOption;
+      systemQueryOptions.put(SystemQueryOptionKind.EXPAND, systemOption);
     } else if (systemOption.getKind() == SystemQueryOptionKind.FILTER) {
-      filterOption = (FilterOptionImpl) systemOption;
+      systemQueryOptions.put(SystemQueryOptionKind.FILTER, systemOption);
     } else if (systemOption.getKind() == SystemQueryOptionKind.FORMAT) {
-      formatOption = (FormatOptionImpl) systemOption;
+      systemQueryOptions.put(SystemQueryOptionKind.FORMAT, systemOption);
     } else if (systemOption.getKind() == SystemQueryOptionKind.ID) {
-      idOption = (IdOptionImpl) systemOption;
+      systemQueryOptions.put(SystemQueryOptionKind.ID, systemOption);
     } else if (systemOption.getKind() == SystemQueryOptionKind.COUNT) {
-      inlineCountOption = (CountOptionImpl) systemOption;
+      systemQueryOptions.put(SystemQueryOptionKind.COUNT, systemOption);
     } else if (systemOption.getKind() == SystemQueryOptionKind.ORDERBY) {
-      orderByOption = (OrderByOptionImpl) systemOption;
+      systemQueryOptions.put(SystemQueryOptionKind.ORDERBY, systemOption);
     } else if (systemOption.getKind() == SystemQueryOptionKind.SEARCH) {
-      searchOption = (SearchOptionImpl) systemOption;
+      systemQueryOptions.put(SystemQueryOptionKind.SEARCH, systemOption);
     } else if (systemOption.getKind() == SystemQueryOptionKind.SELECT) {
-      selectOption = (SelectOptionImpl) systemOption;
+      systemQueryOptions.put(SystemQueryOptionKind.SELECT, systemOption);
     } else if (systemOption.getKind() == SystemQueryOptionKind.SKIP) {
-      skipOption = (SkipOptionImpl) systemOption;
+      systemQueryOptions.put(SystemQueryOptionKind.SKIP, systemOption);
     } else if (systemOption.getKind() == SystemQueryOptionKind.SKIPTOKEN) {
-      skipTokenOption = (SkipTokenOptionImpl) systemOption;
+      systemQueryOptions.put(SystemQueryOptionKind.SKIPTOKEN, systemOption);
     } else if (systemOption.getKind() == SystemQueryOptionKind.TOP) {
-      topOption = (TopOptionImpl) systemOption;
+      systemQueryOptions.put(SystemQueryOptionKind.TOP, systemOption);
+    } else if (systemOption.getKind() == SystemQueryOptionKind.LEVELS) {
+      systemQueryOptions.put(SystemQueryOptionKind.LEVELS, systemOption);
+    } else {
+      throw new ODataRuntimeException("Unsupported System Query Option: " + systemOption.getName());
     }
+
     return this;
   }
 
@@ -291,6 +280,10 @@ public class UriInfoImpl implements UriInfo {
 
   public void removeResourcePart(int index) {
     this.pathParts.remove(index);
-    
+  }
+
+  @Override
+  public Collection<SystemQueryOption> getSystemQueryOptions() {
+    return Collections.unmodifiableCollection(systemQueryOptions.values());
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0db941b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/SystemQueryValidator.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/SystemQueryValidator.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/SystemQueryValidator.java
new file mode 100644
index 0000000..0fd944f
--- /dev/null
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/SystemQueryValidator.java
@@ -0,0 +1,159 @@
+/*
+ * 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.validator;
+
+import org.apache.olingo.commons.api.ODataRuntimeException;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.server.api.uri.UriInfo;
+import org.apache.olingo.server.api.uri.queryoption.SystemQueryOption;
+import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind;
+
+public class SystemQueryValidator {
+
+  //@formatter:off (Eclipse formatter)
+  //CHECKSTYLE:OFF (Maven checkstyle)
+  private boolean[][] decisionMatrix =
+      {
+          /*                                       FILTER FORMAT EXPAND ID     COUNT  ORDERBY SEARCH SELECT SKIP   SKIPTOKEN LEVELS TOP */
+          /*                              all */ { true , true , true , false, true , true ,  true , true , true , true ,    true , false },
+          /*                            batch */ { false, false, false, false, false, false,  false, false, false, false,    false, false },
+          /*                        crossjoin */ { true , true , true , false, true , true ,  true , true , true , true ,    true , true  },
+          /*                         entityId */ { false, true , true , true , false, false,  false, true , false, false,    true , false },
+          /*                         metadata */ { false, true , false, false, false, false,  false, false, false, false,    false, false },
+          /*                         resource */ { false, true , false, false, false, false,  false, false, false, false,    false, false },
+          /*                          service */ { false, true , false, false, false, false,  false, false, false, false,    false, false },
+          /*                        entitySet */ { true , true , true , false, true , true ,  true , true , true , true ,    true , true  },
+          /*                   entitySetCount */ { false, false, false, false, false, false,  false, false, false, false,    false, false },
+          /*                           entity */ { false, true , true , false, false, false,  false, true , false, false,    true , false },
+          /*                      mediaStream */ { false, true , false, false, false, false,  false, false, false, false,    false, false },
+          /*                       references */ { true , true , false, false, false, true ,  true , false, true , true ,    false, true  },
+          /*                        reference */ { false, true , false, false, false, false,  false, false, false, false,    false, false },
+          /*                  propertyComplex */ { false, true , true , false, false, false,  false, true , false, false,    true , false },
+          /*        propertyComplexCollection */ { true , true , true , false, true , true ,  false, false, true , true ,    true , true  },
+          /*   propertyComplexCollectionCount */ { false, false, false, false, false, false,  false, false, false, false,    false, false },
+          /*                propertyPrimitive */ { false, true , false, false, false, false,  false, false, false, false,    false, false },
+          /*      propertyPrimitiveCollection */ { true , true , false, false, false, true ,  false, false, true , true ,    false, true  },
+          /* propertyPrimitiveCollectionCount */ { false, false, false, false, false, false,  false, false, false, false,    false, false },
+          /*           propertyPrimitiveValue */ { false, true , false, false, false, false,  false, false, false, false,    false, false },          
+      };
+  //CHECKSTYLE:ON
+  //@formatter:on
+
+  public void validate(final UriInfo uriInfo, final Edm edm) throws UriValidationException {
+
+    validateQueryOptions(uriInfo);
+    validateKeyPredicateTypes(uriInfo, edm);
+
+  }
+
+  private int colIndex(SystemQueryOptionKind queryOptionKind) {
+    int idx;
+    switch (queryOptionKind) {
+    case FILTER:
+      idx = 0;
+      break;
+    case FORMAT:
+      idx = 1;
+      break;
+    case EXPAND:
+      idx = 2;
+      break;
+    case ID:
+      idx = 3;
+      break;
+    case COUNT:
+      idx = 4;
+      break;
+    case ORDERBY:
+      idx = 5;
+      break;
+    case SEARCH:
+      idx = 6;
+      break;
+    case SELECT:
+      idx = 7;
+      break;
+    case SKIP:
+      idx = 8;
+      break;
+    case SKIPTOKEN:
+      idx = 9;
+      break;
+    case LEVELS:
+      idx = 10;
+      break;
+    case TOP:
+      idx = 11;
+      break;
+    default:
+      throw new ODataRuntimeException("Unsupported Option: " + queryOptionKind);
+    }
+
+    return idx;
+  }
+
+  private int rowIndex(final UriInfo uriInfo) {
+    int idx;
+
+    switch (uriInfo.getKind()) {
+    case all:
+      idx = 0;
+      break;
+    case batch:
+      idx = 1;
+      break;
+    case crossjoin:
+      idx = 2;
+      break;
+    case entityId:
+      idx = 3;
+      break;
+    case metadata:
+      idx = 4;
+      break;
+    case resource:
+      idx = 5;
+      break;
+    case service:
+      idx = 6;
+      break;
+    default:
+      throw new ODataRuntimeException("Unsupported Option: " + uriInfo.getKind());
+    }
+
+    return idx;
+  }
+
+  private void validateKeyPredicateTypes(final UriInfo uriInfo, final Edm edm) throws UriValidationException {
+
+  }
+
+  private void validateQueryOptions(final UriInfo uriInfo) throws UriValidationException {
+    int row = rowIndex(uriInfo);
+
+    for (SystemQueryOption option : uriInfo.getSystemQueryOptions()) {
+      int col = colIndex(option.getKind());
+      if (!decisionMatrix[row][col]) {
+        throw new UriValidationException("Unsupported System Query Option for Uri Type: " + option.getName());
+      }
+    }
+
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0db941b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidationException.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidationException.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidationException.java
index d0f4b8c..3ba323d 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidationException.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidationException.java
@@ -20,6 +20,10 @@ package org.apache.olingo.server.core.uri.validator;
 
 public class UriValidationException extends Exception {
 
+  public UriValidationException(String msg) {
+    super(msg);
+  }
+
   private static final long serialVersionUID = -3179078078053564742L;
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0db941b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/Validator.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/Validator.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/Validator.java
deleted file mode 100644
index 0442563..0000000
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/Validator.java
+++ /dev/null
@@ -1,37 +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.validator;
-
-import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.server.api.uri.UriInfo;
-
-public class Validator {
-
-  public void validate(UriInfo uriInfo, Edm edm) throws UriValidationException {
-    switch (uriInfo.getKind()) {
-    case metadata:
-      if (uriInfo.getTopOption() != null) {
-        throw new UriValidationException();
-      }
-      break;
-      default:
-    }
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/c0db941b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/validator/UriEdmValidatorTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/validator/UriEdmValidatorTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/validator/UriEdmValidatorTest.java
index 106b4ce..de5578c 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/validator/UriEdmValidatorTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/validator/UriEdmValidatorTest.java
@@ -18,25 +18,23 @@
  */
 package org.apache.olingo.server.core.uri.validator;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.server.api.uri.UriInfo;
 import org.apache.olingo.server.core.edm.provider.EdmProviderImpl;
 import org.apache.olingo.server.core.testutil.EdmTechProvider;
 import org.apache.olingo.server.core.uri.parser.Parser;
-import org.apache.olingo.server.core.uri.parser.RawUri;
-import org.apache.olingo.server.core.uri.parser.UriDecoder;
 import org.apache.olingo.server.core.uri.parser.UriParserException;
+import org.junit.Ignore;
 import org.junit.Test;
 
 public class UriEdmValidatorTest {
 
   private Edm edm = new EdmProviderImpl(new EdmTechProvider());
 
-  String[] uris = {
+  String[] tmpUri = {
       "$crossjoin(ESKeyNav, ESTwoKeyNav)/invalid                                                                    ",
       "$crossjoin(invalidEntitySet)                                                                                 ",
       "$entity                                                                                                      ",
@@ -50,26 +48,17 @@ public class UriEdmValidatorTest {
       "FICRTESTwoKeyNavParam(ParameterInt16=@invalidAlias)?@validAlias=1                                            ",
       "FINRTESMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='2')/PropertyComplex                         ",
       "FINRTESMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='2')/$count                                  ",
-      "ESKeyNav(1)?$expand=NavPropertyETKeyNavOne/$ref                                                              ",
-      "ESKeyNav(1)?$expand=NavPropertyETKeyNavOne/$count                                                            ",
-      "ESKeyNav?$top=-3                                                                                             ",
-      "ESAllPrim?$count=foo                                                                                         ",
-      "ESAllPrim?$skip=-3                                                                                           "
+      // "ESKeyNav(1)?$expand=NavPropertyETKeyNavOne/$ref                                                              ",
+//      "ESKeyNav(1)?$expand=NavPropertyETKeyNavOne/$count                                                            ",
+//      "ESKeyNav?$top=-3                                                                                             ",
+//      "ESAllPrim?$count=foo                                                                                         ",
+//      "ESAllPrim?$skip=-3                                                                                           "
   };
 
   @Test
-  public void foo() throws Exception {
-    for (String uri : uris) {
-      Parser parser = new Parser();
-      System.out.println(uri);
-      UriInfo uriInfo = parser.parseUri(uri.trim(), edm);
-      assertNotNull(uriInfo);
-    }
-  }
-
-  @Test
+  @Ignore("key predicate validation not implemented")
   public void keyPredicateValidTypes() throws Exception {
-    String[] uris = { "/ESAllPrim" };
+    String[] uris = {};
 
     for (String uri : uris) {
       parseAndValidate(uri);
@@ -78,6 +67,7 @@ public class UriEdmValidatorTest {
   }
 
   @Test
+  @Ignore("key predicate validation not implemented")
   public void keyPredicateInvalidTypes() throws UriParserException {
     String[] uris = {};
 
@@ -94,22 +84,40 @@ public class UriEdmValidatorTest {
 
   @Test
   public void systemQueryOptionValid() throws Exception {
-    String[] uris = {
+    String[] uris =
+    {
+        /* service document */
+        "",
+        /* metadata */
         "/$metadata",
-        "/$metadata?$format=json"
+        "/$metadata?$format=atom",
     };
 
     for (String uri : uris) {
-      parseAndValidate(uri);
+      try {
+        parseAndValidate(uri);
+      } catch (Exception e) {
+        throw new Exception("Faild for uri: " + uri, e);
+      }
     }
 
   }
 
   @Test
   public void systemQueryOptionInvalid() throws Exception {
-    String[] uris = {
-        "/$metadata?$format=json&$top=3"
-    };
+    String[] uris =
+        {
+            /* service document */
+            /* metadata */
+            "/$metadata?$format=json&$top=3&$skip=5&$skiptoken=123",
+
+            /* misc */
+            "ESKeyNav(1)?$expand=NavPropertyETKeyNavOne/$ref                                                              ",
+            "ESKeyNav(1)?$expand=NavPropertyETKeyNavOne/$count                                                            ",
+            "ESKeyNav?$top=-3                                                                                             ",
+            "ESAllPrim?$count=foo                                                                                         ",
+            "ESAllPrim?$skip=-3                                                                                           "
+        };
 
     for (String uri : uris) {
 
@@ -124,7 +132,7 @@ public class UriEdmValidatorTest {
 
   private void parseAndValidate(String uri) throws UriParserException, UriValidationException {
     UriInfo uriInfo = new Parser().parseUri(uri.trim(), edm);
-    Validator validator = new Validator();
+    SystemQueryValidator validator = new SystemQueryValidator();
     validator.validate(uriInfo, edm);
   }
 }