package com.codahale.metrics.jdbi.strategies;
import org.skife.jdbi.v2.StatementContext;
import java.lang.reflect.Method;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import static com.codahale.metrics.MetricRegistry.name;
public final class ShortNameStrategy extends DelegatingStatementNameStrategy {
private final ConcurrentMap<String, String> shortClassNames = new ConcurrentHashMap<>();
private final String baseJmxName;
public ShortNameStrategy(String baseJmxName) {
this.baseJmxName = baseJmxName;
registerStrategies(NameStrategies.CHECK_EMPTY,
new ShortContextClassStrategy(),
new ShortSqlObjectStrategy(),
NameStrategies.CHECK_RAW,
NameStrategies.NAIVE_NAME);
}
private final class ShortContextClassStrategy implements StatementNameStrategy {
@Override
public String getStatementName(StatementContext statementContext) {
final Object classObj = statementContext.getAttribute(NameStrategies.STATEMENT_CLASS);
final Object nameObj = statementContext.getAttribute(NameStrategies.STATEMENT_NAME);
if (classObj == null || nameObj == null) {
return null;
}
final String className = (String) classObj;
final String statementName = (String) nameObj;
final int dotPos = className.lastIndexOf('.');
if (dotPos == -1) {
return null;
}
final String shortName = className.substring(dotPos + 1);
final String oldClassName = shortClassNames.putIfAbsent(shortName, className);
if (oldClassName == null || oldClassName.equals(className)) {
return name(baseJmxName, shortName, statementName);
} else {
return name(baseJmxName, className, statementName);
}
}
}
private final class ShortSqlObjectStrategy implements StatementNameStrategy {
@Override
public String getStatementName(StatementContext statementContext) {
final Class<?> clazz = statementContext.getSqlObjectType();
final Method method = statementContext.getSqlObjectMethod();
if (clazz != null && method != null) {
final String className = clazz.getName();
final String statementName = method.getName();
final int dotPos = className.lastIndexOf('.');
if (dotPos == -1) {
return null;
}
final String shortName = className.substring(dotPos + 1);
final String oldClassName = shortClassNames.putIfAbsent(shortName, className);
if (oldClassName == null || oldClassName.equals(className)) {
return name(baseJmxName, shortName, statementName);
} else {
return name(baseJmxName, className, statementName);
}
}
return null;
}
}
}