docs: public static void addXmlDigesterRules(Digester digester) {
  
          // add class generation rule
          digester.addObjectCreate("*/" + N_MODULE, CmsModuleXmlHandler.class);
          digester.addSetNext("*/" + N_MODULE, "setModule");
  
          // add rules for base module information
  
          // NOTE: If you change the order of parameters here or add new ones, you may
          // also need to change the corresponding parameter indexes in the method addXmlDigesterRulesForVersion5Modules.
          digester.addCallMethod("*/" + N_MODULE, "createdModule", 15);
          digester.addCallParam("*/" + N_MODULE + "/" + N_NAME, 0);
          digester.addCallParam("*/" + N_MODULE + "/" + N_NICENAME, 1);
          digester.addCallParam("*/" + N_MODULE + "/" + N_GROUP, 2);
          digester.addCallParam("*/" + N_MODULE + "/" + N_CLASS, 3);
          digester.addCallParam("*/" + N_MODULE + "/" + N_IMPORT_SCRIPT, 4);
          digester.addCallParam("*/" + N_MODULE + "/" + N_IMPORT_SITE, 5);
          digester.addCallParam("*/" + N_MODULE + "/" + N_SITE, 6);
          digester.addCallParam("*/" + N_MODULE + "/" + N_EXPORT_MODE, 7, I_CmsXmlConfiguration.A_NAME);
          digester.addCallParam("*/" + N_MODULE + "/" + N_DESCRIPTION, 8);
          digester.addCallParam("*/" + N_MODULE + "/" + N_VERSION, 9);
          digester.addCallParam("*/" + N_MODULE + "/" + N_AUTHORNAME, 10);
          digester.addCallParam("*/" + N_MODULE + "/" + N_AUTHOREMAIL, 11);
          digester.addCallParam("*/" + N_MODULE + "/" + N_DATECREATED, 12);
          digester.addCallParam("*/" + N_MODULE + "/" + N_USERINSTALLED, 13);
          digester.addCallParam("*/" + N_MODULE + "/" + N_DATEINSTALLED, 14);
  
          digester.addRule("*/" + N_MODULE + "/" + N_AUTOINCREMENT, new Rule() {
  
              @Override
              public void body(String namespace, String name, String text) throws Exception {
  
                  CmsModuleXmlHandler handler = (CmsModuleXmlHandler)(getDigester().peek());
                  handler.setAutoIncrement(Boolean.parseBoolean(text.trim()));
              }
          });
  
          digester.addRule("*/" + N_MODULE + "/" + N_CHECKPOINT_TIME, new Rule() {
  
              @Override
              public void body(String namespace, String name, String text) throws Exception {
  
                  CmsModuleXmlHandler handler = (CmsModuleXmlHandler)(getDigester().peek());
                  handler.setCheckpointTime(Long.parseLong(text.trim()));
              }
          });
  
          // add rules for module dependencies
          digester.addCallMethod("*/" + N_MODULE + "/" + N_DEPENDENCIES + "/" + N_DEPENDENCY, "addDependency", 2);
          digester.addCallParam(
              "*/" + N_MODULE + "/" + N_DEPENDENCIES + "/" + N_DEPENDENCY,
              0,
              I_CmsXmlConfiguration.A_NAME);
          digester.addCallParam("*/" + N_MODULE + "/" + N_DEPENDENCIES + "/" + N_DEPENDENCY, 1, A_VERSION);
  
          // add rules for the module export points
          digester.addCallMethod(
              "*/" + N_MODULE + "/" + I_CmsXmlConfiguration.N_EXPORTPOINTS + "/" + I_CmsXmlConfiguration.N_EXPORTPOINT,
              "addExportPoint",
              2);
          digester.addCallParam(
              "*/" + N_MODULE + "/" + I_CmsXmlConfiguration.N_EXPORTPOINTS + "/" + I_CmsXmlConfiguration.N_EXPORTPOINT,
              0,
              I_CmsXmlConfiguration.A_URI);
          digester.addCallParam(
              "*/" + N_MODULE + "/" + I_CmsXmlConfiguration.N_EXPORTPOINTS + "/" + I_CmsXmlConfiguration.N_EXPORTPOINT,
              1,
              I_CmsXmlConfiguration.A_DESTINATION);
  
          // add rules for the module resources
          digester.addCallMethod(
              "*/" + N_MODULE + "/" + N_RESOURCES + "/" + I_CmsXmlConfiguration.N_RESOURCE,
              "addResource",
              1);
          digester.addCallParam(
              "*/" + N_MODULE + "/" + N_RESOURCES + "/" + I_CmsXmlConfiguration.N_RESOURCE,
              0,
              I_CmsXmlConfiguration.A_URI);
  
          // add rules for the module exclude resources
          digester.addCallMethod(
              "*/" + N_MODULE + "/" + N_EXCLUDERESOURCES + "/" + I_CmsXmlConfiguration.N_RESOURCE,
              "addExcludeResource",
              1);
          digester.addCallParam(
              "*/" + N_MODULE + "/" + N_EXCLUDERESOURCES + "/" + I_CmsXmlConfiguration.N_RESOURCE,
              0,
              I_CmsXmlConfiguration.A_URI);
  
          // add rules for the module parameters
          digester.addCallMethod(
              "*/" + N_MODULE + "/" + N_PARAMETERS + "/" + I_CmsXmlConfiguration.N_PARAM,
              "addParameter",
              2);
          digester.addCallParam(
              "*/" + N_MODULE + "/" + N_PARAMETERS + "/" + I_CmsXmlConfiguration.N_PARAM,
              0,
              I_CmsXmlConfiguration.A_NAME);
          digester.addCallParam("*/" + N_MODULE + "/" + N_PARAMETERS + "/" + I_CmsXmlConfiguration.N_PARAM, 1);
  
          // generic <param> parameter rules
          digester.addCallMethod(
              "*/" + I_CmsXmlConfiguration.N_PARAM,
              I_CmsConfigurationParameterHandler.ADD_PARAMETER_METHOD,
              2);
          digester.addCallParam("*/" + I_CmsXmlConfiguration.N_PARAM, 0, I_CmsXmlConfiguration.A_NAME);
          digester.addCallParam("*/" + I_CmsXmlConfiguration.N_PARAM, 1);
  
          // add resource type rules from VFS
          CmsVfsConfiguration.addResourceTypeXmlRules(digester);
  
          // add explorer type rules from workplace
          CmsWorkplaceConfiguration.addExplorerTypeXmlRules(digester);
  
          // finally add all rules for backward compatibility with OpenCms 5.0
          addXmlDigesterRulesForVersion5Modules(digester);
      }