protected void includeHistory(Element root) {
   // add history to end of document
   if (InstanceManager.getDefault(FileHistory.class) != null) {
     root.addContent(
         jmri.jmrit.revhistory.configurexml.FileHistoryXml.storeDirectly(
             InstanceManager.getDefault(FileHistory.class)));
   }
 }
  /**
   * Load a file.
   *
   * <p>Handles problems locally to the extent that it can, by routing them to the
   * creationErrorEncountered method.
   *
   * @param url URL of file to load
   * @param registerDeferred true to register objects to defer
   * @return true if no problems during the load
   * @throws JmriConfigureXmlException
   * @see jmri.configurexml.XmlAdapter#loadDeferred()
   * @since 3.3.2
   */
  @Override
  public boolean load(URL url, boolean registerDeferred) throws JmriConfigureXmlException {
    boolean result = true;
    Element root = null;
    /* We will put all the elements into a load list, along with the load order
    As XML files prior to 2.13.1 had no order to the store, beans would be stored/loaded
    before beans that they were dependant upon had been stored/loaded
    */
    Map<Element, Integer> loadlist =
        Collections.synchronizedMap(new LinkedHashMap<Element, Integer>());

    try {
      root = super.rootFromURL(url);
      // get the objects to load
      List<Element> items = root.getChildren();
      for (int i = 0; i < items.size(); i++) {
        // Put things into an ordered list
        Element item = items.get(i);
        if (item.getAttribute("class") == null) {
          // this is an element that we're not meant to read
          if (log.isDebugEnabled()) {
            log.debug("skipping " + item);
          }
          continue;
        }
        String adapterName = item.getAttribute("class").getValue();
        if (log.isDebugEnabled()) {
          log.debug("attempt to get adapter " + adapterName + " for " + item);
        }
        XmlAdapter adapter = null;

        adapter = (XmlAdapter) Class.forName(adapterName).newInstance();
        int order = adapter.loadOrder();
        if (log.isDebugEnabled()) {
          log.debug("add " + item + " to load list with order id of " + order);
        }
        loadlist.put(item, order);
      }

      ArrayList<Map.Entry<Element, Integer>> l =
          new ArrayList<Map.Entry<Element, Integer>>(loadlist.entrySet());
      Collections.sort(
          l,
          new Comparator<Map.Entry<Element, Integer>>() {

            public int compare(Map.Entry<Element, Integer> o1, Map.Entry<Element, Integer> o2) {
              return o1.getValue().compareTo(o2.getValue());
            }
          });
      for (int i = 0; i < l.size(); i++) {
        Element item = l.get(i).getKey();
        String adapterName = item.getAttribute("class").getValue();
        if (log.isDebugEnabled()) {
          log.debug("load " + item + " via " + adapterName);
        }
        XmlAdapter adapter = null;
        try {
          adapter = (XmlAdapter) Class.forName(adapterName).newInstance();

          // get version info
          // loadVersion(root, adapter);
          // and do it
          if (adapter.loadDeferred() && registerDeferred) {
            // register in the list for deferred load
            loadDeferredList.add(item);
            if (log.isDebugEnabled()) {
              log.debug("deferred load registered for " + item + " " + adapterName);
            }
          } else {
            boolean loadStatus = adapter.load(item, null);
            if (log.isDebugEnabled()) {
              log.debug("load status for " + item + " " + adapterName + " is " + loadStatus);
            }

            // if any adaptor load fails, then the entire load has failed
            if (!loadStatus) {
              result = false;
            }
          }
        } catch (Exception e) {
          creationErrorEncountered(
              adapter,
              "load(" + url.getFile() + ")",
              "Unexpected error (Exception)",
              null,
              null,
              e);

          result = false; // keep going, but return false to signal problem
        } catch (Throwable et) {
          creationErrorEncountered(
              adapter,
              "in load(" + url.getFile() + ")",
              "Unexpected error (Throwable)",
              null,
              null,
              et);

          result = false; // keep going, but return false to signal problem
        }
      }

    } catch (java.io.FileNotFoundException e1) {
      // this returns false to indicate un-success, but not enough
      // of an error to require a message
      creationErrorEncountered(
          null, "opening file " + url.getFile(), "File not found", null, null, e1);
      result = false;
    } catch (org.jdom2.JDOMException e) {
      creationErrorEncountered(null, "parsing file " + url.getFile(), "Parse error", null, null, e);
      result = false;
    } catch (java.lang.Exception e) {
      creationErrorEncountered(
          null, "loading from file " + url.getFile(), "Unknown error (Exception)", null, null, e);
      result = false;
    } finally {
      // no matter what, close error reporting
      handler.done();
    }

    /*try {
    root = super.rootFromFile(fi);
    // get the objects to load
    List<Element> items = root.getChildren();
    for (int i = 0; i<items.size(); i++) {
    // get the class, hence the adapter object to do loading
    Element item = items.get(i);
    if (item.getAttribute("class") == null) {
    // this is an element that we're not meant to read
    continue;
    }
    String adapterName = item.getAttribute("class").getValue();
    log.debug("load via "+adapterName);
    XmlAdapter adapter = null;

    try {
    adapter = (XmlAdapter)Class.forName(adapterName).newInstance();

    // get version info
    // loadVersion(root, adapter);

    // and do it
    if (adapter.loadDeferred() && registerDeferred) {
    // register in the list for deferred load
    loadDeferredList.add(item);
    log.debug("deferred load registered for " + adapterName);
    } else {
    boolean loadStatus = adapter.load(item);
    log.debug("load status for "+adapterName+" is "+loadStatus);

    // if any adaptor load fails, then the entire load has failed
    if (!loadStatus)
    result = false;
    }
    } catch (Exception e) {
    creationErrorEncountered (adapter, "load("+fi.getName()+")",Level.ERROR,
    "Unexpected error (Exception)",null,null,e);

    result = false;  // keep going, but return false to signal problem
    } catch (Throwable et) {
    creationErrorEncountered (adapter, "in load("+fi.getName()+")", Level.ERROR,
    "Unexpected error (Throwable)",null,null,et);

    result = false;  // keep going, but return false to signal problem
    }
    }


    } catch (java.io.FileNotFoundException e1) {
    // this returns false to indicate un-success, but not enough
    // of an error to require a message
    creationErrorEncountered (null, "opening file "+fi.getName(), Level.ERROR,
    "File not found", null,null,e1);
    result = false;
    } catch (org.jdom2.JDOMException e) {
    creationErrorEncountered (null, "parsing file "+fi.getName(), Level.ERROR,
    "Parse error", null,null,e);
    result = false;
    } catch (java.lang.Exception e) {
    creationErrorEncountered (null, "loading from file "+fi.getName(), Level.ERROR,
    "Unknown error (Exception)", null,null,e);
    result = false;
    } finally {
    // no matter what, close error reporting
    handler.done();
    }*/
    // loading complete, as far as it got, make history entry
    FileHistory r = InstanceManager.getDefault(FileHistory.class);
    if (r != null) {
      FileHistory included = null;
      if (root != null) {
        Element filehistory = root.getChild("filehistory");
        if (filehistory != null) {
          included = jmri.jmrit.revhistory.configurexml.FileHistoryXml.loadFileHistory(filehistory);
        }
      }
      r.addOperation((result ? "Load OK" : "Load with errors"), url.getFile(), included);
    } else {
      log.info("Not recording file history");
    }

    return result;
  }