@Override
  public StepExecutionResult executeImplementation(StepExecutionContext context)
      throws MuseExecutionError {
    StepConfiguration config = getConfiguration();
    HashMap<String, Object> values = new HashMap<>();
    for (String name : config.getSourceNames()) {
      MuseValueSource source = getValueSource(config, name, false, context.getProject());
      values.put(name, getValue(source, context, true, Object.class));
    }

    try {
      JavascriptRunner runner = new JavascriptStepRunner();
      runner.evalScript(_origin);

      Object result = runner.invokeFunction(EXECUTE_FUNCTION, context, values);
      if (result instanceof StepExecutionResult) return (StepExecutionResult) result;
      else
        context.raiseEvent(
            new ScriptFailureEvent(
                "Script did not return a StepExecutionResult. Instead, it returned: " + result,
                null)); // TODO do something better than n/a
    } catch (Throwable t) {
      LOG.error("unable to execute script: ", t);
      context.raiseEvent(
          new ScriptFailureEvent(
              "Script threw an exception: " + t.getMessage(),
              t)); // TODO do something better than n/a
    }
    return new BasicStepExecutionResult(StepExecutionStatus.FAILURE);
  }
 private List<String> getNodeNames(StepExecutionContext executionContext) {
   List<INodeEntry> orderedNodes =
       INodeEntryComparator.rankOrderedNodes(
           executionContext.getNodes(),
           executionContext.getNodeRankAttribute(),
           executionContext.isNodeRankOrderAscending());
   List<String> names = new ArrayList<String>();
   for (INodeEntry orderedNode : orderedNodes) {
     names.add(orderedNode.getNodename());
   }
   return names;
 }