diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF index ec9905d5ea72fb46043564a934c4811e111aa173..cfb9c324fd4af8eca171f50b6cb450c315ff7422 100644 --- a/META-INF/MANIFEST.MF +++ b/META-INF/MANIFEST.MF @@ -1,2 +1,2 @@ -Main-Class: org.slub.rosetta.dps.repository.plugin.SLUBTechnicalMetadataExtractorCheckItTiffPlugin +Main-Class: org.slub.rosetta.dps.repository.plugin.SLUBRetroMonographieTIFFFormatValidationPlugin diff --git a/Makefile b/Makefile index 1c699f29b34792b67fe42c4e3a7f51bae27013d9..3872367923537e2fd00710b456a1d64446e7b0ad 100644 --- a/Makefile +++ b/Makefile @@ -2,12 +2,12 @@ # Andreas Romeyke, SLUB Dresden # Plugin, welches TIFFs via checkit_tiff validiert -# Pfad zu Java 11 -JAVAPATH=/usr/lib/jvm/java-11-*/bin -JAVARELEASE=11 +# Pfad zu Java +JAVAPATH=/usr/lib/jvm/java-1.17.0-openjdk-*/bin/ +JAVARELEASE=17 # Verwendete Rosetta-Version -ROSETTAVERSION=7.1.0 +ROSETTAVERSION=7.3.0 # Pfad zum Rosetta-SDK ROSETTASDK=/exlibris/dps/d4_1/system.dir/dps-sdk-${ROSETTAVERSION}/lib/ @@ -20,12 +20,12 @@ ROSETTASDKPLUGINS=${ROSETTASDK}/../../bundled_plugins/ JUNITCLASSPATH=/usr/share/java/junit4.jar #SOURCESCLASSPATH=org/slub/rosetta/dps/repository/plugin/storage/nfs CLASSPATH=${ROSETTASDKDEPOSIT}/dps-sdk-${ROSETTAVERSION}.jar +#BUILDPATH=$(CLASSPATH) # sources - -SOURCES=java/org/slub/rosetta/dps/repository/plugin/SLUBTechnicalMetadataExtractorCheckItTiffPlugin.java +SOURCES=java/org/slub/rosetta/dps/repository/plugin/SLUBRetroMonographieTIFFFormatValidationPlugin.java OBJS=$(SOURCES:.java=.class) -JAR=SLUBTechnicalMetadataExtractorCheckItTiffPlugin.jar +JAR=SLUBRetroMonographieTIFFFormatValidationPlugin.jar BUILD=build/ all: $(BUILD) $(JAR) diff --git a/PLUGIN-INF/metadata_SLUBTechnicalMetadataExtractorCheckItTiffPlugin.xml b/PLUGIN-INF/metadata_SLUBRetroMonographieTIFFFormatValidationPlugin.xml similarity index 83% rename from PLUGIN-INF/metadata_SLUBTechnicalMetadataExtractorCheckItTiffPlugin.xml rename to PLUGIN-INF/metadata_SLUBRetroMonographieTIFFFormatValidationPlugin.xml index 6286785320ffbfa06880b951724e6228999380ea..5686b5a6672bc9230dc2c3d2d10a6d796df42d74 100644 --- a/PLUGIN-INF/metadata_SLUBTechnicalMetadataExtractorCheckItTiffPlugin.xml +++ b/PLUGIN-INF/metadata_SLUBRetroMonographieTIFFFormatValidationPlugin.xml @@ -1,12 +1,12 @@ <pl:metadata-config xmlns:pl="http://www.exlibrisgroup.com/Plugins/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <pl:pluginTypeName>MDExtractorPlugin</pl:pluginTypeName> - <pl:deployName>SLUBTechnicalMetadataExtractorCheckItTiffPlugin</pl:deployName> - <pl:className>org.slub.rosetta.dps.repository.plugin.SLUBTechnicalMetadataExtractorCheckItTiffPlugin</pl:className> + <pl:pluginTypeName>FormatValidationPlugin</pl:pluginTypeName> + <pl:deployName>SLUBRetroMonographieTIFFFormatValidationPlugin</pl:deployName> + <pl:className>org.slub.rosetta.dps.repository.plugin.SLUBRetroMonographieTIFFFormatValidationPlugin</pl:className> <pl:initParameters> <fr:x_form xmlns:fr="http://com/exlibris/digitool/common/forms/xmlbeans"> - <form_name>SLUBTechnicalMetadataExtractorCheckItTiffPlugin_Params</form_name> - <description>SLUBTechnicalMetadataExtractorCheckItTiffPlugin_parameters_form</description> + <form_name>SLUBRetromonographieTIFFFormatValidationPlugin_Params</form_name> + <description>SLUBRetromonographieTIFFFormatValidationPlugin_parameters_form</description> <version>0.1</version> <grid_x>1</grid_x> <md_format>1</md_format> @@ -69,9 +69,9 @@ </x_fields> </fr:x_form> </pl:initParameters> - <pl:description>SLUB Technical Metadata Extractor Plugin, using check_it_tiff to validate - tiff-files</pl:description> - <pl:version>1.105</pl:version> + <pl:description>SLUB TIFF Validation Plugin, using check_it_tiff to validate + tiff-files from retrodigitized monographs</pl:description> + <pl:version>1.0</pl:version> <pl:materialType>DIGITAL</pl:materialType> <pl:module>Preservation</pl:module> <pl:generalType>TASK</pl:generalType> @@ -84,8 +84,8 @@ <lastName>SLUB Dresden</lastName> <telephone1/> <telephone2/> - <email>rosetta@slub-dresden.de</email> - <address1>Zellescher Weg 17</address1> + <email>langzeitarchiv@slub-dresden.de</email> + <address1>Zellescher Weg 18</address1> <address2/> <city>Dresden</city> <zipCode>01069</zipCode> diff --git a/README.md b/README.md index 9817ebf39fc7c15551bf5c2b43a8b3e5f7c4361d..6f15d6d98f990753493d35e35a3f7077aa1a1ad6 100644 --- a/README.md +++ b/README.md @@ -15,9 +15,9 @@ Install ------- * copy jar-file to /operational_shared/plugins/custom/ +* check API https://exlibrisgroup.github.io/Rosetta.dps-sdk-projects/current/javadoc/com/exlibris/dps/sdk/techmd/FormatValidationPlugin.html Configuration ------------- - You should double check the paths in the plugin configuration. diff --git a/deploy_checkit_tiff/add_dnx_mappings/README.txt b/deploy_checkit_tiff/add_dnx_mappings/README.txt deleted file mode 100644 index 66b6d9e26a9f85a8544969390c8930c86281dd2c..0000000000000000000000000000000000000000 --- a/deploy_checkit_tiff/add_dnx_mappings/README.txt +++ /dev/null @@ -1,33 +0,0 @@ -How to automatically add Mappings between extracted Technical Metadata and DNX Significant Properties in Rosetta -================================================================================================================ - -:lang: en -:encoding: utf-8 -:author: Jörg Sachse - -== Prerequisites - -* Desktop environment -* Perl programming language -* Selenium Perl module (download at https://metacpan.org/pod/Selenium::Remote::Driver) -* Chrome browser (download at https://www.google.com/intl/de_de/chrome/) -* Chrome driver compatible with the installed Chrome browser (download at https://sites.google.com/chromium.org/driver/) - -== How to install on Debian 11 (Buster) -* sudo apt install perl chromium cpanminus unzip -* cpanm Selenium::Remote::Driver -* check Chromium version (i.e. "91.x.xxxx.xxx") --> download coresponding 'chromedriver_linux64.zip' from https://sites.google.com/chromium.org/driver/ (Downloads) -* unzip chromedriver_linux64.zip - -== How to build - -* You don't have to do anything, just run the script. - -== How to run - -* general invocation -** $# perl -I path/to/perl/modules ./add_dnx_mappings.pl --rosetta_host="Rosetta-Host.Domain.tld" --protocol="https" --ui_port="Port-Number" --user="Rosetta-User" --password="Rosetta-Password" --institution="Institution-Name" --plugin_name="Plugin-Name" --classification_group="Classification-Group" - -* example invocation: -** $# perl -I path/to/perl/modules ./add_dnx_mappings.pl --rosetta_host="sdvrosetta-test.slub-dresden.de" --protocol="https" --ui_port="8443" --user="su-user" --password="Sw0rdF!$h" --institution="SLUB" --plugin_name="SLUBTechnicalMetadataExtractorCheckItTiffPlugin" --classification_group="Image (Mix)" - diff --git a/deploy_checkit_tiff/add_dnx_mappings/add_dnx_mappings.pl b/deploy_checkit_tiff/add_dnx_mappings/add_dnx_mappings.pl deleted file mode 100644 index d1a6df54a8b21722e0de5da1bbae9d62fe633149..0000000000000000000000000000000000000000 --- a/deploy_checkit_tiff/add_dnx_mappings/add_dnx_mappings.pl +++ /dev/null @@ -1,265 +0,0 @@ -#!/usr/bin/env perl -# adds all dnx properties -# -# usage: perl add_dnx_mappings.pl rosetta-host rosetta-user rosetta-user-password rosetta-institution rosetta-login-port -# example: perl add_dnx_mappings.pl rosetta.my-archive.domain user1 12345 MYINSTITUTE 8443 -# -# needs a geckodriver and the Selenium::Remote::Driver module -# see http://www.seleniumhq.org/ -# -# tested against Rosetta 7.1 using ChromeDriver 98.0.4758.102 and Chrome 98 in Debian 11 -# -# ensure, that the plugin is assigned to a classification, for example to "Image (Mix)" - -use strict; -use warnings; -use utf8; -use feature qw(say signatures); -no warnings qw(experimental::signatures); -use Selenium::Remote::Driver; -use Selenium::Chrome; -use Term::ANSIColor; # colored print -use Getopt::Long; - - -my $host; -my $protocol = 'https'; -my $ui_port = "8443"; -my $user; -my $passwd; -my $institution; -my $plugin_name = 'SLUBTechnicalMetadataExtractorCheckItTiffPlugin'; -my $classification_group = 'Image (Mix)'; -my $driver; -my $step; - -GetOptions( - "rosetta_host=s{1}" => \$host, - "protocol:s{1}" => \$protocol, - "ui_port:s{1}" => \$ui_port, - "user=s{1}" => \$user, - "password=s{1}" => \$passwd, - "institution=s{1}" => \$institution, - "plugin_name:s{1}" => \$plugin_name, - "classification_group:s{1}" => \$classification_group, - "step=i" => \$step, -) or die("Error in command line arguments\n"); -die("invalid/missing argument: --rosetta_host") unless $host; -die("invalid/missing argument: --protocol") unless $protocol; -die("invalid/missing argument: --ui_port") unless $ui_port; -die("invalid/missing argument: --user") unless $user; -die("invalid/missing argument: --password") unless $passwd; -die("invalid/missing argument: --institution") unless $institution; -die("invalid/missing argument: --plugin_name") unless $plugin_name; -die("invalid/missing argument: --classification_group") unless $classification_group; - -my %exiftool2dnx = ( - "ICC-header:ColorSpaceData" => "icc.colorspacedata", - "ICC-header:DeviceModel" => "icc.devicemodel", - "ICC-header:PrimaryPlatform" => "icc.primaryplatform", - "ICC-header:ProfileCMMType" => "icc.profilecmmtype", - "ICC-header:ProfileCreator" => "icc.profilecreator", - "ICC-header:ProfileDateTime" => "icc.profiledatetime", - "ICC-header:ProfileVersion" => "icc.profileversion", - "ICC_Profile:CalibrationDateTime" => "icc.profilecalibrationdatetime", - "ICC_Profile:MakeAndModel" => "icc.makeandmodel", - "ICC_Profile:ProfileCopyright" => "icc.profilecopyright", - "ICC_Profile:ProfileDescription" => "icc.profiledescription", - "IFD0:BitsPerSample" => "tiff.bitspersample", # TIFF-Tag 258 BitsPerSample - "IFD0:Compression" => "tiff.compression", # TIFF-Tag 259 Compression - "IFD0:Copyright" => "tiff.copyright", # TIFF-Tag 33432 Copyright - "IFD0:DocumentName" => "tiff.documentname", # TIFF-Tag 269 DocumentName - "ExifIFD:GrayResponseCurve" => "tiff.grayresponsecurve", # TIFF-Tag 291 GrayResponseCurve - "IFD0:GrayResponseUnit" => "tiff.grayresponseunit", # TIFF-Tag 290 GrayResponseUnit - "IFD0:ImageDescription" => "tiff.imagedescription", # TIFF-Tag 270 ImageDescription - "IFD0:ImageHeight" => "image.height", # TIFF-Tag 257 ImageLength - "IFD0:ImageWidth" => "image.width", # TIFF-Tag 256 ImageWidth - "IFD0:Make" => "tiff.make", # TIFF-Tag 271 Make - "IFD0:MaxSampleValue" => "tiff.maxsamplevalue", # TIFF-Tag 281 MaxSampleValue - "IFD0:MinSampleValue" => "tiff.minsamplevalue", # TIFF-Tag 280 MinSampleValue - "IFD0:Model" => "tiff.model", # TIFF-Tag 272 Model - "IFD0:ModifyDate" => "tiff.datetime", # TIFF-Tag 306 DateTime - "IFD0:PageNumber" => "tiff.pagenumber", # TIFF-Tag 297 PageNumber - "IFD0:PhotometricInterpretation" => "tiff.photometricinterpretation", # TIFF-Tag 262 PhotometricInterpretation - "IFD0:PrimaryChromaticities" => "tiff.primarychromaticities", # TIFF-Tag 319 PrimaryChromaticities - "IFD0:SamplesPerPixel" => "tiff.samplesperpixel", # TIFF-Tag 277 SamplesPerPixel - "IFD0:Software" => "tiff.software", # TIFF-Tag 305 Software - "IFD0:WhitePoint" => "tiff.whitepoint", # TIFF-Tag 318 WhitePoint - "IFD0:XResolution" => "image.xresolution", # TIFF-Tag 282 XResolution - "IFD0:YResolution" => "image.yresolution", # TIFF-Tag 283 YResolution -); - -sub login { - $driver->get("$protocol://$host:${ui_port}/mng?auth=local"); - my $ele_institute = $driver->find_element("institution", "id"); - $driver->find_child_element($ele_institute, "./option[\@value='$institution']", "xpath")->click; - $driver->find_element("userName", "id")->clear; - $driver->find_element("userName", "id")->send_keys($user); - $driver->find_element("password", "id")->clear; - $driver->find_element("password", "id")->send_keys($passwd); - $driver->find_element("login", "id")->click; -} - -sub logout { - $driver->get("$protocol://$host:${ui_port}/mng/action/menus.do?first_time_key=com.exlibris.dps.wrk.general.menu"); - my $ele = $driver->find_element("user", "id")->click; - $driver->pause(); - $ele = $driver->find_element("Logout", "link")->click; -} - -sub _change_to_xxx_format_library { - $driver->get("$protocol://$host:${ui_port}/mng/action/menus.do?first_time_key=com.exlibris.dps.wrk.general.menu"); - $driver->find_element("//a[\@title='Administer the system']", "xpath")->click; - $driver->find_element("General Parameters", "link")->click; - $driver->find_element("modules_button", "id")->click; - $driver->find_element("//li[\@title='format_library']", "xpath")->click; - my $tr = $driver->find_element("//tr[starts-with(td,'format_library_is_global')]", "xpath"); - my $td = $driver->find_child_element($tr, "./td[\@class='form-inline']", "xpath"); - $driver->find_element("generalParameters_model_parameters_2__value_button", "id")->click; - say "click combobox button"; - return $td; -} - -sub change_to_global_format_library { - my $td = _change_to_xxx_format_library(); - $driver->find_child_element($td, "descendant::li[text()='true']", "xpath")->click; - say "select true"; - $driver->find_element("//button[\@value='Update']", "xpath")->click; - say "click update button"; -} - -sub change_to_local_format_library { - my $td = _change_to_xxx_format_library(); - $driver->find_child_element($td, "descendant::li[text()='false']", "xpath")->click; - say "select false"; - $driver->find_element("//button[\@value='Update']", "xpath")->click; - say "click update button"; - $driver->pause(); -} - -sub add_dnx_property ($dnx_property, $dnx_description) { - my $dow = localtime; - $driver->get("$protocol://$host:${ui_port}/mng/action/pageAction.page_xml.page_sig_prop_list.xml.do?pageViewMode=Edit&pageBean.currentUserMode=GLOBAL&menuKey=com.exlibris.dps.wrk.general.menu.Preservation.AdvancedPreservationActivities.mngLibraryGLOBAL.mngLibraryHeader.SigProps.InnerMenu&menuKey=com.exlibris.dps.wrk.general.menu.Preservation.AdvancedPreservationActivities.mngLibraryGLOBAL.mngLibraryHeader.SigProps.InnerMenu&backUrl="); - $driver->pause(); - $driver->find_element("Add Significant Property", "link")->click; - $driver->find_element("selectedSigPropname", "id")->clear; - $driver->find_element("selectedSigPropname", "id")->send_keys("$dnx_property"); - $driver->find_element("selectedSigPropdescription", "id")->clear; - $driver->find_element("selectedSigPropdescription", "id")->send_keys("$dnx_description (automatically added by ${0}, $dow)"); - $driver->find_element("SaveSigPropGenDetails", "name")->click; -} - -sub join_dnx_property_to_classification_group ($dnx_property) { - say "try to join dnx property"; - $driver->get("$protocol://$host:${ui_port}/mng/action/pageAction.page_xml.page_classification_list.xml.do?pageViewMode=Edit&pageBean.currentUserMode=GLOBAL&menuKey=com.exlibris.dps.wrk.general.menu.Preservation.AdvancedPreservationActivities.mngLibraryGLOBAL.mngLibraryHeader.Classifications.InnerMenu&menuKey=com.exlibris.dps.wrk.general.menu.Preservation.AdvancedPreservationActivities.mngLibraryGLOBAL.mngLibraryHeader.Classifications.InnerMenu&backUrl="); - $driver->pause(); - $driver->find_element("find0.0", "id")->clear; - $driver->find_element("find0.0", "id")->send_keys($classification_group); - $driver->find_element("go", "name")->click; - $driver->find_element("Edit", "link")->click; - $driver->find_element("Related Properties", "link")->click; - $driver->find_element("//form[\@id='classificationDetails']//div[\@class='available']//div//input", "xpath")->clear; - $driver->find_element("//form[\@id='classificationDetails']//div[\@class='available']//div//input", "xpath")->send_keys($dnx_property); - $driver->pause(); - $driver->find_element("Add all", "link")->click; - $driver->find_element("SaveClassificationGenDetails", "name")->click; - $driver->pause(); -} - -sub extractors_add_mapping ($dnx_property, $exiftool_property) { - say "try to add extractor mapping"; - # go to custom extractor page (local format library) - $driver->get("$protocol://$host:${ui_port}/mng/action/pageAction.page_xml.page_extractors_list.xml.do?pageBean.deploymentMode=BUNDLED&pageViewMode=Edit&pageBean.currentUserMode=LOCAL&RenewBean=true&menuKey=com.exlibris.dps.wrk.general.menu.Preservation.AdvancedPreservationActivities.mngLibraryLOCAL.mngLibraryHeader.Extractors.InnerMenu&menuKey=com.exlibris.dps.wrk.general.menu.Preservation.AdvancedPreservationActivities.mngLibraryLOCAL.mngLibraryHeader.Extractors.InnerMenu"); - $driver->pause(); - $driver->find_element("Custom", "link")->click; - # filter by plugin name - $driver->find_element("find1.0", "id")->clear; - $driver->find_element("find1.0", "id")->send_keys($plugin_name); - $driver->find_element("pagesections1widgetList0hdListsearchValue2_button", "id")->click; - $driver->find_element("//li[contains(.,'Name')]")->click; - $driver->find_element("go", "name")->click; - # add 1 plugin mapping - $driver->find_element("Edit", "link")->click; - $driver->find_element("Add Mapping", "link")->click; - $driver->find_element("pageBeancurrentMappingextractorProperty_input", "id")->clear; - $driver->find_element("pageBeancurrentMappingextractorProperty_button", "id")->click; - $driver->pause(); - $driver->find_element("//li[\@title='$exiftool_property']", "xpath")->click; - $driver->pause(); - $driver->find_element("pageBeancurrentMappingclassificationProperty_input", "id")->clear; - $driver->find_element("pageBeancurrentMappingclassificationProperty_button", "id")->click; - $driver->pause(); - $driver->find_element("//li[\@title='$dnx_property']", "xpath")->click; - $driver->pause(); - $driver->find_element("pageBeancurrentMappingnormalizer_input", "id")->click; - $driver->find_element("pageBeancurrentMappingnormalizer_input", "id")->click; - $driver->find_element("pageBeancurrentMappingnormalizer_input", "id")->clear; - $driver->pause(); - $driver->find_element("page.buttons.operation", "name")->click; - $driver->pause(); -} - -# startup info -printf colored("Trying to mechanize adding DNX mappings using: - rosetta host = '$host' - ui port = '$ui_port' - user = '$user' - institution = '$institution' - plugin name = '$plugin_name' - classification group = '$classification_group'\n\n", 'bold white'); - -# startup driver -$driver = Selenium::Chrome->new(); -$driver->debug_on; -$driver->set_implicit_wait_timeout(1000); -$driver->set_timeout('script', 1000); - -# Rosetta login -printf colored("Step 1 of 7: login \n", 'bold green'); -login(); - -# change to global format library -printf colored("Step 2 of 7: change to global format library \n", 'bold green'); -change_to_global_format_library(); - -# add dnx property -if (!defined $step or $step == 3) { - printf colored("Step 3 of 7: add dnx property \n", 'bold green'); - foreach my $exiftool_property (sort keys %exiftool2dnx) { - my $dnx_property = $exiftool2dnx{ $exiftool_property }; - add_dnx_property($dnx_property, "$dnx_property <- Exiftool '$exiftool_property'"); - } -} - -# include dnx property to classification group -if (!defined $step or $step == 4) { - printf colored("Step 4 of 7: join dnx property to classification group \n", 'bold green'); - foreach my $exiftool_property (sort keys %exiftool2dnx) { - my $dnx_property = $exiftool2dnx{ $exiftool_property }; - join_dnx_property_to_classification_group($dnx_property); - } -} - -# add mapping -if (!defined $step or $step == 5) { - printf colored("Step 5 of 7: extractors add mapping \n", 'bold green'); - foreach my $exiftool_property (sort keys %exiftool2dnx) { - my $dnx_property = $exiftool2dnx{ $exiftool_property }; - extractors_add_mapping($dnx_property, $exiftool_property); - } -} - -# change to local format library -printf colored("Step 6 of 7: change to local format library \n", 'bold green'); -change_to_local_format_library(); - -# logout -printf colored("Step 7 of 7: logout \n", 'bold green'); -logout(); - -# stop driver -$driver->quit(); -$driver->shutdown_binary(); - -# stop info -printf colored("Finished! \n", 'bold green'); diff --git a/java/org/slub/rosetta/dps/repository/plugin/SLUBRetroMonographieTIFFFormatValidationPlugin.java b/java/org/slub/rosetta/dps/repository/plugin/SLUBRetroMonographieTIFFFormatValidationPlugin.java new file mode 100644 index 0000000000000000000000000000000000000000..40340fe5f4c89ed115c1b604af0cc7f1cdf15b05 --- /dev/null +++ b/java/org/slub/rosetta/dps/repository/plugin/SLUBRetroMonographieTIFFFormatValidationPlugin.java @@ -0,0 +1,295 @@ +/* +2014-2022 by Andreas Romeyke (SLUB Dresden) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Hint: works only with checkit_tiff version 1.0.0 or higher +*/ + +package org.slub.rosetta.dps.repository.plugin; + +import com.exlibris.core.infra.common.exceptions.logging.ExLogger; +import com.exlibris.core.sdk.strings.StringUtils; +import com.exlibris.dps.sdk.techmd.FormatValidationPlugin; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.math.BigInteger; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.MessageDigest; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * SLUBTechnicalMetadataExtractorCheckItTiffPlugin + * + * @author andreas.romeyke@slub-dresden.de (Andreas Romeyke) + * @see com.exlibris.dps.sdk.techmd.FormatValidationPlugin + */ +/*public class SLUBTechnicalMetadataExtractorCheckItTiffPlugin implements MDExtractorPlugin { */ +public class SLUBRetroMonographieTIFFFormatValidationPlugin implements FormatValidationPlugin { + private static final ExLogger log = ExLogger.getExLogger(SLUBRetroMonographieTIFFFormatValidationPlugin.class); + private enum Checkit_tiff_versions { + current, upcoming + } + private final Map<Checkit_tiff_versions, String> checkit_tiff_binary_path = new HashMap<>(); + private final Map<Checkit_tiff_versions, String> checkit_tiff_config_path = new HashMap<>(); + private final List<String> validationLog = new ArrayList<>(); + private boolean isvalid = false; + private boolean iswellformed = false; + private final Map<Checkit_tiff_versions, String> md5Profile = new HashMap<>(); + private final Map<Checkit_tiff_versions, String> md5CheckitTiff = new HashMap<>(); + private boolean isDifferentProfile = true; + private final boolean isDifferentCheckItTiff = true; + private final Map<Checkit_tiff_versions, Boolean> is_checkit_tiff_valid = new HashMap<>(); + + + /** constructor */ + public SLUBRetroMonographieTIFFFormatValidationPlugin() { + log.info("SLUBTechnicalMetadataExtractorCheckItTiffPlugin instantiated"); + for (Checkit_tiff_versions v: Checkit_tiff_versions.values()) { + is_checkit_tiff_valid.put(v, false); + } + } + + /** init params to configure the plugin via xml forms + * @param initp parameter map + */ + public final void initParams(Map<String, String> initp) { + this.checkit_tiff_binary_path.put(Checkit_tiff_versions.current, initp.get("current_checkit_tiff").trim()); + this.checkit_tiff_binary_path.put(Checkit_tiff_versions.upcoming, initp.get("upcoming_checkit_tiff").trim()); + this.checkit_tiff_config_path.put(Checkit_tiff_versions.current, initp.get("current_config_file").trim()); + this.checkit_tiff_config_path.put(Checkit_tiff_versions.upcoming, initp.get("upcoming_config_file").trim()); + + try { + for (Checkit_tiff_versions v: Checkit_tiff_versions.values()) { + check_path(checkit_tiff_binary_path.get(v), "path for checkit_tiff binary " + v, true); + check_path(checkit_tiff_config_path.get(v), "path for checkit_tiff config " + v, false); + md5CheckitTiff.put(v, md5SumOfFile(checkit_tiff_binary_path.get(v))); + md5Profile.put(v,md5SumOfFile(checkit_tiff_config_path.get(v))); + } + this.isDifferentProfile = ! this.md5Profile.get(Checkit_tiff_versions.current).equals(this.md5Profile.get(Checkit_tiff_versions.upcoming)); + } catch (Exception e) { + e.printStackTrace(); + } + log.info("SLUBTechnicalMetadataExtractorCheckItTiffPlugin instantiated with " + + "(current: " + + " checkit_tiff_binary_path=" + checkit_tiff_binary_path.get(Checkit_tiff_versions.current) + + " cfg=" + checkit_tiff_config_path.get(Checkit_tiff_versions.current) + + ") | (upcoming: " + + " checkit_tiff_binary_path=" + checkit_tiff_binary_path.get(Checkit_tiff_versions.upcoming) + + " cfg=" + checkit_tiff_config_path.get(Checkit_tiff_versions.upcoming) + + ")" + ); + } + + @Override + public final String getProfile() { + /* there is no documentation in ExL API, therefore we use it to document the profile versions in a light way */ + StringBuilder returnvalue = new StringBuilder(); + for (Checkit_tiff_versions v: Checkit_tiff_versions.values()) { + String modificationdate = modificationDateOfFile(this.checkit_tiff_config_path.get(v)); + returnvalue.append(v).append("profile:\n").append(" path=").append(this.checkit_tiff_config_path.get(v)).append("\n").append(" md5sum=").append(this.md5CheckitTiff.get(v)).append("\n").append(" modification date=").append(modificationdate).append("\n"); + } + return returnvalue.toString(); + } + + private void check_path(String filePath, String msgPath, boolean is_executable) throws Exception { + if (StringUtils.isEmptyString(filePath)) { + throw new Exception(msgPath + " is empty"); + } + Path path = Paths.get(filePath); + if (! Files.exists( path ) || !Files.isRegularFile(path)) { + throw new Exception(msgPath + " does not exist (" + filePath + ")"); + } + if (is_executable && ! Files.isExecutable(path)) { + throw new Exception(msgPath + " not executable (" + filePath + ")"); + } + } + + private void validate_tiff_by_checkit_tiff_version(String filePath, Checkit_tiff_versions version) { + String execstring = this.checkit_tiff_binary_path.get(version) + " -q " + this.checkit_tiff_config_path.get(version) + " " + filePath ; + log.info("executing: " + execstring); + InputStreamReader process_out; + try { + Process p = Runtime.getRuntime().exec(execstring); + p.waitFor(); + process_out = new InputStreamReader(p.getInputStream()); + if (p.exitValue() == 0) { + is_checkit_tiff_valid.put(version,true); + } else { // something wrong + is_checkit_tiff_valid.put(version, false); + } + BufferedReader reader = new BufferedReader(process_out); + String line = reader.readLine(); + while (line != null) { + System.out.println(line); + validationLog.add(line + System.lineSeparator()); + log.info( line ); + line = reader.readLine(); + } + reader.close(); + log.info( + "file " + filePath + " is " + + (is_checkit_tiff_valid.get(version) ? "valid" : "invalid") + + " using checkit_tiff version " + version + + " (binary: " + this.checkit_tiff_binary_path.get(version) + + " profile: " + this.checkit_tiff_config_path.get(version) + + " )" + ); + } catch (IOException e) { + log.error("ERROR: ("+version.name()+") checkit_tiff not available, path=" + this.checkit_tiff_binary_path.get(version) + ", " + e.getMessage()); + } catch (InterruptedException e) { + log.error("ERROR: ("+version.name()+") checkit_tiff interruption, " + e.getMessage()); + } + } + private void validate_tiff_by_current_checkit_tiff(String filePath) { + // checkit_tiff (current) + validate_tiff_by_checkit_tiff_version(filePath, Checkit_tiff_versions.current); + } + + private void validate_tiff_by_upcoming_checkit_tiff(String filePath) { + // checkit_tiff validation (upcoming) + validate_tiff_by_checkit_tiff_version(filePath, Checkit_tiff_versions.upcoming); + } + public final boolean validateFormat(String filePath) { + validate_tiff_by_upcoming_checkit_tiff(filePath); + /* only check against current checkit_tiff if upcoming fails */ + if ((this.isDifferentCheckItTiff || this.isDifferentProfile) && !is_checkit_tiff_valid.get(Checkit_tiff_versions.upcoming)) { + validate_tiff_by_current_checkit_tiff(filePath); + } + + /* If upcoming was true, only report a is valid, if current was true. report log of upcoming, if all fail, report log for all */ + if (is_checkit_tiff_valid.get(Checkit_tiff_versions.upcoming)) { + isvalid = true; + iswellformed = true; + } else if (is_checkit_tiff_valid.get(Checkit_tiff_versions.current)) { + isvalid = true; + iswellformed=true; + } else { + isvalid = false; + iswellformed = false; + } + return (isvalid && iswellformed); + } + + /** get agent version and signature version calling command VERSION + * + * @return string with version + */ + public final String getAgent() { + log.debug("getAgent() called"); + StringBuilder response= new StringBuilder(); + InputStreamReader process_out; + for (Checkit_tiff_versions version : Checkit_tiff_versions.values()) { + response.append(version.name()).append(" checkit_tiff:\n"); + try { + String execstring = this.checkit_tiff_binary_path.get(version); + Process p = Runtime.getRuntime().exec(execstring); + p.waitFor(); + process_out = new InputStreamReader(p.getInputStream()); + BufferedReader reader = new BufferedReader(process_out); + String line = reader.readLine(); + while (line != null) { + if (line.trim().startsWith("call it with:")) { break; } + log.debug(line); + response.append(line); + line = reader.readLine(); + } + reader.close(); + } catch (IOException e) { + log.error(e); + } catch (InterruptedException e) { + log.error(e); + e.printStackTrace(); + } + } + return response.toString().trim(); + } + + @Override + public final boolean isWellFormed() { + return this.iswellformed; + } + + @Override + public final List<String> getErrors() { + return List.copyOf(this.validationLog); + } + + @Override + public final boolean isValid() { + log.debug("is valid=" + this.isvalid); + return this.isvalid; + } + + private void checkFileExists (String filename) throws Exception { + File f = new File(filename); + if (! f.exists() ) { + log.error("path=" + filename + " not available"); + throw new Exception("ERROR: path=" + filename + " not available"); + } + } + + private String md5SumOfFile(String filename ) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] b = Files.readAllBytes(Paths.get(filename)); + byte[] digest = md.digest(b); + return new BigInteger(1, digest).toString(16); + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + private String modificationDateOfFile(String filename ) { + try { + return Files.getLastModifiedTime(Paths.get(filename)).toString(); + } catch (IOException e) { + e.printStackTrace(); + } + return ""; + } + + /** stand-alone check, main file + * @param args list of files which should be scanned + */ + public static void main(String[] args) { + SLUBRetroMonographieTIFFFormatValidationPlugin plugin = new SLUBRetroMonographieTIFFFormatValidationPlugin(); + Map<String, String> initp = new HashMap<>(); + initp.put( "current_checkit_tiff", "/operational_shared/software/checkit_tiff_current"); + initp.put( "current_config_file", "/operational_shared/software/cit_tiff6_baseline_SLUB_current.cfg"); + initp.put( "upcoming_checkit_tiff", "/operational_shared/software/checkit_tiff_upcoming"); + initp.put( "upcoming_config_file", "/operational_shared/software/cit_tiff6_baseline_SLUB_current.cfg"); + plugin.initParams( initp ); + System.out.println("----------------------------------"); + System.out.println("Agent: '" + plugin.getAgent() + "'"); + System.out.println(); + System.out.println("RESULT: " + plugin.isValid()); + System.out.println("----------------------------------"); + System.out.println("getAgent:"); + System.out.println( plugin.getAgent()); + System.out.println("----------------------------------"); + System.out.println("getProfile:"); + System.out.println( plugin.getProfile()); + System.out.println("----------------------------------"); + } +} diff --git a/java/org/slub/rosetta/dps/repository/plugin/SLUBTechnicalMetadataExtractorCheckItTiffPlugin.java b/java/org/slub/rosetta/dps/repository/plugin/SLUBTechnicalMetadataExtractorCheckItTiffPlugin.java deleted file mode 100644 index b2d0cfba49d09e2093e1630f79309c3d9f4b8949..0000000000000000000000000000000000000000 --- a/java/org/slub/rosetta/dps/repository/plugin/SLUBTechnicalMetadataExtractorCheckItTiffPlugin.java +++ /dev/null @@ -1,1209 +0,0 @@ -/* -2014-2022 by Andreas Romeyke (SLUB Dresden) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Hint: works only with checkit_tiff version 1.0.0 or higher -*/ - -package org.slub.rosetta.dps.repository.plugin; - -import com.exlibris.core.infra.common.exceptions.logging.ExLogger; -import com.exlibris.core.sdk.strings.StringUtils; -import com.exlibris.dps.sdk.techmd.MDExtractorPlugin; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.math.BigInteger; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.security.MessageDigest; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - - -/** - * SLUBTechnicalMetadataExtractorCheckItTiffPlugin - * - * @author andreas.romeyke@slub-dresden.de (Andreas Romeyke) - * @see com.exlibris.dps.sdk.techmd.MDExtractorPlugin - */ -/*public class SLUBTechnicalMetadataExtractorCheckItTiffPlugin implements MDExtractorPlugin { */ -public class SLUBTechnicalMetadataExtractorCheckItTiffPlugin implements MDExtractorPlugin { - private static final ExLogger log = ExLogger.getExLogger(SLUBTechnicalMetadataExtractorCheckItTiffPlugin.class); - private enum Checkit_tiff_versions { - current, upcoming - } - private final Map<Checkit_tiff_versions, String> checkit_tiff_binary_path = new HashMap<>(); - private final Map<Checkit_tiff_versions, String> checkit_tiff_config_path = new HashMap<>(); - private String exiftool_binary_path = null; - private List<String> extractionErrors = new ArrayList<>(); - private final List<String> validationLog = new ArrayList<>(); - private Boolean isvalid = false; - private Boolean iswellformed = false; - private final Map<String,String> attributes = new HashMap<>(); - private final Map<Checkit_tiff_versions, String> md5Profile = new HashMap<>(); - private final Map<Checkit_tiff_versions, String> md5CheckitTiff = new HashMap<>(); - private boolean isDifferentProfile = true; - private final boolean isDifferentCheckItTiff = true; - private final Map<Checkit_tiff_versions, Boolean> is_checkit_tiff_valid = new HashMap<>(); - - - /** constructor */ - public SLUBTechnicalMetadataExtractorCheckItTiffPlugin() { - log.info("SLUBTechnicalMetadataExtractorCheckItTiffPlugin instantiated"); - for (Checkit_tiff_versions v: Checkit_tiff_versions.values()) { - is_checkit_tiff_valid.put(v, false); - } - } - - /** init params to configure the plugin via xml forms - * @param initp parameter map - */ - public final void initParams(Map<String, String> initp) { - this.checkit_tiff_binary_path.put(Checkit_tiff_versions.current, initp.get("current_checkit_tiff").trim()); - this.checkit_tiff_binary_path.put(Checkit_tiff_versions.upcoming, initp.get("upcoming_checkit_tiff").trim()); - this.checkit_tiff_config_path.put(Checkit_tiff_versions.current, initp.get("current_config_file").trim()); - this.checkit_tiff_config_path.put(Checkit_tiff_versions.upcoming, initp.get("upcoming_config_file").trim()); - - this.exiftool_binary_path = initp.get("exiftool").trim(); - try { - check_path(exiftool_binary_path, "path for exiftool_binary", true); - for (Checkit_tiff_versions v: Checkit_tiff_versions.values()) { - check_path(checkit_tiff_binary_path.get(v), "path for checkit_tiff binary " + v, true); - check_path(checkit_tiff_config_path.get(v), "path for checkit_tiff config " + v, false); - md5CheckitTiff.put(v, md5SumOfFile(checkit_tiff_binary_path.get(v))); - md5Profile.put(v,md5SumOfFile(checkit_tiff_config_path.get(v))); - } - this.isDifferentProfile = ! this.md5Profile.get(Checkit_tiff_versions.current).equals(this.md5Profile.get(Checkit_tiff_versions.upcoming)); - } catch (Exception e) { - e.printStackTrace(); - } - log.info("SLUBTechnicalMetadataExtractorCheckItTiffPlugin instantiated with " - + "(current: " - + " checkit_tiff_binary_path=" + checkit_tiff_binary_path.get(Checkit_tiff_versions.current) - + " cfg=" + checkit_tiff_config_path.get(Checkit_tiff_versions.current) - + ") | (upcoming: " - + " checkit_tiff_binary_path=" + checkit_tiff_binary_path.get(Checkit_tiff_versions.upcoming) - + " cfg=" + checkit_tiff_config_path.get(Checkit_tiff_versions.upcoming) - + ")" - + " and exiftool_binary_path=" + exiftool_binary_path - ); - } - - private void parse_exiftool_output( String exiftoolxml ) { - // see output of exiftool -X, alternatively check http://ns.exiftool.ca/ExifTool/1.0/ - Pattern p = Pattern.compile("^\\s*<([^>]+)>([^<]+)</\\1>"); - log.debug("Orig string is: '" + exiftoolxml); - Matcher m = p.matcher(exiftoolxml); - if (m.matches()) { - String key = m.group(1); - String value = m.group(2); - log.debug("matcher: key=" + key + " value=" + value); - attributes.put(key, value); - } - } - - private void check_path(String filePath, String msgPath, boolean is_executable) throws Exception { - if (StringUtils.isEmptyString(filePath)) { - throw new Exception(msgPath + " is empty"); - } - Path path = Paths.get(filePath); - if (! Files.exists( path ) || !Files.isRegularFile(path)) { - throw new Exception(msgPath + " does not exist (" + filePath + ")"); - } - if (is_executable && ! Files.isExecutable(path)) { - throw new Exception(msgPath + " not executable (" + filePath + ")"); - } - } - - @Override - public final void extract(String filePath) throws Exception { - validate_tiff_by_upcoming_checkit_tiff(filePath); - /* only check against current checkit_tiff if upcoming fails */ - if ((this.isDifferentCheckItTiff || isDifferentProfile) && is_checkit_tiff_valid.get(Checkit_tiff_versions.upcoming) == false) { - validate_tiff_by_current_checkit_tiff(filePath); - } - - /* If upcoming was true, only report a is valid, if current was true. report log of upcoming, if all fail, report log for all */ - if (true == is_checkit_tiff_valid.get(Checkit_tiff_versions.upcoming)) { - isvalid = true; - iswellformed = true; - extractionErrors.clear(); - } else if (true == is_checkit_tiff_valid.get(Checkit_tiff_versions.current)) { - isvalid = true; - iswellformed=true; - extractionErrors.clear(); - } else { - isvalid = false; - iswellformed = false; - extractionErrors = validationLog; - } - - // exiftool output of metadata - try { - String execstring = this.exiftool_binary_path + " -X " + filePath; - log.info("executing: " + execstring); - Process p = Runtime.getRuntime().exec(execstring); - p.waitFor(); - BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); - String line=reader.readLine(); - StringBuilder response= new StringBuilder(); - while (line != null) { - log.debug(line); - parse_exiftool_output(line.trim()); - response.append(line); - line = reader.readLine(); - } - attributes.put("exiftool-log", response.toString().trim()); - - } catch (IOException e) { - log.error(e); - } catch (InterruptedException e) { - log.error(e); - e.printStackTrace(); - - } - attributes.put("checkit-tiff-log", validationLog.toString()); - - } - private void validate_tiff_by_checkit_tiff_version(String filePath, Checkit_tiff_versions version) throws Exception { - try { - String execstring = this.checkit_tiff_binary_path.get(version) + " -q " + this.checkit_tiff_config_path.get(version) + " " + filePath ; - log.debug("executing: " + execstring); - Process p = Runtime.getRuntime().exec(execstring); - p.waitFor(); - BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); - String line = reader.readLine(); - - while (line != null) { - System.out.println(line); - validationLog.add(line + System.lineSeparator()); - line = reader.readLine(); - } - if (p.exitValue() == 0) { - is_checkit_tiff_valid.put(version,true); - } else { // something wrong - is_checkit_tiff_valid.put(version, false); - } - } catch (IOException e) { - //log.error("exception creation socket, clamd not available at host=" + host + "port=" + port, e); - //log.error("ERROR: ("+version.name()+") checkit_tiff not available, path=" + this.checkit_tiff_binary_path.get(version) + ", " + e.getMessage()); - throw new Exception("ERROR: ("+version.name()+") checkit_tiff not available, path=" + this.checkit_tiff_binary_path.get(version) + ", " + e.getMessage()); - } - } - private void validate_tiff_by_current_checkit_tiff(String filePath) throws Exception { - // checkit_tiff (current) - validate_tiff_by_checkit_tiff_version(filePath, Checkit_tiff_versions.current); - } - - private void validate_tiff_by_upcoming_checkit_tiff(String filePath) throws Exception { - // checkit_tiff validation (upcoming) - validate_tiff_by_checkit_tiff_version(filePath, Checkit_tiff_versions.upcoming); - } - - public final String getAgentName() { - log.debug("getAgentName() called"); - return "checkit_tiff"; - } - - /** get agent version and signature version calling command VERSION - * - * @return string with version - */ - public final String getAgent() { - log.debug("getAgent() called"); - StringBuilder response= new StringBuilder(); - for (Checkit_tiff_versions version : Checkit_tiff_versions.values()) { - response.append(version.name()).append(" checkit_tiff:\n"); - try { - String execstring = this.checkit_tiff_binary_path.get(version); - Process p = Runtime.getRuntime().exec(execstring); - p.waitFor(); - BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); - String line = reader.readLine(); - while (line != null) { - if (line.trim().startsWith("call it with:")) { break; } - log.debug(line); - response.append(line); - line = reader.readLine(); - } - } catch (IOException e) { - log.error(e); - } catch (InterruptedException e) { - log.error(e); - e.printStackTrace(); - } - } - return response.toString().trim(); - } - - @Override - public final String getAttributeByName(String attribute) { - if (attributes.containsKey(attribute)) { - return attributes.get(attribute); - } - return "not found"; - } - - @Override - public final List<String> getExtractionErrors() { - return this.extractionErrors; - } - /* processed using: - * exiftool -lang de -listx -s > /tmp/exif.xml - * then using - * - XPath "/taginfo/table[@name='Exif::Main']/tag[not(@g1)]/@name" to find IFD0-tags - * - XPath "/taginfo/table[@name='Exif::Main']/tag[@g1='ExifIFD']/@name" to find EXIF-tags - * - * exiftool -lang de -listx -s | xpath -q -e "/taginfo/table[@name='Exif::Main']/tag[not(@g1)]/@name" | sed -e "s/name=\"\(.*\)\"/available.add(\"IFD0:\1\");/" - * exiftool -lang de -listx -s | xpath -q -e "/taginfo/table[@name='Exif::Main']/tag[@g1='ExifIFD']/@name" | sed -e "s/name=\"\(.*\)\"/available.add(\"ExifIFD:\1\");/" - * exiftool -lang de -listx -s | xpath -q -e "/taginfo/table[@name='ICC_Profile::Main']/tag/@name" | sed -e "s/name=\"\(.*\)\"/available.add(\"ICC_Profile:\1\");/" - * exiftool -lang de -listx -s | xpath -q -e "/taginfo/table[@name='ICC_Profile::Header']/tag/@name" | sed -e "s/name=\"\(.*\)\"/available.add(\"ICC-Header:\1\");/" - * - * */ - @Override - public final List<String> getSupportedAttributeNames() { - //return new ArrayList<String>(attributes.keySet()); - List<String> available = new ArrayList<>(); - //available.add("checkit-tiff-conf"); - available.add("checkit-tiff-log"); - //available.add("checkit-tiff-path"); - - available.add("Composite:Aperture"); - available.add("Composite:CircleOfConfusion"); - available.add("Composite:DateTimeCreated"); - available.add("Composite:DigitalCreationDateTime"); - available.add("Composite:Flash"); - available.add("Composite:FocalLength35efl"); - available.add("Composite:FOV"); - available.add("Composite:HyperfocalDistance"); - available.add("Composite:ImageSize"); - available.add("Composite:LensID"); - available.add("Composite:LightValue"); - available.add("Composite:ScaleFactor35efl"); - available.add("Composite:ShutterSpeed"); - available.add("Composite:SubSecCreateDate"); - available.add("Composite:SubSecDateTimeOriginal"); - available.add("ExifIFD:A100DataOffset"); - available.add("ExifIFD:Acceleration"); - available.add("ExifIFD:AdventRevision"); - available.add("ExifIFD:AdventScale"); - available.add("ExifIFD:AffineTransformMat"); - available.add("ExifIFD:AliasLayerMetadata"); - available.add("ExifIFD:AlphaByteCount"); - available.add("ExifIFD:AlphaDataDiscard"); - available.add("ExifIFD:AlphaOffset"); - available.add("ExifIFD:AmbientTemperature"); - available.add("ExifIFD:Annotations"); - available.add("ExifIFD:ApertureValue"); - available.add("ExifIFD:ApplicationNotes"); - available.add("ExifIFD:BackgroundColorIndicator"); - available.add("ExifIFD:BackgroundColorValue"); - available.add("ExifIFD:BadFaxLines"); - available.add("ExifIFD:BatteryLevel"); - available.add("ExifIFD:BitsPerExtendedRunLength"); - available.add("ExifIFD:BitsPerRunLength"); - available.add("ExifIFD:Brightness"); - available.add("ExifIFD:BrightnessValue"); - available.add("ExifIFD:CameraElevationAngle"); - available.add("ExifIFD:CFALayout"); - available.add("ExifIFD:CFAPattern"); - available.add("ExifIFD:CFAPlaneColor"); - available.add("ExifIFD:CIP3DataFile"); - available.add("ExifIFD:CIP3Sheet"); - available.add("ExifIFD:CIP3Side"); - available.add("ExifIFD:CleanFaxData"); - available.add("ExifIFD:ClipPath"); - available.add("ExifIFD:CMYKEquivalent"); - available.add("ExifIFD:CodingMethods"); - available.add("ExifIFD:ColorCharacterization"); - available.add("ExifIFD:ColorMap"); - available.add("ExifIFD:ColorResponseUnit"); - available.add("ExifIFD:ColorSequence"); - available.add("ExifIFD:ColorSpace"); - available.add("ExifIFD:ColorTable"); - available.add("ExifIFD:ComponentsConfiguration"); - available.add("ExifIFD:CompressedBitsPerPixel"); - available.add("ExifIFD:ConsecutiveBadFaxLines"); - available.add("ExifIFD:Contrast"); - available.add("ExifIFD:Converter"); - available.add("ExifIFD:CreateDate"); - available.add("ExifIFD:CustomRendered"); - available.add("ExifIFD:DataType"); - available.add("ExifIFD:DateTimeOriginal"); - available.add("ExifIFD:Decode"); - available.add("ExifIFD:DefaultImageColor"); - available.add("ExifIFD:DeviceSettingDescription"); - available.add("ExifIFD:DigitalZoomRatio"); - available.add("ExifIFD:DotRange"); - available.add("ExifIFD:ExifImageHeight"); - available.add("ExifIFD:ExifImageWidth"); - available.add("ExifIFD:ExifVersion"); - available.add("ExifIFD:ExpandFilm"); - available.add("ExifIFD:ExpandFilterLens"); - available.add("ExifIFD:ExpandFlashLamp"); - available.add("ExifIFD:ExpandLens"); - available.add("ExifIFD:ExpandScanner"); - available.add("ExifIFD:ExpandSoftware"); - available.add("ExifIFD:Exposure"); - available.add("ExifIFD:ExposureCompensation"); - available.add("ExifIFD:ExposureIndex"); - available.add("ExifIFD:ExposureMode"); - available.add("ExifIFD:ExposureProgram"); - available.add("ExifIFD:ExposureTime"); - available.add("ExifIFD:ExtraSamples"); - available.add("ExifIFD:FaxProfile"); - available.add("ExifIFD:FaxRecvParams"); - available.add("ExifIFD:FaxRecvTime"); - available.add("ExifIFD:FaxSubAddress"); - available.add("ExifIFD:FedexEDR"); - available.add("ExifIFD:FileSource"); - available.add("ExifIFD:Flash"); - available.add("ExifIFD:FlashEnergy"); - available.add("ExifIFD:FlashpixVersion"); - available.add("ExifIFD:FNumber"); - available.add("ExifIFD:FocalLength"); - available.add("ExifIFD:FocalLengthIn35mmFormat"); - available.add("ExifIFD:FocalPlaneResolutionUnit"); - available.add("ExifIFD:FocalPlaneXResolution"); - available.add("ExifIFD:FocalPlaneYResolution"); - available.add("ExifIFD:FovCot"); - available.add("ExifIFD:FreeByteCounts"); - available.add("ExifIFD:FreeOffsets"); - available.add("ExifIFD:GainControl"); - available.add("ExifIFD:Gamma"); - available.add("ExifIFD:GDALMetadata"); - available.add("ExifIFD:GDALNoData"); - available.add("ExifIFD:GooglePlusUploadCode"); - available.add("ExifIFD:GrayResponseCurve"); - available.add("ExifIFD:HCUsage"); - available.add("ExifIFD:HeightResolution"); - available.add("ExifIFD:Humidity"); - available.add("ExifIFD:ImageByteCount"); - available.add("ExifIFD:ImageColorIndicator"); - available.add("ExifIFD:ImageColorValue"); - available.add("ExifIFD:ImageDataDiscard"); - available.add("ExifIFD:ImageDepth"); - available.add("ExifIFD:ImageFullHeight"); - available.add("ExifIFD:ImageFullWidth"); - available.add("ExifIFD:ImageHeight"); - available.add("ExifIFD:ImageHistory"); - available.add("ExifIFD:ImageID"); - available.add("ExifIFD:ImageLayer"); - available.add("ExifIFD:ImageNumber"); - available.add("ExifIFD:ImageOffset"); - available.add("ExifIFD:ImageReferencePoints"); - available.add("ExifIFD:ImageType"); - available.add("ExifIFD:ImageUniqueID"); - available.add("ExifIFD:ImageWidth"); - available.add("ExifIFD:Indexed"); - available.add("ExifIFD:INGRReserved"); - available.add("ExifIFD:InkNames"); - available.add("ExifIFD:IntergraphFlagRegisters"); - available.add("ExifIFD:IntergraphMatrix"); - available.add("ExifIFD:IntergraphPacketData"); - available.add("ExifIFD:Interlace"); - available.add("ExifIFD:ISO"); - available.add("ExifIFD:ISOSpeed"); - available.add("ExifIFD:ISOSpeedLatitudeyyy"); - available.add("ExifIFD:ISOSpeedLatitudezzz"); - available.add("ExifIFD:IT8Header"); - available.add("ExifIFD:JBIGOptions"); - available.add("ExifIFD:JPEGACTables"); - available.add("ExifIFD:JPEGDCTables"); - available.add("ExifIFD:JPEGLosslessPredictors"); - available.add("ExifIFD:JPEGPointTransforms"); - available.add("ExifIFD:JPEGProc"); - available.add("ExifIFD:JPEGQTables"); - available.add("ExifIFD:JPEGRestartInterval"); - available.add("ExifIFD:JPEGTables"); - available.add("ExifIFD:JPLCartoIFD"); - available.add("ExifIFD:Lens"); - available.add("ExifIFD:LensInfo"); - available.add("ExifIFD:LensMake"); - available.add("ExifIFD:LensModel"); - available.add("ExifIFD:LensSerialNumber"); - available.add("ExifIFD:LightSource"); - available.add("ExifIFD:MakerNoteApple"); - available.add("ExifIFD:MakerNoteCanon"); - available.add("ExifIFD:MakerNoteCasio"); - available.add("ExifIFD:MakerNoteCasio2"); - available.add("ExifIFD:MakerNoteDJI"); - available.add("ExifIFD:MakerNoteFLIR"); - available.add("ExifIFD:MakerNoteFujiFilm"); - available.add("ExifIFD:MakerNoteGE"); - available.add("ExifIFD:MakerNoteGE2"); - available.add("ExifIFD:MakerNoteHasselblad"); - available.add("ExifIFD:MakerNoteHP"); - available.add("ExifIFD:MakerNoteHP2"); - available.add("ExifIFD:MakerNoteHP4"); - available.add("ExifIFD:MakerNoteHP6"); - available.add("ExifIFD:MakerNoteISL"); - available.add("ExifIFD:MakerNoteJVC"); - available.add("ExifIFD:MakerNoteJVCText"); - available.add("ExifIFD:MakerNoteKodak10"); - available.add("ExifIFD:MakerNoteKodak11"); - available.add("ExifIFD:MakerNoteKodak1a"); - available.add("ExifIFD:MakerNoteKodak1b"); - available.add("ExifIFD:MakerNoteKodak2"); - available.add("ExifIFD:MakerNoteKodak3"); - available.add("ExifIFD:MakerNoteKodak4"); - available.add("ExifIFD:MakerNoteKodak5"); - available.add("ExifIFD:MakerNoteKodak6a"); - available.add("ExifIFD:MakerNoteKodak6b"); - available.add("ExifIFD:MakerNoteKodak7"); - available.add("ExifIFD:MakerNoteKodak8a"); - available.add("ExifIFD:MakerNoteKodak8b"); - available.add("ExifIFD:MakerNoteKodak8c"); - available.add("ExifIFD:MakerNoteKodak9"); - available.add("ExifIFD:MakerNoteKodakUnknown"); - available.add("ExifIFD:MakerNoteKyocera"); - available.add("ExifIFD:MakerNoteLeica"); - available.add("ExifIFD:MakerNoteLeica2"); - available.add("ExifIFD:MakerNoteLeica3"); - available.add("ExifIFD:MakerNoteLeica4"); - available.add("ExifIFD:MakerNoteLeica5"); - available.add("ExifIFD:MakerNoteLeica6"); - available.add("ExifIFD:MakerNoteLeica7"); - available.add("ExifIFD:MakerNoteLeica8"); - available.add("ExifIFD:MakerNoteLeica9"); - available.add("ExifIFD:MakerNoteMinolta"); - available.add("ExifIFD:MakerNoteMinolta2"); - available.add("ExifIFD:MakerNoteMinolta3"); - available.add("ExifIFD:MakerNoteMotorola"); - available.add("ExifIFD:MakerNoteNikon"); - available.add("ExifIFD:MakerNoteNikon2"); - available.add("ExifIFD:MakerNoteNikon3"); - available.add("ExifIFD:MakerNoteNintendo"); - available.add("ExifIFD:MakerNoteOlympus"); - available.add("ExifIFD:MakerNoteOlympus2"); - available.add("ExifIFD:MakerNotePanasonic"); - available.add("ExifIFD:MakerNotePanasonic2"); - available.add("ExifIFD:MakerNotePentax"); - available.add("ExifIFD:MakerNotePentax2"); - available.add("ExifIFD:MakerNotePentax3"); - available.add("ExifIFD:MakerNotePentax4"); - available.add("ExifIFD:MakerNotePentax5"); - available.add("ExifIFD:MakerNotePentax6"); - available.add("ExifIFD:MakerNotePhaseOne"); - available.add("ExifIFD:MakerNoteReconyx"); - available.add("ExifIFD:MakerNoteRicoh"); - available.add("ExifIFD:MakerNoteRicoh2"); - available.add("ExifIFD:MakerNoteRicohText"); - available.add("ExifIFD:MakerNoteSamsung1a"); - available.add("ExifIFD:MakerNoteSamsung1b"); - available.add("ExifIFD:MakerNoteSamsung2"); - available.add("ExifIFD:MakerNoteSanyo"); - available.add("ExifIFD:MakerNoteSanyoC4"); - available.add("ExifIFD:MakerNoteSanyoPatch"); - available.add("ExifIFD:MakerNoteSigma"); - available.add("ExifIFD:MakerNoteSony"); - available.add("ExifIFD:MakerNoteSony2"); - available.add("ExifIFD:MakerNoteSony3"); - available.add("ExifIFD:MakerNoteSony4"); - available.add("ExifIFD:MakerNoteSony5"); - available.add("ExifIFD:MakerNoteSonyEricsson"); - available.add("ExifIFD:MakerNoteSonySRF"); - available.add("ExifIFD:MakerNoteUnknown"); - available.add("ExifIFD:MakerNoteUnknownBinary"); - available.add("ExifIFD:MakerNoteUnknownText"); - available.add("ExifIFD:MatrixWorldToCamera"); - available.add("ExifIFD:MatrixWorldToScreen"); - available.add("ExifIFD:Matteing"); - available.add("ExifIFD:MaxApertureValue"); - available.add("ExifIFD:MDColorTable"); - available.add("ExifIFD:MDFileTag"); - available.add("ExifIFD:MDFileUnits"); - available.add("ExifIFD:MDLabName"); - available.add("ExifIFD:MDPrepDate"); - available.add("ExifIFD:MDPrepTime"); - available.add("ExifIFD:MDSampleInfo"); - available.add("ExifIFD:MDScalePixel"); - available.add("ExifIFD:MeteringMode"); - available.add("ExifIFD:Model2"); - available.add("ExifIFD:ModelTiePoint"); - available.add("ExifIFD:ModelTransform"); - available.add("ExifIFD:ModeNumber"); - available.add("ExifIFD:MoireFilter"); - available.add("ExifIFD:MSDocumentText"); - available.add("ExifIFD:MSDocumentTextPosition"); - available.add("ExifIFD:MSPropertySetStorage"); - available.add("ExifIFD:MultiProfiles"); - available.add("ExifIFD:Noise"); - available.add("ExifIFD:NumberofInks"); - available.add("ExifIFD:OceApplicationSelector"); - available.add("ExifIFD:OceIDNumber"); - available.add("ExifIFD:OceImageLogic"); - available.add("ExifIFD:OceScanjobDesc"); - available.add("ExifIFD:OffsetSchema"); - available.add("ExifIFD:OffsetTime"); - available.add("ExifIFD:OffsetTimeDigitized"); - available.add("ExifIFD:OffsetTimeOriginal"); - available.add("ExifIFD:OPIProxy"); - available.add("ExifIFD:Opto-ElectricConvFactor"); - available.add("ExifIFD:OriginalFileName"); - available.add("ExifIFD:OtherImageLength"); - available.add("ExifIFD:OtherImageStart"); - available.add("ExifIFD:OwnerName"); - available.add("ExifIFD:Padding"); - available.add("ExifIFD:PixelFormat"); - available.add("ExifIFD:PixelIntensityRange"); - available.add("ExifIFD:PixelMagicJBIGOptions"); - available.add("ExifIFD:PixelScale"); - available.add("ExifIFD:Pressure"); - available.add("ExifIFD:ProfileType"); - available.add("ExifIFD:RasterPadding"); - available.add("ExifIFD:RawFile"); - available.add("ExifIFD:RawImageSegmentation"); - available.add("ExifIFD:RecommendedExposureIndex"); - available.add("ExifIFD:RegionXformTackPoint"); - available.add("ExifIFD:RelatedSoundFile"); - available.add("ExifIFD:RowInterleaveFactor"); - available.add("ExifIFD:SampleFormat"); - available.add("ExifIFD:SamsungRawByteOrder"); - available.add("ExifIFD:SamsungRawPointersLength"); - available.add("ExifIFD:SamsungRawPointersOffset"); - available.add("ExifIFD:SamsungRawUnknown"); - available.add("ExifIFD:Saturation"); - available.add("ExifIFD:SceneCaptureType"); - available.add("ExifIFD:SceneType"); - available.add("ExifIFD:SecurityClassification"); - available.add("ExifIFD:SelfTimerMode"); - available.add("ExifIFD:SensingMethod"); - available.add("ExifIFD:SensitivityType"); - available.add("ExifIFD:SerialNumber"); - available.add("ExifIFD:Shadows"); - available.add("ExifIFD:SharedData"); - available.add("ExifIFD:Sharpness"); - available.add("ExifIFD:ShutterSpeedValue"); - available.add("ExifIFD:Site"); - available.add("ExifIFD:SMaxSampleValue"); - available.add("ExifIFD:SMinSampleValue"); - available.add("ExifIFD:Smoothness"); - available.add("ExifIFD:SonyRawFileType"); - available.add("ExifIFD:SpatialFrequencyResponse"); - available.add("ExifIFD:SpectralSensitivity"); - available.add("ExifIFD:SRawType"); - available.add("ExifIFD:StandardOutputSensitivity"); - available.add("ExifIFD:StoNits"); - available.add("ExifIFD:StripByteCounts"); - available.add("ExifIFD:StripOffsets"); - available.add("ExifIFD:StripRowCounts"); - available.add("ExifIFD:SubjectArea"); - available.add("ExifIFD:SubjectDistance"); - available.add("ExifIFD:SubjectDistanceRange"); - available.add("ExifIFD:SubjectLocation"); - available.add("ExifIFD:SubSecTime"); - available.add("ExifIFD:SubSecTimeDigitized"); - available.add("ExifIFD:SubSecTimeOriginal"); - available.add("ExifIFD:SubTileBlockSize"); - available.add("ExifIFD:T4Options"); - available.add("ExifIFD:T6Options"); - available.add("ExifIFD:T82Options"); - available.add("ExifIFD:T88Options"); - available.add("ExifIFD:TextureFormat"); - available.add("ExifIFD:TIFF-EPStandardID"); - available.add("ExifIFD:TIFF_FXExtensions"); - available.add("ExifIFD:TileByteCounts"); - available.add("ExifIFD:TileDepth"); - available.add("ExifIFD:TileOffsets"); - available.add("ExifIFD:TimeZoneOffset"); - available.add("ExifIFD:TransferRange"); - available.add("ExifIFD:Transformation"); - available.add("ExifIFD:TransparencyIndicator"); - available.add("ExifIFD:TrapIndicator"); - available.add("ExifIFD:UIC1Tag"); - available.add("ExifIFD:UIC2Tag"); - available.add("ExifIFD:UIC3Tag"); - available.add("ExifIFD:UIC4Tag"); - available.add("ExifIFD:Uncompressed"); - available.add("ExifIFD:UserComment"); - available.add("ExifIFD:USPTOMiscellaneous"); - available.add("ExifIFD:USPTOOriginalContentType"); - available.add("ExifIFD:VersionYear"); - available.add("ExifIFD:WangAnnotation"); - available.add("ExifIFD:WangTag1"); - available.add("ExifIFD:WangTag3"); - available.add("ExifIFD:WangTag4"); - available.add("ExifIFD:WarpQuadrilateral"); - available.add("ExifIFD:WaterDepth"); - available.add("ExifIFD:WB_GRGBLevels"); - available.add("ExifIFD:WhiteBalance"); - available.add("ExifIFD:WidthResolution"); - available.add("ExifIFD:WrapModes"); - available.add("ExifIFD:XClipPathUnits"); - available.add("ExifIFD:XP_DIP_XML"); - available.add("ExifIFD:YClipPathUnits"); - available.add("ExifTool:ExifToolVersion"); - available.add("exiftool-log"); - available.add("File:CurrentIPTCDigest"); - available.add("File:ExifByteOrder"); - available.add("File:FileType"); - available.add("File:MIMEType"); - available.add("ICC-header:CMMFlags"); - available.add("ICC-header:ColorSpaceData"); - available.add("ICC-header:ConnectionSpaceIlluminant"); - available.add("ICC-header:DeviceAttributes"); - available.add("ICC-header:DeviceManufacturer"); - available.add("ICC-header:DeviceModel"); - available.add("ICC-header:PrimaryPlatform"); - available.add("ICC-header:ProfileClass"); - available.add("ICC-header:ProfileCMMType"); - available.add("ICC-header:ProfileConnectionSpace"); - available.add("ICC-header:ProfileCreator"); - available.add("ICC-header:ProfileDateTime"); - available.add("ICC-header:ProfileFileSignature"); - available.add("ICC-header:ProfileID"); - available.add("ICC-header:ProfileVersion"); - available.add("ICC-header:RenderingIntent"); - available.add("ICC_Profile:AToB0"); - available.add("ICC_Profile:AToB1"); - available.add("ICC_Profile:AToB2"); - available.add("ICC_Profile:BlueMatrixColumn"); - available.add("ICC_Profile:BlueTRC"); - available.add("ICC_Profile:BToA0"); - available.add("ICC_Profile:BToA1"); - available.add("ICC_Profile:BToA2"); - available.add("ICC_Profile:BToD0"); - available.add("ICC_Profile:BToD1"); - available.add("ICC_Profile:BToD2"); - available.add("ICC_Profile:BToD3"); - available.add("ICC_Profile:CalibrationDateTime"); - available.add("ICC_Profile:CharTarget"); - available.add("ICC_Profile:ChromaticAdaptation"); - available.add("ICC_Profile:ColorantOrder"); - available.add("ICC_Profile:ColorantTableOut"); - available.add("ICC_Profile:ColorimetricIntentImageState"); - available.add("ICC_Profile:CRDInfo"); - available.add("ICC_Profile:DeviceMfgDesc"); - available.add("ICC_Profile:DeviceModelDesc"); - available.add("ICC_Profile:DeviceSettings"); - available.add("ICC_Profile:DToB0"); - available.add("ICC_Profile:DToB1"); - available.add("ICC_Profile:DToB2"); - available.add("ICC_Profile:DToB3"); - available.add("ICC_Profile:FocalPlaneColorimetryEstimates"); - available.add("ICC_Profile:Gamut"); - available.add("ICC_Profile:GrayTRC"); - available.add("ICC_Profile:GreenMatrixColumn"); - available.add("ICC_Profile:GreenTRC"); - available.add("ICC_Profile:Luminance"); - available.add("ICC_Profile:MakeAndModel"); - available.add("ICC_Profile:MediaBlackPoint"); - available.add("ICC_Profile:MediaWhitePoint"); - available.add("ICC_Profile:NamedColor"); - available.add("ICC_Profile:NamedColor2"); - available.add("ICC_Profile:NativeDisplayInfo"); - available.add("ICC_Profile:OutputResponse"); - available.add("ICC_Profile:PerceptualRenderingIntentGamut"); - available.add("ICC_Profile:PostScript2CRD0"); - available.add("ICC_Profile:PostScript2CRD1"); - available.add("ICC_Profile:PostScript2CRD2"); - available.add("ICC_Profile:PostScript2CSA"); - available.add("ICC_Profile:Preview0"); - available.add("ICC_Profile:Preview1"); - available.add("ICC_Profile:Preview2"); - available.add("ICC_Profile:ProfileCopyright"); - available.add("ICC_Profile:ProfileDescription"); - available.add("ICC_Profile:ProfileDescriptionML"); - available.add("ICC_Profile:ProfileSequenceDesc"); - available.add("ICC_Profile:ProfileSequenceIdentifier"); - available.add("ICC_Profile:PS2CRDVMSize"); - available.add("ICC_Profile:PS2RenderingIntent"); - available.add("ICC_Profile:RedMatrixColumn"); - available.add("ICC_Profile:RedTRC"); - available.add("ICC_Profile:ReflectionHardcopyOrigColorimetry"); - available.add("ICC_Profile:ReflectionPrintOutputColorimetry"); - available.add("ICC_Profile:SaturationRenderingIntentGamut"); - available.add("ICC_Profile:SceneAppearanceEstimates"); - available.add("ICC_Profile:SceneColorimetryEstimates"); - available.add("ICC_Profile:Screening"); - available.add("ICC_Profile:ScreeningDesc"); - available.add("ICC_Profile:Technology"); - available.add("ICC_Profile:UCRBG"); - available.add("ICC_Profile:VideoCardGamma"); - available.add("ICC_Profile:ViewingCondDesc"); - available.add("ICC_Profile:WCSProfiles"); - available.add("IFD0:AnalogBalance"); - available.add("IFD0:Artist"); - available.add("IFD0:AsShotICCProfile"); - available.add("IFD0:AsShotNeutral"); - available.add("IFD0:AsShotPreProfileMatrix"); - available.add("IFD0:AsShotProfileName"); - available.add("IFD0:AsShotWhiteXY"); - available.add("IFD0:BaselineExposure"); - available.add("IFD0:BaselineExposureOffset"); - available.add("IFD0:BaselineNoise"); - available.add("IFD0:BaselineSharpness"); - available.add("IFD0:BitsPerSample"); - available.add("IFD0:CalibrationIlluminant1"); - available.add("IFD0:CalibrationIlluminant2"); - available.add("IFD0:CameraCalibration1"); - available.add("IFD0:CameraCalibration2"); - available.add("IFD0:CameraCalibrationSig"); - available.add("IFD0:CameraLabel"); - available.add("IFD0:CameraSerialNumber"); - available.add("IFD0:CellLength"); - available.add("IFD0:CellWidth"); - available.add("IFD0:ColorimetricReference"); - available.add("IFD0:ColorMatrix1"); - available.add("IFD0:ColorMatrix2"); - available.add("IFD0:Compression"); - available.add("IFD0:Copyright"); - available.add("IFD0:CurrentICCProfile"); - available.add("IFD0:CurrentPreProfileMatrix"); - available.add("IFD0:DefaultBlackRender"); - available.add("IFD0:DNGAdobeData"); - available.add("IFD0:DNGBackwardVersion"); - available.add("IFD0:DNGLensInfo"); - available.add("IFD0:DNGPrivateData"); - available.add("IFD0:DNGVersion"); - available.add("IFD0:DocumentName"); - available.add("IFD0:FillOrder"); - available.add("IFD0:ForwardMatrix1"); - available.add("IFD0:ForwardMatrix2"); - available.add("IFD0:FrameRate"); - available.add("IFD0:GeoTiffAsciiParams"); - available.add("IFD0:GeoTiffDirectory"); - available.add("IFD0:GeoTiffDoubleParams"); - available.add("IFD0:GrayResponseUnit"); - available.add("IFD0:HalftoneHints"); - available.add("IFD0:HostComputer"); - available.add("IFD0:ImageDescription"); - available.add("IFD0:ImageHeight"); - available.add("IFD0:ImageSourceData"); - available.add("IFD0:ImageWidth"); - available.add("IFD0:InkSet"); - available.add("IFD0:IPTC-NAA"); - available.add("IFD0:LinearResponseLimit"); - available.add("IFD0:LocalizedCameraModel"); - available.add("IFD0:Make"); - available.add("IFD0:MakerNoteSafety"); - available.add("IFD0:MaxSampleValue"); - available.add("IFD0:MinSampleValue"); - available.add("IFD0:Model"); - available.add("IFD0:ModifyDate"); - available.add("IFD0:NewRawImageDigest"); - available.add("IFD0:OldSubfileType"); - available.add("IFD0:Orientation"); - available.add("IFD0:OriginalBestQualitySize"); - available.add("IFD0:OriginalDefaultCropSize"); - available.add("IFD0:OriginalDefaultFinalSize"); - available.add("IFD0:OriginalRawFileData"); - available.add("IFD0:OriginalRawFileDigest"); - available.add("IFD0:OriginalRawFileName"); - available.add("IFD0:PageName"); - available.add("IFD0:PageNumber"); - available.add("IFD0:PanasonicTitle"); - available.add("IFD0:PanasonicTitle2"); - available.add("IFD0:PhotometricInterpretation"); - available.add("IFD0:PlanarConfiguration"); - available.add("IFD0:Predictor"); - available.add("IFD0:PreviewApplicationName"); - available.add("IFD0:PreviewApplicationVersion"); - available.add("IFD0:PreviewColorSpace"); - available.add("IFD0:PreviewDateTime"); - available.add("IFD0:PreviewImageLength"); - available.add("IFD0:PreviewImageStart"); - available.add("IFD0:PreviewSettingsDigest"); - available.add("IFD0:PreviewSettingsName"); - available.add("IFD0:PrimaryChromaticities"); - available.add("IFD0:PrintIM"); - available.add("IFD0:ProcessingSoftware"); - available.add("IFD0:ProfileCalibrationSig"); - available.add("IFD0:ProfileCopyright"); - available.add("IFD0:ProfileEmbedPolicy"); - available.add("IFD0:ProfileHueSatMapData1"); - available.add("IFD0:ProfileHueSatMapData2"); - available.add("IFD0:ProfileHueSatMapDims"); - available.add("IFD0:ProfileHueSatMapEncoding"); - available.add("IFD0:ProfileLookTableData"); - available.add("IFD0:ProfileLookTableDims"); - available.add("IFD0:ProfileLookTableEncoding"); - available.add("IFD0:ProfileName"); - available.add("IFD0:ProfileToneCurve"); - available.add("IFD0:Rating"); - available.add("IFD0:RatingPercent"); - available.add("IFD0:RawDataUniqueID"); - available.add("IFD0:RawImageDigest"); - available.add("IFD0:RawToPreviewGain"); - available.add("IFD0:ReductionMatrix1"); - available.add("IFD0:ReductionMatrix2"); - available.add("IFD0:ReelName"); - available.add("IFD0:ReferenceBlackWhite"); - available.add("IFD0:ResolutionUnit"); - available.add("IFD0:RowsPerStrip"); - available.add("IFD0:SamplesPerPixel"); - available.add("IFD0:SEMInfo"); - available.add("IFD0:ShadowScale"); - available.add("IFD0:Software"); - available.add("IFD0:StripByteCounts"); - available.add("IFD0:StripOffsets"); - available.add("IFD0:SubfileType"); - available.add("IFD0:T6Options"); - available.add("IFD0:TargetPrinter"); - available.add("IFD0:Thresholding"); - available.add("IFD0:ThumbnailLength"); - available.add("IFD0:ThumbnailOffset"); - available.add("IFD0:TileLength"); - available.add("IFD0:TileWidth"); - available.add("IFD0:TimeCodes"); - available.add("IFD0:TransferFunction"); - available.add("IFD0:TStop"); - available.add("IFD0:UniqueCameraModel"); - available.add("IFD0:WhitePoint"); - available.add("IFD0:XPAuthor"); - available.add("IFD0:XPComment"); - available.add("IFD0:XPKeywords"); - available.add("IFD0:XPosition"); - available.add("IFD0:XPSubject"); - available.add("IFD0:XPTitle"); - available.add("IFD0:XResolution"); - available.add("IFD0:YCbCrCoefficients"); - available.add("IFD0:YCbCrPositioning"); - available.add("IFD0:YCbCrSubSampling"); - available.add("IFD0:YPosition"); - available.add("IFD0:YResolution"); - available.add("IPTC2:ApplicationRecordVersion"); - available.add("IPTC2:CopyrightNotice"); - available.add("IPTC:ApplicationRecordVersion"); - available.add("IPTC:CodedCharacterSet"); - available.add("IPTC:CopyrightNotice"); - available.add("IPTC:DateCreated"); - available.add("IPTC:DigitalCreationDate"); - available.add("IPTC:DigitalCreationTime"); - available.add("IPTC:TimeCreated"); - available.add("Photoshop:AlphaChannelsNames"); - available.add("Photoshop:CopyrightFlag"); - available.add("Photoshop:DisplayedUnitsX"); - available.add("Photoshop:DisplayedUnitsY"); - available.add("Photoshop:GlobalAltitude"); - available.add("Photoshop:GlobalAngle"); - available.add("Photoshop:IPTCDigest"); - available.add("Photoshop:PhotoshopThumbnail"); - available.add("Photoshop:XResolution"); - available.add("Photoshop:YResolution"); - available.add("System:Directory"); - available.add("System:FileAccessDate"); - available.add("System:FileInodeChangeDate"); - available.add("System:FileModifyDate"); - available.add("System:FileName"); - available.add("System:FilePermissions"); - available.add("System:FileSize"); - available.add("XMP-aux:ApproximateFocusDistance"); - available.add("XMP-aux:ImageNumber"); - available.add("XMP-aux:Lens"); - available.add("XMP-aux:LensID"); - available.add("XMP-aux:LensInfo"); - available.add("XMP-aux:SerialNumber"); - available.add("XMP-crs:AlreadyApplied"); - available.add("XMP-crs:AutoLateralCA"); - available.add("XMP-crs:AutoWhiteVersion"); - available.add("XMP-crs:Blacks2012"); - available.add("XMP-crs:BlueHue"); - available.add("XMP-crs:BlueSaturation"); - available.add("XMP-crs:CameraProfile"); - available.add("XMP-crs:CameraProfileDigest"); - available.add("XMP-crs:Clarity2012"); - available.add("XMP-crs:ColorNoiseReduction"); - available.add("XMP-crs:ColorNoiseReductionDetail"); - available.add("XMP-crs:ColorNoiseReductionSmoothness"); - available.add("XMP-crs:ColorTemperature"); - available.add("XMP-crs:Contrast2012"); - available.add("XMP-crs:ConvertToGrayscale"); - available.add("XMP-crs:CropAngle"); - available.add("XMP-crs:CropBottom"); - available.add("XMP-crs:CropConstrainToWarp"); - available.add("XMP-crs:CropLeft"); - available.add("XMP-crs:CropRight"); - available.add("XMP-crs:CropTop"); - available.add("XMP-crs:DefringeGreenAmount"); - available.add("XMP-crs:DefringeGreenHueHi"); - available.add("XMP-crs:DefringeGreenHueLo"); - available.add("XMP-crs:DefringePurpleAmount"); - available.add("XMP-crs:DefringePurpleHueHi"); - available.add("XMP-crs:DefringePurpleHueLo"); - available.add("XMP-crs:Exposure2012"); - available.add("XMP-crs:GrainAmount"); - available.add("XMP-crs:GreenHue"); - available.add("XMP-crs:GreenSaturation"); - available.add("XMP-crs:HasCrop"); - available.add("XMP-crs:HasSettings"); - available.add("XMP-crs:Highlights2012"); - available.add("XMP-crs:HueAdjustmentAqua"); - available.add("XMP-crs:HueAdjustmentBlue"); - available.add("XMP-crs:HueAdjustmentGreen"); - available.add("XMP-crs:HueAdjustmentMagenta"); - available.add("XMP-crs:HueAdjustmentOrange"); - available.add("XMP-crs:HueAdjustmentPurple"); - available.add("XMP-crs:HueAdjustmentRed"); - available.add("XMP-crs:HueAdjustmentYellow"); - available.add("XMP-crs:LensManualDistortionAmount"); - available.add("XMP-crs:LensProfileChromaticAberrationScale"); - available.add("XMP-crs:LensProfileDigest"); - available.add("XMP-crs:LensProfileDistortionScale"); - available.add("XMP-crs:LensProfileEnable"); - available.add("XMP-crs:LensProfileFilename"); - available.add("XMP-crs:LensProfileName"); - available.add("XMP-crs:LensProfileSetup"); - available.add("XMP-crs:LensProfileVignettingScale"); - available.add("XMP-crs:LuminanceAdjustmentAqua"); - available.add("XMP-crs:LuminanceAdjustmentBlue"); - available.add("XMP-crs:LuminanceAdjustmentGreen"); - available.add("XMP-crs:LuminanceAdjustmentMagenta"); - available.add("XMP-crs:LuminanceAdjustmentOrange"); - available.add("XMP-crs:LuminanceAdjustmentPurple"); - available.add("XMP-crs:LuminanceAdjustmentRed"); - available.add("XMP-crs:LuminanceAdjustmentYellow"); - available.add("XMP-crs:LuminanceSmoothing"); - available.add("XMP-crs:ParametricDarks"); - available.add("XMP-crs:ParametricHighlights"); - available.add("XMP-crs:ParametricHighlightSplit"); - available.add("XMP-crs:ParametricLights"); - available.add("XMP-crs:ParametricMidtoneSplit"); - available.add("XMP-crs:ParametricShadows"); - available.add("XMP-crs:ParametricShadowSplit"); - available.add("XMP-crs:PerspectiveAspect"); - available.add("XMP-crs:PerspectiveHorizontal"); - available.add("XMP-crs:PerspectiveRotate"); - available.add("XMP-crs:PerspectiveScale"); - available.add("XMP-crs:PerspectiveUpright"); - available.add("XMP-crs:PerspectiveVertical"); - available.add("XMP-crs:PostCropVignetteAmount"); - available.add("XMP-crs:ProcessVersion"); - available.add("XMP-crs:RawFileName"); - available.add("XMP-crs:RedHue"); - available.add("XMP-crs:RedSaturation"); - available.add("XMP-crs:Saturation"); - available.add("XMP-crs:SaturationAdjustmentAqua"); - available.add("XMP-crs:SaturationAdjustmentBlue"); - available.add("XMP-crs:SaturationAdjustmentGreen"); - available.add("XMP-crs:SaturationAdjustmentMagenta"); - available.add("XMP-crs:SaturationAdjustmentOrange"); - available.add("XMP-crs:SaturationAdjustmentPurple"); - available.add("XMP-crs:SaturationAdjustmentRed"); - available.add("XMP-crs:SaturationAdjustmentYellow"); - available.add("XMP-crs:Shadows2012"); - available.add("XMP-crs:ShadowTint"); - available.add("XMP-crs:SharpenDetail"); - available.add("XMP-crs:SharpenEdgeMasking"); - available.add("XMP-crs:SharpenRadius"); - available.add("XMP-crs:Sharpness"); - available.add("XMP-crs:SplitToningBalance"); - available.add("XMP-crs:SplitToningHighlightHue"); - available.add("XMP-crs:SplitToningHighlightSaturation"); - available.add("XMP-crs:SplitToningShadowHue"); - available.add("XMP-crs:SplitToningShadowSaturation"); - available.add("XMP-crs:Tint"); - available.add("XMP-crs:Version"); - available.add("XMP-crs:Vibrance"); - available.add("XMP-crs:VignetteAmount"); - available.add("XMP-crs:WhiteBalance"); - available.add("XMP-crs:Whites2012"); - available.add("XMP-dc:Format"); - available.add("XMP-dc:Rights"); - available.add("XMP-exif:ApertureValue"); - available.add("XMP-exif:BrightnessValue"); - available.add("XMP-exif:ColorSpace"); - available.add("XMP-exif:CompressedBitsPerPixel"); - available.add("XMP-exif:Contrast"); - available.add("XMP-exif:CustomRendered"); - available.add("XMP-exif:DateTimeDigitized"); - available.add("XMP-exif:DateTimeOriginal"); - available.add("XMP-exif:ExifImageHeight"); - available.add("XMP-exif:ExifImageWidth"); - available.add("XMP-exif:ExifVersion"); - available.add("XMP-exif:ExposureCompensation"); - available.add("XMP-exif:ExposureMode"); - available.add("XMP-exif:ExposureProgram"); - available.add("XMP-exif:ExposureTime"); - available.add("XMP-exif:FileSource"); - available.add("XMP-exif:FlashFired"); - available.add("XMP-exif:FlashFunction"); - available.add("XMP-exif:FlashMode"); - available.add("XMP-exif:FlashpixVersion"); - available.add("XMP-exif:FlashRedEyeMode"); - available.add("XMP-exif:FlashReturn"); - available.add("XMP-exif:FNumber"); - available.add("XMP-exif:FocalLength"); - available.add("XMP-exif:FocalLengthIn35mmFormat"); - available.add("XMP-exif:FocalPlaneResolutionUnit"); - available.add("XMP-exif:FocalPlaneXResolution"); - available.add("XMP-exif:FocalPlaneYResolution"); - available.add("XMP-exif:ISO"); - available.add("XMP-exif:LightSource"); - available.add("XMP-exif:MeteringMode"); - available.add("XMP-exif:NativeDigest"); - available.add("XMP-exif:Saturation"); - available.add("XMP-exif:SceneCaptureType"); - available.add("XMP-exif:SceneType"); - available.add("XMP-exif:SensingMethod"); - available.add("XMP-exif:Sharpness"); - available.add("XMP-exif:ShutterSpeedValue"); - available.add("XMP-exif:SubjectDistanceRange"); - available.add("XMP-exif:WhiteBalance"); - available.add("XMP-photoshop:ColorMode"); - available.add("XMP-photoshop:DateCreated"); - available.add("XMP-photoshop:History"); - available.add("XMP-photoshop:ICCProfileName"); - available.add("XMP-tiff:BitsPerSample"); - available.add("XMP-tiff:Compression"); - available.add("XMP-tiff:ImageHeight"); - available.add("XMP-tiff:ImageWidth"); - available.add("XMP-tiff:Make"); - available.add("XMP-tiff:Model"); - available.add("XMP-tiff:NativeDigest"); - available.add("XMP-tiff:Orientation"); - available.add("XMP-tiff:PhotometricInterpretation"); - available.add("XMP-tiff:ResolutionUnit"); - available.add("XMP-tiff:SamplesPerPixel"); - available.add("XMP-tiff:XResolution"); - available.add("XMP-tiff:YResolution"); - available.add("XMP-xmp:CreateDate"); - available.add("XMP-xmp:CreatorTool"); - available.add("XMP-xmp:MetadataDate"); - available.add("XMP-xmpMM:DerivedFrom"); - available.add("XMP-xmpMM:DerivedFromDocumentID"); - available.add("XMP-xmpMM:DerivedFromInstanceID"); - available.add("XMP-xmpMM:DerivedFromOriginalDocumentID"); - available.add("XMP-xmpMM:DocumentID"); - available.add("XMP-xmpMM:HistoryParameters"); - available.add("XMP-xmpMM:InstanceID"); - available.add("XMP-xmpMM:OriginalDocumentID"); - available.add("XMP-xmp:ModifyDate"); - available.add("XMP-x:XMPToolkit"); - return available; - } - - @Override - public final boolean isWellFormed() { - return this.iswellformed; - } - - @Override - public final boolean isValid() { - log.debug("is valid=" + this.isvalid); - return this.isvalid; - } - @Override - public final String getFormatName() { - return "TIFF"; - } - - @Override - public final String getFormatVersion() { - return "6 (baseline + SLUB extensions)"; - } - - @Override - public final Integer getImageCount() { - return 1; //baseline tiff holds exact one - } - - @Override - public final String getMimeType() { - return "image/tiff"; - } - - @Override - public final String getProfile() { - /* there is no documentation in ExL API, therefore we use it to document the profile versions in a light way */ - StringBuilder returnvalue = new StringBuilder(); - for (Checkit_tiff_versions v: Checkit_tiff_versions.values()) { - String modificationdate = modificationDateOfFile(this.checkit_tiff_config_path.get(v)); - returnvalue.append(v).append("profile:\n").append(" path=").append(this.checkit_tiff_config_path.get(v)).append("\n").append(" md5sum=").append(this.md5CheckitTiff.get(v)).append("\n").append(" modification date=").append(modificationdate).append("\n"); - } - return returnvalue.toString(); - } - - private String md5SumOfFile(String filename ) { - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - byte[] b = Files.readAllBytes(Paths.get(filename)); - byte[] digest = md.digest(b); - return new BigInteger(1, digest).toString(16); - } catch (Exception e) { - e.printStackTrace(); - } - return ""; - } - - private String modificationDateOfFile(String filename ) { - try { - return Files.getLastModifiedTime(Paths.get(filename)).toString(); - } catch (IOException e) { - e.printStackTrace(); - } - return ""; - } - - - /** stand-alone check, main file - * @param args list of files which should be scanned - */ - public static void main(String[] args) { - SLUBTechnicalMetadataExtractorCheckItTiffPlugin plugin = new SLUBTechnicalMetadataExtractorCheckItTiffPlugin(); - Map<String, String> initp = new HashMap<>(); - initp.put( "current_checkit_tiff", "/operational_shared/software/checkit_tiff_current"); - initp.put( "current_config_file", "/operational_shared/software/cit_tiff6_baseline_SLUB_current.cfg"); - initp.put( "upcoming_checkit_tiff", "/operational_shared/software/checkit_tiff_upcoming"); - initp.put( "upcoming_config_file", "/operational_shared/software/cit_tiff6_baseline_SLUB_current.cfg"); - initp.put( "exiftool", "/usr/bin/exiftool"); - plugin.initParams( initp ); - System.out.println("Agent: '" + plugin.getAgent() + "'"); - System.out.println(); - for (String file : args) { - try { - plugin.extract(file); - } catch (Exception e) { - e.printStackTrace(); - } - System.out.println("RESULT: " + plugin.isValid()); - System.out.println("ERRORMESSAGE: " + plugin.getExtractionErrors()); - } - System.out.println("----------------------------------"); - System.out.println("getAgentName:"); - System.out.println( plugin.getAgentName()); - System.out.println("----------------------------------"); - System.out.println("getAgent:"); - System.out.println( plugin.getAgent()); - System.out.println("----------------------------------"); - System.out.println("getSupportedAttributeNames:"); - System.out.println( plugin.getSupportedAttributeNames()); - System.out.println("----------------------------------"); - System.out.println("getFormatName:"); - System.out.println( plugin.getFormatName()); - System.out.println("----------------------------------"); - System.out.println("getFormatVersion:"); - System.out.println( plugin.getFormatVersion()); - System.out.println("----------------------------------"); - System.out.println("getMimeType:"); - System.out.println( plugin.getMimeType()); - System.out.println("----------------------------------"); - System.out.println("getProfile:"); - System.out.println( plugin.getProfile()); - System.out.println("----------------------------------"); - System.out.println("getAttributeByName (summarized):"); - for (Map.Entry<String, String> m : plugin.attributes.entrySet()) { - String s = m.getKey() + " -> " + m.getValue(); - System.out.println(s); - } - } -} diff --git a/test.sh b/test.sh index d85103c2d61977aa30160ab693fcee47757341ef..6f345a7a73f7901b15f0a3b011814eb4456255ec 100644 --- a/test.sh +++ b/test.sh @@ -6,11 +6,11 @@ if [ ! -f "$1" ]; then echo "error: media file '$1' does not exist"; exit 1; fi # set variables MEDIA_FILE="$1"; -ROSETTAVERSION="7.1.0" +ROSETTAVERSION="7.3.0" ROSETTA_SDK_DIR="/exlibris/dps/d4_1/system.dir/dps-sdk-${ROSETTAVERSION}" ROSETTA_SDK_JAR="${ROSETTA_SDK_DIR}/lib/dps-sdk-${ROSETTAVERSION}.jar:${ROSETTA_SDK_DIR}/dps-sdk-projects/dps-sdk-deposit/lib/log4j-1.2.14.jar" PLUGIN_JAR="./SLUBTechnicalMetadataExtractorCheckItTiffPlugin.jar" -PLUGIN_NAME="org.slub.rosetta.dps.repository.plugin.SLUBTechnicalMetadataExtractorCheckItTiffPlugin" +PLUGIN_NAME="org.slub.rosetta.dps.repository.plugin.SLUBRetroMonographieTIFFFormatValidationPlugin" # run plugin java -cp "${ROSETTA_SDK_JAR}:${PLUGIN_JAR}" "${PLUGIN_NAME}" "${MEDIA_FILE}"