private static void processElementDescriptors(XmlElementDescriptor descriptor, XmlTag tag, ElementNames names, Set<? super XmlElementDescriptor> history, int depth)
    throws StopProcessingException {
    if (!history.add(descriptor) || ++depth == 200) {
      if (depth == 200) {
        throw new StopProcessingException();
      }
      return;
    }
    final String namespace = descriptor instanceof XmlElementDescriptorImpl
            ? ((XmlElementDescriptorImpl)descriptor).getNamespace()
            : tag.getNamespace();
    names.elementNames.add(new QName(namespace, descriptor.getName()));

    final XmlAttributeDescriptor[] attributesDescriptors = descriptor.getAttributesDescriptors(null);
    for (XmlAttributeDescriptor attributesDescriptor : attributesDescriptors) {
      final String localPart = attributesDescriptor.getName();
      if (!"xmlns".equals(localPart)) names.attributeNames.add(new QName(localPart));
    }

    final XmlElementDescriptor[] descriptors = descriptor.getElementsDescriptors(tag);
    for (XmlElementDescriptor elem : descriptors) {
      processElementDescriptors(elem, tag, names, history, depth);
    }
  }
private static void processElementDescriptors(XmlElementDescriptor descriptor, XmlTag tag, ElementNames names, Set<? super XmlElementDescriptor> history, int depth)