1 package org.apache.commons.digester3.annotations.handlers;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.lang.reflect.AnnotatedElement;
23 import java.lang.reflect.Constructor;
24
25 import org.apache.commons.digester3.annotations.AnnotationHandler;
26 import org.apache.commons.digester3.annotations.rules.ObjectCreate;
27 import org.apache.commons.digester3.binder.ObjectCreateBuilder;
28 import org.apache.commons.digester3.binder.RulesBinder;
29
30
31
32
33
34
35 public final class ObjectCreateHandler
36 implements AnnotationHandler<ObjectCreate, AnnotatedElement>
37 {
38
39
40
41
42 public void handle( ObjectCreate annotation, AnnotatedElement element, RulesBinder rulesBinder )
43 {
44 Class<?> type = null;
45 if ( element instanceof Class<?> )
46 {
47 type = (Class<?>) element;
48 }
49 else if ( element instanceof Constructor<?> )
50 {
51 type = ( (Constructor<?>) element ).getDeclaringClass();
52 }
53 else
54 {
55 rulesBinder.addError( "Misplaced @ObjectCreate annotation to %s, Class and Constructor only supported",
56 element );
57 return;
58 }
59
60 ObjectCreateBuilder builder = rulesBinder
61 .forPattern( annotation.pattern() )
62 .withNamespaceURI( annotation.namespaceURI() )
63 .createObject()
64 .ofType( type )
65 .ofTypeSpecifiedByAttribute( annotation.attributeName() != null ? annotation.attributeName() : null );
66
67 if ( element instanceof Constructor<?> )
68 {
69 Constructor<?> method = (Constructor<?>) element;
70 builder.usingConstructor( method.getParameterTypes() );
71 }
72 }
73
74 }