diff --git a/src/metadatamanipulators/AddUuidToTemplated.php b/src/metadatamanipulators/AddUuidToTemplated.php new file mode 100644 index 0000000..5b526ee --- /dev/null +++ b/src/metadatamanipulators/AddUuidToTemplated.php @@ -0,0 +1,84 @@ +{{ UUID }}. + */ +class AddUuidToTemplated extends MetadataManipulator +{ + /** + * Create a new metadata manipulator instance. + */ + public function __construct($settings, $paramsArray, $record_key) + { + parent::__construct($settings, $paramsArray, $record_key); + $this->record_key = $record_key; + + // Set up logger. + $this->pathToLog = $this->settings['LOGGING']['path_to_manipulator_log']; + $this->log = new \Monolog\Logger('config'); + $this->logStreamHandler = new \Monolog\Handler\StreamHandler( + $this->pathToLog, + Logger::INFO + ); + $this->log->pushHandler($this->logStreamHandler); + + if (count($paramsArray) == 1) { + $this->templatePath = $paramsArray[0]; + $this->templateDirectory = pathinfo($paramsArray[0], PATHINFO_DIRNAME); + $this->templateFilename = pathinfo($paramsArray[0], PATHINFO_BASENAME); + } else { + $this->log->addInfo("AddUuidToTemplated", array('Wrong parameter count' => count($paramsArray))); + } + } + + /** + * General manipulate wrapper method. + * + * @param string $input An XML file to be manipulated. + * + * @return string + * Manipulated XML. + */ + public function manipulate($input) + { + if (file_exists($this->templatePath)) { + $uuid4 = Uuid::uuid4(); + $uuid_string = $uuid4->toString(); + + $loader = new \Twig_Loader_Filesystem($this->templateDirectory); + $twig = new \Twig_Environment($loader); + $xml_from_template = $twig->render($this->templateFilename, array('UUID' => $uuid_string)); + + // Convert $input into DOM, add child from template, reserialize DOM as XML and return it. + $dom = new \DOMDocument; + $dom->preserveWhiteSpace = true; + $dom->formatOutput = true; + $dom->loadXML($input); + $frag = $dom->createDocumentFragment(); + $frag->appendXML($xml_from_template); + $dom->documentElement->appendChild($frag); + $this->log->addInfo("AddUuidToTemplated", array('Record key' => $this->record_key, + 'Template applied' => $this->templatePath, + 'UUID added' => $uuid_string + )); + return $dom->saveXML(); + } else { + $this->log->addWarning("AddUuidToTemplated", array('Record key' => $this->record_key, + 'Template not found' => $this->templatePath + )); + } + } +} diff --git a/tests/assets/templated_metadata_parser/adduuidtotemplatedtest.xml b/tests/assets/templated_metadata_parser/adduuidtotemplatedtest.xml new file mode 100644 index 0000000..9028df8 --- /dev/null +++ b/tests/assets/templated_metadata_parser/adduuidtotemplatedtest.xml @@ -0,0 +1 @@ +{{ UUID }} diff --git a/tests/metadatamanipulators/MetadataManipulatorAddUuidToTemplatedTest.php b/tests/metadatamanipulators/MetadataManipulatorAddUuidToTemplatedTest.php new file mode 100644 index 0000000..3a5adbc --- /dev/null +++ b/tests/metadatamanipulators/MetadataManipulatorAddUuidToTemplatedTest.php @@ -0,0 +1,92 @@ +path_to_temp_dir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . "mik_templated_temp_dir"; + $this->path_to_output_dir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . "mik_templated_output_dir"; + $this->path_to_log = $this->path_to_temp_dir . DIRECTORY_SEPARATOR . "mik.log"; + $this->path_to_mods_schema = realpath( + $this->asset_base_dir . DIRECTORY_SEPARATOR . '/../../extras/scripts/mods-3-5.xsd' + ); + $this->path_to_manipulator_log = $this->path_to_temp_dir . + DIRECTORY_SEPARATOR . "mik_metadatamanipulator_test.log"; + } + + /** + * @covers ::metadata + * @covers ::populateTemplate + */ + public function testCreateMetadata() + { + $settings = array( + 'FETCHER' => array( + 'class' => 'Csv', + 'input_file' => $this->asset_base_dir . '/csv/sample_metadata.csv', + 'record_key' => 'ID', + 'temp_directory' => $this->path_to_temp_dir, + ), + 'FILE_GETTER' => array( + 'validate_input' => false, + 'class' => 'CsvSingleFile', + 'file_name_field' => 'File', + ), + 'LOGGING' => array( + 'path_to_log' => $this->path_to_log, + 'path_to_manipulator_log' => $this->path_to_manipulator_log, + ), + 'METADATA_PARSER' => array( + 'template' => $this->asset_base_dir . '/templated_metadata_parser/templated_mods_twig.xml', + ), + 'MANIPULATORS' => array( + 'metadatamanipulators' => array( + 'AddUuidToTemplated|' . $this->asset_base_dir . + '/templated_metadata_parser/adduuidtotemplatedtest.xml' + ), + ), + ); + + $parser = new Templated($settings); + $mods = $parser->metadata('postcard_1'); + + $dom = new \DOMDocument; + $dom->loadXML($mods); + + $this->assertTrue( + $dom->schemaValidate($this->path_to_mods_schema), + "MODS document generate by Templated metadata parser did not validate" + ); + $identifier_element = ''; + $this->assertContains($identifier_element, $mods, "AddUuidToTemplated metadata manipulator did not work"); + } +}