package xapi.test.bytecode;
import java.io.DataInputStream;
import java.io.InputStream;
import org.junit.Assert;
import org.junit.Test;
import xapi.annotation.inject.InstanceDefault;
import xapi.annotation.inject.InstanceOverride;
import xapi.annotation.inject.SingletonDefault;
import xapi.annotation.inject.SingletonOverride;
import xapi.bytecode.ClassFile;
import xapi.bytecode.ClassPool;
import xapi.bytecode.annotation.Annotation;
import xapi.dev.scanner.impl.ClasspathResourceMap;
import xapi.dev.scanner.impl.ClasspathScannerDefault;
import xapi.platform.JrePlatform;
import xapi.platform.Platform;
import xapi.time.X_Time;
import xapi.time.api.Moment;
import xapi.util.X_String;
class OuterClass {
class InnerOuter{}
}
@JrePlatform
@SingletonDefault(implFor=ByteCodeReaderTest.class)
@SingletonOverride(implFor=ByteCodeReaderTest.class)
public class ByteCodeReaderTest {
private interface InnerInterface {}
@InstanceDefault(implFor=InnerInterface.class)
static class InnerClass implements InnerInterface {}
@Test
public void testReadClass() throws Exception {
InputStream in = getClass().getResourceAsStream(
"/"+getClass().getName().replace('.', '/')+".class");
ClassFile file = new ClassFile(new DataInputStream(in));
Annotation singleton = file.getRuntimeAnnotation(SingletonOverride.class.getName());
Assert.assertNotNull("Did not load SingletonOverride", singleton);
}
@SuppressWarnings("unchecked")
@Test
public void testClasspathScanner() throws Exception{
System.gc();
long mem = Runtime.getRuntime().freeMemory();
X_Time.tick();
Moment start = X_Time.now();
ClasspathResourceMap resources = new ClasspathScannerDefault()
.scanAnnotations(
Platform.class,
SingletonDefault.class, SingletonOverride.class,
InstanceDefault.class, InstanceOverride.class
)
.matchResource(".*")
.matchClassFile(".*")
.scan(Thread.currentThread().getContextClassLoader())
;
ClassPool cp = new ClassPool();
for (ClassFile cls : resources.findClassAnnotatedWith(
SingletonDefault.class, SingletonOverride.class,
InstanceDefault.class, InstanceOverride.class
)) {
Annotation anno = cls.getAnnotation(SingletonDefault.class.getName());
if (anno != null) {
SingletonDefault a = (SingletonDefault)anno.toAnnotationType(Thread.currentThread().getContextClassLoader(), cp);
}
}
X_Time.tick();
System.gc();
long memDone = Runtime.getRuntime().freeMemory();
System.out.println(
"Scanned annotations in "+X_Time.difference(start)
);
System.out.println(
"Used memory: "+X_String.toBinarySuffix(mem-memDone)
);
}
}