Skip to content

Commit d3cf937

Browse files
committed
Support nested annotations #12
1 parent f272e76 commit d3cf937

File tree

7 files changed

+164
-3
lines changed

7 files changed

+164
-3
lines changed

pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@
4343
<email>markus.bernhardt@me.com</email>
4444
</developer>
4545
</developers>
46+
47+
<contributors>
48+
<contributor>
49+
<name>Georg Tsakumagos</name>
50+
<email>tsakumagos@gmail.com</email>
51+
</contributor>
52+
</contributors>
4653

4754
<dependencies>
4855
<dependency>

src/main/java/com/github/markusbernhardt/xmldoclet/Parser.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,12 @@ protected AnnotationInstance parseAnnotationDesc(AnnotationDesc annotationDesc,
193193
Object objValue = elementValuesPair.value().value();
194194
if (objValue instanceof AnnotationValue[]) {
195195
for (AnnotationValue annotationValue : (AnnotationValue[]) objValue) {
196-
annotationArgumentNode.getValue().add(annotationValue.value().toString());
196+
if (annotationValue.value() instanceof AnnotationDesc) {
197+
AnnotationDesc annoDesc = (AnnotationDesc) annotationValue.value();
198+
annotationArgumentNode.getAnnotation().add(parseAnnotationDesc(annoDesc, programElement));
199+
} else {
200+
annotationArgumentNode.getValue().add(annotationValue.value().toString());
201+
}
197202
}
198203
} else if (objValue instanceof FieldDoc) {
199204
annotationArgumentNode.getValue().add(((FieldDoc) objValue).name());

src/main/xjc/javadoc.xsd

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,22 @@
6464
<xs:complexType name="annotationArgument">
6565
<xs:sequence>
6666
<xs:element name="type" type="typeInfo" minOccurs="0" />
67-
<xs:element name="value" type="xs:string" minOccurs="0"
68-
maxOccurs="unbounded" />
67+
<xs:choice>
68+
<xs:element name="value" minOccurs="0" type="xs:string"
69+
maxOccurs="unbounded" />
70+
<xs:element name="annotation" type="annotationInstance" minOccurs="0"
71+
maxOccurs="unbounded" />
72+
</xs:choice>
6973
</xs:sequence>
7074
<xs:attribute name="name" type="xs:string" />
7175
<xs:attribute name="primitive" type="xs:boolean" default="false" />
7276
<xs:attribute name="array" type="xs:boolean" default="false" />
7377
</xs:complexType>
7478

79+
80+
81+
82+
7583
<xs:complexType name="enum">
7684
<xs:sequence>
7785
<xs:element name="comment" type="xs:string" minOccurs="0" />

src/test/java/com/github/markusbernhardt/xmldoclet/ClassTest.java

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import org.junit.Test;
99

10+
import com.github.markusbernhardt.xmldoclet.simpledata.Annotation3;
11+
import com.github.markusbernhardt.xmldoclet.simpledata.AnnotationCascadeChild;
1012
import com.github.markusbernhardt.xmldoclet.simpledata.Class1;
1113
import com.github.markusbernhardt.xmldoclet.simpledata.Class2;
1214
import com.github.markusbernhardt.xmldoclet.simpledata.Class3;
@@ -16,6 +18,7 @@
1618
import com.github.markusbernhardt.xmldoclet.simpledata.Class7;
1719
import com.github.markusbernhardt.xmldoclet.simpledata.Class8;
1820
import com.github.markusbernhardt.xmldoclet.simpledata.Class9;
21+
import com.github.markusbernhardt.xmldoclet.simpledata.ClassAnnotationCascade;
1922
import com.github.markusbernhardt.xmldoclet.xjc.AnnotationArgument;
2023
import com.github.markusbernhardt.xmldoclet.xjc.AnnotationInstance;
2124
import com.github.markusbernhardt.xmldoclet.xjc.Class;
@@ -33,6 +36,80 @@
3336
@SuppressWarnings("deprecation")
3437
public class ClassTest extends AbstractTestParent {
3538

39+
/**
40+
* Testing nested Annotations
41+
* @see ClassAnnotationCascade
42+
*/
43+
@Test
44+
public void testClassAnnotationCascade() {
45+
String[] sourceFiles = new String[] { "./src/test/java/com/github/markusbernhardt/xmldoclet/simpledata/ClassAnnotationCascade.java" };
46+
Root rootNode = executeJavadoc(null, null, null, sourceFiles, null, new String[] { "-dryrun" });
47+
48+
Package packageNode = rootNode.getPackage().get(0);
49+
Class classNode = packageNode.getClazz().get(0);
50+
51+
assertEquals(rootNode.getPackage().size(), 1);
52+
assertEquals(packageNode.getComment(), null);
53+
assertEquals(packageNode.getName(), "com.github.markusbernhardt.xmldoclet.simpledata");
54+
assertEquals(packageNode.getClazz().size(), 1);
55+
assertEquals(packageNode.getEnum().size(), 0);
56+
assertEquals(packageNode.getInterface().size(), 0);
57+
58+
assertEquals("ClassAnnotationCascade", classNode.getComment());
59+
assertEquals("ClassAnnotationCascade", classNode.getName());
60+
61+
assertEquals(ClassAnnotationCascade.class.getName(), classNode.getQualified());
62+
63+
assertEquals(classNode.getAnnotation().size(), 1);
64+
AnnotationInstance annotationNode = classNode.getAnnotation().get(0);
65+
66+
assertEquals("AnnotationCascade", annotationNode.getName() );
67+
assertEquals(1, annotationNode.getArgument().size());
68+
69+
AnnotationArgument annotationArgNode = annotationNode.getArgument().get(0);
70+
71+
// Two nested annotations in child attribute
72+
assertEquals("children", annotationArgNode.getName());
73+
assertEquals(0, annotationArgNode.getValue().size());
74+
assertEquals(2, annotationArgNode.getAnnotation().size());
75+
76+
AnnotationInstance annonNodePrimitive = annotationArgNode.getAnnotation().get(0);
77+
AnnotationInstance annonNodeNested = annotationArgNode.getAnnotation().get(1);
78+
79+
// Equal attribs
80+
assertEquals(AnnotationCascadeChild.class.getSimpleName(), annonNodePrimitive.getName());
81+
assertEquals(AnnotationCascadeChild.class.getSimpleName(), annonNodeNested.getName());
82+
assertEquals(AnnotationCascadeChild.class.getName(), annonNodePrimitive.getQualified());
83+
assertEquals(AnnotationCascadeChild.class.getName(), annonNodeNested.getQualified());
84+
assertEquals(2, annonNodePrimitive.getArgument().size());
85+
assertEquals(2, annonNodeNested.getArgument().size());
86+
assertEquals("name", annonNodePrimitive.getArgument().get(0).getName());
87+
assertEquals("name", annonNodeNested.getArgument().get(0).getName());
88+
89+
// Primitive
90+
AnnotationArgument annArgNodePrimitive = annonNodePrimitive.getArgument().get(1);
91+
assertEquals("dummyData", annArgNodePrimitive.getName());
92+
assertEquals("java.lang.String", annArgNodePrimitive.getType().getQualified());
93+
assertEquals(0, annArgNodePrimitive.getAnnotation().size());
94+
assertEquals(3, annArgNodePrimitive.getValue().size());
95+
assertEquals("A", annArgNodePrimitive.getValue().get(0));
96+
assertEquals("B", annArgNodePrimitive.getValue().get(1));
97+
assertEquals("C", annArgNodePrimitive.getValue().get(2));
98+
99+
// Nested
100+
AnnotationArgument annArgNodeNested = annonNodeNested.getArgument().get(1);
101+
assertEquals("subAnnotations", annArgNodeNested.getName());
102+
assertEquals(Annotation3.class.getName(), annArgNodeNested.getType().getQualified());
103+
assertEquals(3, annArgNodeNested.getAnnotation().size());
104+
assertEquals(0, annArgNodeNested.getValue().size());
105+
assertEquals(Annotation3.class.getSimpleName(), annArgNodeNested.getAnnotation().get(0).getName());
106+
assertEquals(Annotation3.class.getName(), annArgNodeNested.getAnnotation().get(1).getQualified());
107+
assertEquals(1, annArgNodeNested.getAnnotation().get(2).getArgument().size());
108+
109+
assertEquals("666", annArgNodeNested.getAnnotation().get(2).getArgument().get(0).getValue().get(0));
110+
}
111+
112+
36113
/**
37114
* Rigourous Parser :-)
38115
*/
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.github.markusbernhardt.xmldoclet.simpledata;
2+
3+
/**
4+
* AnnotationCascade
5+
*/
6+
public @interface AnnotationCascade {
7+
/**
8+
* value
9+
*
10+
* @return ret
11+
*/
12+
AnnotationCascadeChild[] children();
13+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.github.markusbernhardt.xmldoclet.simpledata;
2+
3+
/**
4+
* AnnotationCascadeChild
5+
*/
6+
public @interface AnnotationCascadeChild {
7+
8+
/**
9+
* The name.
10+
* @return The name.
11+
*/
12+
public String name();
13+
14+
public String[] dummyData() default {} ;
15+
16+
public Annotation3[] subAnnotations() default {};
17+
18+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.github.markusbernhardt.xmldoclet.simpledata;
2+
3+
/**
4+
* ClassAnnotationCascade
5+
*/
6+
@AnnotationCascade(
7+
children= {
8+
@AnnotationCascadeChild(name="primitive",
9+
dummyData= {"A", "B", "C"}
10+
),
11+
@AnnotationCascadeChild(name="nested",
12+
subAnnotations= {
13+
@Annotation3(id=4),
14+
@Annotation3(id=5),
15+
@Annotation3(id=666)
16+
17+
})
18+
}
19+
)
20+
public class ClassAnnotationCascade implements Interface2 {
21+
22+
public void test() {
23+
24+
}
25+
26+
/**
27+
* {@inheritDoc}
28+
*/
29+
@Override
30+
public int method1() {
31+
return 0;
32+
}
33+
}

0 commit comments

Comments
 (0)