package org.limewire.ui; import java.io.File; import java.util.Set; import org.apache.bcel.classfile.AnnotationEntry; import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.JavaClass; import org.limewire.gnutella.tests.LimeTestUtils; import org.limewire.inject.EagerSingleton; import org.limewire.lifecycle.Service; import org.limewire.util.BaseTestCase; import com.google.common.collect.ImmutableSet; public class ServicesAreEagerSingletonsTest extends BaseTestCase { private final static ImmutableSet<String> exceptions = ImmutableSet.of("org.limewire.lifecycle.ServiceRegistryImpl$ServiceHolder$AnnotatedService", "org.limewire.ui.swing.dock.DockIconMacOSXImpl", "org.limewire.lifecycle.ServiceSchedulerImpl"); public void testAllServicesHaveEagerSingletonAnnotations() throws Throwable { Set<File> classFiles = LimeTestUtils.getAllClassFiles(this.getClass()); for (File classFile : classFiles) { JavaClass javaClass = new ClassParser(classFile.getAbsolutePath()).parse(); if (javaClass.isAbstract()) { continue; } if (exceptions.contains(javaClass.getClassName())) { continue; } if (implementsInterface(javaClass, Service.class)) { if (javaClass.isNested() || javaClass.isAnonymous()) { String className = javaClass.getClassName(); int lastDot = className.lastIndexOf('.'); String outerClassName = className.substring(lastDot == -1 ? 0 : lastDot + 1, className.lastIndexOf('$')).concat(".class"); File outerClassFile = new File(classFile.getParent(), outerClassName); assertTrue(outerClassFile.toString(), outerClassFile.exists()); assertIsAnnotatedWith(new ClassParser(outerClassFile.getAbsolutePath()).parse(), EagerSingleton.class); } else { assertIsAnnotatedWith(javaClass, EagerSingleton.class); } } } } private void assertIsAnnotatedWith(JavaClass javaClass, Class clazz) { if (exceptions.contains(javaClass.getClassName())) { return; } String className = clazz.getName().replace('.', '/'); for (AnnotationEntry entry :javaClass.getAnnotationEntries()) { if (entry.getAnnotationType().contains(className)) { return; } } fail(javaClass.getClassName() + " is not annotated with " + clazz.getName()); } private static boolean implementsInterface(JavaClass javaClass, Class clazz) throws Throwable { String interfaceName = clazz.getName(); JavaClass[] interfaces = javaClass.getAllInterfaces(); for (JavaClass interfaze : interfaces) { if (interfaze.getClassName().equals(interfaceName)) { return true; } } return false; } }