public void signal(ExecutionImpl execution, String signalName, Map<String, ?> parameters)
      throws Exception {
    Activity activity = execution.getActivity();

    if (parameters != null) {
      execution.setVariables(parameters);
    }

    execution.fire(signalName, activity);

    Transition transition = null;
    if ((signalName == null)
        && (activity.getOutgoingTransitions() != null)
        && (activity.getOutgoingTransitions().size() == 1)) {
      transition = activity.getOutgoingTransitions().get(0);
    } else {
      transition = activity.findOutgoingTransition(signalName);
    }

    if (transition != null) {
      execution.historyActivityEnd(signalName);
      execution.take(transition);
    } else {
      execution.waitForSignal();
    }
  }