docs: public StandardMessageResponseData setupUserInfo(CreateSiteMessageData siteMessageData)
      {
          MessageRecordDesc userInfoMessageData = (MessageRecordDesc)siteMessageData.getMessageDataDesc(UserInfo.USER_INFO_FILE);
          MessageRecordDesc menusMessageData = (MessageRecordDesc)siteMessageData.getMessageDataDesc(Menus.MENUS_FILE);
          
          TreeMessage replyMessage = new TreeMessage(null, null);
          StandardMessageResponseData runRemoteProcessResponse = new StandardMessageResponseData(replyMessage, null);
          try {
              Record recUser = this.getMainRecord();
              recUser.addNew();
              recUser.setKeyArea(UserInfo.USER_NAME_KEY);
              recUser.getField(UserInfo.USER_NAME).setString((String)userInfoMessageData.get(UserInfo.USER_NAME));
              if (recUser.seek(null))
                  recUser.edit();
              else
                  recUser.addNew(); // If user doesn't exist, create it
              userInfoMessageData.getRawRecordData(recUser);  // User username, password
              ((PropertiesField)recUser.getField(UserInfo.PROPERTIES)).setProperty(DBParams.HOME, (String)menusMessageData.get(MenusMessageData.SITE_HOME_MENU));
              ((PropertiesField)recUser.getField(UserInfo.PROPERTIES)).setProperty(MenusMessageData.DOMAIN_NAME, (String)menusMessageData.get(MenusMessageData.DOMAIN_NAME));
              if (recUser.getEditMode() == DBConstants.EDIT_ADD)
                  recUser.add();
              else
                  recUser.set();
              
              Record recMenus = this.getRecord(Menus.MENUS_FILE);
          
              // First read the template menu record
              String siteTemplate = (String)menusMessageData.get(MenusMessageData.SITE_TEMPLATE_MENU);
              recMenus.getField(Menus.CODE).setString(siteTemplate);
              int iOldOrder = recMenus.getDefaultOrder();
              recMenus.setKeyArea(Menus.CODE_KEY);
              BaseBuffer buffer = null;
              if (recMenus.seek(null))
              {
                  buffer = new VectorBuffer(null);
                  buffer.fieldsToBuffer(recMenus);
              }
              else
              {
                  runRemoteProcessResponse.setMessage("Error: Site template not found: " + siteTemplate);
                  return runRemoteProcessResponse;
              }
          
              // Next, create the new menu for this domain (using template record info)
              recMenus.addNew();
              recMenus.setKeyArea(Menus.CODE_KEY);
              recMenus.getField(Menus.CODE).setString((String)menusMessageData.get(MenusMessageData.DOMAIN_NAME));
              if (recMenus.seek(null))
                  recMenus.edit();    // If it already exists, I must be on the same machine that sent me this message!
              else
              {
                  recMenus.addNew();  // If it doesn't exist, create it
                  if (buffer != null)     // Always
                      buffer.bufferToFields(recMenus, DBConstants.DISPLAY, DBConstants.INIT_MOVE);
              }
              
              recMenus.getField(Menus.SEQUENCE).setValue(100);
              
              // Create customized xslt stylesheet
              String homeDir = System.getProperty("user.home") + File.separator + ".jbundle";
              recMenus.getField(Menus.CODE).setString((String)menusMessageData.get(MenusMessageData.DOMAIN_NAME));
          
              String fullSitePrefix = (String)menusMessageData.get(MenusMessageData.SITE_PREFIX);
              String siteName = (String)menusMessageData.get(MenusMessageData.SITE_NAME);
              String templateArchivePath = (String)menusMessageData.get(MenusMessageData.XSL_TEMPLATE_PATH);
              String siteHomeCode = (String)menusMessageData.get(MenusMessageData.SITE_HOME_MENU);
              recMenus.getField(Menus.NAME).setString(siteName);
          
              String destArchivePath  = templateArchivePath;
              if (destArchivePath.lastIndexOf(File.separator) != -1)  // Always
                  destArchivePath = destArchivePath.substring(destArchivePath.lastIndexOf(File.separator) + 1); // Dest archive dir
              destArchivePath  = Utility.addToPath(homeDir, fullSitePrefix + File.separator + destArchivePath);
          
              ((PropertiesField)recMenus.getField(Menus.PARAMS)).setProperty(DBConstants.USER_ARCHIVE_FOLDER, destArchivePath);
              ((PropertiesField)recMenus.getField(Menus.PARAMS)).setProperty(DBConstants.DB_USER_PREFIX, fullSitePrefix + "_");
          
              String templateFilename = ((PropertiesField)recMenus.getField(Menus.PARAMS)).getProperty(MenusMessageData.XSL_TEMPLATE_PATH);
              if ((templateFilename == null) || (templateFilename.length() == 0))
                  templateFilename = this.getProperty(MenusMessageData.XSL_TEMPLATE_PATH);
              if ((templateFilename == null) || (templateFilename.length() == 0))
                  templateFilename = "docs/styles/xsl/program/fixdemotemplate.xsl";
              ((PropertiesField)recMenus.getField(Menus.PARAMS)).setProperty(MenusMessageData.XSL_TEMPLATE_PATH, templateFilename);
          
              if (recMenus.getEditMode() == DBConstants.EDIT_ADD)
                  recMenus.add();
              else
                  recMenus.set();
          
              this.createCustomArchive(destArchivePath, homeDir, templateArchivePath, templateFilename);
          
              // Make sure the user's account has been added to their new database
              BaseApplication app = (BaseApplication)this.getTask().getApplication();
          
              Map<String,Object> properties = new Hashtable<String,Object>();
              if (app.getProperties() != null)
                  properties.putAll(app.getProperties());
              properties.put(DBConstants.DB_USER_PREFIX, fullSitePrefix + "_");
              properties.put(DBConstants.LOAD_INITIAL_DATA, DBConstants.TRUE);
              properties.put(DBConstants.USER_ARCHIVE_FOLDER, destArchivePath);
              BaseApplication appTemp = new BaseApplication(app.getEnvironment(), properties, null);
              Task task = new AutoTask(appTemp, null, null);
              BaseProcess recordOwner = new BaseProcess(task, null, null);
              UserInfo recUserNew = new UserInfo(recordOwner);
              // Also add this user as an admin
              recUserNew.addNew();
              recUserNew.moveFields(recUser, null, DBConstants.DISPLAY, DBConstants.SCREEN_MOVE, false, false, false, false);
              if (properties.get(BaseRegistrationScreen.ADMIN_HOME_MENU_CODE) != null)
                  ((PropertiesField)recUserNew.getField(UserInfo.PROPERTIES)).setProperty(DBParams.HOME, properties.get(BaseRegistrationScreen.ADMIN_HOME_MENU_CODE).toString());
              UserGroup recUserGroup = new UserGroup(this);
              recUserGroup.setKeyArea(UserGroup.DESCRIPTION_KEY);
              recUserGroup.getField(UserGroup.DESCRIPTION).setString("Admin");
              if (recUserGroup.seek(">="))
                  recUserNew.getField(UserInfo.USER_GROUP_ID).moveFieldToThis(recUserGroup.getCounterField());
              recUserGroup.free();
              recUserNew.add();
              
              // Set all the new users with the same password
              recUserNew.addNew();
              boolean[] rgbEnabled = recUserNew.setEnableListeners(false);
              Object[] rgbfldEnabled = recUserNew.setEnableFieldListeners(false);
              recUserNew.close();
              while (recUserNew.hasNext())
              {
                  recUserNew.next();
                  if (recUserNew.getField(UserInfo.ID).getValue() == 1)
                      continue; // Anonymous user
                  recUserNew.edit();
                  recUserNew.getField(UserInfo.PASSWORD).moveFieldToThis(recUser.getField(UserInfo.PASSWORD), DBConstants.DISPLAY, DBConstants.SCREEN_MOVE);
                  recUserNew.set();
              }
              recUserNew.setEnableListeners(rgbEnabled);
              recUserNew.setEnableFieldListeners(rgbfldEnabled);
              
              String strFreeIfDone = this.getEnvironment().getProperty(DBParams.FREEIFDONE);
              this.getEnvironment().setProperty(DBParams.FREEIFDONE, DBConstants.FALSE);
              appTemp.free();
              this.getEnvironment().setProperty(DBParams.FREEIFDONE, strFreeIfDone);
             
              recMenus.setKeyArea(iOldOrder);
              
              runRemoteProcessResponse.setMessage("Okay: " + fullSitePrefix);
              return runRemoteProcessResponse;
          } catch (DBException ex) {
              ex.printStackTrace();
              runRemoteProcessResponse.setMessage("Error: " + ex.getMessage());
              return runRemoteProcessResponse;
          }
      }