/**
  * {@inheritdoc}
  */
 public function loadClassMetadata(ClassMetadataInterface $metadata)
 {
     if ($this->getBaseMetadataFactory()->isTransient($metadata->getClassName())) {
         return;
     }
     $this->loadExtendedClassMetadata($this->getBaseMetadataFactory()->getMetadataFor($metadata->getClassName()), $metadata);
 }
 /**
  * {@inheritdoc}
  */
 protected function loadExtendedClassMetadata(ClassMetadata $baseClassMetadata, ClassMetadataInterface $extendedClassMetadata)
 {
     $classReflection = $extendedClassMetadata->getClassReflection();
     foreach ($classReflection->getProperties() as $property) {
         if ($baseClassMetadata->isMappedSuperclass && !$property->isPrivate() || $baseClassMetadata->isInheritedField($property->name) || isset($baseClassMetadata->associationMappings[$property->name]['inherited'])) {
             continue;
         }
         if ($uploadableAnnotation = $this->getAnnotationReader()->getPropertyAnnotation($property, self::UPLOADABLE)) {
             $extendedClassMetadata->addUploadableProperty($property->getName(), $uploadableAnnotation->targetField, $uploadableAnnotation->filesystem, $uploadableAnnotation->keymaker, $uploadableAnnotation->keyLength, $uploadableAnnotation->keyPattern);
         }
     }
 }
 /**
  * {@inheritDoc}
  */
 protected function loadExtendedClassMetadata(ClassMetadata $baseClassMetadata, ClassMetadataInterface $extendedClassMetadata)
 {
     $classReflection = $extendedClassMetadata->getClassReflection();
     foreach ($classReflection->getProperties() as $property) {
         if ($baseClassMetadata->isMappedSuperclass && !$property->isPrivate() || $baseClassMetadata->isInheritedField($property->name) || isset($baseClassMetadata->associationMappings[$property->name]['inherited'])) {
             continue;
         }
         if ($translatableAnnotation = $this->getAnnotationReader()->getPropertyAnnotation($property, self::TRANSLATABLE)) {
             if (!isset($translatableAnnotation->mappedBy)) {
                 throw new AnnotationException('Annotation \'Translatable\' in property \'' . $property . '\' of class \'' . $baseClassMetadata->name . '\' does not have required \'mappedBy\' attribute');
             }
             $extendedClassMetadata->addTranslatableProperty($translatableAnnotation->mappedBy, $property->getName(), $translatableAnnotation->targetField);
         }
         if ($languageAnnotation = $this->getAnnotationReader()->getPropertyAnnotation($property, self::LOCALE)) {
             $extendedClassMetadata->localeProperty = $property->getName();
         }
     }
 }
 /**
  * {@inheritDoc}
  */
 protected function validateExtendedMetadata(ClassMetadata $baseClassMetadata, ClassMetadataInterface $extendedClassMetadata)
 {
     if ($extendedClassMetadata->hasTranslatableProperties()) {
         if (!isset($extendedClassMetadata->localeProperty)) {
             throw new Exception\MappingException('Entity \'' . $baseClassMetadata->name . '\' has translatable properties so it must have property marked with @Translatable\\Language annotation');
         }
         $translatableProperties = $extendedClassMetadata->getTranslatableProperties();
         foreach ($translatableProperties as $translation => $properties) {
             if (!$baseClassMetadata->hasAssociation($translation) || !$baseClassMetadata->isCollectionValuedAssociation($translation)) {
                 throw new Exception\MappingException('Field \'' . $translation . '\' in entity \'' . $baseClassMetadata->name . '\' has to be a OneToMany association');
             }
         }
     }
     if (isset($extendedClassMetadata->localeProperty)) {
         if ($extendedClassMetadata->hasTranslatableProperties() && ($baseClassMetadata->hasField($extendedClassMetadata->localeProperty) || $baseClassMetadata->hasAssociation($extendedClassMetadata->localeProperty))) {
             throw new Exception\MappingException('Entity \'' . $baseClassMetadata->name . '\' seems to be a translatable entity so its \'' . $extendedClassMetadata->localeProperty . '\' field must not be persistent');
         } else {
             if (!$extendedClassMetadata->hasTranslatableProperties() && !$baseClassMetadata->hasField($extendedClassMetadata->localeProperty) && !$baseClassMetadata->hasAssociation($extendedClassMetadata->localeProperty)) {
                 throw new Exception\MappingException('Entity \'' . $baseClassMetadata->name . '\' seems to be a translation entity so its \'' . $extendedClassMetadata->localeProperty . '\' field must be persistent');
             }
         }
     }
 }
 /**
  * {@inheritdoc}
  */
 protected function validateExtendedMetadata(ClassMetadata $baseClassMetadata, ClassMetadataInterface $extendedClassMetadata)
 {
     foreach ($extendedClassMetadata->getUploadableProperties() as $field => $options) {
         if (empty($options['targetField'])) {
             throw new MappingException(sprintf('Mapping "Uploadable" in property "%s" of class "%s" does not have required "targetField" attribute, or attribute is empty.', $field, $baseClassMetadata->name));
         }
         if (!property_exists($baseClassMetadata->name, $options['targetField'])) {
             throw new MappingException(sprintf('Mapping "Uploadable" in property "%s" of class "%s" has "targetField" set to "%s", which doesn\'t exist.', $field, $baseClassMetadata->name, $options['targetField']));
         }
         if ($baseClassMetadata->hasField($options['targetField'])) {
             throw new MappingException(sprintf('Mapping "Uploadable" in property "%s" of class "%s" have "targetField" that points at already mapped field ("%s").', $field, $baseClassMetadata->name, $options['targetField']));
         }
         if (!$baseClassMetadata->hasField($field)) {
             throw new MappingException(sprintf('Property "%s" of class "%s" have mapping "Uploadable" but isn\'t mapped as Doctrine\'s column.', $field, $baseClassMetadata->name, $options['targetField']));
         }
         if (!is_null($options['keyLength']) and !is_numeric($options['keyLength'])) {
             throw new MappingException(sprintf('Property "%s" of class "%s" have mapping "Uploadable" with key length is not a number.', $field, $baseClassMetadata->name, $options['targetField']));
         }
         if (!is_null($options['keyLength']) and $options['keyLength'] < 1) {
             throw new MappingException(sprintf('Property "%s" of class "%s" have mapping "Uploadable" with key length less than 1.', $field, $baseClassMetadata->name, $options['targetField']));
         }
         if (!is_null($options['keymaker']) and !$options['keymaker'] instanceof KeymakerInterface) {
             throw new MappingException(sprintf('Mapping "Uploadable" in property "%s" of class "%s" does have keymaker that isn\'t instance of expected FSi\\DoctrineExtensions\\Uploadable\\Keymaker\\KeymakerInterface ("%s" given).', $field, $baseClassMetadata->name, is_object($options['keymaker']) ? get_class($options['keymaker']) : gettype($options['keymaker'])));
         }
     }
 }
 /**
  * {@inheritDoc}
  */
 protected function validateExtendedMetadata(ClassMetadata $baseClassMetadata, ClassMetadataInterface $extendedClassMetadata)
 {
     if ($extendedClassMetadata->hasTranslatableProperties()) {
         $this->validateTranslatableLocaleProperty($baseClassMetadata, $extendedClassMetadata);
         $this->validateTranslatableProperties($baseClassMetadata, $extendedClassMetadata);
     } elseif (isset($extendedClassMetadata->localeProperty)) {
         $this->validateTranslationLocaleProperty($baseClassMetadata, $extendedClassMetadata);
     }
 }