@Override
  public void save() {
    clearValidationErrors();

    // Client-side validation including view/model data binding
    List<ValidationError> errors = flushView();
    if (errors.size() > 0) {
      bus.fireEvent(
          new NotifyEvent(
              new Message(Level.WARNING, "Can't save currency", "Please correct your input.")));
      showValidationErrors(errors);
      return;
    }

    service.store(
        pair,
        new AsyncCallback<Void>() {
          @Override
          public void onFailure(Throwable caught) {
            if (caught instanceof ValidationException) {
              ValidationException ex = (ValidationException) caught;

              // This is probably a FK violation
              if (!ex.hasErrors()) {
                bus.fireEvent(
                    new NotifyEvent(
                        new Message(
                            Level.WARNING,
                            "Can't save exchange rate, errors on server",
                            ex.getMessage())));
              }

              showValidationErrors(ex.getErrors());
            } else {
              bus.fireEvent(new ServerFailureNotifyEvent(caught));
            }
          }

          @Override
          public void onSuccess(Void result) {
            bus.fireEvent(
                new NotifyEvent(
                    new Message(
                        Level.INFO, "Exchange rate saved", "Modifications have been stored.")));
            bus.fireEvent(new CurrencyPairModified(pair));
          }
        });
  }
  @Override
  public void delete() {
    service.remove(
        pair,
        new AsyncCallback<Void>() {
          @Override
          public void onFailure(Throwable caught) {
            bus.fireEvent(new ServerFailureNotifyEvent(caught));
          }

          @Override
          public void onSuccess(Void result) {
            bus.fireEvent(
                new NotifyEvent(
                    new Message(
                        Level.INFO,
                        "Exchange rate deleted",
                        "The exchange rate has been permanently removed.")));
            bus.fireEvent(new CurrencyPairModified(pair));
          }
        });
  }