public HashMap<MeasurementInfoUri, Value> evaluate(Alternative alternative,
SampleObject sample, DigitalObject result, List<MeasurementInfoUri> measurementInfoUris,
IStatusListener listener) throws EvaluatorException {
FloatFormatter formatter = new FloatFormatter();
HashMap<MeasurementInfoUri, Value> results = new HashMap<MeasurementInfoUri, Value>();
String fitsXMLResult = result.getFitsXMLString();
String fitsXMLSample = sample.getFitsXMLString();
XmlExtractor extractor = new XmlExtractor();
extractor.setNamespaceContext(new FitsNamespaceContext());
if ((fitsXMLResult != null) && (fitsXMLSample != null)) {
// so we have a fits xml, lets analyse it:
try {
StringReader reader = new StringReader(fitsXMLResult);
Document fitsDocResult = extractor.getDocument(new InputSource(reader));
reader = new StringReader(fitsXMLSample);
Document fitsDocSample = extractor.getDocument(new InputSource(reader));
String sampleImageCompressionScheme = extractor.extractText(fitsDocSample, "//fits:compressionScheme/text()");
String resultImageCompressionScheme = extractor.extractText(fitsDocResult, "//fits:compressionScheme/text()");
for (MeasurementInfoUri measurementInfoUri : measurementInfoUris) {
Value v = null;
String propertyURI = measurementInfoUri.getAsURI();
Scale scale = descriptor.getMeasurementScale(measurementInfoUri);
if (scale == null) {
// This means that I am not entitled to evaluate this measurementInfo and therefore supposed to skip it:
continue;
}
if(OBJECT_FORMAT_CORRECT_WELLFORMED.equals(propertyURI)) {
v = extractor.extractValue(fitsDocResult, scale,
"//fits:well-formed[@status='SINGLE_RESULT']/text()",
"//fits:filestatus/fits:message/text()");
} else if(OBJECT_FORMAT_CORRECT_VALID.equals(propertyURI)) {
v = extractor.extractValue(fitsDocResult, scale,
"//fits:filestatus/fits:valid[@status='SINGLE_RESULT']/text()",
"//fits:filestatus/fits:message/text()");
} if(OBJECT_COMPRESSION_SCHEME.equals(propertyURI)) {
v = extractor.extractValue(fitsDocResult, scale,
"//fits:compressionScheme/text()",
null);
}
if ((v!= null) && (v.getComment() == null || "".equals(v.getComment()))) {
v.setComment(SOURCE);
results.put(measurementInfoUri, v);
listener.updateStatus(String.format("%s: measurement: %s = %s", NAME, measurementInfoUri.getAsURI(), v.toString()));
// this leaf has been processed
continue;
}
if(OBJECT_FORMAT_CORRECT_CONFORMS.equals(propertyURI)) {
if (alternative.getAction() != null) {
String puid = "UNDEFINED";
FormatInfo info = alternative.getAction().getTargetFormatInfo();
if (info != null) {
puid = info.getPuid();
}
String fitsText = extractor.extractText(fitsDocResult,"//fits:externalIdentifier[@type='puid']/text()");
v = identicalValues(puid, fitsText, scale);
}
} else if((OBJECT_IMAGE_DIMENSION_WIDTH + "#equal").equals(propertyURI)) {
String sampleValue = extractor.extractText(fitsDocSample, "//fits:imageWidth/text()");
String resultValue = extractor.extractText(fitsDocResult,"//fits:imageWidth/text()");
v = identicalValues(sampleValue, resultValue, scale);
} else if((OBJECT_IMAGE_DIMENSION_HEIGHT + "#equal").equals(propertyURI)) {
String sampleValue = extractor.extractText(fitsDocSample,"//fits:imageHeight/text()");
String resultValue = extractor.extractText(fitsDocResult,"//fits:imageHeight/text()");
v = identicalValues(sampleValue, resultValue, scale);
} else if((OBJECT_IMAGE_DIMENSION_ASPECTRATIO + "#equal").equals(propertyURI)) {
try {
int sampleHeight = Integer.parseInt(extractor.extractText(fitsDocSample,"//fits:imageHeight/text()"));
int resultHeight = Integer.parseInt(extractor.extractText(fitsDocResult,"//fits:imageHeight/text()"));
int sampleWidth = Integer.parseInt(extractor.extractText(fitsDocSample,"//fits:imageWidth/text()"));
int resultWidth = Integer.parseInt(extractor.extractText(fitsDocResult,"//fits:imageWidth/text()"));
double sampleRatio = ((double)sampleWidth) / sampleHeight;
double resultRatio = ((double)resultWidth) / resultHeight;
v = scale.createValue();
((BooleanValue)v).bool(0 == Double.compare(sampleRatio, resultRatio));
v.setComment(String.format("Reference value: %s\nActual value: %s",
formatter.formatFloat(sampleRatio),formatter.formatFloat(resultRatio)));
} catch (NumberFormatException e) {
// not all values are available - aspectRatio cannot be calculated
v = scale.createValue();
v.setComment("Image width and/or height are not available - aspectRatio cannot be calculated");
}