package br.gov.frameworkdemoiselle.behave.regression.report.imagemagick.util;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class CommandBuilder {
private String pathToImageMagickCommandBinary;
private final String METRIC_PARAMETER = "-metric";
private final String METRIC_OPTION = "AE";
private final String SUBIMAGE_SEARCH_OPTION = "-subimage-search";
private final String DISSIMILAR_THRESHOLD = "-dissimilarity-threshold";
private final String DISSIMILAR_THRESHOLD_VALUE = "100%";
private String pathToFirstImage;
private String pathToSecondImage;
private String pathToDiffFile;
private List<String> metrics;
private List<String> commands;
private BigDecimal firstImagePixels;
private BigDecimal secondImagePixels;
public CommandBuilder() {
this.commands = new ArrayList<String>();
this.metrics = new ArrayList<String>();
}
public void setPathToImageMagickCommandBinary(String pathToImageMagickCommandBinary) {
this.pathToImageMagickCommandBinary = pathToImageMagickCommandBinary;
}
public void setMetricParameters(String... parameters) {
for(String parameter : parameters) {
this.metrics.add(parameter);
}
}
private void setImageMetricParameters() {
if(firstImagePixels.longValue() != secondImagePixels.longValue()) {
setSubImageMetricParameters();
} else {
setOneToOneComparisonMetricParameters();
}
}
public void setOneToOneComparisonMetricParameters() {
this.metrics.clear();
this.metrics.add(METRIC_PARAMETER);
this.metrics.add(METRIC_OPTION);
}
public void setSubImageMetricParameters() {
setOneToOneComparisonMetricParameters();
this.metrics.add(SUBIMAGE_SEARCH_OPTION);
this.metrics.add(DISSIMILAR_THRESHOLD);
this.metrics.add(DISSIMILAR_THRESHOLD_VALUE);
}
public void setFilePaths(String pathToFirstImage, String pathToSecondImage, String pathToDiffFile) {
this.pathToFirstImage = pathToFirstImage;
this.pathToSecondImage = pathToSecondImage;
this.pathToDiffFile = pathToDiffFile;
}
public BigDecimal getFirstImagePixels() {
return firstImagePixels;
}
public void setFirstImagePixels(BigDecimal firstImagePixels) {
this.firstImagePixels = firstImagePixels;
}
public BigDecimal getSecondImagePixels() {
return secondImagePixels;
}
public void setSecondImagePixels(BigDecimal secondImagePixels) {
this.secondImagePixels = secondImagePixels;
}
private String scapeWhiteSpaces(String path) {
return path.replaceAll(" ", "\\ ");
}
public void build() {
this.commands.add(pathToImageMagickCommandBinary);
setImageMetricParameters();
this.commands.addAll(metrics);
if(secondImagePixels.longValue() > firstImagePixels.longValue()) {
this.commands.add(scapeWhiteSpaces(pathToSecondImage));
this.commands.add(scapeWhiteSpaces(pathToFirstImage));
} else {
this.commands.add(scapeWhiteSpaces(pathToFirstImage));
this.commands.add(scapeWhiteSpaces(pathToSecondImage));
}
this.commands.add(scapeWhiteSpaces(pathToDiffFile));
}
public void buildForGif() {
this.commands.add(pathToImageMagickCommandBinary);
this.commands.add("-delay");
this.commands.add("100");
this.commands.add("-dispose");
this.commands.add("None");
this.commands.add(scapeWhiteSpaces(pathToFirstImage));
this.commands.add(scapeWhiteSpaces(pathToSecondImage));
this.commands.add("-loop");
this.commands.add("0");
this.commands.add(scapeWhiteSpaces(pathToDiffFile));
}
public String toString() {
String commandRepresentation = "";
for(String command : getCommandAsArray())
commandRepresentation += (command + " ");
// System.out.println("COMMAND: " + commandRepresentation);
return commandRepresentation.trim();
}
public String[] getCommandAsArray() {
String[] commandsArray = new String[commands.size()];
return this.commands.toArray(commandsArray);
}
}