Skip to content

Commit c117572

Browse files
author
Thomas Stieglmaier
committed
first draft for public only changes
1 parent 1201532 commit c117572

File tree

9 files changed

+123
-60
lines changed

9 files changed

+123
-60
lines changed

src/main/java/com/manoelcampos/javadoc/coverage/CoverageDoclet.java

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@
1515
*/
1616
package com.manoelcampos.javadoc.coverage;
1717

18+
import java.io.File;
19+
import java.io.FileNotFoundException;
20+
import java.io.FileOutputStream;
21+
import java.io.OutputStreamWriter;
22+
import java.io.PrintWriter;
23+
1824
import com.manoelcampos.javadoc.coverage.exporter.ConsoleExporter;
1925
import com.manoelcampos.javadoc.coverage.exporter.DataExporter;
2026
import com.manoelcampos.javadoc.coverage.exporter.HtmlExporter;
@@ -24,8 +30,6 @@
2430
import com.sun.javadoc.RootDoc;
2531
import com.sun.tools.doclets.standard.Standard;
2632

27-
import java.io.*;
28-
2933
/**
3034
* A {@link Doclet} that computes coverage of JavaDoc documentation.
3135
* It is the entry point for the JavaDoc Tool, which can be executed
@@ -49,12 +53,20 @@ public class CoverageDoclet {
4953
*/
5054
public static final String OUTPUT_NAME_OPTION[] = {"-outputName", "-o"};
5155

56+
/**
57+
* A command line parameter to enable coverage reports only for certain visibility modifiers. The first value is the long version of the
58+
* parameter name and the second is the short one. Values for this option are public (only public stuff is used) and private (everything
59+
* is used)
60+
*/
61+
public static final String COVERAGE_ONLY_FOR_PUBLIC_OPTION[] = { "-modifiers", "-m" };
62+
5263
/**
5364
* The {@link DataExporter} object to export the coverage report to a file
5465
* in a specific format.
5566
*/
5667
private final DataExporter exporter;
5768
private final RootDoc rootDoc;
69+
private final boolean computeOnlyForPublicModifier;
5870

5971
/**
6072
* Starts the actual parsing or JavaDoc documentation and generation of the coverage report.
@@ -75,16 +87,23 @@ public static boolean start(final RootDoc rootDoc) {
7587
*/
7688
public CoverageDoclet(final RootDoc rootDoc) {
7789
this.rootDoc = rootDoc;
90+
computeOnlyForPublicModifier = "public".equals(getOptionValue(COVERAGE_ONLY_FOR_PUBLIC_OPTION));
91+
92+
// this needs to be the last part as it already accesses some stuff from the doclet
7893
this.exporter = new HtmlExporter(this);
7994
}
8095

96+
public final boolean computeOnlyForPublicModifier() {
97+
return computeOnlyForPublicModifier;
98+
}
99+
81100
/**
82101
* Checks if a given parameter is a valid custom parameter accepted by this doclet.
83102
* @param paramName the name of the parameter to check
84103
* @return true if it's a valid custom parameter, false otherwise
85104
*/
86105
private static boolean isCustomParameter(final String paramName) {
87-
return isParameter(paramName, OUTPUT_NAME_OPTION);
106+
return isParameter(paramName, OUTPUT_NAME_OPTION) || isParameter(paramName, COVERAGE_ONLY_FOR_PUBLIC_OPTION);
88107
}
89108

