blob: fb534b54122cf07a99700fe8f16b6faea1ca15c3 [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.webbeans.test.configurator;
import org.apache.webbeans.test.AbstractUnitTest;
import org.junit.Assert;
import org.junit.Test;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.AnnotatedMethod;
import javax.enterprise.inject.spi.AnnotatedParameter;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.Extension;
import javax.enterprise.inject.spi.ProcessAnnotatedType;
import javax.enterprise.inject.spi.ProcessBeanAttributes;
import javax.enterprise.util.AnnotationLiteral;
import javax.inject.Qualifier;
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import static junit.framework.TestCase.assertNotNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class AnnotatedTypeConfiguratorImplTest extends AbstractUnitTest
{
@Test
public void testAddAnnotationToClass()
{
checkAnnotatedType(
pat -> pat.configureAnnotatedType().add(new TheQualifierLiteral("type")),
pba ->
{
Set<Annotation> annotations = pba.getAnnotated().getAnnotations();
assertEquals(1, annotations.size());
assertEquals(TheQualifier.class, annotations.iterator().next().annotationType());
assertTrue(pba.getAnnotated() instanceof AnnotatedType);
AnnotatedMethod<? super AnnotatedTypeConfigClass> methodWithParameters = ((AnnotatedType<AnnotatedTypeConfigClass>) pba.getAnnotated()).getMethods().stream()
.filter(am -> am.getJavaMember().getName().equals("methodWithParameters"))
.findFirst().get();
TheQualifier param1Annotation = methodWithParameters.getParameters().stream()
.filter(ap -> ap.getPosition() == 0)
.findFirst().get().getAnnotation(TheQualifier.class);
assertNotNull(param1Annotation);
assertEquals("blub", param1Annotation.value());
},
AnnotatedTypeConfigClass.class);
}
@Test
public void testAddAnnotationToClass_classAlreadyContainsAnnotations()
{
checkAnnotatedType(
pat -> pat.configureAnnotatedType().add(new TheQualifierLiteral("type")),
pba ->
{
Set<Annotation> annotations = pba.getAnnotated().getAnnotations();
assertEquals(2, annotations.size());
},
AnnotatedTypeConfigClassWithAnnotation.class);
}
@Test
public void testRemoveAnnotation()
{
checkAnnotatedType(
pat -> pat.configureAnnotatedType().add(new TheQualifierLiteral("one"))
.add(new TheQualifierLiteral("two"))
.remove(a -> ((TheQualifier) a).value().equals("two")),
pba ->
{
Set<Annotation> annotations = pba.getAnnotated().getAnnotations();
assertEquals(1, annotations.size());
Annotation annotation = annotations.iterator().next();
assertEquals(TheQualifier.class, annotation.annotationType());
assertEquals("one", ((TheQualifier) annotation).value());
},
AnnotatedTypeConfigClass.class);
}
@Test
public void testRemoveAnnotation_classAlreadyContainsAnnotations()
{
checkAnnotatedType(
pat -> pat.configureAnnotatedType().add(new TheQualifierLiteral("one"))
.remove(a -> ((TheQualifier) a).value().equals("one")),
pba ->
{
Set<Annotation> annotations = pba.getAnnotated().getAnnotations();
assertEquals(2, annotations.size());
},
AnnotatedTypeConfigClassWithAnnotation.class);
}
@Test
public void testRemoveAllAnnotations()
{
checkAnnotatedType(
pat -> pat.configureAnnotatedType().add(new TheQualifierLiteral("one"))
.add(new TheQualifierLiteral("two"))
.removeAll(),
pba ->
{
Set<Annotation> annotations = pba.getAnnotated().getAnnotations();
assertTrue(annotations.isEmpty());
},
AnnotatedTypeConfigClass.class);
}
@Test
public void testRemoveAllAnnotations_classAlreadyContainsAnnotations()
{
checkAnnotatedType(
pat -> pat.configureAnnotatedType().removeAll(),
pba ->
{
Set<Annotation> annotations = pba.getAnnotated().getAnnotations();
assertTrue(annotations.isEmpty());
},
AnnotatedTypeConfigClass.class);
}
@Test
public void testAddAnnotationToMethod()
{
checkAnnotatedType(
pat ->
{
pat.configureAnnotatedType()
.filterMethods(m -> m.getJavaMember().getName().equals("method1"))
.findFirst()
.get()
.add(new TheQualifierLiteral("Method1"));
},
pba ->
{
Assert.assertTrue(pba.getAnnotated() instanceof AnnotatedType);
AnnotatedType<?> at = (AnnotatedType<?>) pba.getAnnotated();
Set<Annotation> annotations = at.getMethods().stream()
.filter(m -> m.getJavaMember().getName().equals("method1"))
.findFirst()
.get().getAnnotations();
assertEquals(1, annotations.size());
Annotation ann = annotations.iterator().next();
assertEquals(TheQualifier.class, ann.annotationType());
assertEquals("Method1", ((TheQualifier) ann).value());
}, AnnotatedTypeConfigClass.class);
}
@Test
public void testRemoveAnnotationFromMethod()
{
final String methodName = "method2";
checkAnnotatedType(
pat -> pat.configureAnnotatedType()
.filterMethods(m -> methodName.equals(m.getJavaMember().getName()))
.findFirst()
.get()
.removeAll(),
pba -> assertTrue(((AnnotatedType<?>) pba.getAnnotated()).getMethods()
.stream()
.filter(m -> methodName.equals(m.getJavaMember().getName()))
.findFirst()
.get()
.getAnnotations()
.isEmpty()),
AnnotatedTypeConfigClassWithAnnotation.class);
}
@Test
public void testAddAnnotationToField()
{
checkAnnotatedType(
pat ->
{
pat.configureAnnotatedType()
.filterFields(m -> m.getJavaMember().getName().equals("field1"))
.findFirst()
.get()
.add(new TheQualifierLiteral("Field1"));
},
pba ->
{
Assert.assertTrue(pba.getAnnotated() instanceof AnnotatedType);
AnnotatedType<?> at = (AnnotatedType<?>) pba.getAnnotated();
Set<Annotation> annotations = at.getFields().stream()
.filter(m -> m.getJavaMember().getName().equals("field1"))
.findFirst()
.get().getAnnotations();
assertEquals(1, annotations.size());
Annotation ann = annotations.iterator().next();
assertEquals(TheQualifier.class, ann.annotationType());
assertEquals("Field1", ((TheQualifier) ann).value());
}, AnnotatedTypeConfigClass.class);
}
@Test
public void testRemoveAnnotationFromField()
{
checkAnnotatedType(pat -> pat.configureAnnotatedType()
.filterFields(af -> "field2".equals(af.getJavaMember().getName()))
.forEach(c -> c.remove(a -> a.annotationType() == TheQualifier.class)),
pba ->
{
Assert.assertTrue(pba.getAnnotated() instanceof AnnotatedType);
assertTrue(((AnnotatedType<?>) pba.getAnnotated()).getFields()
.stream()
.filter(m -> m.getJavaMember().getName().equals("field2"))
.findFirst()
.get()
.getAnnotations()
.isEmpty());
},
AnnotatedTypeConfigClassWithAnnotation.class);
}
private void checkAnnotatedType(Consumer<ProcessAnnotatedType<AnnotatedTypeConfigClass>> typeConfigurator,
Consumer<ProcessBeanAttributes> beanAttributesConsumer,
Class<?> classToCheck)
{
AnnotatedTypeConfiguratorExtension extension
= new AnnotatedTypeConfiguratorExtension(typeConfigurator,beanAttributesConsumer);
addExtension(extension);
startContainer(classToCheck);
shutdown();
}
public static class AnnotatedTypeConfiguratorExtension implements Extension
{
private final Consumer<ProcessAnnotatedType<AnnotatedTypeConfigClass>> typeConfigurator;
private final Consumer<ProcessBeanAttributes> beanAttributesConsumer;
AnnotatedTypeConfiguratorExtension(Consumer<ProcessAnnotatedType<AnnotatedTypeConfigClass>> typeConfigurator,
Consumer<ProcessBeanAttributes> beanAttributesConsumer)
{
this.typeConfigurator = typeConfigurator;
this.beanAttributesConsumer = beanAttributesConsumer;
}
public void createAnnotatedType(@Observes ProcessAnnotatedType<AnnotatedTypeConfigClass> pat)
{
typeConfigurator.accept(pat);
}
public void getCreatedAnnotatedType(@Observes ProcessBeanAttributes<AnnotatedTypeConfigClass> pba)
{
beanAttributesConsumer.accept(pba);
}
}
public static class AnnotatedTypeConfigClass
{
private String field1;
private Integer field2;
public void method1()
{
// do nothing
}
public String method2()
{
return "method 2";
}
public String methodWithParameters(@TheQualifier("blub") String param1, Integer param2)
{
return "parameters: " + param1 + ", " + param2;
}
}
@TheQualifier(value = "default")
public static class AnnotatedTypeConfigClassWithAnnotation
{
@TheQualifier(value = "default_field1")
private String field1;
@TheQualifier(value = "default_field2")
private Integer field2;
@TheQualifier(value = "default_method1")
public void method1()
{
// do nothing
}
@TheQualifier(value = "default_method2")
public String method2()
{
return "method 2";
}
@TheQualifier(value = "default_methodWithParameters")
public String methodWithParameters(String param1, String param2)
{
return "parameters: " + param1 + ", " + param2;
}
public void methodWithAnnotatedParameters(@TheQualifier(value = "default_param1") String param1,
@TheQualifier(value = "default_param2") Integer param2)
{
// nothing to do here
}
}
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.ANNOTATION_TYPE})
public @interface TheQualifier
{
String value();
}
public static class TheQualifierLiteral extends AnnotationLiteral<TheQualifier> implements TheQualifier
{
private final String value;
TheQualifierLiteral(String value)
{
this.value = value;
}
public String value()
{
return value;
}
}
}