From ab5b797676516bbc0a9ba4cd90cb0bd8053fac8f Mon Sep 17 00:00:00 2001 From: Woonduk Kang Date: Wed, 22 May 2013 10:33:37 +0000 Subject: [PATCH] =?UTF-8?q?[=EA=B0=95=EC=9A=B4=EB=8D=95]=20[LUCYSUS-1744]?= =?UTF-8?q?=20rac=EC=9D=98=20url=EC=9D=84=20=EC=A2=80=EB=8D=94=20=EC=A0=95?= =?UTF-8?q?=EA=B5=90=ED=95=98=EA=B2=8C=20=ED=8C=8C=EC=95=85=ED=95=A0?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8A=94=20regex=20=EA=B0=9C=EB=B0=9C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://svn.bds.nhncorp.com/pe/hippo-profiler-bootstrap/trunk@1688 84d0f5b1-2673-498c-a247-62c4ff18d310 --- .../profiler/modifier/db/JDBCUrlParser.java | 33 ++++++++- .../db/{util => }/JDBCUrlParserTest.java | 74 ++++++++++++++++--- 2 files changed, 93 insertions(+), 14 deletions(-) rename src/test/java/com/profiler/modifier/db/{util => }/JDBCUrlParserTest.java (59%) diff --git a/src/main/java/com/profiler/modifier/db/JDBCUrlParser.java b/src/main/java/com/profiler/modifier/db/JDBCUrlParser.java index 4bbc0eb0d..7e3edf6bb 100644 --- a/src/main/java/com/profiler/modifier/db/JDBCUrlParser.java +++ b/src/main/java/com/profiler/modifier/db/JDBCUrlParser.java @@ -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 hostList = new ArrayList(1); hostList.add(host); diff --git a/src/test/java/com/profiler/modifier/db/util/JDBCUrlParserTest.java b/src/test/java/com/profiler/modifier/db/JDBCUrlParserTest.java similarity index 59% rename from src/test/java/com/profiler/modifier/db/util/JDBCUrlParserTest.java rename to src/test/java/com/profiler/modifier/db/JDBCUrlParserTest.java index d9583f167..35bf53660 100644 --- a/src/test/java/com/profiler/modifier/db/util/JDBCUrlParserTest.java +++ b/src/test/java/com/profiler/modifier/db/JDBCUrlParserTest.java @@ -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&characterEncoding=UTF-8"); + DatabaseInfo dbInfo = jdbcUrlParser.parse("jdbc:mysql://ip_address:3306/database_name?useUnicode=yes&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&characterEncoding=UTF-8"); + DatabaseInfo dbInfo = jdbcUrlParser.parse("jdbc:mysql://61.74.71.31/log?useUnicode=yes&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()); +// } }