/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.util.annotation;
import java.lang.annotation.Annotation;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.ImmutableSet;
import com.opengamma.util.ArgumentChecker;
/**
* Implementation of {@link AnnotationScanner} that caches and uses Reflections.
*/
public class AnnotationScannerImpl implements AnnotationScanner {
private static final Logger s_logger = LoggerFactory.getLogger(AnnotationScannerImpl.class);
@Override
public synchronized Set<Class<?>> scan(Class<? extends Annotation> annotationClass) {
ArgumentChecker.notNull(annotationClass, "annotation class");
AnnotationCache cache = AnnotationCache.load(annotationClass);
final ClasspathScanner scanner = new ClasspathScanner();
if (!scanner.getTimestamp().isAfter(cache.getTimestamp())) {
s_logger.info("loading {} annotation from cache", annotationClass.getSimpleName());
return ImmutableSet.copyOf(cache.getClasses());
}
s_logger.info("Scanning class path for classes annotated with {}", annotationClass.getSimpleName());
cache = scanner.scan(annotationClass);
cache.save();
return ImmutableSet.copyOf(cache.getClasses());
}
}