* @package tao */ class tao_models_classes_import_RdfImporter implements tao_models_classes_import_ImportHandler, ServiceLocatorAwareInterface, TaskParameterProviderInterface { use EventManagerAwareTrait; use ImportHandlerHelperTrait; /** * (non-PHPdoc) * @see tao_models_classes_import_ImportHandler::getLabel() */ public function getLabel() { return __('RDF'); } /** * (non-PHPdoc) * @see tao_models_classes_import_ImportHandler::getForm() */ public function getForm() { $form = new tao_models_classes_import_RdfImportForm(); return $form->getForm(); } /** * @param core_kernel_classes_Class $class * @param tao_helpers_form_Form|array $form * @param string|null $userId owner of the resource * @return common_report_Report * @throws common_Exception * @throws common_exception_Error */ public function import($class, $form, $userId = null) { $parser = new tao_models_classes_Parser($this->fetchUploadedFile($form), ['extension' => 'rdf']); $parser->validate(); if (!$parser->isValid()) { $report = common_report_Report::createFailure(__('Nothing imported')); $report->add($parser->getReport()); } else { $report = $this->flatImport($parser->getContent(), $class); if (!$report->containsError()) { $this->getUploadService()->remove($parser->getSource()); } if ($report->getType() == common_report_Report::TYPE_SUCCESS) { $this->getEventManager()->trigger(new RdfImportEvent($report)); } } return $report; } /** * Imports the rdf file into the selected class * * @param string $content * @param core_kernel_classes_Class $class * @return common_report_Report */ protected function flatImport($content, core_kernel_classes_Class $class) { $report = common_report_Report::createSuccess(__('Data imported successfully')); $graph = new EasyRdf_Graph(); $graph->parse($content); // keep type property $map = [ OntologyRdf::RDF_PROPERTY => OntologyRdf::RDF_PROPERTY ]; foreach ($graph->resources() as $resource) { $map[$resource->getUri()] = common_Utils::getNewUri(); } $format = EasyRdf_Format::getFormat('php'); $data = $graph->serialise($format); foreach ($data as $subjectUri => $propertiesValues) { $resource = new core_kernel_classes_Resource($map[$subjectUri]); $subreport = $this->importProperties($resource, $propertiesValues, $map, $class); $report->add($subreport); } return $report; } /** * Import the properties of the resource * * @param core_kernel_classes_Resource $resource * @param array $propertiesValues * @param array $map * @param core_kernel_classes_Class $class * @return common_report_Report */ protected function importProperties(core_kernel_classes_Resource $resource, $propertiesValues, $map, $class) { if (isset($propertiesValues[OntologyRdf::RDF_TYPE])) { // assuming single Type if (count($propertiesValues[OntologyRdf::RDF_TYPE]) > 1) { return new common_report_Report(common_report_Report::TYPE_ERROR, __('Resource not imported due to multiple types')); } else { foreach ($propertiesValues[OntologyRdf::RDF_TYPE] as $k => $v) { $classType = isset($map[$v['value']]) ? new core_kernel_classes_Class($map[$v['value']]) : $class; //$resource->setType($classType); $classType->createInstance(null, null, $resource->getUri()); } } unset($propertiesValues[OntologyRdf::RDF_TYPE]); } if (isset($propertiesValues[OntologyRdfs::RDFS_SUBCLASSOF])) { $resource = new core_kernel_classes_Class($resource); // assuming single subclass if (isset($propertiesValues[OntologyRdf::RDF_TYPE]) && count($propertiesValues[OntologyRdf::RDF_TYPE]) > 1) { return new common_report_Report(common_report_Report::TYPE_ERROR, __('Resource not imported due to multiple super classes')); } foreach ($propertiesValues[OntologyRdfs::RDFS_SUBCLASSOF] as $k => $v) { $classSup = isset($map[$v['value']]) ? new core_kernel_classes_Class($map[$v['value']]) : $class; $resource->setSubClassOf($classSup); } unset($propertiesValues[OntologyRdfs::RDFS_SUBCLASSOF]); } foreach ($propertiesValues as $prop => $values) { $property = new core_kernel_classes_Property(isset($map[$prop]) ? $map[$prop] : $prop); foreach ($values as $k => $v) { $value = isset($map[$v['value']]) ? $map[$v['value']] : $v['value']; if (isset($v['lang'])) { $resource->setPropertyValueByLg($property, $value, $v['lang']); } else { $resource->setPropertyValue($property, $value); } } } $msg = $resource instanceof core_kernel_classes_Class ? __('Successfully imported class "%s"', $resource->getLabel()) : __('Successfully imported "%s"', $resource->getLabel()); return new common_report_Report(common_report_Report::TYPE_SUCCESS, $msg, $resource); } }