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:51:07 UTC
[13/21] git commit: [OLINGO-206] key predicate validation
[OLINGO-206] key predicate validation
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/fbafc3a4
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/fbafc3a4
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/fbafc3a4
Branch: refs/heads/master
Commit: fbafc3a4fdab5d3cc05e6bb5c0e87c3b0a8eb41f
Parents: 9a980e8
Author: Stephan Klevenz <st...@sap.com>
Authored: Fri Mar 28 16:08:33 2014 +0100
Committer: Stephan Klevenz <st...@sap.com>
Committed: Fri Mar 28 16:08:33 2014 +0100
----------------------------------------------------------------------
.../core/uri/UriResourceWithKeysImpl.java | 22 ++++---
.../uri/validator/UriValidationException.java | 9 ++-
.../server/core/uri/validator/UriValidator.java | 69 ++++++++++++++++----
.../core/uri/validator/UriEdmValidatorTest.java | 39 ++++++-----
4 files changed, 96 insertions(+), 43 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/fbafc3a4/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceWithKeysImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceWithKeysImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceWithKeysImpl.java
index f8827fa..aef5800 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceWithKeysImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceWithKeysImpl.java
@@ -1,18 +1,18 @@
-/*
+/*
* 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.
*/
@@ -47,8 +47,10 @@ public abstract class UriResourceWithKeysImpl extends UriResourceImpl implements
public List<UriParameter> getKeyPredicates() {
List<UriParameter> retList = new ArrayList<UriParameter>();
- for (UriParameterImpl item : keyPredicates) {
- retList.add(item);
+ if (keyPredicates != null) {
+ for (UriParameterImpl item : keyPredicates) {
+ retList.add(item);
+ }
}
return retList;
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/fbafc3a4/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 3ba323d..c9c664d 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
@@ -18,12 +18,17 @@
*/
package org.apache.olingo.server.core.uri.validator;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
+
public class UriValidationException extends Exception {
+ private static final long serialVersionUID = -3179078078053564742L;
+
public UriValidationException(String msg) {
super(msg);
}
- private static final long serialVersionUID = -3179078078053564742L;
-
+ public UriValidationException(EdmPrimitiveTypeException e) {
+ super(e);
+ }
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/fbafc3a4/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java
index a8f1790..2530908 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java
@@ -18,14 +18,24 @@
*/
package org.apache.olingo.server.core.uri.validator;
+import java.util.HashMap;
+import java.util.List;
+
import org.apache.olingo.commons.api.ODataRuntimeException;
import org.apache.olingo.commons.api.edm.Edm;
import org.apache.olingo.commons.api.edm.EdmEntityType;
+import org.apache.olingo.commons.api.edm.EdmKeyPropertyRef;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
import org.apache.olingo.commons.api.edm.EdmReturnType;
+import org.apache.olingo.commons.api.edm.EdmType;
import org.apache.olingo.server.api.uri.UriInfo;
+import org.apache.olingo.server.api.uri.UriParameter;
import org.apache.olingo.server.api.uri.UriResource;
import org.apache.olingo.server.api.uri.UriResourceAction;
+import org.apache.olingo.server.api.uri.UriResourceEntitySet;
import org.apache.olingo.server.api.uri.UriResourceFunction;
+import org.apache.olingo.server.api.uri.UriResourceKind;
import org.apache.olingo.server.api.uri.UriResourceNavigation;
import org.apache.olingo.server.api.uri.UriResourcePartTyped;
import org.apache.olingo.server.api.uri.queryoption.SystemQueryOption;
@@ -439,20 +449,14 @@ public class UriValidator {
}
private void validateQueryOptions(final UriInfo uriInfo, Edm edm) throws UriValidationException {
- try {
- RowIndexForUriType row = rowIndexForUriType(uriInfo, edm);
-
- for (SystemQueryOption option : uriInfo.getSystemQueryOptions()) {
- ColumnIndex col = colIndex(option.getKind());
+ RowIndexForUriType row = rowIndexForUriType(uriInfo, edm);
- System.out.print("[" + row + "][" + col + "]");
+ for (SystemQueryOption option : uriInfo.getSystemQueryOptions()) {
+ ColumnIndex col = colIndex(option.getKind());
- if (!decisionMatrix[row.getIndex()][col.getIndex()]) {
- throw new UriValidationException("System query option not allowed: " + option.getName());
- }
+ if (!decisionMatrix[row.getIndex()][col.getIndex()]) {
+ throw new UriValidationException("System query option not allowed: " + option.getName());
}
- } finally {
- System.out.println();
}
}
@@ -492,6 +496,45 @@ public class UriValidator {
return idx;
}
- private void validateKeyPredicateTypes(final UriInfo uriInfo, final Edm edm) throws UriValidationException {}
-
+ private void validateKeyPredicateTypes(final UriInfo uriInfo, final Edm edm) throws UriValidationException {
+ try {
+ for (UriResource pathSegment : uriInfo.getUriResourceParts()) {
+ if (pathSegment.getKind() == UriResourceKind.entitySet) {
+ UriResourceEntitySet pathEntitySet = (UriResourceEntitySet) pathSegment;
+
+ EdmEntityType type = pathEntitySet.getEntityType();
+ List<EdmKeyPropertyRef> keys = type.getKeyPropertyRefs();
+ List<UriParameter> keyPredicates = pathEntitySet.getKeyPredicates();
+
+ if (null != keyPredicates) {
+
+ HashMap<String, EdmKeyPropertyRef> edmKeys = new HashMap<String, EdmKeyPropertyRef>();
+ for (EdmKeyPropertyRef key : keys) {
+ edmKeys.put(key.getKeyPropertyName(), key);
+ }
+
+ for (UriParameter keyPredicate : keyPredicates) {
+ String name = keyPredicate.getName();
+ String value = keyPredicate.getText();
+ EdmKeyPropertyRef edmKey = edmKeys.get(name);
+
+ if (edmKey == null) {
+ throw new UriValidationException("Unknown key property: " + name);
+ }
+
+ EdmType edmType = edmKey.getProperty().getType();
+ EdmPrimitiveType edmPrimitiveType = (EdmPrimitiveType) edmType;
+
+ String edmLiteral = edmPrimitiveType.fromUriLiteral(value);
+ edmPrimitiveType.validate(edmLiteral, edmKey.getProperty().isNullable(), edmKey.getProperty()
+ .getMaxLength(), edmKey.getProperty().getPrecision(), edmKey.getProperty().getScale(), edmKey
+ .getProperty().isUnicode());
+ }
+ }
+ }
+ }
+ } catch (EdmPrimitiveTypeException e) {
+ throw new UriValidationException(e);
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/fbafc3a4/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 a76cee5..4865f8b 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
@@ -73,8 +73,6 @@ public class UriEdmValidatorTest {
private static final String QO_LEVELS = "$expand=*($levels=1)";
private static final String QO_TOP = "$top=1";
- private Edm edm = new EdmProviderImpl(new EdmTechProvider());
-
private String[][] urisWithValidSystemQueryOptions = {
{ URI_ALL, QO_FILTER, }, { URI_ALL, QO_FORMAT }, { URI_ALL, QO_EXPAND }, { URI_ALL, QO_COUNT },
/* { URI_ALL, QO_ORDERBY }, *//* { URI_ALL, QO_SEARCH }, */{ URI_ALL, QO_SELECT }, { URI_ALL, QO_SKIP },
@@ -249,28 +247,33 @@ public class UriEdmValidatorTest {
{ URI_NAV_ENTITY_SET, QO_ID },
};
-
+
private Parser parser;
+ private Edm edm;
@Before
public void before() {
parser = new Parser();
+ edm = new EdmProviderImpl(new EdmTechProvider());
}
-// @Test
-// @Ignore
-// public
-// void bla() throws Exception {
-// String[][] m = {
-// { "/ESMedia(1)/$value?$filter='1' eq '1'" },
-// };
-// String[] uris = constructUri(m);
-// for (String uri : uris) {
-// System.out.println(uri);
-//
-// parseAndValidate(uri);
-// }
-// }
+ @Test(expected = UriValidationException.class)
+ public void validateKeyPredicatesWrongKey() throws Exception {
+ String uri = "ESTwoKeyNav(xxx=1, yyy='abc')";
+ parseAndValidate(uri);
+ }
+
+ @Test
+ public void validateKeyPredicates() throws Exception {
+ String uri = "ESTwoKeyNav(PropertyInt16=1, PropertyString='abc')";
+ parseAndValidate(uri);
+ }
+
+ @Test(expected = UriValidationException.class)
+ public void validateKeyPredicatesWrongValueType() throws Exception {
+ String uri = "ESTwoKeyNav(PropertyInt16='abc', PropertyString=1)";
+ parseAndValidate(uri);
+ }
@Test
public void checkValidSystemQueryOption() throws Exception {
@@ -321,7 +324,7 @@ public class UriEdmValidatorTest {
UriInfo uriInfo = parser.parseUri(uri.trim(), edm);
UriValidator validator = new UriValidator();
- System.out.print("URI: " + uri);
validator.validate(uriInfo, edm, "GET");
}
+
}