296 lines
9.9 KiB
PHP
296 lines
9.9 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;
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
namespace oat\taoDeliveryRdf\scripts\tools;
|
||
|
|
||
|
use common_report_Report as Report;
|
||
|
use oat\generis\model\kernel\persistence\smoothsql\search\filter\Filter;
|
||
|
use oat\generis\model\kernel\persistence\smoothsql\search\filter\FilterOperator;
|
||
|
use oat\generis\model\OntologyAwareTrait;
|
||
|
use oat\oatbox\action\ResolutionException;
|
||
|
use oat\oatbox\extension\AbstractAction;
|
||
|
use oat\oatbox\service\ServiceNotFoundException;
|
||
|
use oat\taoDeliveryRdf\model\DeliverArchiveExistingException;
|
||
|
use oat\taoDeliveryRdf\model\DeliveryArchiveNotExistingException;
|
||
|
use oat\taoDeliveryRdf\model\DeliveryZipException;
|
||
|
use oat\taoDeliveryRdf\model\DeliveryArchiveService;
|
||
|
use oat\taoDeliveryRdf\model\DeliveryAssemblyService;
|
||
|
|
||
|
/**
|
||
|
* Run examples:
|
||
|
*
|
||
|
* - Show list of deliveries:
|
||
|
* ```
|
||
|
* sudo -u www-data php index.php 'oat\taoDeliveryRdf\scripts\tools\DeliveryExecutionArchive' list
|
||
|
* ```
|
||
|
*/
|
||
|
class DeliveryExecutionArchive extends AbstractAction
|
||
|
{
|
||
|
use OntologyAwareTrait;
|
||
|
|
||
|
/**
|
||
|
* @var array Available script modes
|
||
|
*/
|
||
|
public static $options = ['list', 'archive', 'unarchive', 'delete'];
|
||
|
|
||
|
/**
|
||
|
* @var Report
|
||
|
*/
|
||
|
protected $report;
|
||
|
|
||
|
/**
|
||
|
* @var array list of given params
|
||
|
*/
|
||
|
protected $params;
|
||
|
|
||
|
/**
|
||
|
* @param $params
|
||
|
* @return Report
|
||
|
* @throws \common_exception_Error
|
||
|
*/
|
||
|
public function __invoke($params)
|
||
|
{
|
||
|
$this->params = $params;
|
||
|
|
||
|
try {
|
||
|
$this->process();
|
||
|
} catch (\Exception $e) {
|
||
|
$this->helpAction($e->getMessage());
|
||
|
}
|
||
|
|
||
|
return $this->report;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Process action call
|
||
|
*
|
||
|
* @throws ResolutionException
|
||
|
* @throws \common_exception_Error
|
||
|
* @throws ServiceNotFoundException
|
||
|
*/
|
||
|
private function process()
|
||
|
{
|
||
|
$time_start = microtime(true);
|
||
|
|
||
|
if (empty($this->params)) {
|
||
|
throw new ResolutionException('Parameters were not given');
|
||
|
}
|
||
|
$option = $this->getOptionUsed();
|
||
|
|
||
|
switch ($option) {
|
||
|
case 'list':
|
||
|
$this->listAction();
|
||
|
break;
|
||
|
case 'unarchive':
|
||
|
$this->unArchiveAction();
|
||
|
break;
|
||
|
case 'archive':
|
||
|
$this->archiveAction();
|
||
|
break;
|
||
|
case 'delete':
|
||
|
$this->deleteArchivesAction();
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
$time_end = microtime(true);
|
||
|
$execution_time = ($time_end - $time_start) / 60;
|
||
|
|
||
|
$this->report->add(new Report(Report::TYPE_INFO, 'Time:' . round($execution_time, 4) . ' Minutes.'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Show list of all existing deliveries
|
||
|
*/
|
||
|
private function listAction()
|
||
|
{
|
||
|
$deliveryClass = $this->getClass(DeliveryAssemblyService::CLASS_URI);
|
||
|
$deliveries = $deliveryClass->getInstances(true);
|
||
|
$result = [];
|
||
|
foreach ($deliveries as $delivery) {
|
||
|
/** @var \core_kernel_classes_Resource $delivery */
|
||
|
$result[] = $this->deliveryDescription($delivery);
|
||
|
}
|
||
|
$this->report = new Report(
|
||
|
Report::TYPE_INFO,
|
||
|
implode(PHP_EOL, $result)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @throws \common_exception_Error
|
||
|
* @throws ServiceNotFoundException
|
||
|
*/
|
||
|
private function unArchiveAction()
|
||
|
{
|
||
|
$this->report = new Report(
|
||
|
Report::TYPE_INFO,
|
||
|
'Unarchived deliveries:'
|
||
|
);
|
||
|
|
||
|
$deliveryClass = $this->getClass(DeliveryAssemblyService::CLASS_URI);
|
||
|
$deliveries = $deliveryClass->searchInstances([
|
||
|
new Filter(DeliveryAssemblyService::PROPERTY_DELIVERY_TIME, null, FilterOperator::createIsNotNull())
|
||
|
]);
|
||
|
|
||
|
/** @var DeliveryArchiveService $archiveService */
|
||
|
$archiveService = $this->getServiceLocator()->get(DeliveryArchiveService::SERVICE_ID);
|
||
|
$this->propagate($archiveService);
|
||
|
|
||
|
/** @var \core_kernel_classes_Resource $compiledDelivery */
|
||
|
foreach ($deliveries as $compiledDelivery) {
|
||
|
try {
|
||
|
$fileName = $archiveService->unArchive($compiledDelivery, $this->isForced());
|
||
|
$this->report->add(new Report(Report::TYPE_SUCCESS, 'Delivery ' . $this->deliveryDescription($compiledDelivery) . ' unarchived completed: ' . $fileName));
|
||
|
} catch (DeliveryArchiveNotExistingException $exception) {
|
||
|
$this->report->add(new Report(Report::TYPE_ERROR, 'Delivery ' . $this->deliveryDescription($compiledDelivery) . ' ' . $exception->getMessage()));
|
||
|
} catch (DeliveryZipException $exception) {
|
||
|
$this->report->add(new Report(Report::TYPE_ERROR, 'Delivery ' . $this->deliveryDescription($compiledDelivery) . ' ' . $exception->getMessage()));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @throws \common_exception_Error
|
||
|
* @throws ServiceNotFoundException
|
||
|
*/
|
||
|
private function archiveAction()
|
||
|
{
|
||
|
$this->report = new Report(
|
||
|
Report::TYPE_INFO,
|
||
|
'Archived deliveries:'
|
||
|
);
|
||
|
|
||
|
$deliveryClass = $this->getClass(DeliveryAssemblyService::CLASS_URI);
|
||
|
$deliveries = $deliveryClass->searchInstances([
|
||
|
new Filter(DeliveryAssemblyService::PROPERTY_DELIVERY_TIME, null, FilterOperator::createIsNotNull())
|
||
|
]);
|
||
|
/** @var DeliveryArchiveService $archiveService */
|
||
|
$archiveService = $this->getServiceLocator()->get(DeliveryArchiveService::SERVICE_ID);
|
||
|
$this->propagate($archiveService);
|
||
|
|
||
|
/** @var \core_kernel_classes_Resource $compiledDelivery */
|
||
|
foreach ($deliveries as $compiledDelivery) {
|
||
|
try {
|
||
|
$fileName = $archiveService->archive($compiledDelivery, $this->isForced());
|
||
|
$this->report->add(new Report(Report::TYPE_SUCCESS, 'Delivery ' . $this->deliveryDescription($compiledDelivery) . ' archive created: ' . $fileName));
|
||
|
} catch (DeliverArchiveExistingException $exception) {
|
||
|
$this->report->add(new Report(Report::TYPE_ERROR, 'Delivery ' . $this->deliveryDescription($compiledDelivery) . ' ' . $exception->getMessage() . ' use --force to regenerate'));
|
||
|
} catch (DeliveryZipException $exception) {
|
||
|
$this->report->add(new Report(Report::TYPE_ERROR, 'Delivery ' . $this->deliveryDescription($compiledDelivery) . ' ' . $exception->getMessage()));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @throws \common_exception_Error
|
||
|
* @throws ServiceNotFoundException
|
||
|
*/
|
||
|
private function deleteArchivesAction()
|
||
|
{
|
||
|
$this->report = new Report(
|
||
|
Report::TYPE_INFO,
|
||
|
'Deleted Archived deliveries:'
|
||
|
);
|
||
|
|
||
|
$deliveryClass = $this->getClass(DeliveryAssemblyService::CLASS_URI);
|
||
|
$deliveries = $deliveryClass->searchInstances([
|
||
|
new Filter(DeliveryAssemblyService::PROPERTY_DELIVERY_TIME, null, FilterOperator::createIsNotNull())
|
||
|
]);
|
||
|
/** @var DeliveryArchiveService $archiveService */
|
||
|
$archiveService = $this->getServiceLocator()->get(DeliveryArchiveService::SERVICE_ID);
|
||
|
$this->propagate($archiveService);
|
||
|
|
||
|
/** @var \core_kernel_classes_Resource $compiledDelivery */
|
||
|
foreach ($deliveries as $compiledDelivery) {
|
||
|
$fileName = $archiveService->deleteArchive($compiledDelivery);
|
||
|
|
||
|
$this->report->add(new Report(Report::TYPE_SUCCESS, 'Delivery ' . $this->deliveryDescription($compiledDelivery) . ' archive deleted: ' . $fileName));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @throws ResolutionException
|
||
|
* @return string
|
||
|
*/
|
||
|
private function getOptionUsed()
|
||
|
{
|
||
|
$mode = $this->params[0];
|
||
|
|
||
|
if (!in_array($mode, self::$options)) {
|
||
|
throw new ResolutionException('Wrong mode was specified');
|
||
|
}
|
||
|
return $mode;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return bool
|
||
|
*/
|
||
|
protected function isForced()
|
||
|
{
|
||
|
$isForce = isset($this->params[1]) ? $this->params[1] : false;
|
||
|
if ($isForce === '--force') {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param \core_kernel_classes_Resource $delivery
|
||
|
* @return string
|
||
|
*/
|
||
|
private function deliveryDescription($delivery)
|
||
|
{
|
||
|
return $delivery->getLabel() . ' - ' . $delivery->getUri();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set help report
|
||
|
* @param string $message error message to be shown before help information
|
||
|
* @throws \common_exception_Error
|
||
|
*/
|
||
|
private function helpAction($message = null)
|
||
|
{
|
||
|
if ($message !== null) {
|
||
|
$this->report = new Report(
|
||
|
Report::TYPE_ERROR,
|
||
|
$message . PHP_EOL
|
||
|
);
|
||
|
}
|
||
|
|
||
|
$helpReport = new Report(
|
||
|
Report::TYPE_INFO,
|
||
|
"Usage: " . __CLASS__ . " <mode> [<args>]" . PHP_EOL . PHP_EOL
|
||
|
. "Available modes:" . PHP_EOL
|
||
|
. " list get list of all deliveries" . PHP_EOL
|
||
|
. " archive archive all deliveries use --force to forge regeneration" . PHP_EOL
|
||
|
. " unarchive unarchive all deliveries --force to forge unarchiving" . PHP_EOL
|
||
|
. " delete delete all archives deliveries" . PHP_EOL
|
||
|
);
|
||
|
|
||
|
if ($this->report) {
|
||
|
$this->report->add($helpReport);
|
||
|
} else {
|
||
|
$this->report = $helpReport;
|
||
|
}
|
||
|
}
|
||
|
}
|