blob: 4cca9a3238bfb78e8826b5e693202992ff333c5a [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.apache.commons.weaver;
import static org.apache.commons.weaver.test.beans.ComplexAnnotations.Stooge.CURLY;
import static org.apache.commons.weaver.test.beans.ComplexAnnotations.Stooge.LARRY;
import static org.apache.commons.weaver.test.beans.ComplexAnnotations.Stooge.MOE;
import static org.apache.commons.weaver.test.beans.ComplexAnnotations.Stooge.SHEMP;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.Validate;
import org.apache.commons.weaver.test.WeaverTestBase;
import org.apache.commons.weaver.test.beans.AbstractTestBean;
import org.apache.commons.weaver.test.beans.ComplexAnnotations;
import org.apache.commons.weaver.test.beans.ComplexAnnotations.NestAnnotation;
import org.apache.commons.weaver.test.beans.ComplexAnnotations.Stooge;
import org.apache.commons.weaver.test.beans.ComplexAnnotations.TestAnnotation;
import org.apache.commons.weaver.test.beans.TestBeanInterface;
import org.apache.commons.weaver.test.beans.TestBeanWithClassAnnotation;
import org.apache.commons.weaver.test.beans.TestBeanWithMethodAnnotation;
import org.apache.commons.weaver.utils.URLArray;
import org.apache.xbean.finder.Annotated;
import org.apache.xbean.finder.archive.FileArchive;
import org.hamcrest.Matchers;
import org.junit.Test;
public class FinderTest extends WeaverTestBase {
private Finder finder() {
final ClassLoader classLoader = new URLClassLoader(URLArray.fromPaths(getClassPathEntries()));
return new Finder(new FileArchive(classLoader, getTargetFolder()));
}
/**
* The point of this is to prove that we can correctly hydate instances of
* annotations with class retention.
*
* @throws IOException
*/
@Test
public void testElements() throws IOException {
addClassForScanning(ComplexAnnotations.class);
final Map<String, Annotated<Field>> fields = new HashMap<String, Annotated<Field>>();
for (final Annotated<Field> annotated : finder().withAnnotations().findAnnotatedFields(
ComplexAnnotations.TestAnnotation.class)) {
fields.put(annotated.get().getName(), annotated);
}
assertEquals(2, fields.size());
final TestAnnotation anno1 = fields.get("dummy1").getAnnotation(TestAnnotation.class);
assertFalse(anno1.booleanValue());
assertTrue(Arrays.equals(new boolean[] { false }, anno1.booleanValues()));
assertEquals((byte) 0, anno1.byteValue());
assertArrayEquals(new byte[] { 0 }, anno1.byteValues());
assertEquals((char) 0, anno1.charValue());
assertArrayEquals(new char[] { 0 }, anno1.charValues());
assertEquals(Double.valueOf(0.0), Double.valueOf(anno1.doubleValue()));
assertTrue(Arrays.equals(new double[] { 0.0 }, anno1.doubleValues()));
assertEquals(Float.valueOf(0.0f), Float.valueOf(anno1.floatValue()));
assertTrue(Arrays.equals(new float[] { 0.0f }, anno1.floatValues()));
assertEquals(0, anno1.intValue());
assertArrayEquals(new int[] { 0 }, anno1.intValues());
assertEquals(0L, anno1.longValue());
assertArrayEquals(new long[] { 0L }, anno1.longValues());
final NestAnnotation nest1 = anno1.nest();
assertFalse(nest1.booleanValue());
assertTrue(Arrays.equals(new boolean[] { false }, nest1.booleanValues()));
assertEquals((byte) 0, nest1.byteValue());
assertArrayEquals(new byte[] { 0 }, nest1.byteValues());
assertEquals((char) 0, nest1.charValue());
assertArrayEquals(new char[] { 0 }, nest1.charValues());
assertEquals(Double.valueOf(0.0), Double.valueOf(nest1.doubleValue()));
assertTrue(Arrays.equals(new double[] { 0.0 }, nest1.doubleValues()));
assertEquals(Float.valueOf(0.0f), Float.valueOf(nest1.floatValue()));
assertTrue(Arrays.equals(new float[] { 0.0f }, nest1.floatValues()));
assertEquals(0, nest1.intValue());
assertArrayEquals(new int[] { 0 }, nest1.intValues());
assertEquals(0L, nest1.longValue());
assertArrayEquals(new long[] { 0L }, nest1.longValues());
assertEquals((short) 0, nest1.shortValue());
assertArrayEquals(new short[] { 0 }, nest1.shortValues());
assertSame(CURLY, nest1.stooge());
assertArrayEquals(new Stooge[] { MOE, LARRY, SHEMP }, nest1.stooges());
assertEquals("", nest1.string());
assertArrayEquals(new String[] { "" }, nest1.strings());
assertEquals(Object.class, nest1.type());
assertArrayEquals(new Class[] { Object.class }, nest1.types());
assertEquals(1, anno1.nests().length);
final NestAnnotation nest1_0 = anno1.nests()[0];
assertFalse(nest1_0.booleanValue());
assertTrue(Arrays.equals(new boolean[] { false }, nest1_0.booleanValues()));
assertEquals((byte) 0, nest1_0.byteValue());
assertArrayEquals(new byte[] { 0 }, nest1_0.byteValues());
assertEquals((char) 0, nest1_0.charValue());
assertArrayEquals(new char[] { 0 }, nest1_0.charValues());
assertEquals(Double.valueOf(0.0), Double.valueOf(nest1_0.doubleValue()));
assertTrue(Arrays.equals(new double[] { 0.0 }, nest1_0.doubleValues()));
assertEquals(Float.valueOf(0.0f), Float.valueOf(nest1_0.floatValue()));
assertTrue(Arrays.equals(new float[] { 0.0f }, nest1_0.floatValues()));
assertEquals(0, nest1_0.intValue());
assertArrayEquals(new int[] { 0 }, nest1_0.intValues());
assertEquals(0L, nest1_0.longValue());
assertArrayEquals(new long[] { 0L }, nest1_0.longValues());
assertEquals((short) 0, nest1_0.shortValue());
assertArrayEquals(new short[] { 0 }, nest1_0.shortValues());
assertSame(CURLY, nest1_0.stooge());
assertArrayEquals(new Stooge[] { MOE, LARRY, SHEMP }, nest1_0.stooges());
assertEquals("", nest1_0.string());
assertArrayEquals(new String[] { "" }, nest1_0.strings());
assertEquals(Object[].class, nest1_0.type());
assertArrayEquals(new Class[] { Object[].class }, nest1_0.types());
assertEquals((short) 0, anno1.shortValue());
assertArrayEquals(new short[] { 0 }, anno1.shortValues());
assertSame(SHEMP, anno1.stooge());
assertArrayEquals(new Stooge[] { MOE, LARRY, CURLY }, anno1.stooges());
assertEquals("", anno1.string());
assertArrayEquals(new String[] { "" }, anno1.strings());
assertEquals(Object.class, anno1.type());
assertArrayEquals(new Class[] { Object.class }, anno1.types());
final TestAnnotation anno2 = fields.get("dummy2").getAnnotation(TestAnnotation.class);
assertFalse(anno2.booleanValue());
assertTrue(Arrays.equals(new boolean[] { false }, anno2.booleanValues()));
assertEquals((byte) 0, anno2.byteValue());
assertArrayEquals(new byte[] { 0 }, anno2.byteValues());
assertEquals((char) 0, anno2.charValue());
assertArrayEquals(new char[] { 0 }, anno2.charValues());
assertEquals(Double.valueOf(0.0), Double.valueOf(anno2.doubleValue()));
assertTrue(Arrays.equals(new double[] { 0.0 }, anno2.doubleValues()));
assertEquals(Float.valueOf(0.0f), Float.valueOf(anno2.floatValue()));
assertTrue(Arrays.equals(new float[] { 0.0f }, anno2.floatValues()));
assertEquals(0, anno2.intValue());
assertArrayEquals(new int[] { 0 }, anno2.intValues());
assertEquals(0L, anno2.longValue());
assertArrayEquals(new long[] { 0L }, anno2.longValues());
final NestAnnotation nest2 = anno2.nest();
assertFalse(nest2.booleanValue());
assertTrue(Arrays.equals(new boolean[] { false }, nest2.booleanValues()));
assertEquals((byte) 0, nest2.byteValue());
assertArrayEquals(new byte[] { 0 }, nest2.byteValues());
assertEquals((char) 0, nest2.charValue());
assertArrayEquals(new char[] { 0 }, nest2.charValues());
assertEquals(Double.valueOf(0.0), Double.valueOf(nest2.doubleValue()));
assertTrue(Arrays.equals(new double[] { 0.0 }, nest2.doubleValues()));
assertEquals(Float.valueOf(0.0f), Float.valueOf(nest2.floatValue()));
assertTrue(Arrays.equals(new float[] { 0.0f }, nest2.floatValues()));
assertEquals(0, nest2.intValue());
assertArrayEquals(new int[] { 0 }, nest2.intValues());
assertEquals(0L, nest2.longValue());
assertArrayEquals(new long[] { 0L }, nest2.longValues());
assertEquals((short) 0, nest2.shortValue());
assertArrayEquals(new short[] { 0 }, nest2.shortValues());
assertSame(CURLY, nest2.stooge());
assertArrayEquals(new Stooge[] { MOE, LARRY, SHEMP }, nest2.stooges());
assertEquals("", nest2.string());
assertArrayEquals(new String[] { "" }, nest2.strings());
assertEquals(Object.class, nest2.type());
assertArrayEquals(new Class[] { Object.class }, nest2.types());
assertEquals(2, anno2.nests().length);
final NestAnnotation nest2_0 = anno2.nests()[0];
assertFalse(nest2_0.booleanValue());
assertTrue(Arrays.equals(new boolean[] { false }, nest2_0.booleanValues()));
assertEquals((byte) 0, nest2_0.byteValue());
assertArrayEquals(new byte[] { 0 }, nest2_0.byteValues());
assertEquals((char) 0, nest2_0.charValue());
assertArrayEquals(new char[] { 0 }, nest2_0.charValues());
assertEquals(Double.valueOf(0.0), Double.valueOf(nest2_0.doubleValue()));
assertTrue(Arrays.equals(new double[] { 0.0 }, nest2_0.doubleValues()));
assertEquals(Float.valueOf(0.0f), Float.valueOf(nest2_0.floatValue()));
assertTrue(Arrays.equals(new float[] { 0.0f }, nest2_0.floatValues()));
assertEquals(0, nest2_0.intValue());
assertArrayEquals(new int[] { 0 }, nest2_0.intValues());
assertEquals(0L, nest2_0.longValue());
assertArrayEquals(new long[] { 0L }, nest2_0.longValues());
assertEquals((short) 0, nest2_0.shortValue());
assertArrayEquals(new short[] { 0 }, nest2_0.shortValues());
assertSame(CURLY, nest2_0.stooge());
assertArrayEquals(new Stooge[] { MOE, LARRY, SHEMP }, nest2_0.stooges());
assertEquals("", nest2_0.string());
assertArrayEquals(new String[] { "" }, nest2_0.strings());
assertEquals(Object[].class, nest2_0.type());
assertArrayEquals(new Class[] { Object[].class }, nest2_0.types());
final NestAnnotation nest2_1 = anno2.nests()[1];
assertFalse(nest2_1.booleanValue());
assertTrue(Arrays.equals(new boolean[] { false }, nest2_1.booleanValues()));
assertEquals((byte) 0, nest2_1.byteValue());
assertArrayEquals(new byte[] { 0 }, nest2_1.byteValues());
assertEquals((char) 0, nest2_1.charValue());
assertArrayEquals(new char[] { 0 }, nest2_1.charValues());
assertEquals(Double.valueOf(0.0), Double.valueOf(nest2_1.doubleValue()));
assertTrue(Arrays.equals(new double[] { 0.0 }, nest2_1.doubleValues()));
assertEquals(Float.valueOf(0.0f), Float.valueOf(nest2_1.floatValue()));
assertTrue(Arrays.equals(new float[] { 0.0f }, nest2_1.floatValues()));
assertEquals(0, nest2_1.intValue());
assertArrayEquals(new int[] { 0 }, nest2_1.intValues());
assertEquals(0L, nest2_1.longValue());
assertArrayEquals(new long[] { 0L }, nest2_1.longValues());
assertEquals((short) 0, nest2_1.shortValue());
assertArrayEquals(new short[] { 0 }, nest2_1.shortValues());
assertSame(CURLY, nest2_1.stooge());
assertArrayEquals(new Stooge[] { MOE, LARRY, SHEMP }, nest2_1.stooges());
assertEquals("", nest2_1.string());
assertArrayEquals(new String[] { "" }, nest2_1.strings());
assertEquals(Object[].class, nest2_1.type());
assertArrayEquals(new Class[] { Object[].class }, nest2_1.types());
assertEquals((short) 0, anno2.shortValue());
assertArrayEquals(new short[] { 0 }, anno2.shortValues());
assertSame(SHEMP, anno2.stooge());
assertArrayEquals(new Stooge[] { MOE, LARRY, CURLY }, anno2.stooges());
assertEquals("", anno2.string());
assertArrayEquals(new String[] { "" }, anno2.strings());
assertEquals(Object.class, anno2.type());
assertArrayEquals(new Class[] { Object.class }, anno2.types());
}
@Test
public void testObjectMethods() throws IOException {
addClassForScanning(ComplexAnnotations.class);
for (final Annotated<Field> annotated : finder().withAnnotations().findAnnotatedFields(
ComplexAnnotations.TestAnnotation.class)) {
final TestAnnotation anno = annotated.getAnnotation(TestAnnotation.class);
assertFalse(anno.toString().isEmpty());
assertFalse(anno.hashCode() == 0);
assertTrue(anno.equals(anno));
}
}
@Test
public void testFindAssignableTypes() throws IOException {
addClassForScanning(TestBeanInterface.class);
addClassForScanning(AbstractTestBean.class);
addClassForScanning(TestBeanWithClassAnnotation.class);
addClassForScanning(TestBeanWithMethodAnnotation.class);
final Set<Class<?>> implementors = new HashSet<Class<?>>();
for (final Annotated<Class<?>> annotated : finder().withAnnotations().findAssignableTypes(TestBeanInterface.class)) {
implementors.add(annotated.get());
}
assertEquals(1, implementors.size());
assertTrue(implementors.contains(TestBeanWithClassAnnotation.class));
final Set<Class<?>> subclasses = new HashSet<Class<?>>();
for (final Annotated<Class<?>> annotated : finder().withAnnotations().findAssignableTypes(AbstractTestBean.class)) {
subclasses.add(annotated.get());
}
assertEquals(2, subclasses.size());
assertTrue(subclasses.contains(TestBeanWithClassAnnotation.class));
assertTrue(subclasses.contains(TestBeanWithMethodAnnotation.class));
}
@Test
public void testFindAllTypes() throws IOException {
addClassForScanning(TestBeanInterface.class);
addClassForScanning(AbstractTestBean.class);
addClassForScanning(TestBeanWithClassAnnotation.class);
addClassForScanning(TestBeanWithMethodAnnotation.class);
final List<Annotated<Class<?>>> allClasses = finder().withAnnotations().getAllClasses();
assertThat(extract(allClasses), Matchers.<Class<?>> containsInAnyOrder(TestBeanInterface.class,
AbstractTestBean.class, TestBeanWithClassAnnotation.class, TestBeanWithMethodAnnotation.class));
}
private List<Class<?>> extract(final List<Annotated<Class<?>>> input) {
Validate.noNullElements(input);
if (input.isEmpty()) {
return Collections.emptyList();
}
final List<Class<?>> result = new ArrayList<Class<?>>(input.size());
for (final Annotated<Class<?>> c : input) {
result.add(c.get());
}
return result;
}
}