/**
* Convert an object from $source to an \Neos\Media\Domain\Model\AssetInterface implementation
*
* @param mixed $source
* @param string $targetType must implement 'Neos\Media\Domain\Model\AssetInterface'
* @param array $convertedChildProperties
* @param PropertyMappingConfigurationInterface $configuration
* @return Error|AssetInterface The converted Asset, a Validation Error or NULL
* @throws InvalidTargetException
*/
public function convertFrom($source, $targetType, array $convertedChildProperties = array(), PropertyMappingConfigurationInterface $configuration = null)
{
$object = null;
if (is_string($source) && $source !== '') {
$source = array('__identity' => $source);
}
if (isset($convertedChildProperties['resource']) && $convertedChildProperties['resource'] instanceof PersistentResource) {
$resource = $convertedChildProperties['resource'];
if (isset($this->resourcesAlreadyConvertedToAssets[$resource->getSha1()])) {
$object = $this->resourcesAlreadyConvertedToAssets[$resource->getSha1()];
}
// This is pretty late to override the targetType, but usually you want to determine the model type from the resource when a new resource was uploaded...
$targetType = $this->applyModelMappingStrategy($targetType, $resource, $source);
}
if ($object === null) {
if ($configuration !== null && $configuration->getConfigurationValue(self::class, self::CONFIGURATION_ONE_PER_RESOURCE) === true && isset($convertedChildProperties['resource'])) {
$resource = $convertedChildProperties['resource'];
$possibleAsset = $this->assetRepository->findOneByResourceSha1($resource->getSha1());
if ($possibleAsset !== null) {
$this->resourceManager->deleteResource($resource);
return $possibleAsset;
}
}
$object = parent::convertFrom($source, $targetType, $convertedChildProperties, $configuration);
}
if ($object instanceof AssetInterface) {
$object = $this->applyTypeSpecificHandling($object, $source, $convertedChildProperties, $configuration);
if ($object !== null) {
$this->resourcesAlreadyConvertedToAssets[$object->getResource()->getSha1()] = $object;
if (isset($resource) && $resource !== $object->getResource()) {
$this->resourceManager->deleteResource($resource);
}
}
}
return $object;
}