public void loadModel(KBWorkspaceObjectData modelData, boolean showAllRxns) {
    if (modelData == null || modelData.getId() == null || modelData.getWorkspace() == null) return;

    eventBus.fireEvent(new LoadingEvent(false));
    rpc.getKBaseMetabolicModel(
        modelData.getId(),
        modelData.getWorkspace(),
        new AsyncCallback<KBMetabolicModel>() {

          @Override
          public void onFailure(Throwable caught) {
            Window.alert("Remote procedure call failure: getKBaseMetabolicModel");
            setState(State.NO_MODELS_LOADED);
            eventBus.fireEvent(new LoadingEvent(true));
          }

          @Override
          public void onSuccess(KBMetabolicModel model) {
            // fire it off to the rest of the app.
            eventBus.fireEvent(
                new MetabolicModelLoadedEvent(model, view.getShowAllCheckBox().getValue()));
            if (model == null || model.getId().length() == 0) {
              Window.alert(
                  "Sorry, unable to display that model. Please try again.\nIf this problem persists, please contact the site administrator.");
            } else setState(State.MODEL_SELECTED);
            eventBus.fireEvent(new LoadingEvent(true));
          }
        });
  }
  private void setState(State state) {
    switch (state) {
      default:
        break;

      case NO_MODELS_LOADED:
        // model panel shouldn't be there.
        // model text box should say something appropriate.
        view.getModelTextBox().setText(state.getStatusText());
        view.getModelTablePanel().setVisible(false);
        break;

      case MODELS_LOADED:
        // model panel should be there.
        // model text box should say none selected
        view.getModelTablePanel().setVisible(true);
        view.getModelTextBox().setText(state.getStatusText());
        break;

      case MODEL_SELECTED:
        // model text box should say model selected
        view.getModelTablePanel().setVisible(true);
        view.getModelTextBox()
            .setText(modelTableSelection.getId() + " - " + modelTableSelection.getWorkspace());
        break;

      case NO_FBAS_LOADED:
        // fba panel shouldn't be there.
        // fba text box should say something approrpriate
        view.getFBATablePanel().setVisible(false);
        view.getFBATextBox().setText(state.getStatusText());
        break;

      case FBA_LOADED:
        // fba panel should be there.
        // fba text box should say none selected
        view.getFBATablePanel().setVisible(true);
        view.getFBATextBox().setText(state.getStatusText());
        break;

      case FBA_SELECTED:
        // fba text box should say what fba's selected.
        view.getFBATablePanel().setVisible(true);
        view.getFBATextBox()
            .setText(fbaTableSelection.getId() + " - " + fbaTableSelection.getWorkspace());
        break;
    }
    eventBus.fireEvent(new ViewResizedEvent());
  }
  public void loadFBAResults(KBWorkspaceObjectData fbaData, boolean showAllRxns) {
    if (fbaData == null || fbaData.getId() == null || fbaData.getWorkspace() == null) return;

    eventBus.fireEvent(new LoadingEvent(false));
    rpc.getKBaseFBAResult(
        fbaData.getId(),
        fbaData.getWorkspace(),
        new AsyncCallback<KBFBAResult>() {
          @Override
          public void onFailure(Throwable caught) {
            Window.alert("Remote procedure call failure: getKBaseFBAResult");
            setState(State.NO_FBAS_LOADED);
            eventBus.fireEvent(new LoadingEvent(true));
          }

          @Override
          public void onSuccess(KBFBAResult fba) {
            // fire it off to the rest of the app.
            if (fba == null || fba.getId().length() == 0) {
              Window.alert(
                  "Sorry, unable to display that FBA result. Please try again.\n If this problem persists, please contact the site administrator.");
            } else {
              setState(State.FBA_SELECTED);
              view.getFBATextBox()
                  .setText(
                      fba.getId()
                          + " - "
                          + fba.getWorkspace()
                          + " - Biomass: "
                          + fba.getObjective());
              eventBus.fireEvent(
                  new FBAResultLoadedEvent(fba, view.getShowAllCheckBox().getValue()));
            }
            eventBus.fireEvent(new LoadingEvent(true));
          }
        });
  }
 @Override
 public void onSuccess(List<Person> persons) {
   eventBus.fireEvent(new SearchCompletedEvent(persons));
 }
  /**
   * Should be invoked when a user logs in or out. In either case, it should check whether the
   * current user has access to currently loaded models or FBA results.
   */
  public void processUserChange() {
    /* Do a lookup (getModel or get FBA result) on each item in order.
     * Keep the keepable ones, remove, but tag the non-keepable ones.
     * If any were removed from the list, alert the user.
     */
    if (!modelDataProvider.getList().isEmpty()) {
      List<KBWorkspaceObjectData> modelData = new ArrayList<KBWorkspaceObjectData>();
      modelData.addAll(modelDataProvider.getList());

      eventBus.fireEvent(new LoadingEvent(false));
      rpc.getObjectsWithValidPermissions(
          modelData,
          new AsyncCallback<List<KBWorkspaceObjectData>>() {
            @Override
            public void onFailure(Throwable caught) {
              eventBus.fireEvent(new LoadingEvent(true));
              Window.alert("Sorry, an error occurred while checking model\nviewing permissions");
            }

            @Override
            public void onSuccess(List<KBWorkspaceObjectData> validData) {
              if (validData.size() < modelDataProvider.getList().size()) {
                Window.alert(
                    "Changing login status has removed access to some models.\nResetting view...");
                modelDataProvider.getList().clear();
                if (validData.size() > 0) {
                  modelDataProvider.getList().addAll(validData);
                } else setState(State.NO_MODELS_LOADED);
                eventBus.fireEvent(new MetabolicModelLoadedEvent(null));
              }
              eventBus.fireEvent(new LoadingEvent(true));
            }
          });
    }

    if (!fbaDataProvider.getList().isEmpty()) {
      List<KBWorkspaceObjectData> fbaData = new ArrayList<KBWorkspaceObjectData>();
      fbaData.addAll(fbaDataProvider.getList());

      eventBus.fireEvent(new LoadingEvent(false));
      rpc.getObjectsWithValidPermissions(
          fbaDataProvider.getList(),
          new AsyncCallback<List<KBWorkspaceObjectData>>() {
            @Override
            public void onFailure(Throwable caught) {
              eventBus.fireEvent(new LoadingEvent(true));
              Window.alert(
                  "Sorry, an error occurred while checking fba\nresult viewing permissions");
            }

            @Override
            public void onSuccess(List<KBWorkspaceObjectData> validData) {
              if (validData.size() < fbaDataProvider.getList().size()) {
                Window.alert(
                    "Changing login status has removed access to some FBA results.\nResetting view...");
                fbaDataProvider.getList().clear();
                if (validData.size() > 0) {
                  fbaDataProvider.getList().addAll(validData);
                  setState(State.FBA_LOADED);
                }
                eventBus.fireEvent(new FBAResultLoadedEvent(null));
              }
              eventBus.fireEvent(new LoadingEvent(true));
            }
          });
    }
  }