package cz.nkp.differ.compare.metadata.external; import cz.nkp.differ.compare.metadata.AbstractMetadataExtractor; import cz.nkp.differ.compare.metadata.ImageMetadata; import cz.nkp.differ.compare.metadata.MetadataSource; import cz.nkp.differ.compare.metadata.external.ResultTransformer.Entry; import cz.nkp.differ.plugins.tools.CommandRunner; import cz.nkp.differ.plugins.tools.CommandRunner.CommandOutput; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; /** * * @author xrosecky */ public class ExternalMetadataExtractor extends AbstractMetadataExtractor { private List<String> programArguments; private ResultTransformer transformer; private String source; private Map<String, String> units; public List<String> getProgramArguments() { return programArguments; } public void setProgramArguments(List<String> programArguments) { this.programArguments = programArguments; } public ResultTransformer getTransformer() { return transformer; } public void setTransformer(ResultTransformer transformer) { this.transformer = transformer; } public String getSource() { return source; } public void setSource(String source) { this.source = source; } public Map<String, String> getUnits() { return units; } public void setUnits(Map<String, String> units) { this.units = units; } @Override public List<ImageMetadata> getMetadata(File file) { if (super.isSupported(file)) { return this.getMetadata(Collections.singletonMap("{file}", file.getAbsolutePath())); } else { return Collections.emptyList(); } } public List<ImageMetadata> getMetadata(Map<String, String> attributes) { List<ImageMetadata> result = new ArrayList<ImageMetadata>(); List<String> arguments = new ArrayList<String>(); for (String argument : programArguments) { if (attributes.containsKey(argument)) { arguments.add(attributes.get(argument)); } else { arguments.add(argument); } } try { CommandOutput cmdResult = CommandRunner.runCommandAndWaitForExit(null, arguments); MetadataSource metadataSource = new MetadataSource(cmdResult.getExitCode(), new String(cmdResult.getStdout()), new String(cmdResult.getStderr()), source); int exitCode = cmdResult.getExitCode(); String exitCodeString = ""; switch (exitCode) { case 0: exitCodeString = "ok"; break; case -1: exitCodeString = "failed (-1)"; break; default: exitCodeString = String.format("error (%s)", exitCode); break; } result.add(new ImageMetadata("exit-code", exitCodeString, metadataSource)); if (cmdResult.getExitCode() == 0) { Map<String, MetadataSource> sources = new HashMap<String, MetadataSource>(); List<Entry> entries = transformer.transform(cmdResult.getStdout(), cmdResult.getStderr()); for (Entry entry : entries) { ImageMetadata metadata = null; if (entry.getSource() == null) { metadata = new ImageMetadata(entry.getKey(), entry.getValue(), metadataSource); } else { MetadataSource newSource = sources.get(entry.getSource()); if (newSource == null) { newSource = new MetadataSource(cmdResult.getExitCode(), new String(cmdResult.getStdout()), new String(cmdResult.getStderr()), entry.getSource()); sources.put(entry.getSource(), newSource); } metadata = new ImageMetadata(entry.getKey(), entry.getValue(), newSource); } if (units != null) { String unit = units.get(entry.getKey()); metadata.setUnit(unit); } result.add(metadata); } } } catch (Exception ex) { ex.printStackTrace(); } return result; } }