diff --git a/java/org/slub/rosetta/dps/repository/plugin/SLUBTechnicalMetadataExtractorCheckItTiffPlugin.java b/java/org/slub/rosetta/dps/repository/plugin/SLUBTechnicalMetadataExtractorCheckItTiffPlugin.java index 622afc393067c398edb0f54eb9c8bab67c8d6359..e01fb281ba58c928f2d87ff6867d435d99f6a59d 100644 --- a/java/org/slub/rosetta/dps/repository/plugin/SLUBTechnicalMetadataExtractorCheckItTiffPlugin.java +++ b/java/org/slub/rosetta/dps/repository/plugin/SLUBTechnicalMetadataExtractorCheckItTiffPlugin.java @@ -1,5 +1,5 @@ /* -2014-2018 by Andreas Romeyke (SLUB Dresden) +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. @@ -13,7 +13,7 @@ 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 0.3.1 or higher +Hint: works only with checkit_tiff version 1.0.0 or higher */ package org.slub.rosetta.dps.repository.plugin; @@ -25,13 +25,17 @@ 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; -import java.nio.file.*; /** @@ -43,15 +47,24 @@ import java.nio.file.*; /*public class SLUBTechnicalMetadataExtractorCheckItTiffPlugin implements MDExtractorPlugin { */ public class SLUBTechnicalMetadataExtractorCheckItTiffPlugin implements MDExtractorPlugin { private static final ExLogger log = ExLogger.getExLogger(SLUBTechnicalMetadataExtractorCheckItTiffPlugin.class); - private Map<Checkit_tiff_versions, String> checkit_tiff_binary_path = new HashMap<Checkit_tiff_versions, String>(); - private Map<Checkit_tiff_versions, String> checkit_tiff_config_path = new HashMap<Checkit_tiff_versions, String>(); - private Map<Checkit_tiff_versions, Boolean> is_checkit_tiff_valid = new HashMap<Checkit_tiff_versions, Boolean>(); - private String exiftool_binary_path; - private List<String> extractionErrors = new ArrayList<String>(); - private List<String> validationLog = new ArrayList<String>(); + 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 Map<String,String> attributes = new HashMap<String, String>(); + 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"); @@ -60,43 +73,28 @@ public class SLUBTechnicalMetadataExtractorCheckItTiffPlugin implements MDExtrac } } - /** stand-alone check, main file to call local installed clamd - * @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<String, String>(); - // initp.put( "checkit_tiff", "/usr/bin/checkit_tiff"); - // initp.put( "config_file", "/etc/checkit_tiff/slub.cfg"); - initp.put( "current_checkit_tiff", "/home/romeyke/git/checkit_tiff/build/checkit_tiff"); - initp.put( "current_config_file", "/home/romeyke/git/checkit_tiff/example_configs/cit_tiff6_baseline_SLUBrelaxed.cfg"); - initp.put( "upcoming_checkit_tiff", "/home/romeyke/git/checkit_tiff/build/checkit_tiff"); - initp.put( "upcoming_config_file", "/home/romeyke/git/checkit_tiff/example_configs/cit_tiff6_baseline_SLUBrelaxed.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()); - } - } - /** init params to configure the plugin via xml forms * @param initp parameter map */ - public void initParams(Map<String, String> initp) { + 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) @@ -105,7 +103,8 @@ public class SLUBTechnicalMetadataExtractorCheckItTiffPlugin implements MDExtrac + " 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); + + " and exiftool_binary_path=" + exiftool_binary_path + ); } private void parse_exiftool_output( String exiftoolxml ) { @@ -135,17 +134,10 @@ public class SLUBTechnicalMetadataExtractorCheckItTiffPlugin implements MDExtrac } @Override - public void extract(String filePath) throws Exception { - for (Checkit_tiff_versions v: Checkit_tiff_versions.values()) { - check_path( checkit_tiff_binary_path.get(v), "path for (" + v.name() + ") checkit_tiff_binary", true); - check_path( checkit_tiff_config_path.get(v), "path for (" + v.name() + ") checkit_tiff_config", false); - } - - check_path(exiftool_binary_path, "path for exiftool_binary", true); + 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 (is_checkit_tiff_valid.get(Checkit_tiff_versions.upcoming) == false) { + if ((this.isDifferentCheckItTiff || isDifferentProfile) && is_checkit_tiff_valid.get(Checkit_tiff_versions.upcoming) == false) { validate_tiff_by_current_checkit_tiff(filePath); } @@ -172,14 +164,14 @@ public class SLUBTechnicalMetadataExtractorCheckItTiffPlugin implements MDExtrac p.waitFor(); BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); String line=reader.readLine(); - String response=""; + StringBuilder response= new StringBuilder(); while (line != null) { log.debug(line); parse_exiftool_output(line.trim()); - response+=line; + response.append(line); line = reader.readLine(); } - attributes.put("exiftool-log", response.trim()); + attributes.put("exiftool-log", response.toString().trim()); } catch (IOException e) { log.error(e); @@ -226,7 +218,7 @@ public class SLUBTechnicalMetadataExtractorCheckItTiffPlugin implements MDExtrac validate_tiff_by_checkit_tiff_version(filePath, Checkit_tiff_versions.upcoming); } - public String getAgentName() { + public final String getAgentName() { log.debug("getAgentName() called"); return "checkit_tiff"; } @@ -235,11 +227,11 @@ public class SLUBTechnicalMetadataExtractorCheckItTiffPlugin implements MDExtrac * * @return string with version */ - public String getAgent() { + public final String getAgent() { log.debug("getAgent() called"); - String response=""; + StringBuilder response= new StringBuilder(); for (Checkit_tiff_versions version : Checkit_tiff_versions.values()) { - response += (version.name() + " checkit_tiff:\n"); + response.append(version.name()).append(" checkit_tiff:\n"); try { String execstring = this.checkit_tiff_binary_path.get(version) + " -v"; Process p = Runtime.getRuntime().exec(execstring); @@ -248,7 +240,7 @@ public class SLUBTechnicalMetadataExtractorCheckItTiffPlugin implements MDExtrac String line = reader.readLine(); while (line != null) { log.debug(line); - response += line; + response.append(line); line = reader.readLine(); } } catch (IOException e) { @@ -258,11 +250,11 @@ public class SLUBTechnicalMetadataExtractorCheckItTiffPlugin implements MDExtrac e.printStackTrace(); } } - return response.trim(); + return response.toString().trim(); } @Override - public String getAttributeByName(String attribute) { + public final String getAttributeByName(String attribute) { if (attributes.containsKey(attribute)) { return attributes.get(attribute); } @@ -270,7 +262,7 @@ public class SLUBTechnicalMetadataExtractorCheckItTiffPlugin implements MDExtrac } @Override - public List<String> getExtractionErrors() { + public final List<String> getExtractionErrors() { return this.extractionErrors; } /* processed using: @@ -286,9 +278,9 @@ public class SLUBTechnicalMetadataExtractorCheckItTiffPlugin implements MDExtrac * * */ @Override - public List<String> getSupportedAttributeNames() { + public final List<String> getSupportedAttributeNames() { //return new ArrayList<String>(attributes.keySet()); - List<String> available = new ArrayList<String>(); + List<String> available = new ArrayList<>(); //available.add("checkit-tiff-conf"); available.add("checkit-tiff-log"); //available.add("checkit-tiff-path"); @@ -1100,38 +1092,117 @@ public class SLUBTechnicalMetadataExtractorCheckItTiffPlugin implements MDExtrac } @Override - public boolean isWellFormed() { + public final boolean isWellFormed() { return this.iswellformed; } @Override - public boolean isValid() { + public final boolean isValid() { log.debug("is valid=" + this.isvalid); return this.isvalid; } @Override - public String getFormatName() { + public final String getFormatName() { return "TIFF"; } @Override - public String getFormatVersion() { + public final String getFormatVersion() { return "6 (baseline + SLUB extensions)"; } @Override - public Integer getImageCount() { + public final Integer getImageCount() { return 1; //baseline tiff holds exact one } @Override - public String getMimeType() { + public final String getMimeType() { return "image/tiff"; } - private enum Checkit_tiff_versions { - current, 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 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 1bb4f05beb5165ed2c649b5834e3c393e189bcb6..d85103c2d61977aa30160ab693fcee47757341ef 100644 --- a/test.sh +++ b/test.sh @@ -1,10 +1,16 @@ #!/bin/bash -EXL=/exlibris/dps/d4_1/system.dir/dps-sdk-7.1.0/ -java -cp \ -"${EXL}/lib/dps-sdk-7.1.0.jar:${EXL}/dps-sdk-projects/dps-sdk-deposit/lib/log4j-1.2.14.jar:\ -${EXL}/dps-sdk-projects/dps-sdk-deposit/lib/commons-codec-1.10.jar:\ -${EXL}/dps-sdk-projects/dps-sdk-deposit/lib/xmlbeans-2.3.0.jar:\ -/usr/share/java/commons-lang.jar:\ -./SLUBTechnicalMetadataExtractorCheckItTiffPlugin.jar:./SLUBTechnicalMetadataExtractorCheckItTiffPlugin.jar" \ -org.slub.rosetta.dps.repository.plugin.SLUBTechnicalMetadataExtractorCheckItTiffPlugin \ -"$1" + +# check arguments +if [ "$#" -lt 1 ]; then echo "error: no media file given"; exit 1; fi +if [ ! -f "$1" ]; then echo "error: media file '$1' does not exist"; exit 1; fi + +# set variables +MEDIA_FILE="$1"; +ROSETTAVERSION="7.1.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" + +# run plugin +java -cp "${ROSETTA_SDK_JAR}:${PLUGIN_JAR}" "${PLUGIN_NAME}" "${MEDIA_FILE}"