package io.dropwizard.metrics;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
final class LongAdderFactory {
private static final Logger LOG = LoggerFactory.getLogger(LongAdderFactory.class);
private static final String LONG_ADDER_CLASS_NAME = "java.util.concurrent.atomic.LongAdder";
private static final String JAVA8_LONG_ADDER_CLASS_NAME = LongAdderFactory.class.getPackage().getName() + ".Java8LongAdderImpl";
private static final String UNSAFE_LONG_ADDER_CLASS_NAME = LongAdderFactory.class.getPackage().getName() + ".UnsafeLongAdderImpl";
private static final boolean JAVA8 = isClassLoaded(LONG_ADDER_CLASS_NAME, false) && isClassLoaded(JAVA8_LONG_ADDER_CLASS_NAME, true);
private static final boolean UNSAFE = isClassLoaded(UNSAFE_LONG_ADDER_CLASS_NAME, true);
private static final Constructor<LongAdder> JAVA8_LONG_ADDER_CONSTRUCTOR = JAVA8 ? getJava8LongAdderConstructor() : null;
static LongAdder create() {
if (JAVA8 && JAVA8_LONG_ADDER_CONSTRUCTOR != null) {
try {
return JAVA8_LONG_ADDER_CONSTRUCTOR.newInstance();
} catch (IllegalArgumentException | InvocationTargetException | InstantiationException | IllegalAccessException e) {
LOG.info("Error instantiating Java8LongAdderImpl", e);
}
}
if (UNSAFE) {
return new UnsafeLongAdderImpl();
}
return new LongAdderImpl();
}
private static boolean isClassLoaded(String className, boolean canInitialize) {
Class<?> clazz = null;
try {
clazz = LongAdderFactory.class.getClassLoader().loadClass(className);
} catch (ClassNotFoundException e) {
return false;
}
if (canInitialize) {
try {
clazz.newInstance();
} catch (Throwable t) {
LOG.info("Unable to instantiate class {}", className, t);
return false;
}
}
return true;
}
@SuppressWarnings("unchecked")
private static Constructor<LongAdder> getJava8LongAdderConstructor() {
try {
Class<?> clazz = LongAdderFactory.class.getClassLoader().loadClass(JAVA8_LONG_ADDER_CLASS_NAME);
return (Constructor<LongAdder>) clazz.getConstructor();
} catch (ClassNotFoundException | NoSuchMethodException e) {
LOG.info("Unable to locate nullary constructor for {}", JAVA8_LONG_ADDER_CLASS_NAME, e);
return null;
}
}
private LongAdderFactory() {
}
}