@Autowired
  public UrlTokenMonitor(
      ZooKeeperConnection connection,
      ControllerPaths controllerPaths,
      ObjectSerializer objectSerializer,
      UrlTokenDictionary tokenDictionary,
      UrlTokenRepository tokenRepository) {
    ZooKeeperTreeConsistentCallback cb =
        new ZooKeeperTreeConsistentCallback() {
          @Override
          public void treeConsistent(ZooKeeperTreeNode oldRoot, ZooKeeperTreeNode newRoot) {
            onTokenTreeChanged(newRoot);
          }
        };
    this.objectSerializer = objectSerializer;
    this.tokenDictionary = tokenDictionary;
    this.tokenRepository = tokenRepository;

    String nodePath = controllerPaths.getUrlTokens();
    this.tokenNodeWatcher = new ZooKeeperTreeWatcher(connection, 0, nodePath, cb);

    this.tokenChangeListeners = Sets.newHashSet();
    this.previousTokenDtos = Sets.newHashSet();
    this.tokensInitialized = false;
  }
 /**
  * Constructs a new FailoverMonitor with injected dependencies.
  *
  * @param connection the ZooKeeper connection
  * @param controllerPaths controller paths
  */
 @Autowired
 public FailoverMonitor(ZooKeeperConnection connection, ControllerPaths controllerPaths) {
   this.connection = connection;
   this.masterElection = new ZooKeeperElection(connection, controllerPaths.getMaster());
   this.failoverListeners = Sets.newHashSet();
   this.failoverState = FailoverState.UNKNOWN;
 }