/**
  * launch the scheduler loop every 250 milliseconds, to reconnect a failed connection. Will verify
  * if there is an existing scheduler
  *
  * @param now now will launch the loop immediatly, 250ms after if false
  */
 protected void launchFailLoopIfNotlaunched(boolean now) {
   if (isLooping.compareAndSet(false, true) && urlParser.getOptions().failoverLoopRetries != 0) {
     scheduledFailover =
         Executors.newSingleThreadScheduledExecutor()
             .scheduleWithFixedDelay(
                 new FailLoop(this), now ? 0 : 250, 250, TimeUnit.MILLISECONDS);
   }
 }
 /** Permit to remove Host to blacklist after loadBalanceBlacklistTimeout seconds. */
 public void resetOldsBlackListHosts() {
   long currentTime = System.currentTimeMillis();
   Set<HostAddress> currentBlackListkeys = new HashSet<HostAddress>(blacklist.keySet());
   for (HostAddress blackListHost : currentBlackListkeys) {
     if (blacklist.get(blackListHost)
         < currentTime - urlParser.getOptions().loadBalanceBlacklistTimeout * 1000) {
       //                if (log.isTraceEnabled()) log.trace("host " + blackListHost+" remove of
       // blacklist");
       blacklist.remove(blackListHost);
     }
   }
 }
 public boolean isAutoReconnect() {
   return urlParser.getOptions().autoReconnect;
 }
 public int getRetriesAllDown() {
   return urlParser.getOptions().retriesAllDown;
 }
 /**
  * Initialisation.
  *
  * @param urlParser url options.
  */
 public MastersFailoverListener(final UrlParser urlParser) {
   super(urlParser);
   this.mode = urlParser.getHaMode();
   setMasterHostFail();
 }
  /*
  Parse ConnectorJ compatible urls
  jdbc:mysql://host:port/database
  Example: jdbc:mysql://localhost:3306/test?user=root&password=passwd
   */
  private static void parseInternal(UrlParser urlParser, String url, Properties properties)
      throws SQLException {
    try {
      int separator = url.indexOf("//");
      if (separator == -1) {
        throw new IllegalArgumentException(
            "url parsing error : '//' is not present in the url " + url);
      }
      String[] baseTokens = url.substring(0, separator).split(":");

      // parse HA mode
      urlParser.haMode = HaMode.NONE;
      if (baseTokens.length > 2) {
        try {
          urlParser.haMode = HaMode.valueOf(baseTokens[2].toUpperCase());
        } catch (IllegalArgumentException i) {
          throw new IllegalArgumentException(
              "url parameter error '"
                  + baseTokens[2]
                  + "' is a unknown parameter in the url "
                  + url);
        }
      }

      url = url.substring(separator + 2);
      String[] tokens = url.split("/");
      String hostAddressesString = tokens[0];
      String additionalParameters =
          (tokens.length > 1) ? url.substring(tokens[0].length() + 1) : null;

      urlParser.addresses = HostAddress.parse(hostAddressesString, urlParser.haMode);

      if (additionalParameters == null) {
        urlParser.database = null;
        urlParser.options = DefaultOptions.parse(urlParser.haMode, "", properties);
      } else {
        int ind = additionalParameters.indexOf('?');
        if (ind > -1) {
          urlParser.database = additionalParameters.substring(0, ind);
          urlParser.options =
              DefaultOptions.parse(
                  urlParser.haMode, additionalParameters.substring(ind + 1), properties);
        } else {
          urlParser.database = additionalParameters;
          urlParser.options = DefaultOptions.parse(urlParser.haMode, "", properties);
        }
      }

      if (urlParser.haMode == HaMode.AURORA) {
        for (HostAddress hostAddress : urlParser.addresses) {
          hostAddress.type = null;
        }
      } else {
        for (HostAddress hostAddress : urlParser.addresses) {
          if (hostAddress.type == null) {
            hostAddress.type = ParameterConstant.TYPE_MASTER;
          }
        }
      }
    } catch (IllegalArgumentException i) {
      throw new SQLException(i.getMessage());
    }
  }