code: public List<RunnerResult> runTask(InternalTask task) throws InternalTaskException, IOException {
  		List<RunnerResult> ret = new ArrayList<>();
  		//TODO: what is the input file used for in the runner result? It can't be used for much, because the file name is reused...
  		RunnerResult.Builder r = new RunnerResult.Builder(getManifest(), task);
  		switch (task.getType()) {
  			case EXPANDING:
  			{
  				logger.info("Expanding " + task.getName());
  				List<InternalTask> exp = execute(task.asExpandingTask());
  				ret.add(r.success(true).build());
  				for (InternalTask t : exp) {
  					ret.addAll(runTask(t));
  				}
  				break;
  			}
  			case READ_WRITE:
  			{
  				logger.info("Running (r/w) " + task.getName());
  				execute(task.asReadWriteTask());
  				ret.add(r.success(true).build());
  				if (tfw!=null) {
  					writeTempFile(task, tfw);
  				}
  				reset();
  				break;
  			}
  			case READ_ONLY:
  			{
  				logger.info("Running (r) " + task.getName());
  				execute(task.asReadOnlyTask());
  				ret.add(r.success(true).build());
  				break;
  			}
  			default:
  			{
  				logger.warning("Unknown task type, skipping.");
  				ret.add(r.success(false).build());
  			}
  		}
  		return ret;
  	}
docs: Runs a single tasks or task bundle (if the task is expanding) and returns the
  results. If a temporary file handler has been assigned, copies of the intermediary
  results are also created.
  
  @param task the task to run
  @return returns a list of runner results
  @throws InternalTaskException if there is a problem with a task
  @throws IOException if an I/O error occurs