/** Call only with state lock, from state itself it should have the lock already */ @Override public void changeState(final IServerState newState) { if (currentServerState.equals(newState) == false) { // reset state timeout timer. if (currentStateTimeoutTask != null) { currentStateTimeoutTask.cancel(); currentStateTimeoutTask = null; } // check if the new state wants a timeout timer, and how long the // timeout shall be if (newState.getStateTimeoutMillis() != 0) { currentStateTimeoutTask = new StateTimeoutTask(); stateTimeoutTimer.schedule(currentStateTimeoutTask, newState.getStateTimeoutMillis()); } currentServerState = newState; LOGGER.trace("sip server changed state to " + newState.getCurrentState().toString()); currentServerState.onInit(); stateChangeCondition.signalAll(); } }