[강운덕] [LUCYSUS-1744] rac의 url을 좀더 정교하게 파악할수 있는 regex 개발.

git-svn-id: http://svn.bds.nhncorp.com/pe/hippo-profiler-bootstrap/trunk@1688 84d0f5b1-2673-498c-a247-62c4ff18d310
This commit is contained in:
Woonduk Kang
2013-05-22 10:33:37 +00:00
parent 7ed910a79d
commit ab5b797676
2 changed files with 93 additions and 14 deletions
@@ -12,18 +12,19 @@ import java.util.regex.Pattern;
*/
public class JDBCUrlParser {
private static Pattern oracleRAC = Pattern.compile(".*HOST\\s*=\\s*([\\w\\.]*).*PORT\\s*=\\s*([\\d]*).*SERVICE_NAME\\s*=\\s*([\\w]*).*");
public DatabaseInfo parse(String url) {
// jdbc 체크
String lowCaseURL = url.toLowerCase().trim();
if (!lowCaseURL.startsWith("jdbc:")) {
return createUnknownDataBase(url);
}
if (jdbcTypeCheck(lowCaseURL, "mysql")) {
if (driverTypeCheck(lowCaseURL, "mysql")) {
return parseMysql(url);
}
if (jdbcTypeCheck(lowCaseURL, "oracle")) {
if (driverTypeCheck(lowCaseURL, "oracle")) {
return parseOracle(url);
}
return createUnknownDataBase(url);
@@ -74,7 +75,7 @@ public class JDBCUrlParser {
// return null;
}
private boolean jdbcTypeCheck(String lowCaseURL, String type) {
private boolean driverTypeCheck(String lowCaseURL, String type) {
final int jdbcNextIndex = 5;
return lowCaseURL.startsWith(type, jdbcNextIndex);
}
@@ -88,6 +89,29 @@ public class JDBCUrlParser {
// thin driver url
// jdbc:oracle:thin:@hostname:port:SID
// "jdbc:oracle:thin:MYWORKSPACE/qwerty@localhost:1521:XE";
// 들여 쓰기를 통해 token을 보기 좋게 나눈경우.
// jdbc:oracle:thin:
// @(
// DESCRIPTION=(LOAD_BALANCE=on)
// (
// ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.4) (PORT=1521)
// )
// (
// ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.5) (PORT=1521)
// )
// (
// CONNECT_DATA=(SERVICE_NAME=service)
// )
// )
static Pattern oracleRAC = Pattern.compile(
"(" +
".*[ADDRESS=].*\\(\\s*HOST\\s*=\\s*([\\w\\.]*\\s*\\)).*\\(\\s*PORT\\s*=\\s*([\\d]*\\s*\\))+" +
").*" +
"\\(\\s*SERVICE_NAME\\s*=\\s*([\\w]*)\\s*\\).*");
//
private DatabaseInfo parseOracle(String url) {
StringMaker maker = new StringMaker(url);
maker.after("jdbc:oracle:").after(":");
@@ -140,6 +164,7 @@ public class JDBCUrlParser {
StringMaker maker = new StringMaker(url);
maker.after("jdbc:mysql:");
// 10.98.133.22:3306 replacation driver같은 경우 n개가 가능할듯.
// mm db? 의 경우도 고려해야 될듯하다.
String host = maker.after("//").before('/').value();
List<String> hostList = new ArrayList<String>(1);
hostList.add(host);
@@ -1,7 +1,5 @@
package com.profiler.modifier.db.util;
package com.profiler.modifier.db;
import com.profiler.modifier.db.DatabaseInfo;
import com.profiler.modifier.db.JDBCUrlParser;
import junit.framework.Assert;
import org.junit.Test;
import org.slf4j.Logger;
@@ -10,6 +8,7 @@ import org.slf4j.LoggerFactory;
import com.profiler.common.ServiceType;
import java.net.URI;
import java.util.regex.Matcher;
/**
*
@@ -17,7 +16,7 @@ import java.net.URI;
public class JDBCUrlParserTest {
private Logger logger = LoggerFactory.getLogger(JDBCUrlParserTest.class);
private com.profiler.modifier.db.JDBCUrlParser JDBCUrlParser = new JDBCUrlParser();
private com.profiler.modifier.db.JDBCUrlParser jdbcUrlParser = new JDBCUrlParser();
@Test
public void testURIParse() throws Exception {
@@ -43,7 +42,7 @@ public class JDBCUrlParserTest {
@Test
public void mysqlParse1() {
DatabaseInfo dbInfo = JDBCUrlParser.parse("jdbc:mysql://ip_address:3306/database_name?useUnicode=yes&amp;characterEncoding=UTF-8");
DatabaseInfo dbInfo = jdbcUrlParser.parse("jdbc:mysql://ip_address:3306/database_name?useUnicode=yes&amp;characterEncoding=UTF-8");
Assert.assertEquals(dbInfo.getType(), ServiceType.MYSQL);
Assert.assertEquals(dbInfo.getHost().get(0), ("ip_address:3306"));
Assert.assertEquals(dbInfo.getDatabaseId(), "database_name");
@@ -53,7 +52,7 @@ public class JDBCUrlParserTest {
@Test
public void mysqlParse2() {
DatabaseInfo dbInfo = JDBCUrlParser.parse("jdbc:mysql://10.98.133.22:3306/test_lucy_db");
DatabaseInfo dbInfo = jdbcUrlParser.parse("jdbc:mysql://10.98.133.22:3306/test_lucy_db");
Assert.assertEquals(dbInfo.getType(), ServiceType.MYSQL);
Assert.assertEquals(dbInfo.getHost().get(0), "10.98.133.22:3306");
@@ -65,7 +64,7 @@ public class JDBCUrlParserTest {
@Test
public void mysqlParse3() {
DatabaseInfo dbInfo = JDBCUrlParser.parse("jdbc:mysql://61.74.71.31/log?useUnicode=yes&amp;characterEncoding=UTF-8");
DatabaseInfo dbInfo = jdbcUrlParser.parse("jdbc:mysql://61.74.71.31/log?useUnicode=yes&amp;characterEncoding=UTF-8");
Assert.assertEquals(dbInfo.getType(), ServiceType.MYSQL);
Assert.assertEquals(dbInfo.getHost().get(0), "61.74.71.31");
Assert.assertEquals(dbInfo.getDatabaseId(), "log");
@@ -77,7 +76,7 @@ public class JDBCUrlParserTest {
public void oracleParser1() {
// jdbc:oracle:thin:@hostname:port:SID
// "jdbc:oracle:thin:MYWORKSPACE/qwerty@localhost:1521:XE";
DatabaseInfo dbInfo = JDBCUrlParser.parse("jdbc:oracle:thin:@hostname:port:SID");
DatabaseInfo dbInfo = jdbcUrlParser.parse("jdbc:oracle:thin:@hostname:port:SID");
Assert.assertEquals(dbInfo.getType(), ServiceType.ORACLE);
Assert.assertEquals(dbInfo.getHost().get(0), "hostname:port");
Assert.assertEquals(dbInfo.getDatabaseId(), "SID");
@@ -89,7 +88,7 @@ public class JDBCUrlParserTest {
public void oracleParser2() {
// jdbc:oracle:thin:@hostname:port:SID
// "jdbc:oracle:thin:MYWORKSPACE/qwerty@localhost:1521:XE";
DatabaseInfo dbInfo = JDBCUrlParser.parse("jdbc:oracle:thin:MYWORKSPACE/qwerty@localhost:1521:XE");
DatabaseInfo dbInfo = jdbcUrlParser.parse("jdbc:oracle:thin:MYWORKSPACE/qwerty@localhost:1521:XE");
Assert.assertEquals(dbInfo.getType(), ServiceType.ORACLE);
Assert.assertEquals(dbInfo.getHost().get(0), "localhost:1521");
Assert.assertEquals(dbInfo.getDatabaseId(), "XE");
@@ -108,7 +107,7 @@ public class JDBCUrlParserTest {
"(ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.4) (PORT=1521))" +
"(ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.5) (PORT=1522))" +
"(CONNECT_DATA=(SERVICE_NAME=service)))";
DatabaseInfo dbInfo = JDBCUrlParser.parse(rac);
DatabaseInfo dbInfo = jdbcUrlParser.parse(rac);
Assert.assertEquals(dbInfo.getType(), ServiceType.ORACLE);
Assert.assertEquals(dbInfo.getHost().get(0), "1.2.3.4:1521");
@@ -116,4 +115,59 @@ public class JDBCUrlParserTest {
Assert.assertEquals(dbInfo.getUrl(), rac);
logger.info(dbInfo.toString());
}
@Test
public void regexTest1() {
String rac = "jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)" +
"(ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.4) (PORT=1521))" +
"(ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.5) (PORT=1522))" +
"(CONNECT_DATA=(SERVICE_NAME=service)))";
Matcher matcher = JDBCUrlParser.oracleRAC.matcher(rac);
Assert.assertTrue(matcher.matches());
}
@Test
public void regexTest2() {
String rac = "jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)" +
"(ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.4) (PORT=1521))" +
// "(ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.5) (PORT=1522))" +
"(CONNECT_DATA=(SERVICE_NAME=service)))";
Matcher matcher = JDBCUrlParser.oracleRAC.matcher(rac);
Assert.assertTrue(matcher.matches());
}
@Test
public void regexTest3() {
String rac = "jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)" +
"( ADDRESS = ( PROTOCOL=TCP) ( HOST = 1.2.3.4) ( PORT =1521))" +
"(ADDRESS= (PROTOCOL =TCP)(HOST = 1.2.3.5) (PORT= 1522 ))" +
"(CONNECT_DATA=(SERVICE_NAME=service)))";
Matcher matcher = JDBCUrlParser.oracleRAC.matcher(rac);
Assert.assertTrue(matcher.matches());
}
@Test
public void regexInvalidAddressTest1() {
String rac = "jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)" +
// "(ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.4) (PORT=1521))" +
// "(ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.5) (PORT=1522))" +
"(CONNECT_DATA=(SERVICE_NAME=service)))";
Matcher matcher = JDBCUrlParser.oracleRAC.matcher(rac);
Assert.assertFalse(matcher.matches());
}
// @Test
// public void regexInvalidAddressTest2() {
// String rac = "jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)" +
//// "(ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.4) (PORT=1521))" +
// "(ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.5) (PORT=1522))" +
// "(CONNECT_DATA=(SERVICE_NAME=service)))";
//
// Matcher matcher = JDBCUrlParser.oracleRAC.matcher(rac);
// Assert.assertFalse(matcher.matches());
// }
}