/** @author Brian Wing Shun Chan */
public class PropsValues {

  public static final String BROWSER_COMMANDS_DIR_NAME = PropsUtil.get("browser.commands.dir.name");

  public static final String BROWSER_TYPE = PropsUtil.get("browser.type");

  public static final String CLUSTER_NODE_1 = PropsUtil.get("cluster.node1");

  public static final String CLUSTER_NODE_2 = PropsUtil.get("cluster.node2");

  public static final String COMPONENT_NAMES = PropsUtil.get("component.names");

  public static final String EMAIL_ADDRESS_1 = PropsUtil.get("email.address.1");

  public static final String EMAIL_ADDRESS_2 = PropsUtil.get("email.address.2");

  public static final String EMAIL_ADDRESS_3 = PropsUtil.get("email.address.3");

  public static final String EMAIL_ADDRESS_4 = PropsUtil.get("email.address.4");

  public static final String EMAIL_ADDRESS_5 = PropsUtil.get("email.address.5");

  public static final String EMAIL_PASSWORD_1 = PropsUtil.get("email.password.1");

  public static final String EMAIL_PASSWORD_2 = PropsUtil.get("email.password.2");

  public static final String EMAIL_PASSWORD_3 = PropsUtil.get("email.password.3");

  public static final String EMAIL_PASSWORD_4 = PropsUtil.get("email.password.4");

  public static final String EMAIL_PASSWORD_5 = PropsUtil.get("email.password.5");

  public static final String[] FIXED_ISSUES = StringUtil.split(PropsUtil.get("fixed.issues"));

  public static final String IGNORE_ERRORS = PropsUtil.get("ignore.errors");

  public static final String IGNORE_ERRORS_DELIMITER = PropsUtil.get("ignore.errors.delimiter");

  public static final String IGNORE_ERRORS_FILE_NAME = PropsUtil.get("ignore.errors.file.name");

  public static final String LIFERAY_HOME = PropsUtil.get("liferay.home");

  public static final String LIFERAY_PORTAL_BRANCH = PropsUtil.get("liferay.portal.branch");

  public static final String LIFERAY_PORTAL_BUNDLE = PropsUtil.get("liferay.portal.bundle");

  public static final String LOGGER_RESOURCES_URL = PropsUtil.get("logger.resources.url");

  public static final String MOBILE_ANDROID_HOME = PropsUtil.get("mobile.android.home");

  public static final String MOBILE_DEVICE_TYPE = PropsUtil.get("mobile.device.type");

  public static final String OUTPUT_DIR_NAME = PropsUtil.get("output.dir.name");

  public static final String PORTAL_URL = PropsUtil.get("portal.url");

  public static final String PRODUCT_NAMES = PropsUtil.get("product.names");

  public static final String PROJECT_DIR = PropsUtil.get("project.dir");

  public static final int TEST_BATCH_MAX_GROUP_SIZE =
      GetterUtil.getInteger(PropsUtil.get("test.batch.max.group.size"));

  public static final String TEST_BATCH_PROPERTY_NAME = PropsUtil.get("test.batch.property.name");

  public static final String TEST_BATCH_PROPERTY_VALUE = PropsUtil.get("test.batch.property.value");

  public static final boolean SAVE_SCREENSHOT =
      GetterUtil.getBoolean(PropsUtil.get("save.screenshot"));

  public static final boolean SAVE_SOURCE = GetterUtil.getBoolean(PropsUtil.get("save.source"));

  public static final String SELENIUM_CHROME_DRIVER_EXECUTABLE =
      PropsUtil.get("selenium.chrome.driver.executable");

  public static final String SELENIUM_DESIRED_CAPABILITIES_PLATFORM =
      PropsUtil.get("selenium.desired.capabilities.platform");

  public static final String SELENIUM_DESIRED_CAPABILITIES_VERSION =
      PropsUtil.get("selenium.desired.capabilities.version");

  public static final String SELENIUM_EXECUTABLE_DIR_NAME =
      PropsUtil.get("selenium.executable.dir.name");

  public static final String SELENIUM_HOST = PropsUtil.get("selenium.host");

  public static final String SELENIUM_IE_DRIVER_EXECUTABLE =
      PropsUtil.get("selenium.ie.driver.executable");

  public static final String SELENIUM_IMPLEMENTATION = PropsUtil.get("selenium.implementation");

  public static final boolean SELENIUM_LOGGER_ENABLED =
      GetterUtil.getBoolean(PropsUtil.get("selenium.logger.enabled"));

  public static final int SELENIUM_PORT = GetterUtil.getInteger(PropsUtil.get("selenium.port"));

