docs: public Object doRemoteCommand(String strCommand, Map<String,Object> properties) throws RemoteException, DBException
      {
          if (properties == null)
              properties = new Hashtable<String,Object>();
          this.setProperties(properties);
          
          StringWriter stringWriter = new StringWriter();
          PrintWriter out = new PrintWriter(stringWriter);
          
          if (CREATE_SCREEN.equals(strCommand))
          {
              BaseScreen screen = this.getScreen(properties);
              int iErrorCode = screen.checkSecurity();
              if ((iErrorCode != DBConstants.NORMAL_RETURN) && (iErrorCode != Constants.READ_ACCESS))
              {
                  String strError = this.getTask().getLastError(iErrorCode);
                  if ((strError == null)
                      || (strError.length() == 0)
                      || ((iErrorCode >= DBConstants.ACCESS_DENIED) && (iErrorCode <= DBConstants.CREATE_USER_REQUIRED)))
                          strError = Integer.toString(iErrorCode);
                  RemoteException ex = new RemoteException(strError);
                  throw ex;
              }
              this.printScreen(screen, out);
          }
          else if (strCommand != null)
          {
              if (strCommand.indexOf('=') != -1)
                  Utility.parseArgs(properties, strCommand);
              else
                  properties.put(DBParams.COMMAND, strCommand);
              
              BaseScreen screen = this.getScreen(properties);
              if (screen != null)
              {
                  screen = (BaseScreen)screen.doServletCommand(m_topScreen);  // Move the input params to the record fields
                  if (screen != null)
                  {
                      screen.processInputData(out);
                      if (stringWriter.getBuffer().length() == 0)
                          if (HtmlConstants.DISPLAY.equalsIgnoreCase((String)properties.get(HtmlConstants.FORMS)))
                              this.printScreen(screen, out);    // This is a report
                  }
                  else
                  {   // Special case - command success, client needs to reset (to main menu)
                      String strMessage = this.getTask().getStatusText(DBConstants.INFORMATION_MESSAGE);
                      out.println(Utility.startTag(XMLTags.STATUS_TEXT));
                      if (strMessage != null)
                          out.println(Utility.startTag(XMLTags.TEXT) + strMessage + Utility.endTag(XMLTags.TEXT));
                      out.println(Utility.startTag(XMLTags.ERROR) + "information" + Utility.endTag(XMLTags.ERROR));
                      String strReturnCommand = Utility.addURLParam(null, XMLTags.MENU, DBConstants.BLANK);   // User's main menu
                      strReturnCommand = Utility.addURLParam(strReturnCommand, DBParams.USER_NAME, this.getProperty(DBParams.USER_NAME));
                      strReturnCommand = Utility.addURLParam(strReturnCommand, DBParams.AUTH_TOKEN, this.getProperty(DBParams.AUTH_TOKEN));
                      out.println(Utility.startTag(DBParams.COMMAND) + Utility.encodeXML(strReturnCommand) + Utility.endTag(DBParams.COMMAND));
                      out.println(Utility.endTag(XMLTags.STATUS_TEXT));
                  }
              }
          }
          
          out.flush();
          out.close();
          
          return stringWriter.toString();
      }