@Override
  public void onTransUnitSave(TransUnitSaveEvent event) {
    TransUnitId idToSave = event.getTransUnitId();
    Log.info("TU save event: new[" + event.getTargets() + "] + old: [" + event.getOldContents());
    if (stateHasNotChanged(event)) {
      Log.info("NO OP! state has not changed for " + idToSave);
      return;
    }

    queue.push(event);
    if (queue.isSaving(idToSave)) {
      Log.info(idToSave + " has saving event. Put in queue and return.");
      return;
    }

    performSave(idToSave);
  }
  private void performSave(TransUnitId idToSave) {
    TransUnitSaveEvent forSaving = queue.getNextPendingForSaving(idToSave);
    if (forSaving == null) {
      Log.info("no pending save for " + idToSave);
      return;
    }

    targetContentsPresenter.setEditingState(idToSave, TargetContentsDisplay.EditingState.SAVING);

    UpdateTransUnit updateTransUnit =
        new UpdateTransUnit(
            new TransUnitUpdateRequest(
                idToSave,
                forSaving.getTargets(),
                forSaving.getAdjustedStatus(),
                forSaving.getVerNum(),
                sourceType),
            TransUnitUpdated.UpdateType.WebEditorSave);
    Log.info("about to save translation: " + updateTransUnit);
    dispatcher.execute(
        updateTransUnit,
        new UpdateTransUnitCallback(
            forSaving, documentListPresenter.getCurrentDocument(), idToSave));
  }