Repository: olingo-odata4 Updated Branches: refs/heads/master 838ca234e -> 18b126742
[OLINGO-916] Changed guid key predicate parsing Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/18b12674 Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/18b12674 Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/18b12674 Branch: refs/heads/master Commit: 18b126742ee8da021c0ad5bcc6dd1eeb001bfcb9 Parents: 838ca23 Author: mibo <[email protected]> Authored: Sat Mar 26 21:46:02 2016 +0100 Committer: mibo <[email protected]> Committed: Sat Mar 26 21:57:28 2016 +0100 ---------------------------------------------------------------------- .../olingo/server/core/ODataHandlerImpl.java | 4 --- .../core/batchhandler/BatchFacadeImpl.java | 1 - .../core/batchhandler/BatchPartHandler.java | 1 - .../server/core/uri/parser/ParserHelper.java | 36 +++++++++++++++----- .../server/core/uri/parser/ParserTest.java | 27 +++++++++++++++ 5 files changed, 54 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/18b12674/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerImpl.java index 705c767..da4856a 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerImpl.java @@ -18,7 +18,6 @@ */ package org.apache.olingo.server.core; -import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -47,12 +46,9 @@ import org.apache.olingo.server.api.serializer.RepresentationType; import org.apache.olingo.server.api.serializer.SerializerException; import org.apache.olingo.server.api.uri.UriInfo; import org.apache.olingo.server.api.uri.queryoption.FormatOption; -import org.apache.olingo.server.api.uri.queryoption.QueryOption; -import org.apache.olingo.server.api.uri.queryoption.SystemQueryOption; import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind; import org.apache.olingo.server.core.debug.ServerCoreDebugger; import org.apache.olingo.server.core.uri.parser.Parser; -import org.apache.olingo.server.core.uri.parser.UriDecoder; import org.apache.olingo.server.core.uri.parser.UriParserException; import org.apache.olingo.server.core.uri.parser.UriParserSemanticException; import org.apache.olingo.server.core.uri.parser.UriParserSyntaxException; http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/18b12674/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/BatchFacadeImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/BatchFacadeImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/BatchFacadeImpl.java index 4d5a77d..ea7a72d 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/BatchFacadeImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/BatchFacadeImpl.java @@ -28,7 +28,6 @@ import org.apache.olingo.server.api.deserializer.batch.BatchDeserializerExceptio import org.apache.olingo.server.api.deserializer.batch.BatchRequestPart; import org.apache.olingo.server.api.deserializer.batch.ODataResponsePart; import org.apache.olingo.server.api.processor.BatchProcessor; -import org.apache.olingo.server.core.ODataHandlerImpl; import org.apache.olingo.server.core.deserializer.batch.BatchParserCommon; public class BatchFacadeImpl implements BatchFacade { http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/18b12674/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/BatchPartHandler.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/BatchPartHandler.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/BatchPartHandler.java index a40006a..e83e945 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/BatchPartHandler.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/BatchPartHandler.java @@ -29,7 +29,6 @@ import org.apache.olingo.server.api.deserializer.batch.BatchDeserializerExceptio import org.apache.olingo.server.api.deserializer.batch.BatchRequestPart; import org.apache.olingo.server.api.deserializer.batch.ODataResponsePart; import org.apache.olingo.server.api.processor.BatchProcessor; -import org.apache.olingo.server.core.ODataHandlerImpl; import org.apache.olingo.server.core.batchhandler.referenceRewriting.BatchReferenceRewriter; public class BatchPartHandler { http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/18b12674/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ParserHelper.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ParserHelper.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ParserHelper.java index e42a511..0ca0ce6 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ParserHelper.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ParserHelper.java @@ -306,15 +306,12 @@ public class ParserHelper { } } - if (tokenizer.next(TokenKind.ODataIdentifier)) { + if(tokenizer.next(TokenKind.GuidValue)) { + keys.add(parseSimpleKey(tokenizer, edm, referringType, aliases, keyPropertyRefs, referencedNames, true)); + } else if (tokenizer.next(TokenKind.ODataIdentifier)) { keys.addAll(compoundKey(tokenizer, edmEntityType, edm, referringType, aliases)); } else if (keyPropertyRefs.size() - referencedNames.size() == 1) { - for (final EdmKeyPropertyRef candidate : keyPropertyRefs) { - if (referencedNames.get(candidate.getName()) == null) { - keys.add(simpleKey(tokenizer, candidate, edm, referringType, aliases)); - break; - } - } + keys.add(parseSimpleKey(tokenizer, edm, referringType, aliases, keyPropertyRefs, referencedNames, false)); } else { throw new UriParserSemanticException( "Expected " + (keyPropertyRefs.size() -referencedNames.size()) + " key predicates but found one.", @@ -349,14 +346,35 @@ public class ParserHelper { } } + private static UriParameter parseSimpleKey(final UriTokenizer tokenizer, final Edm edm, final EdmType referringType, + final Map<String, AliasQueryOption> aliases, + final List<EdmKeyPropertyRef> keyPropertyRefs, + final Map<String, String> referencedNames, final boolean tokenConsumed) + throws UriParserException, UriValidationException { + + for (final EdmKeyPropertyRef candidate : keyPropertyRefs) { + if (referencedNames.get(candidate.getName()) == null) { + return simpleKey(tokenizer, candidate, edm, referringType, aliases, tokenConsumed); + } + } + throw new UriParserSemanticException("No suitable key found.", + UriParserSemanticException.MessageKeys.WRONG_NUMBER_OF_KEY_PROPERTIES, + "0", String.valueOf(keyPropertyRefs.size())); + } + private static UriParameter simpleKey(UriTokenizer tokenizer, final EdmKeyPropertyRef edmKeyPropertyRef, - final Edm edm, final EdmType referringType, final Map<String, AliasQueryOption> aliases) + final Edm edm, final EdmType referringType, + final Map<String, AliasQueryOption> aliases, final boolean tokenConsumed) throws UriParserException, UriValidationException { final EdmProperty edmProperty = edmKeyPropertyRef == null ? null : edmKeyPropertyRef.getProperty(); final EdmPrimitiveType primitiveType = edmProperty == null ? null : (EdmPrimitiveType) edmProperty.getType(); final boolean nullable = edmProperty != null && edmProperty.isNullable(); - if (nextPrimitiveTypeValue(tokenizer, primitiveType, nullable)) { + boolean primitiveTypeAvailable = tokenConsumed; + if(!tokenConsumed) { + primitiveTypeAvailable = nextPrimitiveTypeValue(tokenizer, primitiveType, nullable); + } + if (primitiveTypeAvailable) { final String literalValue = tokenizer.getText(); ParserHelper.requireNext(tokenizer, TokenKind.CLOSE); return createUriParameter(edmProperty, edmKeyPropertyRef.getName(), literalValue, edm, referringType, aliases); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/18b12674/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 index af523aa..21741ab 100644 --- 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 @@ -44,6 +44,33 @@ import static org.junit.Assert.fail; public class ParserTest { @Test + public void keyPropertyGuid() throws Exception { + final String entitySetName = "ESGuid"; + final String keyPropertyName = "a"; + EdmProperty keyProperty = Mockito.mock(EdmProperty.class); + Mockito.when(keyProperty.getType()) + .thenReturn(OData.newInstance().createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Guid)); + EdmKeyPropertyRef keyPropertyRef = Mockito.mock(EdmKeyPropertyRef.class); + Mockito.when(keyPropertyRef.getName()).thenReturn(keyPropertyName); + Mockito.when(keyPropertyRef.getProperty()).thenReturn(keyProperty); + EdmEntityType entityType = Mockito.mock(EdmEntityType.class); + Mockito.when(entityType.getKeyPredicateNames()).thenReturn(Collections.singletonList(keyPropertyName)); + Mockito.when(entityType.getKeyPropertyRefs()).thenReturn(Collections.singletonList(keyPropertyRef)); + EdmEntitySet entitySet = Mockito.mock(EdmEntitySet.class); + Mockito.when(entitySet.getName()).thenReturn(entitySetName); + Mockito.when(entitySet.getEntityType()).thenReturn(entityType); + EdmEntityContainer container = Mockito.mock(EdmEntityContainer.class); + Mockito.when(container.getEntitySet(entitySetName)).thenReturn(entitySet); + Edm mockedEdm = Mockito.mock(Edm.class); + Mockito.when(mockedEdm.getEntityContainer()).thenReturn(container); + new TestUriValidator().setEdm(mockedEdm) + .run("ESGuid(f89dee73-af9f-4cd4-b330-db93c25ff3c7)") + .goPath() + .at(0).isEntitySet(entitySetName) + .at(0).isKeyPredicate(0, keyPropertyName, "f89dee73-af9f-4cd4-b330-db93c25ff3c7"); + } + + @Test public void navPropertySameNameAsEntitySet() throws Exception { final String namespace = "namespace"; final String entityTypeName = "ETNavProp";
