package com.ctrip.platform.dal.daogen.utils;
import com.ctrip.platform.dal.daogen.entity.DalGroupDB;
import com.ctrip.platform.dal.daogen.enums.DatabaseType;
import org.apache.log4j.Logger;
import java.io.*;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class AllInOneConfigParser {
private static final Logger log = Logger.getLogger(AllInOneConfigParser.class);
private static final Pattern dbLinePattern = Pattern.compile(" name=\"([^\"]+)\" connectionString=\"([^\"]+)\"");
private static final Pattern dburlPattern = Pattern.compile("(data\\ssource|server|address|addr|network)=([^;]+)", 2);
private static final Pattern dbuserPattern = Pattern.compile("(uid|user\\sid)=([^;]+)", 2);
private static final Pattern dbpasswdPattern = Pattern.compile("(password|pwd)=([^;]+)", 2);
private static final Pattern dbnamePattern = Pattern.compile("(database|initial\\scatalog)=([^;]+)", 2);
@SuppressWarnings("unused")
private static final Pattern dbcharsetPattern = Pattern.compile("(charset)=([^;]+)", 2);
private static final Pattern dbportPattern = Pattern.compile("(port)=([^;]+)", 2);
private ConcurrentHashMap<String, DalGroupDB> allDbs = new ConcurrentHashMap<>();
public AllInOneConfigParser(String configFilePath) {
BufferedReader br = null;
try {
if (null != configFilePath && new File(configFilePath).exists()) {
br = new BufferedReader(new InputStreamReader(new FileInputStream(configFilePath)));
} else {
br = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/Database.config")));
}
String line = br.readLine();
while (line != null) {
try {
Matcher matcher = dbLinePattern.matcher(line);
if (matcher.find()) {
String dbLogicName = matcher.group(1);
DalGroupDB db = parseDotNetDBConnString(matcher.group(2));
db.setDbname(dbLogicName);
db.setDal_group_id(-1);
this.allDbs.put(dbLogicName, db);
}
line = br.readLine();
} catch (Exception ex) {
log.error("parse all in one error: " + line, ex);
}
}
return;
} catch (IOException e) {
log.error("Read db config file error, msg:" + e.getMessage(), e);
} catch (Exception e) {
log.error("Init db config props error, msg:" + e.getMessage(), e);
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
log.error("close DB config file IO error", e);
}
}
}
}
public Map<String, DalGroupDB> getDBAllInOneConfig() {
return this.allDbs;
}
private DalGroupDB parseDotNetDBConnString(String connStr) {
DalGroupDB db = new DalGroupDB();
try {
String dbhost = null;
Matcher matcher = dbnamePattern.matcher(connStr);
if (matcher.find()) {
db.setDb_catalog(matcher.group(2));
}
matcher = dburlPattern.matcher(connStr);
if (matcher.find()) {
String[] dburls = matcher.group(2).split(",");
dbhost = dburls[0];
if (dburls.length == 2) {
db.setDb_address(dbhost);
db.setDb_port(dburls[1]);
db.setDb_providerName(DatabaseType.SQLServer.getValue());
} else {
matcher = dbportPattern.matcher(connStr);
if (matcher.find()) {
db.setDb_address(dbhost);
db.setDb_port(matcher.group(2));
} else {
db.setDb_address(dbhost);
db.setDb_port("3306");
}
db.setDb_providerName(DatabaseType.MySQL.getValue());
}
}
matcher = dbuserPattern.matcher(connStr);
if (matcher.find()) {
db.setDb_user(matcher.group(2));
}
matcher = dbpasswdPattern.matcher(connStr);
if (matcher.find()) {
db.setDb_password(matcher.group(2));
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return db;
}
public static void main(String[] args) {
Configuration.addResource("conf.properties");
Map<String, DalGroupDB> allDbs = new AllInOneConfigParser(Configuration.get("all_in_one")).getDBAllInOneConfig();
Set<String> keys = allDbs.keySet();
for (String key : keys) {
System.out.println(allDbs.get(key));
}
}
}