docs: public static void generateExplorerTypesXml(
          Element startNode,
          List<CmsExplorerTypeSettings> explorerTypes,
          boolean module) {
  
          // we need the default access node later to check if the explorer type is an individual setting
          CmsExplorerTypeAccess defaultAccess = null;
          if (OpenCms.getWorkplaceManager() != null) {
              defaultAccess = OpenCms.getWorkplaceManager().getDefaultAccess();
          }
          // get the menu rule translator to eliminate eventual legacy menu rules
          Iterator<CmsExplorerTypeSettings> i = explorerTypes.iterator();
          while (i.hasNext()) {
              // create an explorer type node
              CmsExplorerTypeSettings settings = i.next();
  
              if (settings.isAddititionalModuleExplorerType() == module) {
                  Element explorerTypeElement = startNode.addElement(N_EXPLORERTYPE);
                  explorerTypeElement.addAttribute(A_NAME, settings.getName());
                  explorerTypeElement.addAttribute(A_KEY, settings.getKey());
                  String originalIcon = settings.getOriginalIcon();
                  if (CmsStringUtil.isNotEmpty(originalIcon)) {
                      explorerTypeElement.addAttribute(A_ICON, settings.getOriginalIcon());
                  }
                  if (CmsStringUtil.isNotEmpty(settings.getBigIcon())) {
                      explorerTypeElement.addAttribute(A_BIGICON, settings.getBigIcon());
                  }
                  if (CmsStringUtil.isNotEmpty(settings.getSmallIconStyle())) {
                      explorerTypeElement.addAttribute(A_SMALLICONSTYLE, settings.getSmallIconStyle());
                  }
                  if (CmsStringUtil.isNotEmpty(settings.getBigIconStyle())) {
                      explorerTypeElement.addAttribute(A_BIGICONSTYLE, settings.getBigIconStyle());
                  }
  
                  if (settings.getReference() != null) {
                      explorerTypeElement.addAttribute(A_REFERENCE, settings.getReference());
                  }
  
                  if (settings.getElementView() != null) {
                      explorerTypeElement.addAttribute(A_ELEMENTVIEW, settings.getElementView());
                  }
  
                  if (settings.isView()) {
                      explorerTypeElement.addAttribute(A_ISVIEW, "true");
                  }
  
                  if (settings.getNamePattern() != null) {
                      explorerTypeElement.addAttribute(A_NAME_PATTERN, settings.getNamePattern());
                  }
  
                  if (settings.getViewOrder(false) != null) {
                      explorerTypeElement.addAttribute(A_VIEW_ORDER, "" + settings.getViewOrder(false));
                  }
  
                  // create subnode <newresource>
                  Element newResElement = explorerTypeElement.addElement(N_NEWRESOURCE);
                  newResElement.addAttribute(A_CREATABLE, String.valueOf(settings.isCreatable()));
                  newResElement.addAttribute(A_ORDER, settings.getNewResourceOrder());
                  newResElement.addAttribute(A_AUTOSETNAVIGATION, String.valueOf(settings.isAutoSetNavigation()));
                  newResElement.addAttribute(A_AUTOSETTITLE, String.valueOf(settings.isAutoSetTitle()));
                  newResElement.addAttribute(A_INFO, settings.getInfo());
                  newResElement.addAttribute(A_KEY, settings.getTitleKey());
                  // create subnode <accesscontrol>
                  CmsExplorerTypeAccess access = settings.getAccess();
                  if (access != defaultAccess) {
                      // don't output the node if this is in fact the default access settings
                      List<String> accessEntries = new ArrayList<String>(access.getAccessEntries().keySet());
                      // sort accessEntries
                      Collections.sort(accessEntries);
                      if (accessEntries.size() > 0) {
                          Element accessControlElement = explorerTypeElement.addElement(N_ACCESSCONTROL);
                          Iterator<String> k = accessEntries.iterator();
                          while (k.hasNext()) {
                              String key = k.next();
                              String value = settings.getAccess().getAccessEntries().get(key);
                              Element accessEntryElement = accessControlElement.addElement(N_ACCESSENTRY);
                              accessEntryElement.addAttribute(A_PRINCIPAL, key);
                              accessEntryElement.addAttribute(A_PERMISSIONS, value);
                          }
                      }
                  }
                  // create subnode <editoptions>
                  if (settings.hasEditOptions()) {
                      Element editOptionsElement = explorerTypeElement.addElement(N_EDITOPTIONS);
                      Element defaultPropertiesElement = editOptionsElement.addElement(N_DEFAULTPROPERTIES);
                      defaultPropertiesElement.addAttribute(A_ENABLED, String.valueOf(settings.isPropertiesEnabled()));
                      defaultPropertiesElement.addAttribute(
                          A_SHOWNAVIGATION,
                          String.valueOf(settings.isShowNavigation()));
                      Iterator<String> m = settings.getProperties().iterator();
                      while (m.hasNext()) {
                          defaultPropertiesElement.addElement(N_DEFAULTPROPERTY).addAttribute(A_NAME, m.next());
                      }
                  }
  
                  Map<String, CmsIconRule> iconRules = settings.getIconRules();
                  if ((iconRules != null) && !iconRules.isEmpty()) {
                      Element iconRulesElem = explorerTypeElement.addElement(N_ICONRULES);
                      for (Map.Entry<String, CmsIconRule> entry : iconRules.entrySet()) {
                          CmsIconRule rule = entry.getValue();
                          Element ruleElem = iconRulesElem.addElement(N_ICONRULE);
                          String icon = rule.getIcon();
                          String bigIcon = rule.getBigIcon();
                          String extension = rule.getExtension();
                          ruleElem.addAttribute(A_EXTENSION, extension);
                          if (icon != null) {
                              ruleElem.addAttribute(A_ICON, icon);
                          }
                          if (bigIcon != null) {
                              ruleElem.addAttribute(A_BIGICON, bigIcon);
                          }
                          if (rule.getSmallIconStyle() != null) {
                              ruleElem.addAttribute(A_SMALLICONSTYLE, rule.getSmallIconStyle());
                          }
                          if (rule.getBigIconStyle() != null) {
                              ruleElem.addAttribute(A_BIGICONSTYLE, rule.getBigIconStyle());
                          }
                      }
                  }
  
              }
          }
      }