private void readDataBase() {
   try {
     logger.traceINFO("Initializing database...");
     Class.forName("com.mysql.jdbc.Driver");
     connect =
         DriverManager.getConnection("jdbc:mysql://localhost/marketdata?" + "user=root&password=");
   } catch (Exception e) {
     logger.traceERROR(e);
     System.exit(0);
   }
 }
  public RealtimeTimer(int timerInterval, int hourStart, int minStart, int hourStop, int minStop) {
    this.timerInterval = timerInterval;
    Calendar startDateCal = Calendar.getInstance();
    startDateCal.set(Calendar.HOUR_OF_DAY, hourStart);
    startDateCal.set(Calendar.MINUTE, minStart);
    startDateCal.set(Calendar.SECOND, 0);

    Calendar endDateCal = Calendar.getInstance();
    endDateCal.set(Calendar.HOUR_OF_DAY, hourStop);
    endDateCal.set(Calendar.MINUTE, minStop);
    endDateCal.set(Calendar.SECOND, 0);

    this.startDate = startDateCal;
    this.endDate = endDateCal;
    logger.traceINFO("start time = " + startDate.getTime().toString());
    logger.traceINFO("end time = " + endDate.getTime().toString());
  }
 public void insertMarketData(String symbol, String price) {
   String query =
       "INSERT INTO `marketdata`.`market_data` (`ID`, `SYMBOL`, `PRICE`, `TIMESTAMP`) VALUES (NULL, '"
           + symbol
           + "', '"
           + price
           + "', CURRENT_TIMESTAMP);";
   logger.traceINFO("Inserting ( " + symbol + ", " + price + " )");
   try {
     connect.createStatement().execute(query);
   } catch (CommunicationsException e) {
     readDataBase();
     insertMarketData(symbol, price);
   } catch (Exception e) {
     logger.traceERROR(e);
   }
 }
public class DatabaseAccess {
  private Logger logger = Logger.getInstance();
  private Connection connect = null;
  private Statement statement = null;
  private ResultSet resultSet = null;

  public DatabaseAccess() {
    readDataBase();
  }

  public void insertMarketData(String symbol, String price) {
    String query =
        "INSERT INTO `marketdata`.`market_data` (`ID`, `SYMBOL`, `PRICE`, `TIMESTAMP`) VALUES (NULL, '"
            + symbol
            + "', '"
            + price
            + "', CURRENT_TIMESTAMP);";
    logger.traceINFO("Inserting ( " + symbol + ", " + price + " )");
    try {
      connect.createStatement().execute(query);
    } catch (CommunicationsException e) {
      readDataBase();
      insertMarketData(symbol, price);
    } catch (Exception e) {
      logger.traceERROR(e);
    }
  }

  private void readDataBase() {
    try {
      logger.traceINFO("Initializing database...");
      Class.forName("com.mysql.jdbc.Driver");
      connect =
          DriverManager.getConnection("jdbc:mysql://localhost/marketdata?" + "user=root&password=");
    } catch (Exception e) {
      logger.traceERROR(e);
      System.exit(0);
    }
  }

