package com.supaham.commons.database; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.supaham.commons.utils.StringUtils; import java.util.AbstractMap.SimpleEntry; import java.util.AbstractMap.SimpleImmutableEntry; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Optional; import javax.annotation.Nonnull; import pluginbase.config.annotation.SerializableAs; @SerializableAs("DatabaseSettings") public class DatabaseSettings { public static final String MYSQL = "mysql"; public static final String REDIS = "redis"; public static final String DATABASE = "database"; public static final String ENABLED = "enabled"; public static final String IP = "ip"; public static final String MAX_REDIS_CONNECTIONS = "max-redis-connections"; public static final String PASSWORD = "password"; public static final String PORT = "port"; public static final String URL = "url"; public static final String USERNAME = "username"; /* ================================ * >> Config properties * ================================ */ private Map<String, Map<String, Object>> databases = new HashMap<>(); public static Entry<String, Map<String, Object>> getMysqlDefault() { return new SimpleEntry<>(MYSQL, ImmutableMap.<String, Object>builder() .put("enabled", false) .put("ip", "localhost") .put("port", 3306) .put("username", "user") .put("password", "password") .put("database", "test") .build()); } public static Entry<String, Map<String, Object>> getRedisDefault() { return new SimpleImmutableEntry<>(REDIS, ImmutableMap.<String, Object>builder() .put("enabled", false) .put("ip", "localhost") .put("port", 6379) .put("password", "password") .put("max-redis-connections", "test") .build()); } protected DatabaseSettings() {} public DatabaseSettings(@Nonnull Map<String, Map<String, Object>> databases) { checkNotNull(databases, "databases cannot be null."); checkArgument(!databases.isEmpty(), "databases cannot be empty."); this.databases = databases; } public Map<String, Map<String, Object>> getDatabases() { return Collections.unmodifiableMap(databases); } public void setDatabases(Map<String, Map<String, Object>> databases) { this.databases = databases; } protected Map<String, Object> getDatabaseMap(@Nonnull String database) { Preconditions.checkNotNull(database, "database cannot be null."); Map<String, Object> dbMap = this.databases.get(database); Preconditions.checkArgument(dbMap != null, database + " not defined."); return dbMap; } public Optional<Boolean> isEnabled(@Nonnull String database) throws IllegalArgumentException { return getString(database, ENABLED).flatMap(StringUtils::parseBoolean); } @Nonnull public Optional<String> getString(@Nonnull String database, @Nonnull String key) { Map<String, Object> dbMap = getDatabaseMap(database); Preconditions.checkNotNull(key, "key cannot be null."); Object foundKey = dbMap.get(key); return Optional.ofNullable(foundKey).map(Object::toString); } }