1 /*
2  * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /*
25  * NOTE: this class is an almost a replica of the example used in the
26  * package-info.java.
27  */
28 import java.io.IOException;
29 import java.util.Arrays;
30 import java.util.HashSet;
31 import java.util.List;
32 import java.util.Locale;
33 import java.util.Set;
34 
35 import javax.lang.model.SourceVersion;
36 import javax.lang.model.element.Element;
37 import javax.lang.model.element.TypeElement;
38 import javax.lang.model.util.ElementFilter;
39 import javax.tools.Diagnostic.Kind;
40 
41 import com.sun.source.doctree.DocCommentTree;
42 import com.sun.source.util.DocTrees;
43 
44 import jdk.javadoc.doclet.*;
45 
46 /**
47  * An Example class implementing the Doclet.
48  */
49 public class Example implements Doclet {
50 
51     Reporter reporter;
52 
53     @Override
init(Locale locale, Reporter reporter)54     public void init(Locale locale, Reporter reporter) {
55         reporter.print(Kind.NOTE, "Doclet using locale: " + locale);
56         this.reporter = reporter;
57     }
58 
59     /**
60      * Prints an element.
61      *
62      * @param trees the utility class
63      * @param e the element to be printed
64      */
printElement(DocTrees trees, Element e)65     public void printElement(DocTrees trees, Element e) {
66         DocCommentTree docCommentTree = trees.getDocCommentTree(e);
67         if (docCommentTree != null) {
68             System.out.println("Element (" + e.getKind() + ": "
69                     + e + ") has the following comments:");
70             System.out.println("Entire body: " + docCommentTree.getFullBody());
71             System.out.println("Block tags: " + docCommentTree.getBlockTags());
72         }
73     }
74 
75     @Override
run(DocletEnvironment docEnv)76     public boolean run(DocletEnvironment docEnv) {
77         reporter.print(Kind.NOTE, "overviewfile: " + overviewfile);
78         // get the DocTrees utility class to access DocComments
79         DocTrees docTrees = docEnv.getDocTrees();
80 
81         // location of an element in the same directory as overview.html
82         try {
83             Element e = ElementFilter.typesIn(docEnv.getSpecifiedElements()).iterator().next();
84             DocCommentTree docCommentTree
85                     = docTrees.getDocCommentTree(e, overviewfile);
86             if (docCommentTree != null) {
87                 System.out.println("Overview html: " + docCommentTree.getFullBody());
88             }
89         } catch (IOException missing) {
90             reporter.print(Kind.ERROR, "No overview.html found.");
91         }
92 
93         for (TypeElement t : ElementFilter.typesIn(docEnv.getIncludedElements())) {
94             System.out.println(t.getKind() + ":" + t);
95             for (Element e : t.getEnclosedElements()) {
96                 printElement(docTrees, e);
97             }
98         }
99         return true;
100     }
101 
102     @Override
getName()103     public String getName() {
104         return "Example";
105     }
106 
107     private String overviewfile;
108 
109     @Override
getSupportedOptions()110     public Set<? extends Option> getSupportedOptions() {
111         Option[] options = {
112             new Option() {
113                 private final List<String> someOption = Arrays.asList(
114                         "-overviewfile",
115                         "-overview-file",
116                         "--over-view-file"
117                 );
118 
119                 @Override
120                 public int getArgumentCount() {
121                     return 1;
122                 }
123 
124                 @Override
125                 public String getDescription() {
126                     return "an option with aliases";
127                 }
128 
129                 @Override
130                 public Option.Kind getKind() {
131                     return Option.Kind.STANDARD;
132                 }
133 
134                 @Override
135                 public List<String> getNames() {
136                     return someOption;
137                 }
138 
139                 @Override
140                 public String getParameters() {
141                     return "file";
142                 }
143 
144                 @Override
145                 public boolean process(String opt, List<String> arguments) {
146                     overviewfile = arguments.get(0);
147                     return true;
148                 }
149             }
150         };
151         return new HashSet<>(Arrays.asList(options));
152     }
153 
154     @Override
getSupportedSourceVersion()155     public SourceVersion getSupportedSourceVersion() {
156         // support the latest release
157         return SourceVersion.latest();
158     }
159 }
160