/**
  * Load a resource into a object property and return instance of resource
  *
  * @param object        $context  object to inject the resource
  * @param string        $property property to use, should have a valid resource annotation
  * @param File          $file     instance of file to inject
  * @param EntityManager $em       Entity manager instance, required in case of load the resource manually
  *
  * @return ResourceObjectInterface the resource object instance
  * @throws \Exception
  */
 public function load(&$context, $property, File $file, EntityManager $em = null)
 {
     $accessor = new PropertyAccessor();
     if (($resource = $accessor->getValue($context, $property)) && $resource instanceof ResourceObjectInterface) {
         $resource->setFile($file);
         //update
         //delete any existent
         if ($resource->getId() && $resource->getMapping() && $resource->getLocation()) {
             $previousResolverName = $this->getLocationConfig('resolver', $resource->getLocation(), $this->config);
             $previousResolver = $this->resolverManager->get($previousResolverName);
             $previousResolver->setConfig($this->config);
             $previousResolver->deleteFile($resource);
         }
     } else {
         /** @var ResourceObjectInterface $resource */
         $resource = new $this->class();
         //create
         $resource->setFile($file);
     }
     if (null === ($config = $this->getPropertyConfig($context, $property))) {
         $message = sprintf('Can not create resource for %s in %s.
          Invalid object or annotation is missing.', $property, $context);
         throw new \LogicException($message);
     }
     //new file settings
     $resource->setMapping($config->getMapping());
     $resource->setUpdated(new \DateTime());
     $resource->setSize($file->getSize());
     $resource->setMimeType($file->getMimeType());
     if (isset($this->config['mappings'][$config->getMapping()]['location'])) {
         $resource->setLocation($this->config['mappings'][$config->getMapping()]['location']);
     } else {
         $resource->setLocation($this->config['default_location']);
     }
     $resolverName = $this->getLocationConfig('resolver', $resource->getLocation(), $this->config);
     $resolver = $this->resolverManager->get($resolverName);
     $resolver->setConfig($this->config);
     $resourceMapping = $this->getResourceMapping($this->config, $resource);
     if (isset($resourceMapping['relative_path']) && ($relativePath = $resourceMapping['relative_path'])) {
         $relativePath = $this->parseName($relativePath, $context, $property);
         $resource->setRelativePath($relativePath);
     }
     foreach ($this->transformerManager->getAll() as $transformer) {
         if ($transformer->supports($resource->getFile(), $config)) {
             $file = $transformer->transform($resource->getFile(), $config);
             $resource->setFile($file);
         }
     }
     $this->setResourceName($resource, $property, $context);
     //save
     $resolver->saveFile($resource);
     $resource->setUrl($resolver->getUrl($resource));
     $accessor->setValue($context, $property, $resource);
     if ($em) {
         //prepare the listener to listen any save operation after resource load
         $updater = new ResourceLoaderListener($this, $context, $property, $resource->getFile());
         $em->getEventManager()->addEventListener([Events::postPersist, Events::preUpdate], $updater);
     }
     return $resource;
 }
 /**
  * loadResource
  *
  * @param ResourceObjectInterface $resource
  *
  * @throws \Exception
  */
 protected function loadResource(ResourceObjectInterface $resource)
 {
     $resolverName = $this->getLocationConfig('resolver', $resource->getLocation(), $this->config);
     $resolver = $this->resolverManager->get($resolverName);
     $resolver->setConfig($this->config);
     $resource->setFile($resolver->getFile($resource));
     $resource->setUrl($resolver->getUrl($resource));
 }