View Javadoc
1   /*
2    * Copyright (c) 2013, 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.  Oracle designates this
8    * particular file as subject to the "Classpath" exception as provided
9    * by Oracle in the LICENSE file that accompanied this code.
10   *
11   * This code is distributed in the hope that it will be useful, but WITHOUT
12   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14   * version 2 for more details (a copy is included in the LICENSE file that
15   * accompanied this code).
16   *
17   * You should have received a copy of the GNU General Public License version
18   * 2 along with this work; if not, write to the Free Software Foundation,
19   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20   *
21   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22   * or visit www.oracle.com if you need additional information or have any
23   * questions.
24   */
25  
26  package com.sun.tools.doclets.formats.html;
27  
28  import java.io.*;
29  
30  import com.sun.javadoc.*;
31  import com.sun.tools.doclets.formats.html.markup.*;
32  import com.sun.tools.doclets.internal.toolkit.*;
33  
34  /**
35   * Writes annotation type field documentation in HTML format.
36   *
37   *  <p><b>This is NOT part of any supported API.
38   *  If you write code that depends on this, you do so at your own risk.
39   *  This code and its internal interfaces are subject to change or
40   *  deletion without notice.</b>
41   *
42   * @author Bhavesh Patel
43   */
44  public class AnnotationTypeFieldWriterImpl extends AbstractMemberWriter
45      implements AnnotationTypeFieldWriter, MemberSummaryWriter {
46  
47      /**
48       * Construct a new AnnotationTypeFieldWriterImpl.
49       *
50       * @param writer         the writer that will write the output.
51       * @param annotationType the AnnotationType that holds this member.
52       */
53      public AnnotationTypeFieldWriterImpl(SubWriterHolderWriter writer,
54              AnnotationTypeDoc annotationType) {
55          super(writer, annotationType);
56      }
57  
58      /**
59       * {@inheritDoc}
60       */
61      public Content getMemberSummaryHeader(ClassDoc classDoc,
62              Content memberSummaryTree) {
63          memberSummaryTree.addContent(
64                  HtmlConstants.START_OF_ANNOTATION_TYPE_FIELD_SUMMARY);
65          Content memberTree = writer.getMemberTreeHeader();
66          writer.addSummaryHeader(this, classDoc, memberTree);
67          return memberTree;
68      }
69  
70      /**
71       * {@inheritDoc}
72       */
73      public Content getMemberTreeHeader() {
74          return writer.getMemberTreeHeader();
75      }
76  
77      /**
78       * {@inheritDoc}
79       */
80      public void addAnnotationFieldDetailsMarker(Content memberDetails) {
81          memberDetails.addContent(HtmlConstants.START_OF_ANNOTATION_TYPE_FIELD_DETAILS);
82      }
83  
84      /**
85       * {@inheritDoc}
86       */
87      public void addAnnotationDetailsTreeHeader(ClassDoc classDoc,
88              Content memberDetailsTree) {
89          if (!writer.printedAnnotationFieldHeading) {
90              memberDetailsTree.addContent(writer.getMarkerAnchor(
91                      SectionName.ANNOTATION_TYPE_FIELD_DETAIL));
92              Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING,
93                      writer.fieldDetailsLabel);
94              memberDetailsTree.addContent(heading);
95              writer.printedAnnotationFieldHeading = true;
96          }
97      }
98  
99      /**
100      * {@inheritDoc}
101      */
102     public Content getAnnotationDocTreeHeader(MemberDoc member,
103             Content annotationDetailsTree) {
104         annotationDetailsTree.addContent(
105                 writer.getMarkerAnchor(member.name()));
106         Content annotationDocTree = writer.getMemberTreeHeader();
107         Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING);
108         heading.addContent(member.name());
109         annotationDocTree.addContent(heading);
110         return annotationDocTree;
111     }
112 
113     /**
114      * {@inheritDoc}
115      */
116     public Content getSignature(MemberDoc member) {
117         Content pre = new HtmlTree(HtmlTag.PRE);
118         writer.addAnnotationInfo(member, pre);
119         addModifiers(member, pre);
120         Content link =
121                 writer.getLink(new LinkInfoImpl(configuration,
122                         LinkInfoImpl.Kind.MEMBER, getType(member)));
123         pre.addContent(link);
124         pre.addContent(writer.getSpace());
125         if (configuration.linksource) {
126             Content memberName = new StringContent(member.name());
127             writer.addSrcLink(member, memberName, pre);
128         } else {
129             addName(member.name(), pre);
130         }
131         return pre;
132     }
133 
134     /**
135      * {@inheritDoc}
136      */
137     public void addDeprecated(MemberDoc member, Content annotationDocTree) {
138         addDeprecatedInfo(member, annotationDocTree);
139     }
140 
141     /**
142      * {@inheritDoc}
143      */
144     public void addComments(MemberDoc member, Content annotationDocTree) {
145         addComment(member, annotationDocTree);
146     }
147 
148     /**
149      * {@inheritDoc}
150      */
151     public void addTags(MemberDoc member, Content annotationDocTree) {
152         writer.addTagsInfo(member, annotationDocTree);
153     }
154 
155     /**
156      * {@inheritDoc}
157      */
158     public Content getAnnotationDetails(Content annotationDetailsTree) {
159         return getMemberTree(annotationDetailsTree);
160     }
161 
162     /**
163      * {@inheritDoc}
164      */
165     public Content getAnnotationDoc(Content annotationDocTree,
166             boolean isLastContent) {
167         return getMemberTree(annotationDocTree, isLastContent);
168     }
169 
170     /**
171      * Close the writer.
172      */
173     public void close() throws IOException {
174         writer.close();
175     }
176 
177     /**
178      * {@inheritDoc}
179      */
180     public void addSummaryLabel(Content memberTree) {
181         Content label = HtmlTree.HEADING(HtmlConstants.SUMMARY_HEADING,
182                 writer.getResource("doclet.Field_Summary"));
183         memberTree.addContent(label);
184     }
185 
186     /**
187      * {@inheritDoc}
188      */
189     public String getTableSummary() {
190         return configuration.getText("doclet.Member_Table_Summary",
191                 configuration.getText("doclet.Field_Summary"),
192                 configuration.getText("doclet.fields"));
193     }
194 
195     /**
196      * {@inheritDoc}
197      */
198     public Content getCaption() {
199         return configuration.getResource("doclet.Fields");
200     }
201 
202     /**
203      * {@inheritDoc}
204      */
205     public String[] getSummaryTableHeader(ProgramElementDoc member) {
206         String[] header = new String[] {
207             writer.getModifierTypeHeader(),
208             configuration.getText("doclet.0_and_1",
209                     configuration.getText("doclet.Fields"),
210                     configuration.getText("doclet.Description"))
211         };
212         return header;
213     }
214 
215     /**
216      * {@inheritDoc}
217      */
218     public void addSummaryAnchor(ClassDoc cd, Content memberTree) {
219         memberTree.addContent(writer.getMarkerAnchor(
220                 SectionName.ANNOTATION_TYPE_FIELD_SUMMARY));
221     }
222 
223     /**
224      * {@inheritDoc}
225      */
226     public void addInheritedSummaryAnchor(ClassDoc cd, Content inheritedTree) {
227     }
228 
229     /**
230      * {@inheritDoc}
231      */
232     public void addInheritedSummaryLabel(ClassDoc cd, Content inheritedTree) {
233     }
234 
235     /**
236      * {@inheritDoc}
237      */
238     protected void addSummaryLink(LinkInfoImpl.Kind context, ClassDoc cd, ProgramElementDoc member,
239             Content tdSummary) {
240         Content memberLink = HtmlTree.SPAN(HtmlStyle.memberNameLink,
241                 writer.getDocLink(context, (MemberDoc) member, member.name(), false));
242         Content code = HtmlTree.CODE(memberLink);
243         tdSummary.addContent(code);
244     }
245 
246     /**
247      * {@inheritDoc}
248      */
249     protected void addInheritedSummaryLink(ClassDoc cd,
250             ProgramElementDoc member, Content linksTree) {
251         //Not applicable.
252     }
253 
254     /**
255      * {@inheritDoc}
256      */
257     protected void addSummaryType(ProgramElementDoc member, Content tdSummaryType) {
258         MemberDoc m = (MemberDoc)member;
259         addModifierAndType(m, getType(m), tdSummaryType);
260     }
261 
262     /**
263      * {@inheritDoc}
264      */
265     protected Content getDeprecatedLink(ProgramElementDoc member) {
266         return writer.getDocLink(LinkInfoImpl.Kind.MEMBER,
267                 (MemberDoc) member, ((MemberDoc)member).qualifiedName());
268     }
269 
270     /**
271      * {@inheritDoc}
272      */
273     protected Content getNavSummaryLink(ClassDoc cd, boolean link) {
274         if (link) {
275             return writer.getHyperLink(
276                     SectionName.ANNOTATION_TYPE_FIELD_SUMMARY,
277                     writer.getResource("doclet.navField"));
278         } else {
279             return writer.getResource("doclet.navField");
280         }
281     }
282 
283     /**
284      * {@inheritDoc}
285      */
286     protected void addNavDetailLink(boolean link, Content liNav) {
287         if (link) {
288             liNav.addContent(writer.getHyperLink(
289                     SectionName.ANNOTATION_TYPE_FIELD_DETAIL,
290                     writer.getResource("doclet.navField")));
291         } else {
292             liNav.addContent(writer.getResource("doclet.navField"));
293         }
294     }
295 
296     private Type getType(MemberDoc member) {
297         if (member instanceof FieldDoc) {
298             return ((FieldDoc) member).type();
299         } else {
300             return ((MethodDoc) member).returnType();
301         }
302     }
303 }