コード例 #1
0
 /**
  * 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()));
     }
 }
コード例 #2
0
ファイル: MetadataWriter.php プロジェクト: lionsoft/phpodata
 /**
  * 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;
 }