Skip to content
This repository was archived by the owner on Dec 19, 2023. It is now read-only.

Commit 262c21c

Browse files
committed
support for deprecated annotation and javadoc tag
1 parent e3974e7 commit 262c21c

File tree

27 files changed

+533
-76
lines changed

27 files changed

+533
-76
lines changed

docs/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1637,7 +1637,7 @@ <h4 id="contributing-building-build"><a class="link" href="#contributing-buildin
16371637
</div>
16381638
<div id="footer">
16391639
<div id="footer-text">
1640-
Last updated 2017-10-30 09:01:48 CET
1640+
Last updated 2017-10-30 21:25:03 CET
16411641
</div>
16421642
</div>
16431643
<link rel="stylesheet" href="highlight/styles/github.min.css">

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/OperationAttributeHelper.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import capital.scalable.restdocs.constraints.ConstraintReader;
3131
import capital.scalable.restdocs.javadoc.JavadocReader;
3232
import capital.scalable.restdocs.misc.AuthorizationSnippet;
33+
import capital.scalable.restdocs.util.TemplateFormatting;
3334
import com.fasterxml.jackson.databind.ObjectMapper;
3435
import org.springframework.mock.web.MockHttpServletRequest;
3536
import org.springframework.restdocs.RestDocumentationContext;
@@ -46,9 +47,6 @@ public class OperationAttributeHelper {
4647
"org.springframework.restdocs.configuration";
4748
public static final String REQUEST_PATTERN = "REQUEST_PATTERN";
4849

49-
private static final String LINE_BREAK_ASCIIDOC = " +\n";
50-
private static final String LINE_BREAK_MARKDOWN = "<br>";
51-
5250
public static HandlerMethod getHandlerMethod(Operation operation) {
5351
Map<String, Object> attributes = operation.getAttributes();
5452
return (HandlerMethod) attributes.get(HandlerMethod.class.getName());
@@ -131,13 +129,12 @@ public static List<Snippet> getDefaultSnippets(Operation operation) {
131129
return (List<Snippet>) operation.getAttributes().get(ATTRIBUTE_NAME_DEFAULT_SNIPPETS);
132130
}
133131

134-
public static String determineForcedLineBreak(Operation operation) {
135-
return determineForcedLineBreak(getTemplateFormat(operation));
132+
public static TemplateFormatting determineTemplateFormatting(Operation operation) {
133+
return determineTemplateFormatting(getTemplateFormat(operation));
136134
}
137135

138-
// necessary until https://github.com/spring-projects/spring-restdocs/issues/351 is fixed
139-
public static String determineForcedLineBreak(TemplateFormat templateFormat) {
136+
public static TemplateFormatting determineTemplateFormatting(TemplateFormat templateFormat) {
140137
return templateFormat.getId().equals(TemplateFormats.asciidoctor().getId())
141-
? LINE_BREAK_ASCIIDOC : LINE_BREAK_MARKDOWN;
138+
? TemplateFormatting.ASCIIDOC : TemplateFormatting.MARKDOWN;
142139
}
143140
}

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/constraints/ConstraintReader.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
public interface ConstraintReader {
2424
String CONSTRAINTS_ATTRIBUTE = "constraints";
2525
String OPTIONAL_ATTRIBUTE = "optionals";
26+
String DEPRECATED_ATTRIBUTE = "deprecated";
2627

2728
List<String> getConstraintMessages(Class<?> javaBaseClass, String javaFieldName);
2829

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/constraints/ConstraintReaderImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import static capital.scalable.restdocs.constraints.ConstraintAndGroupDescriptionResolver.VALUE;
2020
import static capital.scalable.restdocs.constraints.MethodParameterValidatorConstraintResolver
2121
.CONSTRAINT_CLASS;
22-
import static capital.scalable.restdocs.util.ObjectUtil.arrayToString;
22+
import static capital.scalable.restdocs.util.FormatUtil.arrayToString;
2323
import static java.util.Collections.emptyList;
2424
import static java.util.Collections.singletonList;
2525
import static java.util.Collections.singletonMap;

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/constraints/HumanReadableConstraintResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package capital.scalable.restdocs.constraints;
1818

19-
import static capital.scalable.restdocs.util.ObjectUtil.arrayToString;
19+
import static capital.scalable.restdocs.util.FormatUtil.arrayToString;
2020
import static org.slf4j.LoggerFactory.getLogger;
2121

2222
import java.util.ArrayList;

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/jackson/FieldDocumentationVisitorContext.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,17 @@
1717
package capital.scalable.restdocs.jackson;
1818

1919
import static capital.scalable.restdocs.constraints.ConstraintReader.CONSTRAINTS_ATTRIBUTE;
20+
import static capital.scalable.restdocs.constraints.ConstraintReader.DEPRECATED_ATTRIBUTE;
2021
import static capital.scalable.restdocs.constraints.ConstraintReader.OPTIONAL_ATTRIBUTE;
2122
import static capital.scalable.restdocs.util.FieldUtil.fromGetter;
2223
import static capital.scalable.restdocs.util.FieldUtil.isGetter;
2324
import static capital.scalable.restdocs.util.TypeUtil.isPrimitive;
2425
import static org.apache.commons.lang3.StringUtils.isBlank;
26+
import static org.apache.commons.lang3.StringUtils.isNotBlank;
2527
import static org.slf4j.LoggerFactory.getLogger;
2628
import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
2729

30+
import java.lang.reflect.Field;
2831
import java.util.ArrayList;
2932
import java.util.List;
3033

@@ -35,6 +38,7 @@
3538
import org.slf4j.Logger;
3639
import org.springframework.restdocs.payload.FieldDescriptor;
3740
import org.springframework.restdocs.snippet.Attributes.Attribute;
41+
import org.springframework.util.ReflectionUtils;
3842

3943
class FieldDocumentationVisitorContext {
4044
private static final Logger log = getLogger(FieldDocumentationVisitorContext.class);
@@ -74,7 +78,8 @@ public void addField(InternalFieldInfo info, String jsonType) {
7478

7579
Attribute constraints = constraintAttribute(javaBaseClass, javaFieldName);
7680
Attribute optionals = optionalAttribute(javaBaseClass, javaFieldName);
77-
fieldDescriptor.attributes(constraints, optionals);
81+
Attribute deprecated = deprecatedAttribute(javaBaseClass, javaFieldName);
82+
fieldDescriptor.attributes(constraints, optionals, deprecated);
7883

7984
fields.add(fieldDescriptor);
8085
log.debug("({}) {} added", jsonFieldPath, javaFieldTypeName);
@@ -116,6 +121,11 @@ private Attribute optionalAttribute(Class<?> javaBaseClass, String javaFieldName
116121
resolveOptionalMessages(javaBaseClass, javaFieldName));
117122
}
118123

124+
private Attribute deprecatedAttribute(Class<?> javaBaseClass, String javaFieldName) {
125+
return new Attribute(DEPRECATED_ATTRIBUTE,
126+
resolveDeprecatedMessage(javaBaseClass, javaFieldName));
127+
}
128+
119129
private List<String> resolveOptionalMessages(Class<?> javaBaseClass, String javaFieldName) {
120130
List<String> optionalMessages = new ArrayList<>();
121131

@@ -156,4 +166,13 @@ private List<String> resolveConstraintDescriptions(Class<?> javaBaseClass,
156166

157167
return descriptions;
158168
}
169+
170+
private String resolveDeprecatedMessage(Class<?> javaBaseClass, String javaFieldName) {
171+
Field field = ReflectionUtils.findField(javaBaseClass, javaFieldName);
172+
boolean isDeprecated = field == null
173+
? false
174+
: field.getAnnotation(Deprecated.class) != null;
175+
String comment = javadocReader.resolveFieldTag(javaBaseClass, javaFieldName, "deprecated");
176+
return isDeprecated || isNotBlank(comment) ? comment : null;
177+
}
159178
}

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/javadoc/ClassJavadoc.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package capital.scalable.restdocs.javadoc;
1818

19-
import static org.springframework.util.StringUtils.hasText;
19+
import static org.apache.commons.lang3.StringUtils.trimToEmpty;
2020

2121
import java.util.HashMap;
2222
import java.util.Map;
@@ -75,10 +75,6 @@ public String getFieldTag(String javaFieldName, String tagName) {
7575
}
7676
}
7777

78-
private static String trimToEmpty(String value) {
79-
return hasText(value) ? value : "";
80-
}
81-
8278
static class MethodJavadoc {
8379
private String comment;
8480
private Map<String, String> parameters = new HashMap<>();

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/javadoc/JavadocUtil.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package capital.scalable.restdocs.javadoc;
22

3+
import capital.scalable.restdocs.util.TemplateFormatting;
4+
35
public class JavadocUtil {
46
private static String FORCED_LB = "__FLB__";
57
private static String LB = "__LB__";
@@ -8,7 +10,7 @@ private JavadocUtil() {
810
// util
911
}
1012

11-
public static String convertFromJavadoc(String javadoc, String forcedLineBreak) {
13+
public static String convertFromJavadoc(String javadoc, TemplateFormatting templateFormatting) {
1214
String converted = javadoc.toString()
1315
// line breaks in javadoc are ignored
1416
.replace("\n", "")
@@ -21,13 +23,17 @@ public static String convertFromJavadoc(String javadoc, String forcedLineBreak)
2123
.replace("<ul>", LB)
2224
.replace("</ul>", LB + LB)
2325
.replace("<li>", LB + "- ")
24-
.replace("</li>", "");
26+
.replace("</li>", "")
27+
.replace("<b>", templateFormatting.getBold())
28+
.replace("</b>", templateFormatting.getBold())
29+
.replace("<i>", templateFormatting.getItalics())
30+
.replace("</i>", templateFormatting.getItalics());
2531

2632
if (converted.isEmpty()) {
2733
return "";
2834
}
2935

30-
String res = trimAndFixLineBreak(converted, FORCED_LB, forcedLineBreak);
36+
String res = trimAndFixLineBreak(converted, FORCED_LB, templateFormatting.getLineBreak());
3137
res = trimAndFixLineBreak(res, LB, "\n");
3238
return res.toString();
3339
}

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/misc/DescriptionSnippet.java

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@
1616

1717
package capital.scalable.restdocs.misc;
1818

19-
import static capital.scalable.restdocs.OperationAttributeHelper.determineForcedLineBreak;
19+
import static capital.scalable.restdocs.OperationAttributeHelper.determineTemplateFormatting;
2020
import static capital.scalable.restdocs.OperationAttributeHelper.getHandlerMethod;
2121
import static capital.scalable.restdocs.OperationAttributeHelper.getJavadocReader;
2222
import static capital.scalable.restdocs.javadoc.JavadocUtil.convertFromJavadoc;
23+
import static capital.scalable.restdocs.util.FormatUtil.addDot;
24+
import static org.apache.commons.lang3.StringUtils.capitalize;
25+
import static org.apache.commons.lang3.StringUtils.isNotBlank;
2326

2427
import java.util.HashMap;
2528
import java.util.Map;
@@ -46,14 +49,31 @@ protected Map<String, Object> createModel(Operation operation) {
4649
}
4750

4851
JavadocReader javadocReader = getJavadocReader(operation);
52+
String methodComment = resolveComment(handlerMethod, javadocReader);
53+
String deprecated = resolveDeprecated(handlerMethod, javadocReader);
54+
String description = convertFromJavadoc(deprecated + methodComment,
55+
determineTemplateFormatting(operation));
4956

50-
String methodComment = javadocReader.resolveMethodComment(handlerMethod.getBeanType(),
51-
handlerMethod.getMethod().getName());
57+
model.put("description", description);
58+
return model;
59+
}
5260

53-
methodComment = convertFromJavadoc(methodComment, determineForcedLineBreak(operation));
61+
private String resolveDeprecated(HandlerMethod handlerMethod, JavadocReader javadocReader) {
62+
boolean isDeprecated = handlerMethod.getMethod().getAnnotation(Deprecated.class) != null;
63+
String comment = javadocReader.resolveMethodTag(handlerMethod.getBeanType(),
64+
handlerMethod.getMethod().getName(), "deprecated");
65+
if (isDeprecated || isNotBlank(comment)) {
66+
comment = capitalize(addDot(comment));
67+
return "<b>Deprecated.</b> " + comment + "<p>";
68+
} else {
69+
return "";
70+
}
71+
}
5472

55-
model.put("description", methodComment);
56-
return model;
73+
private String resolveComment(HandlerMethod handlerMethod, JavadocReader javadocReader) {
74+
String methodComment = javadocReader.resolveMethodComment(handlerMethod.getBeanType(),
75+
handlerMethod.getMethod().getName());
76+
return capitalize(addDot(methodComment));
5777
}
5878

5979
private Map<String, Object> defaultModel() {

spring-auto-restdocs-core/src/main/java/capital/scalable/restdocs/request/AbstractParameterSnippet.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static capital.scalable.restdocs.OperationAttributeHelper.getHandlerMethod;
2121
import static capital.scalable.restdocs.OperationAttributeHelper.getJavadocReader;
2222
import static capital.scalable.restdocs.constraints.ConstraintReader.CONSTRAINTS_ATTRIBUTE;
23+
import static capital.scalable.restdocs.constraints.ConstraintReader.DEPRECATED_ATTRIBUTE;
2324
import static capital.scalable.restdocs.constraints.ConstraintReader.OPTIONAL_ATTRIBUTE;
2425
import static capital.scalable.restdocs.util.FieldDescriptorUtil.assertAllDocumented;
2526
import static capital.scalable.restdocs.util.TypeUtil.determineTypeName;
@@ -88,7 +89,8 @@ private void addFieldDescriptor(HandlerMethod handlerMethod,
8889

8990
Attribute constraints = constraintAttribute(param, constraintReader);
9091
Attribute optionals = optionalsAttribute(param, annot);
91-
descriptor.attributes(constraints, optionals);
92+
Attribute deprecated = deprecatedAttribute(param, annot, javadocReader);
93+
descriptor.attributes(constraints, optionals, deprecated);
9294

9395
fieldDescriptors.add(descriptor);
9496
}
@@ -102,6 +104,12 @@ protected Attribute optionalsAttribute(MethodParameter param, A annot) {
102104
return new Attribute(OPTIONAL_ATTRIBUTE, singletonList(!isRequired(param, annot)));
103105
}
104106

107+
protected Attribute deprecatedAttribute(MethodParameter param, A annot,
108+
JavadocReader javadocReader) {
109+
return new Attribute(DEPRECATED_ATTRIBUTE,
110+
param.getParameterAnnotation(Deprecated.class) != null ? "" : null);
111+
}
112+
105113
protected abstract boolean isRequired(MethodParameter param, A annot);
106114

107115
protected abstract String getPath(A annot);

0 commit comments

Comments
 (0)