You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2015/08/12 15:24:33 UTC
olingo-odata4 git commit: [OLINGO-755] Fixed in UriParseTreeVisitor
and added test case
Repository: olingo-odata4
Updated Branches:
refs/heads/master 790ec7601 -> 2ca8e0d9d
[OLINGO-755] Fixed in UriParseTreeVisitor and added test case
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/2ca8e0d9
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/2ca8e0d9
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/2ca8e0d9
Branch: refs/heads/master
Commit: 2ca8e0d9d185f7407d3b7716398ab05267c9974c
Parents: 790ec76
Author: mibo <mi...@apache.org>
Authored: Wed Aug 12 15:23:35 2015 +0200
Committer: mibo <mi...@apache.org>
Committed: Wed Aug 12 15:23:35 2015 +0200
----------------------------------------------------------------------
.../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(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2ca8e0d9/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.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 2ed6d19..17da148 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<Object> {
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<UriResource> 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<SystemQueryOptionImpl> list = new ArrayList<SystemQueryOptionImpl>();
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2ca8e0d9/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 10240ab..66985ce 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 {
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2ca8e0d9/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ParserTest.java
----------------------------------------------------------------------
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 0000000..c9c0907
--- /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 <code>Parser</code> implementation
+ * (and with that also the <code>UriParseTreeVisitor</code>).
+ */
+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