PropertyWriterImpl.java revision 3233:b5d08bc0d224
1/*
2 * Copyright (c) 1997, 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.  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
26package jdk.javadoc.internal.doclets.formats.html;
27
28import java.io.*;
29
30import java.util.Arrays;
31import java.util.List;
32
33import javax.lang.model.element.Element;
34import javax.lang.model.element.ExecutableElement;
35import javax.lang.model.element.TypeElement;
36
37import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
38import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
39import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
40import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
41import jdk.javadoc.internal.doclets.formats.html.markup.StringContent;
42import jdk.javadoc.internal.doclets.toolkit.Content;
43import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter;
44import jdk.javadoc.internal.doclets.toolkit.PropertyWriter;
45
46
47/**
48 * Writes property documentation in HTML format.
49 *
50 *  <p><b>This is NOT part of any supported API.
51 *  If you write code that depends on this, you do so at your own risk.
52 *  This code and its internal interfaces are subject to change or
53 *  deletion without notice.</b>
54 *
55 * @author Robert Field
56 * @author Atul M Dambalkar
57 * @author Jamie Ho (rewrite)
58 * @author Bhavesh Patel (Modified)
59 */
60public class PropertyWriterImpl extends AbstractMemberWriter
61    implements PropertyWriter, MemberSummaryWriter {
62
63    public PropertyWriterImpl(SubWriterHolderWriter writer, TypeElement typeElement) {
64        super(writer, typeElement);
65    }
66
67    /**
68     * {@inheritDoc}
69     */
70    @Override
71    public Content getMemberSummaryHeader(TypeElement typeElement,
72            Content memberSummaryTree) {
73        memberSummaryTree.addContent(HtmlConstants.START_OF_PROPERTY_SUMMARY);
74        Content memberTree = writer.getMemberTreeHeader();
75        writer.addSummaryHeader(this, typeElement, memberTree);
76        return memberTree;
77    }
78
79    /**
80     * {@inheritDoc}
81     */
82    public void addMemberTree(Content memberSummaryTree, Content memberTree) {
83        writer.addMemberTree(memberSummaryTree, memberTree);
84    }
85
86    /**
87     * {@inheritDoc}
88     */
89    @Override
90    public Content getPropertyDetailsTreeHeader(TypeElement typeElement,
91            Content memberDetailsTree) {
92        memberDetailsTree.addContent(HtmlConstants.START_OF_PROPERTY_DETAILS);
93        Content propertyDetailsTree = writer.getMemberTreeHeader();
94        propertyDetailsTree.addContent(writer.getMarkerAnchor(
95                SectionName.PROPERTY_DETAIL));
96        Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING,
97                writer.propertyDetailsLabel);
98        propertyDetailsTree.addContent(heading);
99        return propertyDetailsTree;
100    }
101
102    /**
103     * {@inheritDoc}
104     */
105    @Override
106    public Content getPropertyDocTreeHeader(ExecutableElement property,
107            Content propertyDetailsTree) {
108        propertyDetailsTree.addContent(
109                writer.getMarkerAnchor(name(property)));
110        Content propertyDocTree = writer.getMemberTreeHeader();
111        Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING);
112        heading.addContent(utils.getPropertyLabel(name(property)));
113        propertyDocTree.addContent(heading);
114        return propertyDocTree;
115    }
116
117    /**
118     * {@inheritDoc}
119     */
120    @Override
121    public Content getSignature(ExecutableElement property) {
122        Content pre = new HtmlTree(HtmlTag.PRE);
123        writer.addAnnotationInfo(property, pre);
124        addModifiers(property, pre);
125        Content propertylink = writer.getLink(new LinkInfoImpl(
126                configuration, LinkInfoImpl.Kind.MEMBER,
127                utils.getReturnType(property)));
128        pre.addContent(propertylink);
129        pre.addContent(" ");
130        if (configuration.linksource) {
131            Content propertyName = new StringContent(name(property));
132            writer.addSrcLink(property, propertyName, pre);
133        } else {
134            addName(name(property), pre);
135        }
136        return pre;
137    }
138
139    /**
140     * {@inheritDoc}
141     */
142    @Override
143    public void addDeprecated(ExecutableElement property, Content propertyDocTree) {
144    }
145
146    /**
147     * {@inheritDoc}
148     */
149    @Override
150    public void addComments(ExecutableElement property, Content propertyDocTree) {
151        TypeElement holder = (TypeElement)property.getEnclosingElement();
152        if (!utils.getBody(property).isEmpty()) {
153            if (holder.equals(typeElement) ||
154                    (!utils.isPublic(holder) || utils.isLinkable(holder))) {
155                writer.addInlineComment(property, propertyDocTree);
156            } else {
157                Content link =
158                        writer.getDocLink(LinkInfoImpl.Kind.PROPERTY_COPY,
159                        holder, property,
160                        utils.isIncluded(holder)
161                                ? holder.toString() : utils.getFullyQualifiedName(holder),
162                            false);
163                Content codeLink = HtmlTree.CODE(link);
164                Content descfrmLabel = HtmlTree.SPAN(HtmlStyle.descfrmTypeLabel,
165                        utils.isClass(holder)
166                                ? writer.descfrmClassLabel
167                                : writer.descfrmInterfaceLabel);
168                descfrmLabel.addContent(writer.getSpace());
169                descfrmLabel.addContent(codeLink);
170                propertyDocTree.addContent(HtmlTree.DIV(HtmlStyle.block, descfrmLabel));
171                writer.addInlineComment(property, propertyDocTree);
172            }
173        }
174    }
175
176    /**
177     * {@inheritDoc}
178     */
179    @Override
180    public void addTags(ExecutableElement property, Content propertyDocTree) {
181        writer.addTagsInfo(property, propertyDocTree);
182    }
183
184    /**
185     * {@inheritDoc}
186     */
187    @Override
188    public Content getPropertyDetails(Content propertyDetailsTree) {
189        if (configuration.allowTag(HtmlTag.SECTION)) {
190            HtmlTree htmlTree = HtmlTree.SECTION(getMemberTree(propertyDetailsTree));
191            return htmlTree;
192        }
193        return getMemberTree(propertyDetailsTree);
194    }
195
196    /**
197     * {@inheritDoc}
198     */
199    @Override
200    public Content getPropertyDoc(Content propertyDocTree,
201            boolean isLastContent) {
202        return getMemberTree(propertyDocTree, isLastContent);
203    }
204
205    /**
206     * Close the writer.
207     */
208    @Override
209    public void close() throws IOException {
210        writer.close();
211    }
212
213    /**
214     * {@inheritDoc}
215     */
216    @Override
217    public void addSummaryLabel(Content memberTree) {
218        Content label = HtmlTree.HEADING(HtmlConstants.SUMMARY_HEADING,
219                writer.getResource("doclet.Property_Summary"));
220        memberTree.addContent(label);
221    }
222
223    /**
224     * {@inheritDoc}
225     */
226    @Override
227    public String getTableSummary() {
228        return configuration.getText("doclet.Member_Table_Summary",
229                configuration.getText("doclet.Property_Summary"),
230                configuration.getText("doclet.properties"));
231    }
232
233    /**
234     * {@inheritDoc}
235     */
236    @Override
237    public Content getCaption() {
238        return configuration.getResource("doclet.Properties");
239    }
240
241    /**
242     * {@inheritDoc}
243     */
244    @Override
245    public List<String> getSummaryTableHeader(Element member) {
246        List<String> header = Arrays.asList(configuration.getText("doclet.Type"),
247                configuration.getText("doclet.0_and_1",
248                        configuration.getText("doclet.Property"),
249                        configuration.getText("doclet.Description")));
250        return header;
251    }
252
253    /**
254     * {@inheritDoc}
255     */
256    @Override
257    public void addSummaryAnchor(TypeElement typeElement, Content memberTree) {
258        memberTree.addContent(writer.getMarkerAnchor(
259                SectionName.PROPERTY_SUMMARY));
260    }
261
262    /**
263     * {@inheritDoc}
264     */
265    @Override
266    public void addInheritedSummaryAnchor(TypeElement typeElement, Content inheritedTree) {
267        inheritedTree.addContent(writer.getMarkerAnchor(
268                SectionName.PROPERTIES_INHERITANCE,
269                configuration.getClassName(typeElement)));
270    }
271
272    /**
273     * {@inheritDoc}
274     */
275    @Override
276    public void addInheritedSummaryLabel(TypeElement typeElement, Content inheritedTree) {
277        Content classLink = writer.getPreQualifiedClassLink(
278                LinkInfoImpl.Kind.MEMBER, typeElement, false);
279        Content label = new StringContent(
280                utils.isClass(typeElement)
281                       ? configuration.getText("doclet.Properties_Inherited_From_Class")
282                       : configuration.getText("doclet.Properties_Inherited_From_Interface"));
283        Content labelHeading = HtmlTree.HEADING(HtmlConstants.INHERITED_SUMMARY_HEADING,
284                label);
285        labelHeading.addContent(writer.getSpace());
286        labelHeading.addContent(classLink);
287        inheritedTree.addContent(labelHeading);
288    }
289
290    /**
291     * {@inheritDoc}
292     */
293    @Override
294    protected void addSummaryLink(LinkInfoImpl.Kind context, TypeElement typeElement, Element member,
295            Content tdSummary) {
296        Content memberLink = HtmlTree.SPAN(HtmlStyle.memberNameLink,
297                writer.getDocLink(context, typeElement,
298                member,
299                utils.getPropertyLabel(name(member)),
300                false,
301                true));
302
303        Content code = HtmlTree.CODE(memberLink);
304        tdSummary.addContent(code);
305    }
306
307    /**
308     * {@inheritDoc}
309     */
310    @Override
311    protected void addInheritedSummaryLink(TypeElement typeElement, Element member, Content linksTree) {
312        String mname = name(member);
313        Content content = writer.getDocLink(LinkInfoImpl.Kind.MEMBER, typeElement, member,
314                utils.isProperty(mname) ? utils.getPropertyName(mname) : mname,
315                false, true);
316        linksTree.addContent(content);
317    }
318
319    /**
320     * {@inheritDoc}
321     */
322    @Override
323    protected void addSummaryType(Element member, Content tdSummaryType) {
324        addModifierAndType(member, utils.getReturnType((ExecutableElement)member), tdSummaryType);
325    }
326
327    /**
328     * {@inheritDoc}
329     */
330    @Override
331    protected Content getDeprecatedLink(Element member) {
332        return writer.getDocLink(LinkInfoImpl.Kind.MEMBER, member,
333                utils.getFullyQualifiedName(member));
334    }
335
336    /**
337     * {@inheritDoc}
338     */
339    @Override
340    protected Content getNavSummaryLink(TypeElement typeElement, boolean link) {
341        if (link) {
342            if (typeElement == null) {
343                return writer.getHyperLink(
344                SectionName.PROPERTY_SUMMARY,
345                writer.getResource("doclet.navProperty"));
346            } else {
347                return writer.getHyperLink(
348                SectionName.PROPERTIES_INHERITANCE,
349                configuration.getClassName(typeElement), writer.getResource("doclet.navProperty"));
350            }
351        } else {
352            return writer.getResource("doclet.navProperty");
353        }
354    }
355
356    /**
357     * {@inheritDoc}
358     */
359    @Override
360    protected void addNavDetailLink(boolean link, Content liNav) {
361        if (link) {
362            liNav.addContent(writer.getHyperLink(
363                    SectionName.PROPERTY_DETAIL,
364                    writer.getResource("doclet.navProperty")));
365        } else {
366            liNav.addContent(writer.getResource("doclet.navProperty"));
367        }
368    }
369}
370