/** Load the configuration. */
  @SuppressWarnings("unchecked")
  public void load() {
    // Create the default configuration file
    plugin.createDefaultConfiguration(new File(plugin.getDataFolder(), "config.yml"), "config.yml");

    config =
        new YAMLProcessor(
            new File(plugin.getDataFolder(), "config.yml"), true, YAMLFormat.EXTENDED);
    try {
      config.load();
    } catch (IOException e) {
      log.severe("Error reading configuration for global config: ");
      e.printStackTrace();
    }

    config.removeProperty("suppress-tick-sync-warnings");
    useRegionsScheduler = config.getBoolean("regions.use-scheduler", true);
    migrateRegionsToUuid = config.getBoolean("regions.uuid-migration.perform-on-next-start", true);
    keepUnresolvedNames =
        config.getBoolean("regions.uuid-migration.keep-names-that-lack-uuids", true);
    useRegionsCreatureSpawnEvent = config.getBoolean("regions.use-creature-spawn-event", true);
    useGodPermission =
        config.getBoolean(
            "auto-invincible", config.getBoolean("auto-invincible-permission", false));
    useGodGroup = config.getBoolean("auto-invincible-group", false);
    useAmphibiousGroup = config.getBoolean("auto-no-drowning-group", false);
    config.removeProperty("auto-invincible-permission");
    usePlayerMove = config.getBoolean("use-player-move-event", true);
    usePlayerTeleports = config.getBoolean("use-player-teleports", true);

    deopOnJoin = config.getBoolean("security.deop-everyone-on-join", false);
    blockInGameOp = config.getBoolean("security.block-in-game-op-command", false);

    hostKeys = new HashMap<String, String>();
    Object hostKeysRaw = config.getProperty("host-keys");
    if (hostKeysRaw == null || !(hostKeysRaw instanceof Map)) {
      config.setProperty("host-keys", new HashMap<String, String>());
    } else {
      for (Map.Entry<Object, Object> entry : ((Map<Object, Object>) hostKeysRaw).entrySet()) {
        String key = String.valueOf(entry.getKey());
        String value = String.valueOf(entry.getValue());
        hostKeys.put(key.toLowerCase(), value);
      }
    }

    // ====================================================================
    // Region store drivers
    // ====================================================================

    boolean useSqlDatabase = config.getBoolean("regions.sql.use", false);
    String sqlDsn = config.getString("regions.sql.dsn", "jdbc:mysql://localhost/worldguard");
    String sqlUsername = config.getString("regions.sql.username", "worldguard");
    String sqlPassword = config.getString("regions.sql.password", "worldguard");
    String sqlTablePrefix = config.getString("regions.sql.table-prefix", "");

    DataSourceConfig dataSourceConfig =
        new DataSourceConfig(sqlDsn, sqlUsername, sqlPassword, sqlTablePrefix);
    SQLDriver sqlDriver = new SQLDriver(dataSourceConfig);
    DirectoryYamlDriver yamlDriver = new DirectoryYamlDriver(getWorldsDataFolder(), "regions.yml");

    this.regionStoreDriverMap =
        ImmutableMap.<DriverType, RegionDriver>builder()
            .put(DriverType.MYSQL, sqlDriver)
            .put(DriverType.YAML, yamlDriver)
            .build();
    this.selectedRegionStoreDriver = useSqlDatabase ? sqlDriver : yamlDriver;

    // Load configurations for each world
    for (World world : plugin.getServer().getWorlds()) {
      get(world);
    }

    config.setHeader(CONFIG_HEADER);
  }