public void saveAs() {
    MostRecentFileDialog mrfd = new MostRecentFileDialog("org.concord.otviewer.saveotml");
    mrfd.setFilenameFilter("otml");

    if (currentUserFile != null) {
      mrfd.setCurrentDirectory(currentUserFile.getParentFile());
      mrfd.setSelectedFile(currentUserFile);
    }

    int retval = mrfd.showSaveDialog(getDialogParent());

    File file = null;
    if (retval == MostRecentFileDialog.APPROVE_OPTION) {
      file = mrfd.getSelectedFile();

      String fileName = file.getPath();
      currentUserFile = file;

      if (!fileName.toLowerCase().endsWith(".otml")) {
        currentUserFile = new File(currentUserFile.getAbsolutePath() + ".otml");
      }

      try {
        ExporterJDOM.export(currentUserFile, userDataDB.getRoot(), userDataDB);
        userDataDB.setDirty(false);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
  public void save() {
    if (currentUserFile == null || !currentUserFile.exists()) {
      saveAs();
      return;
    }

    if (currentUserFile.exists()) {
      try {
        ExporterJDOM.export(currentUserFile, userDataDB.getRoot(), userDataDB);
        userDataDB.setDirty(false);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
  protected void initUserDb(XMLDatabase userDataDb) throws Exception {
    this.userDataDB = userDataDb;
    otrunk.addDatabase(userDataDB);

    OTObjectService objService = otrunk.createObjectService(userDataDb);

    OTDataObject rootDO = userDataDb.getRoot();

    OTStateRoot stateRoot = (OTStateRoot) objService.getOTObject(rootDO.getGlobalId());

    OTObjectMap userMap = stateRoot.getUserMap();

    // find the user from this database.
    // this currently is the first user in the userMap
    Vector<String> keys = userMap.getObjectKeys();
    refMap = (OTReferenceMap) userMap.getObject(keys.get(0));
  }