tao-test/app/generis/core/fileReference/ResourceFileSerializer.php

185 lines
6.5 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; under version 2
* of the License (non-upgradable).
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Copyright (c) 2017 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);
*
*/
namespace oat\generis\model\fileReference;
use oat\generis\model\GenerisRdf;
use oat\generis\model\OntologyAwareTrait;
use oat\oatbox\filesystem\Directory;
use oat\oatbox\filesystem\File;
use oat\oatbox\filesystem\FileSystemService;
use oat\oatbox\service\ConfigurableService;
/**
* Class ResourceFileSerializer
*
* @see UrlFileSerializer
*/
class ResourceFileSerializer extends ConfigurableService implements FileReferenceSerializer
{
use OntologyAwareTrait;
const RESOURCE_FILE_FILESYSTEM_URI = 'fileSystemUri';
const RESOURCE_FILE_PATH = 'path';
const RESOURCE_FILE_NAME = 'fileName';
/**
* @see FileReferenceSerializer::serialize
*/
public function serialize($abstraction)
{
$fileClass = $this->getClass(GenerisRdf::CLASS_GENERIS_FILE);
if ($abstraction instanceof File) {
$filename = $abstraction->getBasename();
$filePath = dirname($abstraction->getPrefix());
} elseif ($abstraction instanceof Directory) {
$filename = '';
$filePath = $abstraction->getPrefix();
} else {
throw new FileSerializerException(
__CLASS__ . '::' . __FUNCTION__ . ' expects parameter to be an instance of Directory or File'
);
}
$resource = $fileClass->createInstanceWithProperties(
[
GenerisRdf::PROPERTY_FILE_FILENAME => $filename,
GenerisRdf::PROPERTY_FILE_FILEPATH => $filePath,
GenerisRdf::PROPERTY_FILE_FILESYSTEM => $this->getResource($abstraction->getFileSystemId()),
]
);
return $resource->getUri();
}
/**
* This implementation uses resource URI as serial
*
* @see FileReferenceSerializer::unserialize
*/
public function unserialize($serial)
{
$properties = $this->getResourceFilePropertiesValues($serial);
$dir = $this->getRootDirectory($properties[self::RESOURCE_FILE_FILESYSTEM_URI]);
return (isset($properties[self::RESOURCE_FILE_NAME]) && !empty($properties[self::RESOURCE_FILE_NAME]))
? $dir->getFile($properties[self::RESOURCE_FILE_PATH] . '/' . $properties[self::RESOURCE_FILE_NAME])
: $dir->getDirectory($properties[self::RESOURCE_FILE_PATH]);
}
/**
* This implementation uses resource URI as serial
*
* @see FileReferenceSerializer::unserializeFile
*/
public function unserializeFile($serial)
{
$properties = $this->getResourceFilePropertiesValues($serial);
return $this->getRootDirectory($properties[self::RESOURCE_FILE_FILESYSTEM_URI])
->getFile($properties[self::RESOURCE_FILE_PATH] . '/' . $properties[self::RESOURCE_FILE_NAME]);
}
/**
* This implementation uses resource URI as serial
*
* @see FileReferenceSerializer::unserializeDirectory
*/
public function unserializeDirectory($serial)
{
$properties = $this->getResourceFilePropertiesValues($serial);
return $this->getRootDirectory($properties[self::RESOURCE_FILE_FILESYSTEM_URI])
->getDirectory($properties[self::RESOURCE_FILE_PATH]);
}
/**
* This implementation uses resource URI as serial
*
* @see FileReferenceSerializer::cleanUp
*/
public function cleanUp($serial)
{
$resourceFile = $this->getResource($serial);
$file = new \core_kernel_classes_Resource($resourceFile);
return $file->delete();
}
/**
* Return root directory represented by the given uri
*
* @return Directory
*/
protected function getRootDirectory($id)
{
return $this->getServiceLocator()->get(FileSystemService::SERVICE_ID)->getDirectory($id);
}
/**
* Return an array with filesystem uri and path following serial
* Serial is Resource file uri, data are extracted from database
*
* This implementation uses resource URI as serial
*
* @param $serial
* @return array
* @throws \common_exception_InvalidArgumentType
* @throws FileSerializerException
*/
protected function getResourceFilePropertiesValues($serial)
{
$file = $this->getResource($serial);
if (!$file->exists()) {
throw new \common_exception_NotFound('File reference serial "' . $serial . '" not exist as resource');
}
if (!$file->hasType($this->getClass(GenerisRdf::CLASS_GENERIS_FILE))) {
throw new \common_exception_NotFound('Resource ' . $serial . ' is not a file');
}
$properties = [];
$propertiesDefinition = [
$this->getProperty(GenerisRdf::PROPERTY_FILE_FILEPATH),
$this->getProperty(GenerisRdf::PROPERTY_FILE_FILESYSTEM),
$this->getProperty(GenerisRdf::PROPERTY_FILE_FILENAME),
];
$propertiesValues = $file->getPropertiesValues($propertiesDefinition);
$fileSystemProperty = current($propertiesValues[GenerisRdf::PROPERTY_FILE_FILESYSTEM]);
$properties[self::RESOURCE_FILE_FILESYSTEM_URI] = $fileSystemProperty instanceof \core_kernel_classes_Resource
? $fileSystemProperty->getUri()
: $fileSystemProperty->literal;
$filePath = current($propertiesValues[GenerisRdf::PROPERTY_FILE_FILEPATH])->literal;
$properties[self::RESOURCE_FILE_PATH] = trim(str_replace(DIRECTORY_SEPARATOR, '/', $filePath), '/');
if (!empty($propertiesValues[GenerisRdf::PROPERTY_FILE_FILENAME])) {
$fileName = current($propertiesValues[GenerisRdf::PROPERTY_FILE_FILENAME])->literal;
$properties[self::RESOURCE_FILE_NAME] = ltrim(str_replace(DIRECTORY_SEPARATOR, '/', $fileName), '/');
}
return $properties;
}
}