/* * Copyright 2014 NAVER Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.navercorp.pinpoint.plugin.jdbc.cubrid; import com.navercorp.pinpoint.bootstrap.context.DatabaseInfo; import com.navercorp.pinpoint.bootstrap.logging.PLogger; import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; import com.navercorp.pinpoint.bootstrap.plugin.jdbc.DefaultDatabaseInfo; import com.navercorp.pinpoint.bootstrap.plugin.jdbc.JdbcUrlParserV2; import com.navercorp.pinpoint.bootstrap.plugin.jdbc.StringMaker; import com.navercorp.pinpoint.bootstrap.plugin.jdbc.UnKnownDatabaseInfo; import com.navercorp.pinpoint.common.trace.ServiceType; import com.navercorp.pinpoint.common.util.StringUtils; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author emeroad */ public class CubridJdbcUrlParser implements JdbcUrlParserV2 { public static final String DEFAULT_HOSTNAME = "localhost"; public static final int DEFAULT_PORT = 30000; public static final String DEFAULT_USER = "public"; public static final String DEFAULT_PASSWORD = ""; private static final String URL_PREFIX_PATTERN = "jdbc:cubrid(-oracle|-mysql)?:"; private static final Pattern PREFIX_PATTERN = Pattern.compile(URL_PREFIX_PATTERN, Pattern.CASE_INSENSITIVE); private static final String URL_PATTERN = URL_PREFIX_PATTERN + "([a-zA-Z_0-9\\.-]*):([0-9]*):([^:]+):([^:]*):([^:]*):(\\?[a-zA-Z_0-9]+=[^&=?]+(&[a-zA-Z_0-9]+=[^&=?]+)*)?"; private static final Pattern PATTERN = Pattern.compile(URL_PATTERN, Pattern.CASE_INSENSITIVE); private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); @Override public DatabaseInfo parse(String jdbcUrl) { if (jdbcUrl == null) { logger.info("jdbcUrl may not be null"); return UnKnownDatabaseInfo.INSTANCE; } final Matcher matcher = PREFIX_PATTERN.matcher(jdbcUrl); if (!matcher.find()) { logger.info("jdbcUrl has invalid prefix.(url:{}, prefix-pattern:{})", jdbcUrl, URL_PREFIX_PATTERN); return UnKnownDatabaseInfo.INSTANCE; } DatabaseInfo result = null; try { result = parse0(jdbcUrl); } catch (Exception e) { logger.info("CubridJdbcUrl parse error. url: {}, Caused: {}", jdbcUrl, e.getMessage(), e); result = UnKnownDatabaseInfo.createUnknownDataBase(CubridConstants.CUBRID, CubridConstants.CUBRID_EXECUTE_QUERY, jdbcUrl); } return result; } private DatabaseInfo parse0(String jdbcUrl) { final Matcher matcher = PATTERN.matcher(jdbcUrl); if (!matcher.find()) { throw new IllegalArgumentException(); } String host = matcher.group(2); String portString = matcher.group(3); String db = matcher.group(4); String user = matcher.group(5); // String pass = matcher.group(6); // String prop = matcher.group(7); // int port = DEFAULT_PORT; // String resolvedUrl; if (StringUtils.isEmpty(host)) { host = DEFAULT_HOSTNAME; } // if (portString == null || portString.length() == 0) { // port = DEFAULT_PORT; // } else { // try { // port = Integer.parseInt(portString); // } catch (NumberFormatException e) { // logger.info("cubrid portString parsing fail. portString:{}, url:{}", portString, jdbcUrl); // } // } if (user == null) { user = DEFAULT_USER; } // if (pass == null) { // pass = DEFAULT_PASSWORD; // } // resolvedUrl = "jdbc:cubrid:" + host + ":" + port + ":" + db + ":" + user + ":********:"; StringMaker maker = new StringMaker(jdbcUrl); String normalizedUrl = maker.clear().before('?').value(); List<String> hostList = new ArrayList<String>(1); final String hostAndPort = host + ":" + portString; hostList.add(hostAndPort); // skip alt host return new DefaultDatabaseInfo(CubridConstants.CUBRID, CubridConstants.CUBRID_EXECUTE_QUERY, jdbcUrl, normalizedUrl, hostList, db); } /* private DatabaseInfo parseCubrid(String url) { // jdbc:cubrid:10.20.30.40:12345:pinpoint::: StringMaker maker = new StringMaker(url); maker.after("jdbc:cubrid:"); // 10.11.12.13:3306 In case of replication driver could have multiple values // We have to consider mm db too. String host = maker.after("//").before('/').value(); List<String> hostList = new ArrayList<String>(1); hostList.add(host); // String port = maker.next().after(':').before('/').value(); String databaseId = maker.next().afterLast('/').before('?').value(); String normalizedUrl = maker.clear().before('?').value(); return new DatabaseInfo(ServiceType.CUBRID, ServiceType.CUBRID_EXECUTE_QUERY, url, normalizedUrl, hostList, databaseId); } */ @Override public ServiceType getServiceType() { return CubridConstants.CUBRID; } }