90109
/**
@@ -131,7 +150,7 @@ public static boolean validOptions(final String[][] options, final DocErrorRepor
131150
*/
132151
public static int optionLength(final String option) {
133152
/*The custom outputName parameter accepts one argument.
134-
* The name of the param counts as the one argument.*/
153+
* The name of the param counts as the one argument.*/
135154
if (isCustomParameter(option)) {
136155
return 2;
137156
}
@@ -148,14 +167,14 @@ public static int optionLength(final String option) {
148167
* @return the values associated to the option, where the 0th element is the option itself;
149168
* or an empty array if the option is invalid.
150169
*/
151-
public String[] getOptionValues(final String[] optionNames) {
170+
public String getOptionValue(final String[] optionNames) {
152171
for (final String[] optionValues : rootDoc.options()) {
153172
if (isParameter(optionValues[0], optionNames)) {
154-
return optionValues;
173+
return optionValues[1];
155174
}
156175
}
157176

158-
return new String[]{};
177+
return null;
159178
}
160179

161180
/**
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.manoelcampos.javadoc.coverage;
2+
3+
public enum VisibilityToCheck {
4+
PUBLIC, PRIVATE;
5+
}

src/main/java/com/manoelcampos/javadoc/coverage/exporter/AbstractDataExporter.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515
*/
1616
package com.manoelcampos.javadoc.coverage.exporter;
1717

18-
import com.manoelcampos.javadoc.coverage.CoverageDoclet;
19-
import com.manoelcampos.javadoc.coverage.Utils;
20-
import com.manoelcampos.javadoc.coverage.stats.JavaDocsStats;
21-
2218
import java.io.File;
2319
import java.io.FileNotFoundException;
2420
import java.io.PrintWriter;
2521

22+
import com.manoelcampos.javadoc.coverage.CoverageDoclet;
23+
import com.manoelcampos.javadoc.coverage.Utils;
24+
import com.manoelcampos.javadoc.coverage.stats.JavaDocsStats;
25+
2626
/**
2727
* Abstract class to implement JavaDoc Coverage reports in different formats.
2828
* Each sub-class should implement a specific format such as HTML, CSV, JSON, etc.
@@ -58,7 +58,7 @@ protected AbstractDataExporter(final CoverageDoclet doclet, final String fileExt
5858
}
5959
}
6060

61-
this.stats = new JavaDocsStats(doclet.getRootDoc());
61+
this.stats = new JavaDocsStats(doclet.getRootDoc(), doclet.computeOnlyForPublicModifier());
6262
}
6363

6464
/**
@@ -85,8 +85,8 @@ private String generateReportFileName(final String fileExtension) {
8585
* @see CoverageDoclet#OUTPUT_NAME_OPTION
8686
*/
8787
private String getFileNameFromCommandLine() {
88-
final String[] outputNameOption = doclet.getOptionValues(CoverageDoclet.OUTPUT_NAME_OPTION);
89-
return outputNameOption.length > 1 ? outputNameOption[1] : DEFAULT_OUTPUT_NAME;
88+
final String outputNameOption = doclet.getOptionValue(CoverageDoclet.OUTPUT_NAME_OPTION);
89+
return outputNameOption != null ? outputNameOption : DEFAULT_OUTPUT_NAME;
9090
}
9191

9292
/**

src/main/java/com/manoelcampos/javadoc/coverage/exporter/HtmlExporter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@
1515
*/
1616
package com.manoelcampos.javadoc.coverage.exporter;
1717

18+
import java.util.List;
19+
1820
import com.manoelcampos.javadoc.coverage.CoverageDoclet;
1921
import com.manoelcampos.javadoc.coverage.Utils;
2022
import com.manoelcampos.javadoc.coverage.stats.ClassDocStats;
2123
import com.manoelcampos.javadoc.coverage.stats.MembersDocStats;
2224
import com.manoelcampos.javadoc.coverage.stats.MethodDocStats;
2325
import com.sun.javadoc.PackageDoc;
2426

25-
import java.util.List;
26-
2727
/**
2828
* Exports the JavaDoc coverage report to an HTML file.
2929
*

src/main/java/com/manoelcampos/javadoc/coverage/stats/ClassDocStats.java

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,17 @@
1515
*/
1616
package com.manoelcampos.javadoc.coverage.stats;
1717

18-
import com.manoelcampos.javadoc.coverage.Utils;
19-
import com.sun.javadoc.*;
20-
2118
import java.util.ArrayList;
2219
import java.util.Collections;
2320
import java.util.List;
2421

22+
import com.manoelcampos.javadoc.coverage.Utils;
23+
import com.sun.javadoc.AnnotationTypeDoc;
24+
import com.sun.javadoc.AnnotationTypeElementDoc;
25+
import com.sun.javadoc.ClassDoc;
26+
import com.sun.javadoc.ConstructorDoc;
27+
import com.sun.javadoc.MethodDoc;
28+
2529
/**
2630
* Computes statistics about the JavaDocs of a class, inner class, interface or enum
2731
* and its members, such as: fields, methods, constructors and annotations.
@@ -46,34 +50,40 @@ public class ClassDocStats extends MembersDocStats {
4650
private List<MethodDocStats> methodsStats;
4751
private List<MethodDocStats> constructorsStats;
4852

49-
public ClassDocStats(final ClassDoc doc) {
53+
public ClassDocStats(final ClassDoc doc, boolean computeOnlyForPublic) {
5054
this.doc = doc;
51-
fieldsStats = new ClassMembersDocStats(doc.fields(false), "Fields");
52-
enumsStats = new ClassMembersDocStats(doc.enumConstants(), "Enum Consts");
53-
processMethodsDocsStats(doc);
54-
processConstructorsDocsStats(doc);
55-
processAnnotationsDocsStats(doc);
55+
fieldsStats = new ClassMembersDocStats(doc.fields(false), "Fields", computeOnlyForPublic);
56+
enumsStats = new ClassMembersDocStats(doc.enumConstants(), "Enum Consts", computeOnlyForPublic);
57+
processMethodsDocsStats(doc, computeOnlyForPublic);
58+
processConstructorsDocsStats(doc, computeOnlyForPublic);
59+
processAnnotationsDocsStats(doc, computeOnlyForPublic);
5660
}
5761

58-
private void processAnnotationsDocsStats(ClassDoc doc) {
62+
private void processAnnotationsDocsStats(ClassDoc doc, boolean computeOnlyForPublic) {
5963
if (doc instanceof AnnotationTypeDoc) {
60-
annotationsStats = new ClassMembersDocStats(((AnnotationTypeDoc) doc).elements(), "Annotations");
61-
} else annotationsStats = new ClassMembersDocStats(new AnnotationTypeElementDoc[0], "Annotations");
64+
annotationsStats = new ClassMembersDocStats(((AnnotationTypeDoc) doc).elements(), "Annotations", computeOnlyForPublic);
65+
} else {
66+
annotationsStats = new ClassMembersDocStats(new AnnotationTypeElementDoc[0], "Annotations", computeOnlyForPublic);
67+
}
6268
}
6369

64-
private void processConstructorsDocsStats(ClassDoc doc) {
70+
private void processConstructorsDocsStats(ClassDoc doc, boolean computeOnlyForPublic) {
6571
final ConstructorDoc[] constructors = doc.constructors(false);
66-
constructorsStats = new ArrayList<>(constructors.length);
72+
constructorsStats = new ArrayList<>();
6773
for (final ConstructorDoc constructor : constructors) {
68-
constructorsStats.add(new MethodDocStats(constructor));
74+
if (!computeOnlyForPublic || constructor.isPublic()) {
75+
constructorsStats.add(new MethodDocStats(constructor));
76+
}
6977
}
7078
}
7179

72-
private void processMethodsDocsStats(ClassDoc doc) {
80+
private void processMethodsDocsStats(ClassDoc doc, boolean computeOnlyForPublic) {
7381
final MethodDoc[] methods = doc.methods(false);
74-
methodsStats = new ArrayList<>(methods.length);
82+
methodsStats = new ArrayList<>();
7583
for (final MethodDoc method : methods) {
76-
methodsStats.add(new MethodDocStats(method));
84+
if (!computeOnlyForPublic || method.isPublic()) {
85+
methodsStats.add(new MethodDocStats(method));
86+
}
7787
}
7888
}
7989

src/main/java/com/manoelcampos/javadoc/coverage/stats/ClassMembersDocStats.java

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,14 @@
1515
*/
1616
package com.manoelcampos.javadoc.coverage.stats;
1717

18-
import com.manoelcampos.javadoc.coverage.Utils;
19-
import com.sun.javadoc.Doc;
20-
2118
import java.util.Arrays;
2219
import java.util.Objects;
20+
import java.util.function.Predicate;
21+
22+
import com.manoelcampos.javadoc.coverage.Utils;
23+
import com.sun.javadoc.ClassDoc;
24+
import com.sun.javadoc.Doc;
25+
import com.sun.javadoc.ProgramElementDoc;
2326

2427
/**
2528
* Computes JavaDoc coverage statistics for specific type of members belonging to an owner.
@@ -35,17 +38,22 @@ public class ClassMembersDocStats extends MembersDocStats {
3538
*/
3639
private final Doc[] membersDocs;
3740
private final String membersType;
41+
private final boolean computeOnlyForPublic;
3842

3943
/**
40-
* Instantiates an object to compute JavaDoc coverage statistics
41-
* for the members of a class, interface or enum.
44+
* Instantiates an object to compute JavaDoc coverage statistics for the members of a class, interface or enum.
4245
*
43-
* @param membersDocs the JavaDoc documentation for the members of the owner.
44-
* @param membersType the type of the members of the owner to compute JavaDoc coverage statistics.
46+
* @param membersDocs
47+
* the JavaDoc documentation for the members of the owner.
48+
* @param membersType
49+
* the type of the members of the owner to compute JavaDoc coverage statistics.
50+
* @param computeOnlyForPublic
51+
* indicates that coverage should only be compute for the public part of the javadoc
4552
*/
46-
ClassMembersDocStats(final Doc[] membersDocs, final String membersType) {
53+
ClassMembersDocStats(final Doc[] membersDocs, final String membersType, boolean computeOnlyForPublic) {
4754
this.membersDocs = membersDocs;
4855
this.membersType = membersType;
56+
this.computeOnlyForPublic = computeOnlyForPublic;
4957
}
5058

5159
/**
@@ -66,14 +74,31 @@ public long getMembersNumber() {
6674
* a class source code) will be computed as undocumented.
6775
*/
6876
return Arrays.stream(membersDocs)
77+
.filter(filterPublicIfNecessary())
6978
.map(Doc::position)
7079
.filter(Objects::nonNull)
7180
.count();
7281
}
7382

7483
@Override
7584
public long getDocumentedMembers() {
76-
return Arrays.stream(membersDocs).map(Doc::getRawCommentText).filter(Utils::isNotStringEmpty).count();
85+
return Arrays.stream(membersDocs).filter(filterPublicIfNecessary()).map(Doc::getRawCommentText).filter(Utils::isNotStringEmpty)
86+
.count();
87+
}
88+
89+
private Predicate<? super Doc> filterPublicIfNecessary() {
90+
return m -> {
91+
if (computeOnlyForPublic) {
92+
if (m instanceof ClassDoc) {
93+
return !computeOnlyForPublic || ((ClassDoc) m).isPublic();
94+
} else if (m instanceof ProgramElementDoc) {
95+
return !computeOnlyForPublic || ((ProgramElementDoc) m).isPublic();
96+
} else {
97+
throw new UnsupportedOperationException("unimplemented for type " + m.getClass());
98+
}
99+
}
100+
return true;
101+
};
77102
}
78103

79104
@Override

src/main/java/com/manoelcampos/javadoc/coverage/stats/ClassesDocStats.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,12 @@
1515
*/
1616
package com.manoelcampos.javadoc.coverage.stats;
1717

18-
import com.manoelcampos.javadoc.coverage.Utils;
19-
import com.sun.javadoc.ClassDoc;
20-
import com.sun.javadoc.Doc;
21-
2218
import java.util.ArrayList;
2319
import java.util.Collections;
2420
import java.util.List;
2521

22+
import com.sun.javadoc.ClassDoc;
23+
2624
/**
2725
* Computes JavaDoc coverage statistics for a list of classes.
2826
*
@@ -35,12 +33,17 @@ public class ClassesDocStats extends MembersDocStats {
3533
/**
3634
* Instantiates an object to compute JavaDoc coverage statistics for a list of classes.
3735
*
38-
* @param docs an array of elements which enables reading the classes' JavaDoc documentation
36+
* @param classDocs
37+
* an array of elements which enables reading the classes' JavaDoc documentation
38+
* @param computeOnlyForPublic
39+
* indicates that coverage should only be compute for the public part of the javadoc
3940
*/
40-
public ClassesDocStats(final ClassDoc[] docs){
41-
classesDocStats = new ArrayList<>(docs.length);
42-
for (final ClassDoc doc : docs) {
43-
classesDocStats.add(new ClassDocStats(doc));
41+
public ClassesDocStats(final ClassDoc[] classDocs, boolean computeOnlyForPublic) {
42+
classesDocStats = new ArrayList<>();
43+
for (final ClassDoc doc : classDocs) {
44+
if (!computeOnlyForPublic || doc.isPublic()) {
45+
classesDocStats.add(new ClassDocStats(doc, computeOnlyForPublic));
46+
}
4447
}
4548
}
4649

@@ -56,7 +59,7 @@ public String getType() {
5659

5760
@Override
5861
public long getDocumentedMembers() {
59-
return classesDocStats.stream().map(ClassDocStats::getDoc).map(Doc::getRawCommentText).filter(Utils::isNotStringEmpty).count();
62+
return classesDocStats.stream().filter(ClassDocStats::isDocumented).count();
6063
}
6164

6265
/**

src/main/java/com/manoelcampos/javadoc/coverage/stats/JavaDocsStats.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,16 @@ public class JavaDocsStats implements DocStats {
4040
private final ClassesDocStats classesDocStats;
4141

4242
/**
43-
* Instantiates an object to compute JavaDoc coverage statistics for all Java files
44-
* received by the JavaDoc tool.
43+
* Instantiates an object to compute JavaDoc coverage statistics for all Java files received by the JavaDoc tool.
4544
*
46-
* @param rootDoc root element which enables reading JavaDoc documentation
45+
* @param rootDoc
46+
* root element which enables reading JavaDoc documentation
47+
* @param computeOnlyForPublic
48+
* indicates that coverage should only be compute for the public part of the javadoc
4749
*/
48-
public JavaDocsStats(final RootDoc rootDoc) {
50+
public JavaDocsStats(final RootDoc rootDoc, boolean computeOnlyForPublic) {
4951
this.rootDoc = rootDoc;
50-
this.classesDocStats = new ClassesDocStats(rootDoc.classes());
52+
this.classesDocStats = new ClassesDocStats(rootDoc.classes(), computeOnlyForPublic);
5153
this.packagesDocStats = computePackagesDocsStats();
5254
}
5355

src/main/java/com/manoelcampos/javadoc/coverage/stats/MethodTagsDocStats.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,7 @@ public long getDocumentedMembers() {
6868
* @return the documented Tag Stream
6969
*/
7070
protected Stream<Tag> getDocumentedTagStream() {
71-
return Arrays.stream(getDoc().tags())
72-
.filter(tag -> getTagName().equals(tag.name()))
71+
return Arrays.stream(getDoc().tags()).filter(tag -> getTagName().equals(tag.name()))
7372
.filter(tag -> Utils.isNotStringEmpty(tag.text()));
7473
}
7574

0 commit comments

Comments
 (0)