public function testResourceProperty() { $addressResType = new ResourceType(new \ReflectionClass('UnitTests\\POData\\Facets\\NorthWind1\\Address2'), ResourceTypeKind::COMPLEX, 'Address', 'Northwind'); $booleanResourcetype = ResourceType::getPrimitiveResourceType(EdmPrimitiveType::BOOLEAN); $isPrimaryPrimProperty = new ResourceProperty('IsPrimary', null, ResourcePropertyKind::PRIMITIVE, $booleanResourcetype); $addressResType->addProperty($isPrimaryPrimProperty); try { $addressComplexProperty = new ResourceProperty('Address', null, ResourcePropertyKind::COMPLEX_TYPE | ResourcePropertyKind::KEY, $addressResType); $this->fail('An expected InvalidArgumentException for \'invalid ResourcePropertyKind\' has not been raised'); } catch (\InvalidArgumentException $exception) { $this->assertStringEndsWith('not a valid ResourcePropertyKind enum value or valid combination of ResourcePropertyKind enum values', $exception->getMessage()); } $stringResourceType = ResourceType::getPrimitiveResourceType(EdmPrimitiveType::STRING); try { $addressComplexProperty = new ResourceProperty('Address', null, ResourcePropertyKind::COMPLEX_TYPE, $stringResourceType); $this->fail('An expected InvalidArgumentException for \'Property and ResourceType kind mismatch\' has not been raised'); } catch (\InvalidArgumentException $exception) { $this->assertStringStartsWith('The \'$kind\' parameter does not match with the type of the resource type', $exception->getMessage()); } $customerResType = new ResourceType(new \ReflectionClass('UnitTests\\POData\\Facets\\NorthWind1\\Customer2'), ResourceTypeKind::ENTITY, 'Customer', 'Northwind'); $stringResourceType = ResourceType::getPrimitiveResourceType(EdmPrimitiveType::STRING); $customerIDPrimProperty = new ResourceProperty('CustomerID', null, ResourcePropertyKind::PRIMITIVE | ResourcePropertyKind::KEY, $stringResourceType); $customerNamePrimProperty = new ResourceProperty('CustomerName', null, ResourcePropertyKind::PRIMITIVE, $stringResourceType); $intResourceType = ResourceType::getPrimitiveResourceType(EdmPrimitiveType::INT32); $ratingPrimProperty = new ResourceProperty('Rating', null, ResourcePropertyKind::PRIMITIVE, $intResourceType); $customerResType->addProperty($customerIDPrimProperty); $customerResType->addProperty($customerNamePrimProperty); $customerResType->addProperty($ratingPrimProperty); $this->assertTrue($customerIDPrimProperty->isKindOf(ResourcePropertyKind::KEY)); $this->assertTrue($customerIDPrimProperty->isKindOf(ResourcePropertyKind::PRIMITIVE)); $customerReferenceSetProperty = new ResourceProperty('Customers', null, ResourcePropertyKind::RESOURCESET_REFERENCE, $customerResType); $this->assertEquals($customerReferenceSetProperty->getName(), 'Customers'); $this->assertEquals($customerReferenceSetProperty->getKind(), ResourcePropertyKind::RESOURCESET_REFERENCE); $this->assertEquals($customerReferenceSetProperty->getInstanceType() instanceof \ReflectionClass, true); $this->assertEquals($customerReferenceSetProperty->getResourceType()->getName(), 'Customer'); $this->assertEquals($customerReferenceSetProperty->getTypeKind(), ResourceTypeKind::ENTITY); $this->assertFalse($customerReferenceSetProperty->isKindOf(ResourcePropertyKind::RESOURCE_REFERENCE)); }
/** * Write primitive property facets. * * @param ResourceProperty $primitveProperty primitive property * * @return void */ private function _writePrimitivePropertyFacets(ResourceProperty $primitveProperty) { $nullable = true; if ($primitveProperty->isKindOf(ResourcePropertyKind::KEY)) { $nullable = false; } $this->_xmlWriter->writeAttribute(ODataConstants::NULLABLE, $nullable ? "true" : "false"); }
/** * Add a property belongs to this resource type instance * * @param ResourceProperty $property Property to add * * @throws InvalidOperationException * @return void */ public function addProperty(ResourceProperty $property) { if ($this->_resourceTypeKind == ResourceTypeKind::PRIMITIVE) { throw new InvalidOperationException(Messages::resourceTypeNoAddPropertyForPrimitive()); } $name = $property->getName(); foreach (array_keys($this->_propertiesDeclaredOnThisType) as $propertyName) { if (strcasecmp($propertyName, $name) == 0) { throw new InvalidOperationException(Messages::resourceTypePropertyWithSameNameAlreadyExists($propertyName, $this->_name)); } } if ($property->isKindOf(ResourcePropertyKind::KEY)) { if ($this->_resourceTypeKind != ResourceTypeKind::ENTITY) { throw new InvalidOperationException(Messages::resourceTypeKeyPropertiesOnlyOnEntityTypes()); } if ($this->_baseType != null) { throw new InvalidOperationException(Messages::resourceTypeNoKeysInDerivedTypes()); } } if ($property->isKindOf(ResourcePropertyKind::ETAG) && $this->_resourceTypeKind != ResourceTypeKind::ENTITY) { throw new InvalidOperationException(Messages::resourceTypeETagPropertiesOnlyOnEntityTypes()); } //Check for Base class properties $this->_propertiesDeclaredOnThisType[$name] = $property; // Set $this->_allProperties to null, this is very important because the // first call to getAllProperties will initilaize $this->_allProperties, // further call to getAllProperties will not reinitialize _allProperties // so if addProperty is called after calling getAllProperties then the // property just added will not be reflected in $this->_allProperties unset($this->_allProperties); $this->_allProperties = array(); }