/** * This function is used to perform following checking (validation) * for capability negotiation. * (1) Check client request's 'DataServiceVersion' header value is * less than or equal to the minimum version required to intercept * the response * (2) Check client request's 'MaxDataServiceVersion' header value is * less than or equal to the version of protocol required to generate * the response * (3) Check the configured maximum protocol version is less than or equal * to the version of protocol required to generate the response * In addition to these checking, this function is also responsible for * initializing the properties representing 'DataServiceVersion' and * 'MaxDataServiceVersion'. * * * @throws ODataException If any of the above 3 check fails. */ public function validateVersions() { //If the request version is below the minimum version required by supplied request arguments..throw an exception if ($this->requestVersion->compare($this->requiredMinRequestVersion) < 0) { throw ODataException::createBadRequestError(Messages::requestVersionTooLow($this->requestVersion->toString(), $this->requiredMinRequestVersion->toString())); } //If the requested max version is below the version required to fulfill the response...throw an exception if ($this->requestMaxVersion->compare($this->requiredMinResponseVersion) < 0) { throw ODataException::createBadRequestError(Messages::requestVersionTooLow($this->requestMaxVersion->toString(), $this->requiredMinResponseVersion->toString())); } //If the max version supported by the service is below the version required to fulfill the response..throw an exception if ($this->maxServiceVersion->compare($this->requiredMinResponseVersion) < 0) { throw ODataException::createBadRequestError(Messages::requestVersionIsBiggerThanProtocolVersion($this->requiredMinResponseVersion->toString(), $this->maxServiceVersion->toString())); } }
/** * Write the metadata in CSDL format. * * @return string */ public function writeMetadata() { $this->_metadataManager = MetadataManager::create($this->providersWrapper); $this->_dataServiceVersion = new Version(1, 0); $edmSchemaVersion = $this->providersWrapper->getEdmSchemaVersion(); $this->_metadataManager->getDataServiceAndEdmSchemaVersions($this->_dataServiceVersion, $edmSchemaVersion); $this->_xmlWriter = new \XMLWriter(); $this->_xmlWriter->openMemory(); $this->_xmlWriter->setIndent(4); $this->_writeTopLevelElements($this->_dataServiceVersion->toString()); $resourceTypesInContainerNamespace = array(); $containerNamespace = $this->providersWrapper->getContainerNamespace(); foreach ($this->_metadataManager->getResourceTypesAlongWithNamespace() as $resourceTypeNamespace => $resourceTypesWithName) { if ($resourceTypeNamespace == $containerNamespace) { foreach ($resourceTypesWithName as $resourceTypeName => $resourceType) { $resourceTypesInContainerNamespace[] = $resourceType; } } else { $associationsInThisNamespace = $this->_metadataManager->getResourceAssociationTypesForNamespace($resourceTypeNamespace); $this->_writeSchemaElement($resourceTypeNamespace, $edmSchemaVersion); $uniqueAssociationsInThisNamespace = $this->_metadataManager->getUniqueResourceAssociationTypesForNamespace($resourceTypeNamespace); $this->_writeResourceTypes(array_values($resourceTypesWithName), $associationsInThisNamespace); $this->_writeAssociationTypes($uniqueAssociationsInThisNamespace); } } //write Container schema node and define required nmaespaces $this->_writeSchemaElement($resourceTypeNamespace, $edmSchemaVersion); if (!empty($resourceTypesInContainerNamespace)) { //Get assocation types in container namespace as array of //key-value pairs (with key as association type //lookup key i.e. ResourceType::Name_NavigationProperty::Name. //Same association will appear twice for di-directional relationship //(duplicate value will be there in this case) $associationsInThisNamespace = $this->_metadataManager->getResourceAssociationTypesForNamespace($containerNamespace); //Get association type in container namespace as array of unique values $uniqueAssociationsInThisNamespace = $this->_metadataManager->getUniqueResourceAssociationTypesForNamespace($containerNamespace); $this->_writeResourceTypes($resourceTypesInContainerNamespace, $associationsInThisNamespace); $this->_writeAssociationTypes($uniqueAssociationsInThisNamespace); } $this->_writeEntityContainer(); //End container Schema node $this->_xmlWriter->endElement(); //End edmx:Edmx and edmx:DataServices nodes $this->_xmlWriter->endElement(); $this->_xmlWriter->endElement(); $metadataInCsdl = $this->_xmlWriter->outputMemory(true); return $metadataInCsdl; }