  public void close() {
    try {
      if (resultSet != null) {
        resultSet.close();
      }

      if (statement != null) {
        statement.close();
      }

      if (connect != null) {
        connect.close();
      }
    } catch (Exception e) {
      logger.traceERROR(e);
    }
  }
}
  public void flush() {
    String formatString = "| %55s | %9s | %18s |";
    // Mind that all rows have the same sizes.
    for (int i = 0; i < rows.size(); i++) {
      Row row = rows.get(i);
      String strOut = String.format(formatString, row.adTitle, row.adPrice, row.status);

      // First or last row
      if (i == 0) {
        Logger.traceINFO(org.apache.commons.lang3.StringUtils.repeat("_", strOut.length()));
      }

      Logger.traceINFO(strOut);

      if (i == rows.size() - 1) {
        Logger.traceINFO(org.apache.commons.lang3.StringUtils.repeat("_", strOut.length()));
      }
    }
  }
  private boolean checkBounds() {
    Calendar nowDate = Calendar.getInstance();

    if (startDate.get(Calendar.DATE) < nowDate.get(Calendar.DATE)) {
      // Increment day by one.
      startDate.add(Calendar.DATE, 1);
      endDate.add(Calendar.DATE, 1);
      logger.traceINFO("start time = " + startDate.getTime().toString());
      logger.traceINFO("end time = " + endDate.getTime().toString());
    }

    if (nowDate.getTime().after(startDate.getTime())
        && nowDate.getTime().before(endDate.getTime())) {
      return true;
    } else {
      long currentMs = nowDate.getTime().getTime();
      if (currentMs - lastCheckBoundsMessageMs > 5000) {
        lastCheckBoundsMessageMs = currentMs;
        logger.traceINFO("Out of dates bounds");
      }
      return false;
    }
  }
  public void close() {
    try {
      if (resultSet != null) {
        resultSet.close();
      }

      if (statement != null) {
        statement.close();
      }

      if (connect != null) {
        connect.close();
      }
    } catch (Exception e) {
      logger.traceERROR(e);
    }
  }
public class RealtimeTimer {
  private Logger logger = Logger.getInstance();
  private int timerInterval = 1000;
  private TimerListener listener = null;
  private boolean condition = true;
  private Thread timerThread = new Thread(new TimerTask(this));
  private Calendar startDate;
  private Calendar endDate;

  private class TimerTask implements Runnable {
    private RealtimeTimer timer;

    public TimerTask(RealtimeTimer timer) {
      this.timer = timer;
    }

    @Override
    public void run() {
      while (condition) {
        if (checkBounds() && listener != null) {
          listener.onTimerTick(timer);
        }

        if (timerInterval > 0) {
          try {
            Thread.sleep(timerInterval);
          } catch (InterruptedException e) {
            logger.traceERROR(e);
            condition = false;
          }
        }
      }
    }
  }

  public void start() {
    timerThread.start();
  }

  public void stop() {
    condition = false;
  }

  public RealtimeTimer(int timerInterval, int hourStart, int minStart, int hourStop, int minStop) {
    this.timerInterval = timerInterval;
    Calendar startDateCal = Calendar.getInstance();
    startDateCal.set(Calendar.HOUR_OF_DAY, hourStart);
    startDateCal.set(Calendar.MINUTE, minStart);
    startDateCal.set(Calendar.SECOND, 0);

    Calendar endDateCal = Calendar.getInstance();
    endDateCal.set(Calendar.HOUR_OF_DAY, hourStop);
    endDateCal.set(Calendar.MINUTE, minStop);
    endDateCal.set(Calendar.SECOND, 0);

    this.startDate = startDateCal;
    this.endDate = endDateCal;
    logger.traceINFO("start time = " + startDate.getTime().toString());
    logger.traceINFO("end time = " + endDate.getTime().toString());
  }

  public void setListener(TimerListener listener) {
    this.listener = listener;
  }

  long lastCheckBoundsMessageMs = System.currentTimeMillis();

  private boolean checkBounds() {
    Calendar nowDate = Calendar.getInstance();

    if (startDate.get(Calendar.DATE) < nowDate.get(Calendar.DATE)) {
      // Increment day by one.
      startDate.add(Calendar.DATE, 1);
      endDate.add(Calendar.DATE, 1);
      logger.traceINFO("start time = " + startDate.getTime().toString());
      logger.traceINFO("end time = " + endDate.getTime().toString());
    }

    if (nowDate.getTime().after(startDate.getTime())
        && nowDate.getTime().before(endDate.getTime())) {
      return true;
    } else {
      long currentMs = nowDate.getTime().getTime();
      if (currentMs - lastCheckBoundsMessageMs > 5000) {
        lastCheckBoundsMessageMs = currentMs;
        logger.traceINFO("Out of dates bounds");
      }
      return false;
    }
  }
}