  public static final boolean SELENIUM_REMOTE_DRIVER_ENABLED =
      GetterUtil.getBoolean(PropsUtil.get("selenium.remote.driver.enabled"));

  public static final String SELENIUM_REMOTE_DRIVER_HUB =
      PropsUtil.get("selenium.remote.driver.hub");

  public static final String TCAT_ADMIN_REPOSITORY = PropsUtil.get("tcat.admin.repository");

  public static final boolean TCAT_ENABLED = GetterUtil.getBoolean(PropsUtil.get("tcat.enabled"));

  public static final boolean TEAR_DOWN_BEFORE_TEST =
      GetterUtil.getBoolean(PropsUtil.get("tear.down.before.test"));

  public static final boolean TEST_ASSERT_WARNING_EXCEPTIONS =
      GetterUtil.getBoolean(PropsUtil.get("test.assert.warning.exceptions"));

  public static final String TEST_BASE_DIR_NAME = PropsUtil.get("test.base.dir.name");

  public static final String TEST_CASE_AVAILABLE_PROPERTY_NAMES =
      PropsUtil.get("test.case.available.property.names");

  public static final String TEST_CASE_REQUIRED_PROPERTY_NAMES =
      PropsUtil.get("test.case.required.property.names");

  public static final String TEST_CONSOLE_LOG_FILE_NAME =
      PropsUtil.get("test.console.log.file.name");

  public static final String TEST_CONSOLE_SHUT_DOWN_FILE_NAME =
      PropsUtil.get("test.console.shut.down.file.name");

  public static final boolean TEST_DATABASE_MINIMAL =
      GetterUtil.getBoolean(PropsUtil.get("test.database.minimal"));

  public static final String TEST_DEPENDENCIES_DIR_NAME =
      PropsUtil.get("test.dependencies.dir.name");

  public static final String TEST_POSHI_WARNINGS_FILE_NAME =
      PropsUtil.get("test.poshi.warnings.file.name");

  public static final boolean TEST_RUN_LOCALLY =
      GetterUtil.getBoolean(PropsUtil.get("test.run.locally"));

  public static final String TEST_NAME = PropsUtil.get("test.name");

  public static final boolean TEST_SKIP_TEAR_DOWN =
      GetterUtil.getBoolean(PropsUtil.get("test.skip.tear.down"));

  public static final boolean TESTING_CLASS_METHOD =
      GetterUtil.getBoolean(PropsUtil.get("testing.class.method"));

  public static final String[] THEME_IDS = StringUtil.split(PropsUtil.get("theme.ids"));

  public static final int TIMEOUT_EXPLICIT_WAIT =
      GetterUtil.getInteger(PropsUtil.get("timeout.explicit.wait"));

  public static final int TIMEOUT_IMPLICIT_WAIT =
      GetterUtil.getInteger(PropsUtil.get("timeout.implicit.wait"));

  public static final String VM_HOST = PropsUtil.get("vm.host");
}
  private SystemProperties() {
    Properties p = new Properties();

    ClassLoader classLoader = getClass().getClassLoader();

    // system.properties

    try {
      URL url = classLoader.getResource("system.properties");

      if (url != null) {
        InputStream is = url.openStream();

        p.load(is);

        is.close();

        logger.debug("Loading " + url);
      }
    } catch (Exception e) {
      logger.warn(e.getMessage(), e);
    }

    // system-ext.properties

    try {
      URL url = classLoader.getResource("system-ext.properties");

      if (url != null) {
        InputStream is = url.openStream();

        p.load(is);

        is.close();

        logger.debug("Loading " + url);
      }
    } catch (Exception e) {
      logger.warn(e.getMessage(), e);
    }

    // Set environment properties

    SystemEnv.setProperties(p);

    // Set system properties

    boolean systemPropertiesLoad =
        GetterUtil.getBoolean(System.getProperty(SYSTEM_PROPERTIES_LOAD), true);

    boolean systemPropertiesFinal =
        GetterUtil.getBoolean(System.getProperty(SYSTEM_PROPERTIES_FINAL), true);

    if (systemPropertiesLoad) {
      Enumeration<String> enu = (Enumeration<String>) p.propertyNames();

      while (enu.hasMoreElements()) {
        String key = enu.nextElement();

        if (systemPropertiesFinal || Validator.isNull(System.getProperty(key))) {

          System.setProperty(key, p.getProperty(key));
        }
      }
    }

    _props = new ConcurrentHashMap<String, String>();

    // Use a fast concurrent hash map implementation instead of the slower
    // java.util.Properties

    PropertiesUtil.fromProperties(p, _props);
  }