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";

Reply via email to