/**
* Copyright (c) 2009-2011 VMware, Inc. All Rights Reserved.
*
* 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.springsource.insight.plugin.jdbc.parser.parsers;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.springsource.insight.plugin.jdbc.parser.AbstractSqlParser;
import com.springsource.insight.plugin.jdbc.parser.JdbcUrlMetaData;
import com.springsource.insight.plugin.jdbc.parser.SimpleJdbcUrlMetaData;
import com.springsource.insight.util.ArrayUtil;
import com.springsource.insight.util.StringUtil;
public class OracleRACParser extends AbstractSqlParser {
public static final int DEFAULT_CONNECTION_PORT = 1521;
public static final String DEFAULT_CONNECTION_PORT_STRING = String.valueOf(DEFAULT_CONNECTION_PORT);
public static final String VENDOR = "oracle";
public OracleRACParser() {
super(VENDOR, DEFAULT_CONNECTION_PORT);
}
public static final String HOST_ATTRIBUTE = "HOST", PORT_ATTRIBUTE = "PORT", SERVICE_ATTRIBUTE = "SERVICE_NAME";
public static final Pattern ORACLE_RAC_HOST_PATTERN = createDefaultAttributePattern(HOST_ATTRIBUTE);
public static final Pattern ORACLE_RAC_PORT_PATTERN = createDefaultAttributePattern(PORT_ATTRIBUTE);
public static final Pattern ORACLE_RAC_SERVICE_PATTERN = createDefaultAttributePattern(SERVICE_ATTRIBUTE);
/**
* Extract an Oracle RAC URL of the form: (DESCRIPTION... (ADDRESS = ...
* (HOST = [HOST])(PORT = [PORT])...
*/
public List<JdbcUrlMetaData> parse(String connectionUrl, String vendorName) {
String[] addressParts = connectionUrl.split("ADDRESS");
/*
* NOTE: the 1st address "part" is actually everything BEFORE the 1st
* address and as such contains no useful information
*/
if (ArrayUtil.length(addressParts) <= 1) {
return Collections.emptyList();
}
String dbName = resolveAttributeValue(SERVICE_ATTRIBUTE, ORACLE_RAC_SERVICE_PATTERN, connectionUrl, null);
List<JdbcUrlMetaData> parsedUrls = new ArrayList<JdbcUrlMetaData>(addressParts.length - 1);
for (int index = 1; index < addressParts.length; index++) {
String part = addressParts[index];
String host = resolveAttributeValue(HOST_ATTRIBUTE, ORACLE_RAC_HOST_PATTERN, part, getDefaultHost());
String portValue = resolveAttributeValue(PORT_ATTRIBUTE, ORACLE_RAC_PORT_PATTERN, part, DEFAULT_CONNECTION_PORT_STRING);
int port = getDefaultPort();
if (portValue != DEFAULT_CONNECTION_PORT_STRING) {
port = parsePort(connectionUrl, portValue);
}
parsedUrls.add(new SimpleJdbcUrlMetaData(host, port, dbName, connectionUrl, vendorName));
}
return parsedUrls;
}
static String resolveAttributeValue(String attrName, Pattern pattern, String part, String defaultValue) {
if (StringUtil.isEmpty(part) || (!part.contains(attrName))) {
return defaultValue;
}
Matcher attrMat = pattern.matcher(part);
if (attrMat.find()) {
String attrValue = attrMat.group(1);
if (attrValue != null) {
attrValue = attrValue.trim();
}
if (StringUtil.isEmpty(attrValue)) {
return defaultValue;
} else {
return attrValue;
}
} else {
return defaultValue;
}
}
static final Pattern createDefaultAttributePattern(String attrName) {
return Pattern.compile(attrName + "\\s*=\\s*([^)]+)");
}
}