/* * Copyright (C) 2015 Red Hat, Inc. and/or its affiliates. * * Licensed 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.jboss.errai.reflections; import com.google.common.base.Predicate; import org.junit.Assert; import org.junit.Test; import org.jboss.errai.reflections.serializers.JavaCodeSerializer; import org.jboss.errai.reflections.scanners.TypeElementsScanner; import org.jboss.errai.reflections.scanners.TypesScanner; import org.jboss.errai.reflections.util.ConfigurationBuilder; import org.jboss.errai.reflections.util.ClasspathHelper; import org.jboss.errai.reflections.util.FilterBuilder; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.reflect.Field; import java.lang.reflect.Method; import static java.util.Arrays.asList; import java.util.Set; /** */ public class JavaCodeSerializerTest { @Test public void generateAndSave() { //generate Predicate<String> filter = new FilterBuilder().include("org.jboss.errai.reflections.TestModel\\$.*").include("org.jboss.errai.reflections.MyTestModelStore.*"); Reflections reflections = new Reflections(new ConfigurationBuilder() .filterInputsBy(filter) .setScanners(new TypesScanner(), new TypeElementsScanner()) .setUrls(asList(ClasspathHelper.forClass(TestModel.class)))); reflections.scan(); //no re-serializing Set<String> stringSet = reflections.getStore().get(TypesScanner.class).keySet(); for (String s : stringSet) { if (stringSet.contains("MyTestModelStore")) { Assert.fail(s + " has been re-serialized"); } } //save String filename = ReflectionsTest.getUserDir() + "/src/test/java/org.jboss.errai.reflections.MyTestModelStore"; reflections.save(filename, new JavaCodeSerializer()); } @Test public void classCanBeFetchedFromJavaCodeSerializer() { //class Class<? extends JavaCodeSerializer.IClass> aClass1 = MyTestModelStore.org.jboss.errai.reflections.TestModel$C1.class; Class aClass = JavaCodeSerializer.resolveClass(aClass1); Assert.assertEquals(TestModel.C1.class, aClass); } @Test public void methodCanBeFetchedFromJavaCodeSerializer() throws NoSuchMethodException { //method Class<? extends JavaCodeSerializer.IMethod> method1 = MyTestModelStore.org.jboss.errai.reflections.TestModel$C4.m1.class; Method m1 = JavaCodeSerializer.resolveMethod(method1); Assert.assertEquals(TestModel.C4.class.getDeclaredMethod("m1"), m1); //overloaded method with parameters Class<? extends JavaCodeSerializer.IMethod> method2 = MyTestModelStore.org.jboss.errai.reflections.TestModel$C4.m1_int_java$lang$String$$.class; Method m2 = JavaCodeSerializer.resolveMethod(method2); Assert.assertEquals(TestModel.C4.class.getDeclaredMethod("m1", int.class, String[].class), m2); //overloaded method with parameters and multi dimensional array Class<? extends JavaCodeSerializer.IMethod> method3 = MyTestModelStore.org.jboss.errai.reflections.TestModel$C4.m1_int$$$$_java$lang$String$$$$.class; Method m3 = JavaCodeSerializer.resolveMethod(method3); Assert.assertEquals(TestModel.C4.class.getDeclaredMethod("m1", int[][].class, String[][].class), m3); } @Test public void fieldCanBeFetchedFromJavaCodeSerializer() throws NoSuchMethodException, NoSuchFieldException { //field Class<? extends JavaCodeSerializer.IField> field1 = MyTestModelStore.org.jboss.errai.reflections.TestModel$C4.f1.class; Field f1 = JavaCodeSerializer.resolveField(field1); Assert.assertEquals(TestModel.C4.class.getDeclaredField("f1"), f1); } @Test public void fieldCanBeFetchedFromAnnotationUsingJavaCodeSerializer() throws NoSuchFieldException { //field can be fetched from annotation Mark mark = SomeClassToMark.class.getAnnotation(Mark.class); Class<? extends JavaCodeSerializer.IField> markedElement = mark.value(); Field markedField = JavaCodeSerializer.resolveField(markedElement); Assert.assertEquals(TestModel.C4.class.getDeclaredField("f1"), markedField); } //test case - use the store in annotations @Retention(RetentionPolicy.RUNTIME) public @interface Mark { Class<? extends JavaCodeSerializer.IField> value(); } @Mark(MyTestModelStore.org.jboss.errai.reflections.TestModel$C4.f1.class) //annotation can use Store to specify class/field/method in a semi strong typed manner @SuppressWarnings({"UnusedDeclaration"}) public static class SomeClassToMark { } }