예제 #1
0
 /**
  * Creates an instance of KeyDescriptor by parsing a key predicate, also 
  * validates the KeyDescriptor
  * 
  * @param string       $segment      The uri segment in the form identifier
  *                                   (keyPredicate)
  * @param ResourceType $resourceType The Resource type whose keys need to 
  *                                   be parsed
  * @param string       $keyPredicate The key predicate to parse and generate 
  *                                   KeyDescriptor for
  * 
  * @return KeyDescriptor Describes the key values in the $keyPredicate
  * 
  * @throws ODataException Exception if any error occurs while parsing and 
  *                                  validating the key predicate
  */
 private function _createKeyDescriptor($segment, ResourceType $resourceType, $keyPredicate)
 {
     /**
      * @var KeyDescriptor
      */
     $keyDescriptor = null;
     if (!KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor)) {
         ODataException::createSyntaxError(Messages::syntaxError());
     }
     // Note: Currenlty WCF Data Service does not support multiple
     // 'Positional values' so Order_Details(10248, 11) is not valid
     if (!$keyDescriptor->isEmpty() && !$keyDescriptor->areNamedValues() && $keyDescriptor->valueCount() > 1) {
         ODataException::createSyntaxError(Messages::segmentParserKeysMustBeNamed($segment));
     }
     try {
         $keyDescriptor->validate($segment, $resourceType);
     } catch (ODataException $exception) {
         throw $exception;
     }
     return $keyDescriptor;
 }
예제 #2
0
 public function testKeyDescriptorValidation()
 {
     try {
         $northWindMetadata = CreateNorthWindMetadata3::Create();
         $orderDetailsResourceType = $northWindMetadata->resolveResourceType('Order_Details');
         $this->assertFalse(is_null($orderDetailsResourceType));
         $keyDescriptor = null;
         //Test with a valid named value key predicate
         $keyPredicate = 'ProductID=11, OrderID=2546';
         $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
         $this->assertTrue($validPredicateSyntax);
         $this->assertFalse(is_null($keyDescriptor));
         $keyDescriptor->validate('Order_Details(ProductID=11, OrderID=2546)', $orderDetailsResourceType);
         $validatedNamedValues = $keyDescriptor->getValidatedNamedValues();
         $this->assertTrue(array_key_exists('ProductID', $validatedNamedValues));
         $this->assertTrue(array_key_exists('OrderID', $validatedNamedValues));
         $productVal = $validatedNamedValues['ProductID'];
         $orderVal = $validatedNamedValues['OrderID'];
         $this->assertEquals($productVal[0], 11);
         $this->assertEquals($orderVal[0], 2546);
         $keyDescriptor = null;
         //Test with a valid positional value key predicate
         $keyPredicate = '11, 2546';
         $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
         $this->assertTrue($validPredicateSyntax);
         $this->assertFalse(is_null($keyDescriptor));
         $keyDescriptor->validate('Order_Details(11, 2546)', $orderDetailsResourceType);
         $validatedNamedValues = $keyDescriptor->getValidatedNamedValues();
         $this->assertEquals(count($validatedNamedValues), 2);
         $this->assertTrue(array_key_exists('ProductID', $validatedNamedValues));
         $this->assertTrue(array_key_exists('OrderID', $validatedNamedValues));
         $productVal = $validatedNamedValues['ProductID'];
         $orderVal = $validatedNamedValues['OrderID'];
         $this->assertEquals($productVal[0], 11);
         $this->assertEquals($orderVal[0], 2546);
         //Test for key count
         $keyDescriptor = null;
         $keyPredicate = 'ProductID=11';
         $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
         $exceptionThrown = false;
         try {
             $keyDescriptor->validate('Order_Details(ProductID=11)', $orderDetailsResourceType);
         } catch (ODataException $exception) {
             $this->assertStringEndsWith(' expect 2 keys but 1 provided', $exception->getMessage());
             $exceptionThrown = true;
         }
         if (!$exceptionThrown) {
             $this->fail('An expected ODataException for predicate key count has not been thrown');
         }
         //test for missing key
         $keyDescriptor = null;
         $keyPredicate = 'ProductID=11, OrderID1=2546';
         $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
         $exceptionThrown = false;
         try {
             $keyDescriptor->validate('Order_Details(ProductID=11, OrderID1=2546)', $orderDetailsResourceType);
         } catch (ODataException $exception) {
             $this->assertStringEndsWith('The key predicate expect the keys \'ProductID, OrderID\'', $exception->getMessage());
             $exceptionThrown = true;
         }
         if (!$exceptionThrown) {
             $this->fail('An expected ODataException for missing of keys in the predicate has not been thrown');
         }
         //test for key type
         $keyDescriptor = null;
         $keyPredicate = 'ProductID=11.12, OrderID=2546';
         $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
         $exceptionThrown = false;
         try {
             $keyDescriptor->validate('Order_Details(ProductID=11.12, OrderID=2546)', $orderDetailsResourceType);
         } catch (ODataException $exception) {
             $this->assertStringEndsWith('The value of key property \'ProductID\' should be of type Edm.Int32, given Edm.Double', $exception->getMessage());
             $exceptionThrown = true;
         }
         if (!$exceptionThrown) {
             $this->fail('An expected ODataException for type incompactibility has not been thrown');
         }
         //test for key type
         $keyDescriptor = null;
         $keyPredicate = '11, \'ABCD\'';
         $validPredicateSyntax = KeyDescriptor::tryParseKeysFromKeyPredicate($keyPredicate, $keyDescriptor);
         $exceptionThrown = false;
         try {
             $keyDescriptor->validate('Order_Details(11, \'ABCD\')', $orderDetailsResourceType);
         } catch (ODataException $exception) {
             $this->assertStringEndsWith('The value of key property \'OrderID\' at position 1 should be of type Edm.Int32, given Edm.String', $exception->getMessage());
             $exceptionThrown = true;
         }
         if (!$exceptionThrown) {
             $this->fail('An expected ODataException for type incompactibility has not been thrown');
         }
     } catch (\Exception $exception) {
         $this->fail('An unexpected Exception has been raised.' . $exception->getMessage());
     }
 }