package se.chalmers.gdcn.taskbuilder; import org.apache.commons.io.IOUtils; import se.chalmers.gdcn.taskbuilder.communicationToClient.ValidityListener; import java.io.IOException; import java.io.StringWriter; import java.text.NumberFormat; import java.text.ParseException; import java.util.ArrayList; import java.util.List; import java.util.Locale; /** * Created by joakim on 2014-04-01. * * Class for validating results of tasks */ public class Validifier { private final ValidityListener listener; /** * Creates a validifier instance * @param listener listens for validity results */ public Validifier(ValidityListener listener) { this.listener = listener; } /** * Runs a validity test of a result * @param program the testing program * @param result the result file * @param taskDeps the task dependencies used for generating the result */ public void testResult(String program, String result, List<String> taskDeps) { List<String> command = new ArrayList<>(); command.add(program); command.add(result); command.addAll(taskDeps); Process proc = null; try { proc = new ProcessBuilder(command).start(); if (proc.waitFor() == 0) { // Check output StringWriter writer = new StringWriter(); IOUtils.copy(proc.getInputStream(), writer, null); try { NumberFormat numberFormat = NumberFormat.getInstance(Locale.ENGLISH); double quality = numberFormat.parse(writer.toString()).doubleValue(); // Result accepted listener.validityOk(quality); } catch (ParseException e) { // Result is corrupt listener.validityCorrupt(); } } else { // Program error StringWriter writer = new StringWriter(); IOUtils.copy(proc.getErrorStream(), writer, null); listener.validityError(writer.toString()); } } catch (IOException | InterruptedException e) { listener.validityError(e.toString()); } finally { if (proc != null) proc.destroy(); } } }