/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.util.annotation;
import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.fudgemsg.AnnotationReflector;
import org.reflections.scanners.TypeAnnotationsScanner;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.ClasspathUtils;
/**
* Static utility for scanning classes for a particular annotation.
*/
public final class ClassNameAnnotationScannerUtils {
/**
* Restricted constructor.
*/
private ClassNameAnnotationScannerUtils() {
}
/**
* Scans the specified classpath for an annotation.
*
* @param classpathElements the classpath, not null
* @param annotationClass the annotation to find, not null
* @return the matching elements, not null
*/
public static Set<String> scan(String[] classpathElements, Class<?> annotationClass) {
ArgumentChecker.notNull(annotationClass, "annotationClass");
return scan(classpathElements, annotationClass.getName());
}
/**
* Scans the specified classpath for an annotation.
*
* @param classpathElements the classpath, not null
* @param annotationClassName the annotation to find, not null
* @return the matching elements, not null
*/
public static Set<String> scan(String[] classpathElements, String annotationClassName) {
URL[] classpathUrls = ClasspathUtils.getClasspathURLs(classpathElements);
return scan(classpathUrls, annotationClassName);
}
/**
* Scans the specified classpath for an annotation.
*
* @param classpathUrls the classpath, not null
* @param annotationClassName the annotation to find, not null
* @return the matching elements, not null
*/
public static Set<String> scan(URL[] classpathUrls, String annotationClassName) {
ArgumentChecker.notNull(annotationClassName, "annotationClassName");
Set<URL> urls = new HashSet<>(Arrays.asList(classpathUrls));
AnnotationReflector reflector = new AnnotationReflector(
null, urls, new TypeAnnotationsScanner(),
ClassNameAnnotationScannerUtils.class.getClassLoader(), Thread.currentThread().getContextClassLoader());
Set<String> classNames = reflector.getReflector().getStore().getTypesAnnotatedWith(annotationClassName);
if (classNames == null) {
return Collections.emptySet();
}
return Collections.unmodifiableSet(classNames);
}
}