/**
   * Use this if there is more than one object type (eg Tables and Paragraphs) you are interested in
   * doing something with during the traversal.
   *
   * <p>This method is for traversing an arbitrary WML object (eg a table), as opposed to eg the
   * main document part, or a header.
   *
   * @param parent
   * @param visitorList
   */
  public static void visit(Object parent, List<TraversalUtilVisitor> visitorList) {

    CompoundTraversalUtilVisitorCallback callback = null;
    if ((visitorList != null) && (!visitorList.isEmpty())) {
      if (visitorList.size() > 1) {
        visit(parent, new CompoundTraversalUtilVisitorCallback(visitorList));
      } else {
        visit(parent, visitorList.get(0));
      }
    }
  }
  /**
   * Use this if there is more than one object type (eg Tables and Paragraphs) you are interested in
   * doing something with during the traversal.
   *
   * <p>This method allows you to traverse just the main document part, or also headers/footers,
   * footnotes/endnotes, and comments as well.
   *
   * @param wmlPackage
   * @param bodyOnly
   * @param visitorList
   */
  public static void visit(
      WordprocessingMLPackage wmlPackage,
      boolean bodyOnly,
      List<TraversalUtilVisitor> visitorList) {

    CompoundTraversalUtilVisitorCallback callback = null;
    if ((visitorList != null) && (!visitorList.isEmpty())) {
      if (visitorList.size() > 1) {
        visit(wmlPackage, bodyOnly, new CompoundTraversalUtilVisitorCallback(visitorList));
      } else {
        visit(wmlPackage, bodyOnly, visitorList.get(0));
      }
    }
  }
  /**
   * Use this if there is only a single object type (eg just P's) you are interested in doing
   * something with.
   *
   * <p>This method allows you to traverse just the main document part, or also headers/footers,
   * footnotes/endnotes, and comments as well.
   *
   * @param wmlPackage
   * @param bodyOnly
   * @param visitor
   */
  public static void visit(
      WordprocessingMLPackage wmlPackage, boolean bodyOnly, TraversalUtilVisitor visitor) {

    if (visitor != null) {
      visit(wmlPackage, bodyOnly, new SingleTraversalUtilVisitorCallback(visitor));
    }
  }
 protected static String findXPathStorageItemIdInContentControls(
     WordprocessingMLPackage wmlPackage) {
   FindContentControlsVisitor visitor = null;
   if ((wmlPackage.getCustomXmlDataStorageParts() != null)
       && (!wmlPackage.getCustomXmlDataStorageParts().isEmpty())) {
     try {
       visitor =
           new FindContentControlsVisitor(wmlPackage.getCustomXmlDataStorageParts().keySet());
       TraversalUtil.visit(wmlPackage, false, visitor);
     } catch (FindContentControlsVisitor.BreakException be) { // noop
     }
   }
   return (visitor != null ? visitor.getdefinedStoreItemId() : null);
 }
  /**
   * Use this if there is only a single object type (eg just P's) you are interested in doing
   * something with.
   *
   * <p>This method is for traversing an arbitrary WML object (eg a table), as opposed to eg the
   * main document part, or a header.
   *
   * @param parent
   * @param visitor
   */
  public static void visit(Object parent, TraversalUtilVisitor visitor) {

    if (visitor != null) {
      visit(parent, new SingleTraversalUtilVisitorCallback(visitor));
    }
  }