docs: private synchronized void refreshTree() {
  
          if (!isTreeRefreshRequired()) {
              // The groupsTree was already re-built while
              // we were waiting to enter this method.
              return;
          }
  
          log.info("Refreshing groups tree for SmartLdap");
  
          // We must join the builder thread if
          // we don't have an existing groupsTree.
          final boolean doJoin = groupsTree == null;
  
          // In most cases, re-build the tree in a separate thread;  the current
          // request can proceed with the newly-expired groupsTree.
          Thread refresh =
                  new Thread("SmartLdap Refresh Worker") {
                      @Override
                      public void run() {
                          // Replace the old with the new...
                          try {
                              groupsTree = buildGroupsTree();
                          } catch (Throwable t) {
                              log.error("SmartLdapGroupStore failed to build the groups tree", t);
                          }
                      }
                  };
          refresh.setDaemon(true);
          refresh.start();
          if (doJoin) {
              try {
                  log.info("Joining the SmartLdap Refresh Worker Thread");
                  refresh.join();
              } catch (InterruptedException ie) {
                  throw new RuntimeException(ie);
              }
          }
  
          // Even if the refresh thread failed, don't try
          // again for another groupsTreeRefreshIntervalSeconds.
          lastTreeRefreshTime = System.currentTimeMillis();
      }