From 2ca8e0d9d185f7407d3b7716398ab05267c9974c Mon Sep 17 00:00:00 2001 From: mibo Date: Wed, 12 Aug 2015 15:23:35 +0200 Subject: [PATCH] [OLINGO-755] Fixed in UriParseTreeVisitor and added test case --- .../core/uri/parser/UriParseTreeVisitor.java | 44 +++++- .../core/uri/antlr/TestFullResourcePath.java | 39 ------ .../server/core/uri/parser/ParserTest.java | 127 ++++++++++++++++++ 3 files changed, 167 insertions(+), 43 deletions(-) create mode 100644 lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ParserTest.java diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java index 2ed6d195f..17da1481c 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java @@ -18,10 +18,6 @@ */ package org.apache.olingo.server.core.uri.parser; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - import org.antlr.v4.runtime.misc.NotNull; import org.antlr.v4.runtime.misc.ParseCancellationException; import org.antlr.v4.runtime.tree.ParseTree; @@ -46,7 +42,9 @@ import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory; import org.apache.olingo.server.api.uri.UriInfoKind; +import org.apache.olingo.server.api.uri.UriInfoResource; import org.apache.olingo.server.api.uri.UriResource; +import org.apache.olingo.server.api.uri.UriResourceEntitySet; import org.apache.olingo.server.api.uri.UriResourcePartTyped; import org.apache.olingo.server.api.uri.queryoption.expression.BinaryOperatorKind; import org.apache.olingo.server.api.uri.queryoption.expression.MethodKind; @@ -185,6 +183,10 @@ import org.apache.olingo.server.core.uri.queryoption.expression.MethodImpl; import org.apache.olingo.server.core.uri.queryoption.expression.TypeLiteralImpl; import org.apache.olingo.server.core.uri.queryoption.expression.UnaryImpl; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + /** * UriVisitor * @@ -1226,9 +1228,43 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor { context.contextUriInfo = uriInfoResourceBU; context.contextExpandItemPath = contextExpandItemPathBU; + // test + validate(uriInfoResourceBU.asUriInfoResource(), expandItem); + // + return expandItem; } + private void validate(UriInfoResource uriInfoResource, ExpandItemImpl expandItem) { + if(uriInfoResource != null) { + EdmEntityType type = getEntityType(uriInfoResource); + EdmEntityType name = getEntityType(expandItem.getResourcePath()); + + if(name != null && type != null) { + EdmElement property = type.getProperty(name.getName()); + if(! (property instanceof EdmNavigationProperty)) { + throw wrap(new UriParserSemanticException("NavigationProperty '" + name.getName() + "' not found in type '" + + type.getFullQualifiedName().getFullQualifiedNameAsString() + "'", + UriParserSemanticException.MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE, + name.getFullQualifiedName().getFullQualifiedNameAsString(), + type.getFullQualifiedName().getFullQualifiedNameAsString())); + } + } + } + } + + private EdmEntityType getEntityType(UriInfoResource test) { + List parts = test.getUriResourceParts(); + if (!parts.isEmpty()) { + UriResource lastPart = parts.get(parts.size() - 1); + if (lastPart instanceof UriResourceEntitySet) { + UriResourceEntitySet entitySet = (UriResourceEntitySet) lastPart; + return entitySet.getEntityType(); + } + } + return null; + } + @Override public Object visitExpandPathExtension(final ExpandPathExtensionContext ctx) { List list = new ArrayList(); 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 10240abd5..66985ceeb 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 @@ -2078,45 +2078,6 @@ public class TestFullResourcePath { .isCount(); } - /** - * Test for EntitySet and NavigationProperty with same name defined in metadata. - * (related to Olingo issue OLINGO-741) - */ - @Test - public void yetAnotherSmallTest() throws Exception { - TestUriValidator testUri = new TestUriValidator(); - - Edm mockEdm = Mockito.mock(Edm.class); - EdmEntitySet esCategory = Mockito.mock(EdmEntitySet.class); - EdmEntitySet esProduct = Mockito.mock(EdmEntitySet.class); - EdmEntityType typeCategory = Mockito.mock(EdmEntityType.class); - EdmEntityContainer container = Mockito.mock(EdmEntityContainer.class); - EdmNavigationProperty productsNavigation = Mockito.mock(EdmNavigationProperty.class); - EdmEntityType productsType = Mockito.mock(EdmEntityType.class); - - Mockito.when(mockEdm.getEntityContainer(null)).thenReturn(container); - Mockito.when(typeCategory.getName()).thenReturn("Category"); - Mockito.when(typeCategory.getNamespace()).thenReturn("NS"); - Mockito.when(esCategory.getEntityType()).thenReturn(typeCategory); - Mockito.when(productsNavigation.getName()).thenReturn("Products"); - Mockito.when(typeCategory.getProperty("Products")).thenReturn(productsNavigation); - Mockito.when(container.getEntitySet("Category")).thenReturn(esCategory); - Mockito.when(container.getEntitySet("Products")).thenReturn(esProduct); - Mockito.when(productsType.getName()).thenReturn("Products"); - Mockito.when(productsType.getNamespace()).thenReturn("NS"); - Mockito.when(productsNavigation.getType()).thenReturn(productsType); - - // test and verify - testUri.setEdm(mockEdm) - .run("Category", "$expand=Products") - .isKind(UriInfoKind.resource).goPath().goExpand() - .first() - .goPath().first() - .isNavProperty("Products", new FullQualifiedName("NS", "Products"), false) - .isType(new FullQualifiedName("NS", "Products"), false); - Mockito.verifyZeroInteractions(esProduct); - } - @Test public void runExpand() throws Exception { diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ParserTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ParserTest.java new file mode 100644 index 000000000..c9c09076f --- /dev/null +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ParserTest.java @@ -0,0 +1,127 @@ +/* + * 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 org.apache.olingo.commons.api.edm.Edm; +import org.apache.olingo.commons.api.edm.EdmEntityContainer; +import org.apache.olingo.commons.api.edm.EdmEntitySet; +import org.apache.olingo.commons.api.edm.EdmEntityType; +import org.apache.olingo.commons.api.edm.EdmNavigationProperty; +import org.apache.olingo.commons.api.edm.FullQualifiedName; +import org.apache.olingo.server.api.uri.UriInfoKind; +import org.apache.olingo.server.core.uri.testutil.TestUriValidator; +import org.junit.Test; +import org.mockito.Mockito; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +/** + * All Tests which involves the Parser implementation + * (and with that also the UriParseTreeVisitor). + */ +public class ParserTest { + + /** + * Test for EntitySet and NavigationProperty with same name defined in metadata. + * (related to Olingo issue OLINGO-741) + */ + @Test + public void parseEntitySetAndNavigationPropertyWithSameName() throws Exception { + TestUriValidator testUri = new TestUriValidator(); + + Edm mockEdm = Mockito.mock(Edm.class); + EdmEntitySet esCategory = Mockito.mock(EdmEntitySet.class); + EdmEntitySet esProduct = Mockito.mock(EdmEntitySet.class); + EdmEntityType typeCategory = Mockito.mock(EdmEntityType.class); + EdmEntityContainer container = Mockito.mock(EdmEntityContainer.class); + EdmNavigationProperty productsNavigation = Mockito.mock(EdmNavigationProperty.class); + EdmEntityType productsType = Mockito.mock(EdmEntityType.class); + + Mockito.when(mockEdm.getEntityContainer(null)).thenReturn(container); + Mockito.when(typeCategory.getName()).thenReturn("Category"); + Mockito.when(typeCategory.getNamespace()).thenReturn("NS"); + Mockito.when(esCategory.getEntityType()).thenReturn(typeCategory); + Mockito.when(productsNavigation.getName()).thenReturn("Products"); + Mockito.when(typeCategory.getProperty("Products")).thenReturn(productsNavigation); + Mockito.when(container.getEntitySet("Category")).thenReturn(esCategory); + Mockito.when(container.getEntitySet("Products")).thenReturn(esProduct); + Mockito.when(productsType.getName()).thenReturn("Products"); + Mockito.when(productsType.getNamespace()).thenReturn("NS"); + Mockito.when(productsNavigation.getType()).thenReturn(productsType); + + // test and verify + testUri.setEdm(mockEdm) + .run("Category", "$expand=Products") + .isKind(UriInfoKind.resource).goPath().goExpand() + .first() + .goPath().first() + .isNavProperty("Products", new FullQualifiedName("NS", "Products"), false) + .isType(new FullQualifiedName("NS", "Products"), false); + Mockito.verifyZeroInteractions(esProduct); + } + + /** + * Test for EntitySet with navigation to an not existing NavigationProperty (name) + * but with another EntitySet with this name defined in metadata. + * (related to Olingo issue OLINGO-755) + */ + @Test + public void entitySetWoNavigationButWithEntitySetWithSameName() throws Exception { + TestUriValidator testUri = new TestUriValidator(); + + Edm mockEdm = Mockito.mock(Edm.class); + EdmEntitySet esCategory = Mockito.mock(EdmEntitySet.class); + EdmEntitySet esProduct = Mockito.mock(EdmEntitySet.class); + EdmEntityType typeCategory = Mockito.mock(EdmEntityType.class); + FullQualifiedName fqnCategory = new FullQualifiedName("NS", "Category"); + EdmEntityContainer container = Mockito.mock(EdmEntityContainer.class); + EdmNavigationProperty productsNavigation = Mockito.mock(EdmNavigationProperty.class); + EdmEntityType typeProduct = Mockito.mock(EdmEntityType.class); + FullQualifiedName fqnProduct = new FullQualifiedName("NS", "Products"); + + Mockito.when(mockEdm.getEntityContainer(null)).thenReturn(container); + Mockito.when(typeCategory.getName()).thenReturn(fqnCategory.getName()); + Mockito.when(typeCategory.getNamespace()).thenReturn(fqnCategory.getNamespace()); + Mockito.when(typeCategory.getFullQualifiedName()).thenReturn(fqnCategory); + Mockito.when(esCategory.getEntityType()).thenReturn(typeCategory); + Mockito.when(esProduct.getEntityType()).thenReturn(typeProduct); + Mockito.when(productsNavigation.getName()).thenReturn("Products"); + Mockito.when(typeCategory.getProperty("Products")).thenReturn(productsNavigation); + Mockito.when(container.getEntitySet("Category")).thenReturn(esCategory); + Mockito.when(container.getEntitySet("Products")).thenReturn(esProduct); + Mockito.when(typeProduct.getName()).thenReturn(fqnProduct.getName()); + Mockito.when(typeProduct.getNamespace()).thenReturn(fqnProduct.getNamespace()); + Mockito.when(typeProduct.getFullQualifiedName()).thenReturn(fqnProduct); + Mockito.when(productsNavigation.getType()).thenReturn(typeProduct); + + try { + // test and verify + testUri.setEdm(mockEdm) + .run("Products", "$expand=Category") + .isKind(UriInfoKind.resource).goPath().goExpand() + .first() + .goPath().first() + .isType(new FullQualifiedName("NS", "Category"), false); + fail("Expected exception was not thrown."); + } catch (Exception e) { + assertEquals("NavigationProperty 'Category' not found in type 'NS.Products'", e.getMessage()); + } + } +} \ No newline at end of file