/**
  * Gets the ResourceAssociationSet instance for the given source association end,
  * Note: Wrapper for IDataServiceMetadataProvider::getResourceAssociationSet 
  * method implementation
  * 
  * @param ResourceSetWrapper $resourceSetWrapper Resource set of the source 
  *                                               association end
  * @param ResourceType       $resourceType       Resource type of the source 
  *                                               association end
  * @param ResourceProperty   $resourceProperty   Resource property of the source 
  *                                               association end
  * 
  * @return ResourceAssociationSet/NULL Returns ResourceAssociationSet for the source
  *                                             association end, NULL if no such 
  *                                             association end or resource set in the
  *                                             other end of the association is invisible
  */
 public function getResourceAssociationSet(ResourceSetWrapper $resourceSetWrapper, ResourceType $resourceType, ResourceProperty $resourceProperty)
 {
     $resourceType = $this->_getResourceTypeWherePropertyIsDeclared($resourceType, $resourceProperty);
     $cacheKey = $resourceSetWrapper->getName() . '_' . $resourceType->getName() . '_' . $resourceProperty->getName();
     if (array_key_exists($cacheKey, $this->_resourceAssociationSetCache)) {
         return $this->_resourceAssociationSetCache[$cacheKey];
     }
     $associationSet = $this->_metadataProvider->getResourceAssociationSet($resourceSetWrapper->getResourceSet(), $resourceType, $resourceProperty);
     if (!is_null($associationSet)) {
         $thisAssociationSetEnd = $associationSet->getResourceAssociationSetEnd($resourceSetWrapper->getResourceSet(), $resourceType, $resourceProperty);
         $relatedAssociationSetEnd = $associationSet->getRelatedResourceAssociationSetEnd($resourceSetWrapper->getResourceSet(), $resourceType, $resourceProperty);
         //If $thisAssociationSetEnd or $relatedAssociationSetEnd
         //is null means the associationset
         //we got from the IDSMP::getResourceAssociationSet is invalid.
         //AssociationSet::getResourceAssociationSetEnd
         //return null, if AssociationSet's End1 or End2's resourceset name
         //is not matching with the name of
         //resource set wrapper (param1) and resource type is not assignable
         //from given resource type (param2)
         if (is_null($thisAssociationSetEnd) || is_null($relatedAssociationSetEnd)) {
             throw new ODataException(Messages::metadataQueryProviderWrapperIDSMPGetResourceSetReturnsInvalidResourceSet($resourceSetWrapper->getName(), $resourceType->getFullName(), $resourceProperty->getName()), 500);
         }
         $relatedResourceSetWrapper = $this->_validateResourceSetAndGetWrapper($relatedAssociationSetEnd->getResourceSet());
         if ($relatedResourceSetWrapper === null) {
             $associationSet = null;
         } else {
             $this->_validateResourceType($thisAssociationSetEnd->getResourceType());
             $this->_validateResourceType($relatedAssociationSetEnd->getResourceType());
         }
     }
     $this->_resourceAssociationSetCache[$cacheKey] = $associationSet;
     return $associationSet;
 }