blob: da5dbf0253e42b70df31a3db4efee64bf4b27350 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.j2ee.metadata.model.api.support.annotation;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.logging.Level;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement;
import org.netbeans.api.java.source.ClasspathInfo;
import org.netbeans.api.java.source.ElementHandle;
import org.netbeans.modules.j2ee.metadata.model.support.TestUtilities;
import org.netbeans.modules.j2ee.metadata.model.support.PersistenceTestCase;
import org.netbeans.modules.parsing.api.indexing.IndexingManager;
import org.openide.util.MapFormat;
/**
*
* @author Andrei Badea
*/
public class AnnotationScannerTest extends PersistenceTestCase {
public AnnotationScannerTest(String testName) {
super(testName);
}
protected Level logLevel() {
// enabling logging
return Level.INFO;
}
public PrintStream getLog() {
return System.err;
}
public void testScanTypes() throws Exception {
TestUtilities.copyStringToFileObject(srcFO, "Customer.java",
"@javax.persistence.Entity()" +
"public class Customer { }");
TestUtilities.copyStringToFileObject(srcFO, "Foo.java",
"public class Foo { }");
TestUtilities.copyStringToFileObject(srcFO, "Item.java",
"@javax.persistence.Entity()" +
"public class Item { }");
IndexingManager.getDefault().refreshIndexAndWait(srcFO.getURL(), null);
ClasspathInfo cpi = ClasspathInfo.create(srcFO);
final AnnotationModelHelper helper = AnnotationModelHelper.create(cpi);
final Set<String> types = new HashSet<String>();
helper.runJavaSourceTask(new Callable<Void>() {
public Void call() throws InterruptedException {
helper.getAnnotationScanner().findAnnotations("javax.persistence.Entity", AnnotationScanner.TYPE_KINDS, new AnnotationHandler() {
public void handleAnnotation(TypeElement type, Element element, AnnotationMirror annotation) {
types.add(type.getQualifiedName().toString());
}
});
return null;
}
});
assertEquals(2, types.size());
assertTrue(types.contains("Customer"));
assertTrue(types.contains("Item"));
}
public void testPerformance() throws Exception {
// Logger.getLogger(AnnotationScanner.class.getName()).setLevel(Level.FINEST);
final int ENTITY_COUNT = 500;
String template = TestUtilities.copyStreamToString(getClass().getResourceAsStream("Table.javax"));
Map<String, String> args = new HashMap<String, String>();
MapFormat format = new MapFormat(args);
format.setLeftBrace("__");
format.setRightBrace("__");
for (int i = 0; i < ENTITY_COUNT; i++) {
String name = "Table" + i;
args.put("NUM", Integer.toString(i));
args.put("NAME", name);
String contents = format.format(template);
TestUtilities.copyStringToFileObject(srcFO, name + ".java", contents);
}
long startTime = System.nanoTime();
IndexingManager.getDefault().refreshIndexAndWait(srcFO.getURL(), null);
long compilationDoneTime = System.nanoTime();
ClasspathInfo cpi = ClasspathInfo.create(srcFO);
final AnnotationModelHelper helper = AnnotationModelHelper.create(cpi);
final int[] entityCount = { 0 };
final long initialScanDoneTime[] = { 0L };
final List<ElementHandle<TypeElement>> typeHandles = new ArrayList<ElementHandle<TypeElement>>();
helper.runJavaSourceTask(new Callable<Void>() {
public Void call() throws InterruptedException {
helper.getAnnotationScanner().findAnnotations("javax.persistence.Entity", AnnotationScanner.TYPE_KINDS, new AnnotationHandler() {
public void handleAnnotation(TypeElement type, Element element, AnnotationMirror annotation) {
typeHandles.add(ElementHandle.create(type));
entityCount[0]++;
}
});
initialScanDoneTime[0] = System.nanoTime();
return null;
}
});
assertEquals(ENTITY_COUNT, entityCount[0]);
System.out.println("Compilation time (ms): " + (compilationDoneTime - startTime) / 1e6);
System.out.println("Initial annotation scan time (ms): " + (initialScanDoneTime[0] - compilationDoneTime) / 1e6);
}
private ClasspathInfo createClasspathInfoForScanningAnnotations() throws Exception {
TestUtilities.copyStringToFileObject(srcFO, "foo/MyClass.java",
"package foo;" +
"" +
"import javax.annotation.Resource;" +
"import javax.sql.DataSource;" +
"" +
"@Resource(name=\"myClass\")" +
"public class MyClass {" +
" @Resource" +
" private DataSource myDS;" +
"}");
TestUtilities.copyStringToFileObject(srcFO, "foo/YourClass.java",
"package foo;" +
"" +
"import javax.annotation.Resource;" +
"import javax.sql.DataSource;" +
"" +
"public class YourClass {" +
" @Resource" +
" private void setYourDataSource(DataSource ds) {" +
" }" +
"}");
IndexingManager.getDefault().refreshIndexAndWait(srcFO.getURL(), null);
return ClasspathInfo.create(srcFO);
}
public void testScanAnnotationsOnClassesMethodsFields() throws Exception {
final AnnotationModelHelper helper = AnnotationModelHelper.create(createClasspathInfoForScanningAnnotations());
final Set<String> elements = new HashSet<String>();
helper.runJavaSourceTask(new Callable<Void>() {
public Void call() throws InterruptedException{
helper.getAnnotationScanner().findAnnotations(
"javax.annotation.Resource",
EnumSet.of(ElementKind.CLASS, ElementKind.METHOD, ElementKind.FIELD),
new AnnotationHandler() {
public void handleAnnotation(TypeElement typeElement, Element element, AnnotationMirror annotationMirror) {
elements.add(element.getSimpleName().toString());
}
});
return null;
}
});
assertEquals(3, elements.size());
assertTrue(elements.contains("MyClass"));
assertTrue(elements.contains("myDS"));
assertTrue(elements.contains("setYourDataSource"));
}
public void testScanAnnotationsOnMethodsFields() throws Exception {
final AnnotationModelHelper helper = AnnotationModelHelper.create(createClasspathInfoForScanningAnnotations());
final Set<String> elements = new HashSet<String>();
helper.runJavaSourceTask(new Callable<Void>() {
public Void call() throws InterruptedException {
helper.getAnnotationScanner().findAnnotations(
"javax.annotation.Resource",
EnumSet.of(ElementKind.METHOD, ElementKind.FIELD),
new AnnotationHandler() {
public void handleAnnotation(TypeElement typeElement, Element element, AnnotationMirror annotationMirror) {
elements.add(element.getSimpleName().toString());
}
});
return null;
}
});
assertEquals(2, elements.size());
assertTrue(elements.contains("myDS"));
assertTrue(elements.contains("setYourDataSource"));
}
public void testScanAnnotationsOnClasses() throws Exception {
final AnnotationModelHelper helper = AnnotationModelHelper.create(createClasspathInfoForScanningAnnotations());
final Set<String> elements = new HashSet<String>();
helper.runJavaSourceTask(new Callable<Void>() {
public Void call() throws InterruptedException {
helper.getAnnotationScanner().findAnnotations(
"javax.annotation.Resource",
EnumSet.of(ElementKind.CLASS),
new AnnotationHandler() {
public void handleAnnotation(TypeElement typeElement, Element element, AnnotationMirror annotationMirror) {
assertSame(typeElement, element);
elements.add(element.getSimpleName().toString());
}
});
return null;
}
});
assertEquals(1, elements.size());
assertTrue(elements.contains("MyClass"));
}
public void testScanAnnotationsOnMethods() throws Exception {
final AnnotationModelHelper helper = AnnotationModelHelper.create(createClasspathInfoForScanningAnnotations());
final Set<String> elements = new HashSet<String>();
helper.runJavaSourceTask(new Callable<Void>() {
public Void call() throws InterruptedException {
helper.getAnnotationScanner().findAnnotations(
"javax.annotation.Resource",
EnumSet.of(ElementKind.METHOD),
new AnnotationHandler() {
public void handleAnnotation(TypeElement typeElement, Element element, AnnotationMirror annotationMirror) {
assertEquals("foo.YourClass", typeElement.getQualifiedName().toString());
elements.add(element.getSimpleName().toString());
}
});
return null;
}
});
assertEquals(1, elements.size());
assertTrue(elements.contains("setYourDataSource"));
}
public void testScanAnnotationsOnFields() throws Exception {
final AnnotationModelHelper helper = AnnotationModelHelper.create(createClasspathInfoForScanningAnnotations());
final Set<String> elements = new HashSet<String>();
helper.runJavaSourceTask(new Callable<Void>() {
public Void call() throws InterruptedException {
helper.getAnnotationScanner().findAnnotations(
"javax.annotation.Resource",
EnumSet.of(ElementKind.FIELD),
new AnnotationHandler() {
public void handleAnnotation(TypeElement typeElement, Element element, AnnotationMirror annotationMirror) {
assertEquals("foo.MyClass", typeElement.getQualifiedName().toString());
elements.add(element.getSimpleName().toString());
}
});
return null;
}
});
assertEquals(1, elements.size());
assertTrue(elements.contains("myDS"));
}
}