[OLINGO-206] key predicate validation
This commit is contained in:
parent
9a980e88e2
commit
fbafc3a4fd
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
RowIndexForUriType row = rowIndexForUriType(uriInfo, edm);
|
||||
|
||||
for (SystemQueryOption option : uriInfo.getSystemQueryOptions()) {
|
||||
ColumnIndex col = colIndex(option.getKind());
|
||||
for (SystemQueryOption option : uriInfo.getSystemQueryOptions()) {
|
||||
ColumnIndex col = colIndex(option.getKind());
|
||||
|
||||
System.out.print("[" + row + "][" + col + "]");
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue