/**
  * {@inheritdoc}
  */
 public function loadClassMetadata(ClassMetadataInterface $classMetadata, array $normalizationGroups = null, array $denormalizationGroups = null, array $validationGroups = null)
 {
     $className = $classMetadata->getReflectionClass()->name;
     $manager = $this->managerRegistry->getManagerForClass($className);
     if (!$manager) {
         return $classMetadata;
     }
     $doctrineClassMetadata = $manager->getClassMetadata($className);
     if (!$doctrineClassMetadata) {
         return $classMetadata;
     }
     $identifiers = $doctrineClassMetadata->getIdentifier();
     if (1 !== count($identifiers)) {
         return $classMetadata;
     }
     $identifierName = $identifiers[0];
     if (!$classMetadata->hasAttributeMetadata($identifierName)) {
         $attributeMetadata = $this->attributeMetadataFactory->getAttributeMetadataFor($classMetadata, $identifierName, $normalizationGroups, $denormalizationGroups);
         if ($doctrineClassMetadata->isIdentifierNatural()) {
             $attributeMetadata = $attributeMetadata->withWritable(false);
         }
         $classMetadata = $classMetadata->withAttributeMetadata($identifierName, $attributeMetadata);
     }
     $classMetadata = $classMetadata->withIdentifierName($identifierName);
     return $classMetadata;
 }
 public function getAttributeMetadataFor(ClassMetadataInterface $classMetadata, $attributeName, array $normalizationGroups = null, array $denormalizationGroups = null)
 {
     if ($classMetadata->hasAttributeMetadata($attributeName)) {
         return $classMetadata->getAttributeMetadata($attributeName);
     }
     $attributeMetadata = new AttributeMetadata();
     $reflectionProperty = $this->getReflectionProperty($classMetadata->getReflectionClass(), $attributeName);
     if (!$reflectionProperty) {
         return $attributeMetadata;
     }
     $types = $this->propertyInfo->getTypes($reflectionProperty);
     if (!isset($types[0])) {
         return $attributeMetadata;
     }
     $type = $types[0];
     $attributeMetadata = $attributeMetadata->withType($type);
     $class = $type->getClass();
     $link = $this->resourceCollection->getResourceForEntity($class) || $type->isCollection() && $type->getCollectionType() && ($class = $type->getCollectionType()->getClass()) && $this->resourceCollection->getResourceForEntity($class);
     $attributeMetadata = $attributeMetadata->withLink($link)->withLinkClass($class);
     if (!$link) {
         return $attributeMetadata;
     }
     if (null === $normalizationGroups) {
         $attributeMetadata = $attributeMetadata->withNormalizationLink(true);
     }
     if (null === $denormalizationGroups) {
         $attributeMetadata = $attributeMetadata->withDenormalizationLink(true);
     }
     return $attributeMetadata;
 }
 /**
  * Populates normalization and denormalization links.
  *
  * @param ClassMetadataInterface     $classMetadata
  * @param string                     $attributeName
  * @param AttributeMetadataInterface $attributeMetadata
  * @param array|null                 $normalizationGroups
  * @param array|null                 $denormalizationGroups
  *
  * @return ClassMetadataInterface
  */
 private function populateNormalizationLinks(ClassMetadataInterface $classMetadata, $attributeName, AttributeMetadataInterface $attributeMetadata, array $normalizationGroups = null, array $denormalizationGroups = null)
 {
     if (!$classMetadata->hasAttributeMetadata($attributeName) || !$attributeMetadata->isLink() || $attributeMetadata->isNormalizationLink() && $attributeMetadata->isDenormalizationLink()) {
         return $classMetadata;
     }
     $relationSerializerMetadata = $this->serializerClassMetadataFactory->getMetadataFor($attributeMetadata->getLinkClass());
     if (!$relationSerializerMetadata) {
         $attributeMetadata = $attributeMetadata->withNormalizationLink(true)->withDenormalizationLink(true);
         return $classMetadata->withAttributeMetadata($attributeName, $attributeMetadata);
     }
     foreach ($relationSerializerMetadata->getAttributesMetadata() as $serializerAttributeMetadata) {
         $serializerAttributeGroups = $serializerAttributeMetadata->getGroups();
         if (null !== $normalizationGroups && 1 <= count(array_intersect($normalizationGroups, $serializerAttributeGroups))) {
             $normalizationLink = false;
         }
         if (null !== $denormalizationGroups && 1 <= count(array_intersect($denormalizationGroups, $serializerAttributeGroups))) {
             $denormalizationLink = false;
         }
         if (isset($normalizationLink) && isset($denormalizationLink)) {
             $classMetadata = $classMetadata->withAttributeMetadata($attributeName, $attributeMetadata);
         }
     }
     if (!isset($normalizationLink)) {
         $attributeMetadata = $attributeMetadata->withNormalizationLink(true);
     }
     if (!isset($denormalizationLink)) {
         $attributeMetadata = $attributeMetadata->withDenormalizationLink(true);
     }
     return $classMetadata->withAttributeMetadata($attributeName, $attributeMetadata);
 }