@NotNull
  private static XmlFileHeader calcXmlFileHeader(final XmlFile file) {

    if (file instanceof PsiFileEx
        && ((PsiFileEx) file).isContentsLoaded()
        && file.getNode().isParsed()) {
      return computeHeaderByPsi(file);
    }

    if (!XmlUtil.isStubBuilding() && file.getFileType() == XmlFileType.INSTANCE) {
      VirtualFile virtualFile = file.getVirtualFile();
      if (virtualFile instanceof VirtualFileWithId) {
        ObjectStubTree tree =
            StubTreeLoader.getInstance().readFromVFile(file.getProject(), virtualFile);
        if (tree != null) {
          Stub root = tree.getRoot();
          if (root instanceof FileStub) {
            return ((FileStub) root).getHeader();
          }
        }
      }
    }

    if (!file.isValid()) return XmlFileHeader.EMPTY;

    return NanoXmlUtil.parseHeader(file);
  }
        @NotNull
        public Map<Integer, Void> map(final FileContent inputData) {
          final Map<Integer, Void> map = new HashMap<Integer, Void>();

          NanoXmlUtil.parse(
              new StringReader(inputData.getContentAsText().toString()),
              new NanoXmlUtil.IXMLBuilderAdapter() {
                private boolean isFirstElement = true;

                public void startElement(
                    final String elemName,
                    final String nsPrefix,
                    final String nsURI,
                    final String systemID,
                    final int lineNr)
                    throws Exception {
                  if (isFirstElement) {
                    if (!"project".equalsIgnoreCase(elemName)) {
                      stop();
                    }
                    isFirstElement = false;
                  } else {
                    if ("import".equalsIgnoreCase(elemName)
                        || "include".equalsIgnoreCase(elemName)) {
                      map.put(ANT_FILES_WITH_IMPORTS_KEY, null);
                      stop();
                    }
                  }
                }

                public void addAttribute(
                    final String key,
                    final String nsPrefix,
                    final String nsURI,
                    final String value,
                    final String type)
                    throws Exception {
                  // if (myAttributes != null) {
                  //  myAttributes.add(key);
                  // }
                }

                public void elementAttributesProcessed(
                    final String name, final String nsPrefix, final String nsURI) throws Exception {
                  // if (myAttributes != null) {
                  //  if (!(myAttributes.contains("name") && myAttributes.contains("default"))) {
                  //    stop();
                  //  }
                  //  myAttributes = null;
                  // }
                }
              });
          return map;
        }
 public static boolean isTestngXML(final VirtualFile virtualFile) {
   if ("xml".equalsIgnoreCase(virtualFile.getExtension())
       && virtualFile.isInLocalFileSystem()
       && virtualFile.isValid()) {
     final String result = NanoXmlUtil.parseHeader(virtualFile).getRootTagLocalName();
     if (result != null && result.equals(SUITE_TAG_NAME)) {
       return true;
     }
   }
   return false;
 }
  @NotNull
  private static XmlFileHeader calcXmlFileHeader(final PsiFile file) {

    // if (file.getFileType() == XmlFileType.INSTANCE) {
    //  VirtualFile virtualFile = file.getVirtualFile();
    //  if (virtualFile instanceof VirtualFileWithId) {
    //    ObjectStubTree tree = StubTreeLoader.getInstance().readFromVFile(file.getProject(),
    // virtualFile);
    //    if (tree != null) {
    //      return ((FileStub)tree.getRoot()).getHeader();
    //    }
    //  }
    // }
    if (file instanceof XmlFile && file.getNode().isParsed()) {
      final XmlDocument document = ((XmlFile) file).getDocument();
      if (document != null) {
        String publicId = null;
        String systemId = null;
        final XmlProlog prolog = document.getProlog();
        if (prolog != null) {
          final XmlDoctype doctype = prolog.getDoctype();
          if (doctype != null) {
            publicId = doctype.getPublicId();
            systemId = doctype.getSystemId();
            if (systemId == null) {
              systemId = doctype.getDtdUri();
            }
          }
        }

        final XmlTag tag = document.getRootTag();
        if (tag != null) {
          String localName = tag.getLocalName();
          if (StringUtil.isNotEmpty(localName)) {
            if (tag.getPrevSibling() instanceof PsiErrorElement) {
              return XmlFileHeader.EMPTY;
            }

            String psiNs = tag.getNamespace();
            return new XmlFileHeader(
                localName,
                psiNs == XmlUtil.EMPTY_URI || Comparing.equal(psiNs, systemId) ? null : psiNs,
                publicId,
                systemId);
          }
        }
      }
      return XmlFileHeader.EMPTY;
    }

    if (!file.isValid()) return XmlFileHeader.EMPTY;
    return NanoXmlUtil.parseHeader(file);
  }
    @Nullable
    private static String getControllerClassName(String content) {
      if (!content.contains(JavaFxNamespaceDataProvider.JAVAFX_NAMESPACE)) {
        return null;
      }

      final String[] className = new String[] {null};

      class StopException extends RuntimeException {}

      try {
        NanoXmlUtil.parse(
            new StringReader(content),
            new NanoXmlUtil.IXMLBuilderAdapter() {
              private boolean myFxRootUsed = false;

              @Override
              public void addAttribute(
                  String key, String nsPrefix, String nsURI, String value, String type)
                  throws Exception {
                if (value != null
                    && (FxmlConstants.FX_CONTROLLER.equals(nsPrefix + ":" + key)
                        || FxmlConstants.TYPE.equals(key) && myFxRootUsed)) {
                  className[0] = value;
                }
              }

              @Override
              public void elementAttributesProcessed(String name, String nsPrefix, String nsURI)
                  throws Exception {
                throw new StopException();
              }

              @Override
              public void startElement(
                  String name, String nsPrefix, String nsURI, String systemID, int lineNr)
                  throws Exception {
                myFxRootUsed = FxmlConstants.FX_ROOT.equals(nsPrefix + ":" + name);
              }
            });
      } catch (StopException ignore) {
      }
      return className[0];
    }