/**
   * This method returns the properties that are located within the given property file. If the
   * properties have been cached and the cache is still fresh, then it will return the values from
   * the cache. If the properties are cached, but the cache is not fresh, then the cache will be
   * updated with the current values in the properties file and then the property values will be
   * returned. If the properties for that file are not cached at all, the property will be retrieved
   * from the properties file and returned.
   *
   * <p>NOTE: THIS IS AN EXPENSIVE OPERATION. IT WILL CREATE A DEEP COPY OF THE PROPERTIES AND
   * RETURN IT. THAT MEANS IT WILL CREATE AN EXACT REPLICA WITH ALL DATA. THIS IS A PROTECTION TO
   * MAKE SURE THAT A PROPERTY IS NOT INADVERTANTLY CHANGED OUTSIDE OF THIS CLASS.
   *
   * @param propertyFile The name of the properties file without the path or extension.
   * @throws PropertyAccessException This is thrown if an error occurs accessing the property.
   */
  public final synchronized Properties getProperties(String propertyFile)
      throws PropertyAccessException {
    validateInput(propertyFile);
    checkForRefreshAndLoad(propertyFile);

    return propertyFileDAO.getProperties(propertyFile);
  }
  /**
   * This will return the duration in milliseconds before the next refresh of the properties file. A
   * value of -1 indicates that no refresh will occur.
   *
   * @param propertyFile The name of the property file.
   * @throws PropertyAccessException This is thrown if an error occurs accessing the property.
   */
  public synchronized int getDurationBeforeNextRefresh(String propertyFile)
      throws PropertyAccessException {
    validateInput(propertyFile);
    checkForRefreshAndLoad(propertyFile);

    return refreshHandler.getDurationBeforeNextRefresh(propertyFile);
  }
  /**
   * This will return the long value conversion of the property. If the property value cannot be
   * converted to a long, an exception will be thrown.
   *
   * @param propertyFile The name of the property file.
   * @param propertyName The name of the property that contains a boolean value.
   * @return This will return the long representation of the value.
   * @throws PropertyAccessException This is thrown if an error occurs accessing the property.
   */
  public synchronized long getPropertyLong(String propertyFile, String propertyName)
      throws PropertyAccessException {
    validateInput(propertyFile, propertyName);
    checkForRefreshAndLoad(propertyFile);

    return propertyFileDAO.getPropertyLong(propertyFile, propertyName);
  }
  /**
   * This method dumps the properties and associated values for a properties file to the log file.
   *
   * @param propertyFile The name of the property file.
   * @throws PropertyAccessException This is thrown if an error occurs accessing the property.
   */
  public void dumpPropsToLog(String propertyFile) throws PropertyAccessException {
    validateInput(propertyFile);

    refreshHandler.printToLog(propertyFile);
    propertyFileDAO.printToLog(propertyFile);
  }
  /**
   * If a property file has been cached, this will force a refresh of the property file. If a
   * property file is not cached, then this operation will do nothing.
   *
   * @param propertyFile The name of the property file.
   * @throws PropertyAccessException This is thrown if an error occurs accessing the property.
   */
  public synchronized void forceRefresh(String propertyFile) throws PropertyAccessException {
    validateInput(propertyFile);

    loadPropertyFile(propertyFile);
  }