public void endDocument() throws SAXException {

    outputFirstElementIfNeeded();

    // Output global properties
    if (properties.size() > 0) {
      final AttributesImpl newAttributes = new AttributesImpl();
      for (final Map.Entry<String, String> currentEntry : properties.entrySet()) {
        final String propertyName = currentEntry.getKey();
        newAttributes.addAttribute(
            XFormsConstants.XXFORMS_NAMESPACE_URI,
            propertyName,
            "xxforms:" + propertyName,
            ContentHandlerHelper.CDATA,
            currentEntry.getValue());
      }

      super.startPrefixMapping("xxforms", XFormsConstants.XXFORMS_NAMESPACE_URI);
      super.startElement("", "properties", "properties", newAttributes);
      super.endElement("", "properties", "properties");
      super.endPrefixMapping("xxforms");
    }

    super.endElement("", "static-state", "static-state");
    super.endDocument();
  }
  public void endElement(String uri, String localname, String qName) throws SAXException {

    level--;

    // Check for XForms or extension namespaces
    //        final boolean isXForms = XFormsConstants.XFORMS_NAMESPACE_URI.equals(uri);
    //        final boolean isXXForms = XFormsConstants.XXFORMS_NAMESPACE_URI.equals(uri);
    //        final boolean isEXForms = XFormsConstants.EXFORMS_NAMESPACE_URI.equals(uri);
    //        final boolean isXBL = XFormsConstants.XBL_NAMESPACE_URI.equals(uri);
    final boolean isXHTML = XMLConstants.XHTML_NAMESPACE_URI.equals(uri);
    //        final boolean isXFormsOrExtension = isXForms || isXXForms || isEXForms || isXBL;
    final boolean isXFormsOrExtension =
        !isXHTML && !"".equals(uri); // TODO: how else can we handle components?

    if (level > 0 || !ignoreRootElement) {
      // We are within preserved content or we output regular XForms content
      if (inXFormsOrExtension && (inPreserve || isXFormsOrExtension)) {
        super.endElement(uri, localname, qName);
      }

      if (inPreserve && level == preserveLevel) {
        // Leaving preserved content
        inPreserve = false;
      }

      if (inXFormsOrExtension && level == xformsLevel) {
        // Leaving model or controls
        inXFormsOrExtension = false;
        sendEndPrefixMappings();
      }
    } else {
      // Just close the root element
      super.endElement(uri, localname, qName);
      sendEndPrefixMappings();
    }

    if (!inXFormsOrExtension) {
      xmlBaseStack.pop();
    }

    namespaceSupport.endElement();
  }