1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.proxy2.stub;
19
20 import java.lang.annotation.Annotation;
21
22 import org.apache.commons.proxy2.interceptor.InterceptorUtils;
23
24 public abstract class BaseAnnotationTrainer<S extends BaseAnnotationTrainer<S, A>, A extends Annotation> extends
25 BaseTrainer<S, A>
26 {
27 protected BaseAnnotationTrainer()
28 {
29 super();
30 }
31
32 protected BaseAnnotationTrainer(Class<A> traineeType)
33 {
34 super(traineeType);
35 }
36
37 protected class WhenAnnotation<R> extends WhenObject<R>
38 {
39 public S thenStub(Class<R> type)
40 {
41 trainingContext().push(type);
42 trainingContext().then(InterceptorUtils.constant(trainingContext().pop(AnnotationInvoker.INSTANCE)));
43 return self();
44 }
45
46 @Override
47 public S thenStub(BaseTrainer<?, R> trainer)
48 {
49 final R trainee = trainingContext().push(trainer.traineeType);
50 trainer.train(trainee);
51 trainingContext().then(InterceptorUtils.constant(trainingContext().pop(AnnotationInvoker.INSTANCE)));
52 return self();
53 }
54 }
55
56 protected class WhenAnnotationArray<R> extends WhenObjectArray<R>
57 {
58 protected WhenAnnotationArray(Class<? extends R> componentType)
59 {
60 super(componentType);
61 }
62
63 @Override
64 public StubAnnotationArrayBuilder<R> thenBuildArray()
65 {
66 return new StubAnnotationArrayBuilder<R>(componentType);
67 }
68 }
69
70 protected class StubAnnotationArrayBuilder<R> extends StubArrayBuilder<R>
71 {
72 private final BaseTrainer<?, R> annotationTypeTrainer;
73
74 private <N extends Annotation> StubAnnotationArrayBuilder(final Class<? extends R> componentType)
75 {
76 super(componentType);
77
78
79
80
81
82
83 @SuppressWarnings("unchecked")
84 final Class<N> annotationType = (Class<N>) componentType;
85 @SuppressWarnings("unchecked")
86 final BaseTrainer<?, R> trainer = (BaseTrainer<?, R>) new AnnotationTypeTrainer<N>(
87 annotationType);
88 this.annotationTypeTrainer = trainer;
89 }
90
91 @Override
92 public StubAnnotationArrayBuilder<R> addElement(BaseTrainer<?, R> trainer)
93 {
94 final R trainee = trainingContext().push(trainer.traineeType);
95
96 annotationTypeTrainer.train(trainee);
97 trainer.train(trainee);
98
99 elements.add(trainingContext().<R> pop());
100 return this;
101 }
102 }
103
104 @Override
105 public <R> WhenAnnotation<R> when(R expression)
106 {
107 return new WhenAnnotation<R>();
108 }
109
110 @Override
111 public <R> WhenAnnotationArray<R> when(R[] expression)
112 {
113 @SuppressWarnings("unchecked")
114 final Class<? extends R> componentType = (Class<? extends R>) expression.getClass().getComponentType();
115 return new WhenAnnotationArray<R>(componentType);
116 }
117 }