Skip to content

Commit

Permalink
Merge pull request MarkusBernhardt#13 from G-Ork/master
Browse files Browse the repository at this point in the history
Support nested annotations MarkusBernhardt#12
  • Loading branch information
MarkusBernhardt authored May 28, 2018
2 parents f272e76 + d3cf937 commit 6bb0cc1
Show file tree
Hide file tree
Showing 7 changed files with 164 additions and 3 deletions.
7 changes: 7 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,13 @@
<email>[email protected]</email>
</developer>
</developers>

<contributors>
<contributor>
<name>Georg Tsakumagos</name>
<email>[email protected]</email>
</contributor>
</contributors>

<dependencies>
<dependency>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,12 @@ protected AnnotationInstance parseAnnotationDesc(AnnotationDesc annotationDesc,
Object objValue = elementValuesPair.value().value();
if (objValue instanceof AnnotationValue[]) {
for (AnnotationValue annotationValue : (AnnotationValue[]) objValue) {
annotationArgumentNode.getValue().add(annotationValue.value().toString());
if (annotationValue.value() instanceof AnnotationDesc) {
AnnotationDesc annoDesc = (AnnotationDesc) annotationValue.value();
annotationArgumentNode.getAnnotation().add(parseAnnotationDesc(annoDesc, programElement));
} else {
annotationArgumentNode.getValue().add(annotationValue.value().toString());
}
}
} else if (objValue instanceof FieldDoc) {
annotationArgumentNode.getValue().add(((FieldDoc) objValue).name());
Expand Down
12 changes: 10 additions & 2 deletions src/main/xjc/javadoc.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,22 @@
<xs:complexType name="annotationArgument">
<xs:sequence>
<xs:element name="type" type="typeInfo" minOccurs="0" />
<xs:element name="value" type="xs:string" minOccurs="0"
maxOccurs="unbounded" />
<xs:choice>
<xs:element name="value" minOccurs="0" type="xs:string"
maxOccurs="unbounded" />
<xs:element name="annotation" type="annotationInstance" minOccurs="0"
maxOccurs="unbounded" />
</xs:choice>
</xs:sequence>
<xs:attribute name="name" type="xs:string" />
<xs:attribute name="primitive" type="xs:boolean" default="false" />
<xs:attribute name="array" type="xs:boolean" default="false" />
</xs:complexType>





<xs:complexType name="enum">
<xs:sequence>
<xs:element name="comment" type="xs:string" minOccurs="0" />
Expand Down
77 changes: 77 additions & 0 deletions src/test/java/com/github/markusbernhardt/xmldoclet/ClassTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

import org.junit.Test;

import com.github.markusbernhardt.xmldoclet.simpledata.Annotation3;
import com.github.markusbernhardt.xmldoclet.simpledata.AnnotationCascadeChild;
import com.github.markusbernhardt.xmldoclet.simpledata.Class1;
import com.github.markusbernhardt.xmldoclet.simpledata.Class2;
import com.github.markusbernhardt.xmldoclet.simpledata.Class3;
Expand All @@ -16,6 +18,7 @@
import com.github.markusbernhardt.xmldoclet.simpledata.Class7;
import com.github.markusbernhardt.xmldoclet.simpledata.Class8;
import com.github.markusbernhardt.xmldoclet.simpledata.Class9;
import com.github.markusbernhardt.xmldoclet.simpledata.ClassAnnotationCascade;
import com.github.markusbernhardt.xmldoclet.xjc.AnnotationArgument;
import com.github.markusbernhardt.xmldoclet.xjc.AnnotationInstance;
import com.github.markusbernhardt.xmldoclet.xjc.Class;
Expand All @@ -33,6 +36,80 @@
@SuppressWarnings("deprecation")
public class ClassTest extends AbstractTestParent {

/**
* Testing nested Annotations
* @see ClassAnnotationCascade
*/
@Test
public void testClassAnnotationCascade() {
String[] sourceFiles = new String[] { "./src/test/java/com/github/markusbernhardt/xmldoclet/simpledata/ClassAnnotationCascade.java" };
Root rootNode = executeJavadoc(null, null, null, sourceFiles, null, new String[] { "-dryrun" });

Package packageNode = rootNode.getPackage().get(0);
Class classNode = packageNode.getClazz().get(0);

assertEquals(rootNode.getPackage().size(), 1);
assertEquals(packageNode.getComment(), null);
assertEquals(packageNode.getName(), "com.github.markusbernhardt.xmldoclet.simpledata");
assertEquals(packageNode.getClazz().size(), 1);
assertEquals(packageNode.getEnum().size(), 0);
assertEquals(packageNode.getInterface().size(), 0);

assertEquals("ClassAnnotationCascade", classNode.getComment());
assertEquals("ClassAnnotationCascade", classNode.getName());

assertEquals(ClassAnnotationCascade.class.getName(), classNode.getQualified());

assertEquals(classNode.getAnnotation().size(), 1);
AnnotationInstance annotationNode = classNode.getAnnotation().get(0);

assertEquals("AnnotationCascade", annotationNode.getName() );
assertEquals(1, annotationNode.getArgument().size());

AnnotationArgument annotationArgNode = annotationNode.getArgument().get(0);

// Two nested annotations in child attribute
assertEquals("children", annotationArgNode.getName());
assertEquals(0, annotationArgNode.getValue().size());
assertEquals(2, annotationArgNode.getAnnotation().size());

AnnotationInstance annonNodePrimitive = annotationArgNode.getAnnotation().get(0);
AnnotationInstance annonNodeNested = annotationArgNode.getAnnotation().get(1);

// Equal attribs
assertEquals(AnnotationCascadeChild.class.getSimpleName(), annonNodePrimitive.getName());
assertEquals(AnnotationCascadeChild.class.getSimpleName(), annonNodeNested.getName());
assertEquals(AnnotationCascadeChild.class.getName(), annonNodePrimitive.getQualified());
assertEquals(AnnotationCascadeChild.class.getName(), annonNodeNested.getQualified());
assertEquals(2, annonNodePrimitive.getArgument().size());
assertEquals(2, annonNodeNested.getArgument().size());
assertEquals("name", annonNodePrimitive.getArgument().get(0).getName());
assertEquals("name", annonNodeNested.getArgument().get(0).getName());

// Primitive
AnnotationArgument annArgNodePrimitive = annonNodePrimitive.getArgument().get(1);
assertEquals("dummyData", annArgNodePrimitive.getName());
assertEquals("java.lang.String", annArgNodePrimitive.getType().getQualified());
assertEquals(0, annArgNodePrimitive.getAnnotation().size());
assertEquals(3, annArgNodePrimitive.getValue().size());
assertEquals("A", annArgNodePrimitive.getValue().get(0));
assertEquals("B", annArgNodePrimitive.getValue().get(1));
assertEquals("C", annArgNodePrimitive.getValue().get(2));

// Nested
AnnotationArgument annArgNodeNested = annonNodeNested.getArgument().get(1);
assertEquals("subAnnotations", annArgNodeNested.getName());
assertEquals(Annotation3.class.getName(), annArgNodeNested.getType().getQualified());
assertEquals(3, annArgNodeNested.getAnnotation().size());
assertEquals(0, annArgNodeNested.getValue().size());
assertEquals(Annotation3.class.getSimpleName(), annArgNodeNested.getAnnotation().get(0).getName());
assertEquals(Annotation3.class.getName(), annArgNodeNested.getAnnotation().get(1).getQualified());
assertEquals(1, annArgNodeNested.getAnnotation().get(2).getArgument().size());

assertEquals("666", annArgNodeNested.getAnnotation().get(2).getArgument().get(0).getValue().get(0));
}


/**
* Rigourous Parser :-)
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.github.markusbernhardt.xmldoclet.simpledata;

/**
* AnnotationCascade
*/
public @interface AnnotationCascade {
/**
* value
*
* @return ret
*/
AnnotationCascadeChild[] children();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.github.markusbernhardt.xmldoclet.simpledata;

/**
* AnnotationCascadeChild
*/
public @interface AnnotationCascadeChild {

/**
* The name.
* @return The name.
*/
public String name();

public String[] dummyData() default {} ;

public Annotation3[] subAnnotations() default {};

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.github.markusbernhardt.xmldoclet.simpledata;

/**
* ClassAnnotationCascade
*/
@AnnotationCascade(
children= {
@AnnotationCascadeChild(name="primitive",
dummyData= {"A", "B", "C"}
),
@AnnotationCascadeChild(name="nested",
subAnnotations= {
@Annotation3(id=4),
@Annotation3(id=5),
@Annotation3(id=666)

})
}
)
public class ClassAnnotationCascade implements Interface2 {

public void test() {

}

/**
* {@inheritDoc}
*/
@Override
public int method1() {
return 0;
}
}

0 comments on commit 6bb0cc1

Please sign in to comment.