package codeine.db.mysql;
import codeine.executer.Task;
import codeine.jsons.global.GlobalConfigurationJsonStore;
import codeine.jsons.global.MysqlConfigurationJson;
import codeine.utils.network.InetUtils;
import org.apache.log4j.Logger;
import javax.inject.Inject;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class NearestMysqlHostSelectorPreferLocalhost implements Task, MysqlHostSelector{
private static final Logger log = Logger.getLogger(NearestMysqlHostSelectorPreferLocalhost.class);
@Inject private IDBConnection dbConnection;
@Inject
private GlobalConfigurationJsonStore conf;
private MysqlConfigurationJson mysqlConf;
@Override
public MysqlConfigurationJson mysql() {
return mysql(false);
}
private MysqlConfigurationJson mysql(boolean forceNew) {
if (null != mysqlConf && !forceNew){
return mysqlConf;
}
mysqlConf = getLocalConfOrNull();
if (null != mysqlConf) {
return mysqlConf;
}
mysqlConf = selectNearestConf();
return mysqlConf;
}
private MysqlConfigurationJson selectNearestConf() {
log.info("selectNearestConf - starting");
MysqlConfigurationJson selectedMysql = new NearestHostSelector(new MysqlConnectionsProvider(conf.get().mysql(), dbConnection)).select();
log.info("selectNearestConf - selected mysql " + selectedMysql);
return selectedMysql;
}
public MysqlConfigurationJson getLocalConfOrNull() {
return getLocalConfOrNull(conf);
}
public static MysqlConfigurationJson getLocalConfOrNull(GlobalConfigurationJsonStore conf2) {
log.info("getLocalConfOrNull - checking host");
InetAddress localHost = InetUtils.getLocalHost();
for (MysqlConfigurationJson mysqlConfigurationJson : conf2.get().mysql()) {
try {
InetAddress mysqlAddress = InetAddress.getByName(mysqlConfigurationJson.host());
log.info("Checking " + mysqlAddress.getHostAddress() + " against " + localHost.getHostAddress());
if (mysqlAddress.getHostAddress().equals(localHost.getHostAddress())){
log.info("returning localhost " + mysqlConfigurationJson.host());
return mysqlConfigurationJson;
}
} catch (UnknownHostException e) {
log.warn("host unknown " + e.getMessage());
}
}
return null;
}
@Override
public String toString() {
return "NearestMysqlHostSelector [mysqlConf=" + mysqlConf + "]";
}
@Override
public void run() {
log.info("Checking for nearest mysql db");
mysql(true);
}
}