2828
2929import java .lang .reflect .Field ;
3030import java .lang .reflect .Method ;
31- import java .util .List ;
32- import java .util .Map ;
31+ import java .util .*;
3332import java .util .stream .Collectors ;
3433
3534import com .github .therapi .runtimejavadoc .ClassJavadoc ;
@@ -56,6 +55,11 @@ public class SpringDocJavadocProvider implements JavadocProvider {
5655 */
5756 private final CommentFormatter formatter = new CommentFormatter ();
5857
58+ /**
59+ * The Class javadoc cache.
60+ */
61+ private final Map <Class <?>, ClassJavadoc > classJavadocCache = new HashMap <>();
62+
5963
6064 /**
6165 * Gets class description.
@@ -65,7 +69,7 @@ public class SpringDocJavadocProvider implements JavadocProvider {
6569 */
6670 @ Override
6771 public String getClassJavadoc (Class <?> cl ) {
68- ClassJavadoc classJavadoc = RuntimeJavadoc . getJavadoc (cl );
72+ ClassJavadoc classJavadoc = getJavadoc (cl );
6973 return formatter .format (classJavadoc .getComment ());
7074 }
7175
@@ -77,7 +81,7 @@ public String getClassJavadoc(Class<?> cl) {
7781 */
7882 @ Override
7983 public Map <String , String > getRecordClassParamJavadoc (Class <?> cl ) {
80- ClassJavadoc classJavadoc = RuntimeJavadoc . getJavadoc (cl );
84+ ClassJavadoc classJavadoc = getJavadoc (cl );
8185 return classJavadoc .getRecordComponents ().stream ()
8286 .collect (Collectors .toMap (ParamJavadoc ::getName , recordClass -> formatter .format (recordClass .getComment ())));
8387 }
@@ -90,7 +94,7 @@ public Map<String, String> getRecordClassParamJavadoc(Class<?> cl) {
9094 */
9195 @ Override
9296 public String getMethodJavadocDescription (Method method ) {
93- MethodJavadoc methodJavadoc = RuntimeJavadoc . getJavadoc (method );
97+ MethodJavadoc methodJavadoc = getJavadoc (method );
9498 return formatter .format (methodJavadoc .getComment ());
9599 }
96100
@@ -102,7 +106,7 @@ public String getMethodJavadocDescription(Method method) {
102106 */
103107 @ Override
104108 public String getMethodJavadocReturn (Method method ) {
105- MethodJavadoc methodJavadoc = RuntimeJavadoc . getJavadoc (method );
109+ MethodJavadoc methodJavadoc = getJavadoc (method );
106110 return formatter .format (methodJavadoc .getReturns ());
107111 }
108112
@@ -113,7 +117,7 @@ public String getMethodJavadocReturn(Method method) {
113117 * @return the method throws (name-description map)
114118 */
115119 public Map <String , String > getMethodJavadocThrows (Method method ) {
116- return RuntimeJavadoc . getJavadoc (method )
120+ return getJavadoc (method )
117121 .getThrows ()
118122 .stream ()
119123 .collect (toMap (ThrowsJavadoc ::getName , javadoc -> formatter .format (javadoc .getComment ())));
@@ -128,7 +132,7 @@ public Map<String, String> getMethodJavadocThrows(Method method) {
128132 */
129133 @ Override
130134 public String getParamJavadoc (Method method , String name ) {
131- MethodJavadoc methodJavadoc = RuntimeJavadoc . getJavadoc (method );
135+ MethodJavadoc methodJavadoc = getJavadoc (method );
132136 List <ParamJavadoc > paramsDoc = methodJavadoc .getParams ();
133137 return paramsDoc .stream ().filter (paramJavadoc1 -> name .equals (paramJavadoc1 .getName ())).findAny ()
134138 .map (paramJavadoc1 -> formatter .format (paramJavadoc1 .getComment ())).orElse (null );
@@ -142,7 +146,7 @@ public String getParamJavadoc(Method method, String name) {
142146 */
143147 @ Override
144148 public String getFieldJavadoc (Field field ) {
145- FieldJavadoc fieldJavadoc = RuntimeJavadoc . getJavadoc (field );
149+ FieldJavadoc fieldJavadoc = getJavadoc (field );
146150 return formatter .format (fieldJavadoc .getComment ());
147151 }
148152
@@ -173,4 +177,38 @@ public String getFirstSentence(String text) {
173177 }
174178 return text ;
175179 }
180+
181+ private ClassJavadoc getJavadoc (Class <?> cl ) {
182+ ClassJavadoc classJavadoc = classJavadocCache .get (cl );
183+ if (classJavadoc != null ) {
184+ return classJavadoc ;
185+ }
186+ classJavadoc = RuntimeJavadoc .getJavadoc (cl );
187+ classJavadocCache .put (cl , classJavadoc );
188+ return classJavadoc ;
189+ }
190+
191+ private MethodJavadoc getJavadoc (Method method ) {
192+ ClassJavadoc classJavadoc = getJavadoc (method .getDeclaringClass ());
193+ List <String > paramTypes = Arrays .stream (method .getParameterTypes ())
194+ .map (Class ::getCanonicalName )
195+ .toList ();
196+ return classJavadoc .getMethods ()
197+ .stream ()
198+ .filter (it -> Objects .equals (method .getName (), it .getName ()) && Objects .equals (paramTypes , it .getParamTypes ()))
199+ .findFirst ().orElseGet (() -> MethodJavadoc .createEmpty (method ));
200+ }
201+
202+ private FieldJavadoc getJavadoc (Field field ) {
203+ ClassJavadoc classJavadoc = getJavadoc (field .getDeclaringClass ());
204+ return classJavadoc .getFields ()
205+ .stream ()
206+ .filter (it -> Objects .equals (field .getName (), it .getName ()))
207+ .findFirst ().orElseGet (() -> FieldJavadoc .createEmpty (field .getName ()));
208+ }
209+
210+ @ Override
211+ public void clean () {
212+ classJavadocCache .clear ();
213+ }
176214}
0 commit comments