void setSimpleState(SimpleGoalState next_state)
 {
     ROS.Debug("actionlib", "Transitioning SimpleState from [%s] to [%s]",
               goalState.toString(),
               next_state.toString());
     goalState = next_state;
 }
        void handleTransition(ClientGoalHandle <ActionSpec> gh)
        {
            CommState commState = gh.getCommState();

            switch (commState.state)
            {
            case CommState.StateEnum.WAITING_FOR_GOAL_ACK:
                ROS.Error("actionlib", "BUG: Shouldn't ever get a transition callback for WAITING_FOR_GOAL_ACK");
                break;

            case CommState.StateEnum.PENDING:
                if (goalState != SimpleGoalState.StateEnum.PENDING)
                {
                    ROS.Error("BUG: Got a transition to CommState [%s] when our in SimpleGoalState [%s]",
                              commState.toString(), goalState.toString());
                }
                break;

            case CommState.StateEnum.ACTIVE:
                switch (goalState.state)
                {
                case SimpleGoalState.StateEnum.PENDING:
                    setSimpleState(SimpleGoalState.StateEnum.ACTIVE);
                    if (activeCallback != null)
                    {
                        activeCallback();
                    }
                    break;

                case SimpleGoalState.StateEnum.ACTIVE:
                    break;

                case SimpleGoalState.StateEnum.DONE:
                    ROS.Error("actionlib", "BUG: Got a transition to CommState [%s] when in SimpleGoalState [%s]",
                              commState.ToString(), goalState.ToString());
                    break;

                default:
                    ROS.Error("Unknown SimpleGoalState %u", goalState.state);
                    return;

                    break;
                }
                break;

            case CommState.StateEnum.WAITING_FOR_RESULT:
                break;

            case CommState.StateEnum.WAITING_FOR_CANCEL_ACK:
                break;

            case CommState.StateEnum.RECALLING:
                if (goalState != SimpleGoalState.StateEnum.PENDING)
                {
                    ROS.Error("BUG: Got a transition to CommState [%s] when our in SimpleGoalState [%s]",
                              commState.ToString(), goalState.ToString());
                }
                break;

            case CommState.StateEnum.PREEMPTING:
                switch (goalState.state)
                {
                case SimpleGoalState.StateEnum.PENDING:
                    setSimpleState(SimpleGoalState.StateEnum.ACTIVE);
                    if (activeCallback != null)
                    {
                        activeCallback();
                    }
                    break;

                case SimpleGoalState.StateEnum.ACTIVE:
                    break;

                case SimpleGoalState.StateEnum.DONE:
                    ROS.Error("actionlib", "BUG: Got a transition to CommState [%s] when in SimpleGoalState [%s]",
                              commState.ToString(), goalState.ToString());
                    break;

                default:
                    ROS.Error("Unknown SimpleGoalState %u", goalState.state);
                    return;

                    break;
                }
                break;

            case CommState.StateEnum.DONE:
                switch (goalState.state)
                {
                case SimpleGoalState.StateEnum.PENDING:
                case SimpleGoalState.StateEnum.ACTIVE:
                    lock ( doneMutex )
                    {
                        setSimpleState(SimpleGoalState.StateEnum.DONE);
                    }

                    if (doneCallback != null)
                    {
                        doneCallback(getState(), gh.getResult());
                    }

                    doneCondition.Set();
//					doneCondition.notify_all();
                    break;

                case SimpleGoalState.StateEnum.DONE:
                    ROS.Error("actionlib", "BUG: Got a second transition to DONE");
                    break;

                default:
                    ROS.Error("Unknown SimpleGoalState %u", goalState.state);
                    return;

                    break;
                }
                break;

            default:
                ROS.Error("actionlib", "Unknown CommState received [%u]", commState.state);
                break;
            }
        }