/**
  * {@inheritdoc}
  */
 public function process(ContainerBuilder $container)
 {
     if (!$container->hasParameter('vich_uploader.mappings')) {
         return;
     }
     $serviceTypes = array('inject', 'clean', 'remove', 'upload');
     $metadata = $container->get('vich_uploader.metadata_reader');
     $mappings = $container->getParameter('vich_uploader.mappings');
     foreach ($metadata->getUploadableClasses() as $class) {
         foreach ($metadata->getUploadableFields($class) as $field) {
             if (empty($mappings[$field['mapping']])) {
                 throw MappingNotFoundException::createNotFoundForClassAndField($field['mapping'], $class, $field['propertyName']);
             }
             $mapping = $mappings[$field['mapping']];
             if ($mapping['db_driver'] !== 'propel') {
                 continue;
             }
             foreach ($serviceTypes as $type) {
                 if (!$container->has(sprintf('vich_uploader.listener.%s.%s', $type, $field['mapping']))) {
                     continue;
                 }
                 $definition = $container->getDefinition(sprintf('vich_uploader.listener.%s.%s', $type, $field['mapping']));
                 $definition->setClass($container->getDefinition($definition->getParent())->getClass());
                 $definition->setPublic(true);
                 $definition->addTag('propel.event_subscriber', array('class' => $class));
             }
         }
     }
 }
 /**
  * Creates the property mapping from the read annotation and configured mapping.
  *
  * @param object $obj         The object.
  * @param string $fieldName   The field name.
  * @param array  $mappingData The mapping data.
  *
  * @return PropertyMapping           The property mapping.
  * @throws MappingNotFoundException
  */
 protected function createMapping($obj, $fieldName, array $mappingData)
 {
     if (!array_key_exists($mappingData['mapping'], $this->mappings)) {
         throw MappingNotFoundException::createNotFoundForClassAndField($mappingData['mapping'], $this->getClassName($obj), $fieldName);
     }
     $config = $this->mappings[$mappingData['mapping']];
     $fileProperty = isset($mappingData['propertyName']) ? $mappingData['propertyName'] : $fieldName;
     $fileNameProperty = empty($mappingData['fileNameProperty']) ? $fileProperty . $this->defaultFilenameAttributeSuffix : $mappingData['fileNameProperty'];
     $mapping = new PropertyMapping($fileProperty, $fileNameProperty);
     $mapping->setMappingName($mappingData['mapping']);
     $mapping->setMapping($config);
     if ($config['namer']['service']) {
         $namerConfig = $config['namer'];
         $namer = $this->container->get($namerConfig['service']);
         if (!empty($namerConfig['options']) && $namer instanceof ConfigurableInterface) {
             $namer->configure($namerConfig['options']);
         } else {
             if (!empty($namerConfig['options']) && !$namer instanceof ConfigurableInterface) {
                 throw new \LogicException(sprintf('Namer %s can not receive options as it does not implement ConfigurableInterface.', $namerConfig['service']));
             }
         }
         $mapping->setNamer($namer);
     }
     if ($config['directory_namer']) {
         $mapping->setDirectoryNamer($this->container->get($config['directory_namer']));
     }
     return $mapping;
 }