@Override
 public void masterIsAvailable(HighAvailabilityMemberChangeEvent event) {
   if (event.getNewState() == event.getOldState()
       && event.getOldState() == HighAvailabilityMemberState.SLAVE) {
     clusterMemberAvailability.memberIsAvailable(SLAVE, slaveHaURI, resolveStoreId());
   } else {
     stateChanged(event);
   }
 }
 @Override
 public void masterIsElected(HighAvailabilityMemberChangeEvent event) {
   if (event.getNewState() == event.getOldState()
       && event.getOldState() == HighAvailabilityMemberState.MASTER) {
     clusterMemberAvailability.memberIsAvailable(MASTER, masterHaURI, resolveStoreId());
   } else {
     stateChanged(event);
   }
 }
  private void stateChanged(HighAvailabilityMemberChangeEvent event) {
    if (event.getNewState() == event.getOldState()) {
      /*
       * We get here if for example a new master becomes available while we are already switching. In that case
       * we don't change state but we must update with the new availableMasterId, but only if it is not null.
       */
      if (event.getServerHaUri() != null) {
        availableMasterId = event.getServerHaUri();
      }
      return;
    }

    availableMasterId = event.getServerHaUri();

    currentTargetState = event.getNewState();
    switch (event.getNewState()) {
      case TO_MASTER:
        if (event.getOldState().equals(HighAvailabilityMemberState.SLAVE)) {
          clusterMemberAvailability.memberIsUnavailable(SLAVE);
        }

        switchToMaster();
        break;
      case TO_SLAVE:
        switchToSlave();
        break;
      case PENDING:
        if (event.getOldState().equals(HighAvailabilityMemberState.SLAVE)) {
          clusterMemberAvailability.memberIsUnavailable(SLAVE);
        } else if (event.getOldState().equals(HighAvailabilityMemberState.MASTER)) {
          clusterMemberAvailability.memberIsUnavailable(MASTER);
        }

        switchToPending();
        break;
      default:
        // do nothing
    }
  }