/**
  * {@inheritdoc}
  */
 public function loadClassMetadata(ClassMetadataInterface $classMetadata, array $normalizationGroups = null, array $denormalizationGroups = null, array $validationGroups = null)
 {
     $validatorClassMetadata = $this->validatorMetadataFactory->getMetadataFor($classMetadata->getName());
     foreach ($classMetadata->getAttributesMetadata() as $attributeName => $attributeMetadata) {
         foreach ($validatorClassMetadata->getPropertyMetadata($attributeName) as $propertyMetadata) {
             if (null === $validationGroups) {
                 foreach ($propertyMetadata->findConstraints($validatorClassMetadata->getDefaultGroup()) as $constraint) {
                     if ($this->isRequired($constraint)) {
                         $attributeMetadata = $attributeMetadata->withRequired(true);
                         break 2;
                     }
                 }
             } else {
                 foreach ($validationGroups as $validationGroup) {
                     if (!is_string($validationGroup)) {
                         continue;
                     }
                     foreach ($propertyMetadata->findConstraints($validationGroup) as $constraint) {
                         if ($this->isRequired($constraint)) {
                             $attributeMetadata = $attributeMetadata->withRequired(true);
                             break 3;
                         }
                     }
                 }
             }
         }
         $classMetadata = $classMetadata->withAttributeMetadata($attributeName, $attributeMetadata);
     }
     return $classMetadata;
 }
 /**
  * {@inheritdoc}
  */
 public function loadClassMetadata(ClassMetadataInterface $classMetadata, array $normalizationGroups = null, array $denormalizationGroups = null, array $validationGroups = null)
 {
     if (null === $normalizationGroups && null === $denormalizationGroups) {
         return $classMetadata;
     }
     $serializerClassMetadata = $this->serializerClassMetadataFactory->getMetadataFor($classMetadata->getName());
     foreach ($serializerClassMetadata->getAttributesMetadata() as $serializerAttributeMetadata) {
         $attributeName = $serializerAttributeMetadata->getName();
         $attributeMetadata = $this->attributeMetadataFactory->getAttributeMetadataFor($classMetadata, $attributeName, $normalizationGroups, $denormalizationGroups);
         list($classMetadata, $attributeMetadata) = $this->populateAttributeMetadata($classMetadata, $attributeName, $attributeMetadata, $serializerAttributeMetadata, $normalizationGroups, $denormalizationGroups);
         $classMetadata = $this->populateNormalizationLinks($classMetadata, $attributeName, $attributeMetadata, $normalizationGroups, $denormalizationGroups);
     }
     return $classMetadata;
 }