docs: @Override
      public void exportNode( Node node,
                              ContentHandler contentHandler,
                              boolean skipBinary,
                              boolean noRecurse ) throws RepositoryException, SAXException {
          ExecutionContext executionContext = session.context();
  
          JcrSharedNode sharedNode = asSharedNode(node);
          if (sharedNode != null) {
              // This is a shared node, and per Section 14.7 of the JCR 2.0 specification, they have to be written out
              // in a special way ...
              AttributesImpl atts = new AttributesImpl();
  
              // jcr:primaryType = nt:share ...
              addAttribute(atts, JcrLexicon.PRIMARY_TYPE, PropertyType.NAME, JcrNtLexicon.SHARE);
  
              // jcr:uuid = UUID of shared node ...
              addAttribute(atts, JcrLexicon.UUID, PropertyType.STRING, node.getIdentifier());
  
              // Write out the element ...
              Name name = sharedNode.segment().getName();
              startElement(contentHandler, name, atts);
              endElement(contentHandler, name);
              return;
          }
          exporting(node);
  
          // If this node is a special xmltext node, output it as raw content (see JCR 1.0 spec - section 6.4.2.3)
          if (node.getDepth() > 0 && isXmlTextNode(node)) {
              String xmlCharacters = getXmlCharacters(node);
              contentHandler.characters(xmlCharacters.toCharArray(), 0, xmlCharacters.length());
              return;
          }
  
          // Build the attributes for this node's element, but add the primary type first ...
          AttributesImpl atts = new AttributesImpl();
          Property primaryType = ((AbstractJcrNode)node).getProperty(JcrLexicon.PRIMARY_TYPE);
          if (primaryType != null) {
              addAttribute(atts, primaryType, skipBinary, false);
          }
  
          // And add the remaining properties next ...
          PropertyIterator properties = node.getProperties();
          while (properties.hasNext()) {
              Property prop = properties.nextProperty();
              if (prop == primaryType) continue;
              addAttribute(atts, prop, skipBinary, true);
          }
  
          // Special case to stub in name for root node as per JCR 1.0 Spec - 6.4.2.2
          Name name = null;
          ValueFactories valueFactories = executionContext.getValueFactories();
          if (node.getDepth() == 0) {
              name = JcrLexicon.ROOT;
          } else {
              name = valueFactories.getNameFactory().create(node.getName());
          }
  
          // Write out the element ...
          startElement(contentHandler, name, atts);
          if (!noRecurse) {
              //the node iterator should check permissions and return only those nodes on which there is READ permission
              NodeIterator nodes = node.getNodes();
              while (nodes.hasNext()) {
                  Node child = nodes.nextNode();
                  //MODE-2171 Ignore any ACL nodes
                  if (!child.isNodeType(ModeShapeLexicon.ACCESS_LIST_NODE_TYPE_STRING)) {
                      exportNode(child, contentHandler, skipBinary, noRecurse);
                  }
              }
          }
          endElement(contentHandler, name);
      }