7112427: The doclet needs to be able to generate JavaFX documentation.
Reviewed-by: jjg
Contributed-by: jan.valenta@oracle.com
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java Sun Feb 24 11:36:58 2013 -0800
@@ -60,7 +60,7 @@
ClassDoc classDoc) {
super(writer, classDoc);
VisibleMemberMap visibleMemberMap = new VisibleMemberMap(classDoc,
- VisibleMemberMap.CONSTRUCTORS, configuration.nodeprecated);
+ VisibleMemberMap.CONSTRUCTORS, configuration);
List<ProgramElementDoc> constructors = new ArrayList<ProgramElementDoc>(visibleMemberMap.getMembersFor(classDoc));
for (int i = 0; i < constructors.size(); i++) {
if ((constructors.get(i)).isProtected() ||
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java Sun Feb 24 11:36:58 2013 -0800
@@ -543,7 +543,8 @@
}
HtmlTree navList = new HtmlTree(HtmlTag.UL);
navList.addStyle(HtmlStyle.navList);
- navList.addAttr(HtmlAttr.TITLE, "Navigation");
+ navList.addAttr(HtmlAttr.TITLE,
+ configuration.getText("doclet.Navigation"));
if (configuration.createoverview) {
navList.addContent(getNavLinkContents());
}
@@ -1299,13 +1300,31 @@
*/
public String getDocLink(int context, ClassDoc classDoc, MemberDoc doc,
String label, boolean strong) {
+ return getDocLink(context, classDoc, doc, label, strong, false);
+ }
+
+ /**
+ * Return the link for the given member.
+ *
+ * @param context the id of the context where the link will be printed.
+ * @param classDoc the classDoc that we should link to. This is not
+ * necessarily equal to doc.containingClass(). We may be
+ * inheriting comments.
+ * @param doc the member being linked to.
+ * @param label the label for the link.
+ * @param strong true if the link should be strong.
+ * @param isProperty true if the doc parameter is a JavaFX property.
+ * @return the link for the given member.
+ */
+ public String getDocLink(int context, ClassDoc classDoc, MemberDoc doc,
+ String label, boolean strong, boolean isProperty) {
if (! (doc.isIncluded() ||
Util.isLinkable(classDoc, configuration))) {
return label;
} else if (doc instanceof ExecutableMemberDoc) {
ExecutableMemberDoc emd = (ExecutableMemberDoc)doc;
return getLink(new LinkInfoImpl(configuration, context, classDoc,
- getAnchor(emd), label, strong));
+ getAnchor(emd, isProperty), label, strong));
} else if (doc instanceof MemberDoc) {
return getLink(new LinkInfoImpl(configuration, context, classDoc,
doc.name(), label, strong));
@@ -1343,6 +1362,13 @@
}
public String getAnchor(ExecutableMemberDoc emd) {
+ return getAnchor(emd, false);
+ }
+
+ public String getAnchor(ExecutableMemberDoc emd, boolean isProperty) {
+ if (isProperty) {
+ return emd.name();
+ }
StringBuilder signature = new StringBuilder(emd.signature());
StringBuilder signatureParsed = new StringBuilder();
int counter = 0;
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkInfoImpl.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkInfoImpl.java Sun Feb 24 11:36:58 2013 -0800
@@ -198,6 +198,11 @@
*/
public static final int CONTEXT_CLASS_USE_HEADER = 33;
+ /**
+ * The header for property documentation copied from parent.
+ */
+ public static final int CONTEXT_PROPERTY_DOC_COPY = 34;
+
public final ConfigurationImpl configuration;
/**
@@ -422,6 +427,7 @@
case CONTEXT_SUBCLASSES:
case CONTEXT_METHOD_DOC_COPY:
case CONTEXT_FIELD_DOC_COPY:
+ case CONTEXT_PROPERTY_DOC_COPY:
case CONTEXT_CLASS_USE_HEADER:
includeTypeInClassLinkLabel = false;
break;
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java Sun Feb 24 11:36:58 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -161,6 +161,7 @@
*/
protected void addClassKindListing(ClassDoc[] arr, Content labelContent,
Content contentTree) {
+ arr = Util.filterOutPrivateClasses(arr, configuration.javafx);
if(arr.length > 0) {
Arrays.sort(arr);
boolean printedHeader = false;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PropertyWriterImpl.java Sun Feb 24 11:36:58 2013 -0800
@@ -0,0 +1,322 @@
+/*
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.doclets.formats.html;
+
+import java.io.*;
+
+import com.sun.javadoc.*;
+import com.sun.tools.doclets.formats.html.markup.*;
+import com.sun.tools.doclets.internal.toolkit.*;
+import com.sun.tools.doclets.internal.toolkit.util.*;
+
+/**
+ * Writes property documentation in HTML format.
+ *
+ * <p><b>This is NOT part of any supported API.
+ * If you write code that depends on this, you do so at your own risk.
+ * This code and its internal interfaces are subject to change or
+ * deletion without notice.</b>
+ *
+ * @author Robert Field
+ * @author Atul M Dambalkar
+ * @author Jamie Ho (rewrite)
+ * @author Bhavesh Patel (Modified)
+ */
+public class PropertyWriterImpl extends AbstractMemberWriter
+ implements PropertyWriter, MemberSummaryWriter {
+
+ public PropertyWriterImpl(SubWriterHolderWriter writer, ClassDoc classdoc) {
+ super(writer, classdoc);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Content getMemberSummaryHeader(ClassDoc classDoc,
+ Content memberSummaryTree) {
+ memberSummaryTree.addContent(HtmlConstants.START_OF_PROPERTY_SUMMARY);
+ Content memberTree = writer.getMemberTreeHeader();
+ writer.addSummaryHeader(this, classDoc, memberTree);
+ return memberTree;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Content getPropertyDetailsTreeHeader(ClassDoc classDoc,
+ Content memberDetailsTree) {
+ memberDetailsTree.addContent(HtmlConstants.START_OF_PROPERTY_DETAILS);
+ Content propertyDetailsTree = writer.getMemberTreeHeader();
+ propertyDetailsTree.addContent(writer.getMarkerAnchor("property_detail"));
+ Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING,
+ writer.propertyDetailsLabel);
+ propertyDetailsTree.addContent(heading);
+ return propertyDetailsTree;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Content getPropertyDocTreeHeader(MethodDoc property,
+ Content propertyDetailsTree) {
+ propertyDetailsTree.addContent(
+ writer.getMarkerAnchor(property.name()));
+ Content propertyDocTree = writer.getMemberTreeHeader();
+ Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING);
+ heading.addContent(property.name().substring(0, property.name().lastIndexOf("Property")));
+ propertyDocTree.addContent(heading);
+ return propertyDocTree;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Content getSignature(MethodDoc property) {
+ Content pre = new HtmlTree(HtmlTag.PRE);
+ writer.addAnnotationInfo(property, pre);
+ addModifiers(property, pre);
+ Content propertylink = new RawHtml(writer.getLink(new LinkInfoImpl(
+ configuration, LinkInfoImpl.CONTEXT_MEMBER,
+ property.returnType())));
+ pre.addContent(propertylink);
+ pre.addContent(" ");
+ if (configuration.linksource) {
+ Content propertyName = new StringContent(property.name());
+ writer.addSrcLink(property, propertyName, pre);
+ } else {
+ addName(property.name(), pre);
+ }
+ return pre;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addDeprecated(MethodDoc property, Content propertyDocTree) {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addComments(MethodDoc property, Content propertyDocTree) {
+ ClassDoc holder = property.containingClass();
+ if (property.inlineTags().length > 0) {
+ if (holder.equals(classdoc) ||
+ (! (holder.isPublic() || Util.isLinkable(holder, configuration)))) {
+ writer.addInlineComment(property, propertyDocTree);
+ } else {
+ Content link = new RawHtml(
+ writer.getDocLink(LinkInfoImpl.CONTEXT_PROPERTY_DOC_COPY,
+ holder, property,
+ holder.isIncluded() ?
+ holder.typeName() : holder.qualifiedTypeName(),
+ false));
+ Content codeLink = HtmlTree.CODE(link);
+ Content strong = HtmlTree.STRONG(holder.isClass()?
+ writer.descfrmClassLabel : writer.descfrmInterfaceLabel);
+ strong.addContent(writer.getSpace());
+ strong.addContent(codeLink);
+ propertyDocTree.addContent(HtmlTree.DIV(HtmlStyle.block, strong));
+ writer.addInlineComment(property, propertyDocTree);
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addTags(MethodDoc property, Content propertyDocTree) {
+ writer.addTagsInfo(property, propertyDocTree);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Content getPropertyDetails(Content propertyDetailsTree) {
+ return getMemberTree(propertyDetailsTree);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Content getPropertyDoc(Content propertyDocTree,
+ boolean isLastContent) {
+ return getMemberTree(propertyDocTree, isLastContent);
+ }
+
+ /**
+ * Close the writer.
+ */
+ public void close() throws IOException {
+ writer.close();
+ }
+
+ public int getMemberKind() {
+ return VisibleMemberMap.PROPERTIES;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addSummaryLabel(Content memberTree) {
+ Content label = HtmlTree.HEADING(HtmlConstants.SUMMARY_HEADING,
+ writer.getResource("doclet.Property_Summary"));
+ memberTree.addContent(label);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getTableSummary() {
+ return configuration.getText("doclet.Member_Table_Summary",
+ configuration.getText("doclet.Property_Summary"),
+ configuration.getText("doclet.properties"));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getCaption() {
+ return configuration.getText("doclet.Properties");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String[] getSummaryTableHeader(ProgramElementDoc member) {
+ String[] header = new String[] {
+ configuration.getText("doclet.Type"),
+ configuration.getText("doclet.0_and_1",
+ configuration.getText("doclet.Property"),
+ configuration.getText("doclet.Description"))
+ };
+ return header;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addSummaryAnchor(ClassDoc cd, Content memberTree) {
+ memberTree.addContent(writer.getMarkerAnchor("property_summary"));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addInheritedSummaryAnchor(ClassDoc cd, Content inheritedTree) {
+ inheritedTree.addContent(writer.getMarkerAnchor(
+ "properties_inherited_from_class_" + configuration.getClassName(cd)));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addInheritedSummaryLabel(ClassDoc cd, Content inheritedTree) {
+ Content classLink = new RawHtml(writer.getPreQualifiedClassLink(
+ LinkInfoImpl.CONTEXT_MEMBER, cd, false));
+ Content label = new StringContent(cd.isClass() ?
+ configuration.getText("doclet.Properties_Inherited_From_Class") :
+ configuration.getText("doclet.Properties_Inherited_From_Interface"));
+ Content labelHeading = HtmlTree.HEADING(HtmlConstants.INHERITED_SUMMARY_HEADING,
+ label);
+ labelHeading.addContent(writer.getSpace());
+ labelHeading.addContent(classLink);
+ inheritedTree.addContent(labelHeading);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void addSummaryLink(int context, ClassDoc cd, ProgramElementDoc member,
+ Content tdSummary) {
+ Content strong = HtmlTree.STRONG(new RawHtml(
+ writer.getDocLink(context,
+ cd,
+ (MemberDoc) member,
+ member.name().substring(0, member.name().lastIndexOf("Property")),
+ false,
+ true)));
+
+ Content code = HtmlTree.CODE(strong);
+ tdSummary.addContent(code);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void addInheritedSummaryLink(ClassDoc cd,
+ ProgramElementDoc member, Content linksTree) {
+ linksTree.addContent(new RawHtml(
+ writer.getDocLink(LinkInfoImpl.CONTEXT_MEMBER, cd, (MemberDoc)member,
+ ((member.name().lastIndexOf("Property") != -1) && configuration.javafx)
+ ? member.name().substring(0, member.name().length() - "Property".length())
+ : member.name(),
+ false, true)));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void addSummaryType(ProgramElementDoc member, Content tdSummaryType) {
+ MethodDoc property = (MethodDoc)member;
+ addModifierAndType(property, property.returnType(), tdSummaryType);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected Content getDeprecatedLink(ProgramElementDoc member) {
+ return writer.getDocLink(LinkInfoImpl.CONTEXT_MEMBER,
+ (MemberDoc) member, ((MethodDoc)member).qualifiedName());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected Content getNavSummaryLink(ClassDoc cd, boolean link) {
+ if (link) {
+ return writer.getHyperLink((cd == null)?
+ "property_summary":
+ "properties_inherited_from_class_" +
+ configuration.getClassName(cd),
+ writer.getResource("doclet.navProperty"));
+ } else {
+ return writer.getResource("doclet.navProperty");
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void addNavDetailLink(boolean link, Content liNav) {
+ if (link) {
+ liNav.addContent(writer.getHyperLink("property_detail",
+ writer.getResource("doclet.navProperty")));
+ } else {
+ liNav.addContent(writer.getResource("doclet.navProperty"));
+ }
+ }
+}
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java Sun Feb 24 11:36:58 2013 -0800
@@ -146,6 +146,15 @@
/**
* {@inheritDoc}
*/
+ public PropertyWriterImpl getPropertyWriter(ClassWriter classWriter)
+ throws Exception {
+ return new PropertyWriterImpl((SubWriterHolderWriter) classWriter,
+ classWriter.getClassDoc());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public MethodWriterImpl getMethodWriter(ClassWriter classWriter)
throws Exception {
return new MethodWriterImpl((SubWriterHolderWriter) classWriter,
@@ -174,6 +183,8 @@
return getEnumConstantWriter(classWriter);
case VisibleMemberMap.FIELDS:
return getFieldWriter(classWriter);
+ case VisibleMemberMap.PROPERTIES:
+ return getPropertyWriter(classWriter);
case VisibleMemberMap.INNERCLASSES:
return new NestedClassWriterImpl((SubWriterHolderWriter)
classWriter, classWriter.getClassDoc());
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlConstants.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlConstants.java Sun Feb 24 11:36:58 2013 -0800
@@ -112,6 +112,12 @@
new Comment("=========== FIELD SUMMARY ===========");
/**
+ * Marker to identify start of properties summary.
+ */
+ public static final Content START_OF_PROPERTY_SUMMARY =
+ new Comment("=========== PROPERTY SUMMARY ===========");
+
+ /**
* Marker to identify start of method summary.
*/
public static final Content START_OF_METHOD_SUMMARY =
@@ -136,6 +142,12 @@
new Comment("============ FIELD DETAIL ===========");
/**
+ * Marker to identify start of property details.
+ */
+ public static final Content START_OF_PROPERTY_DETAILS =
+ new Comment("============ PROPERTY DETAIL ===========");
+
+ /**
* Marker to identify start of constructor details.
*/
public static final Content START_OF_CONSTRUCTOR_DETAILS =
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java Sun Feb 24 11:36:58 2013 -0800
@@ -148,6 +148,8 @@
public final Content fieldDetailsLabel;
+ public final Content propertyDetailsLabel;
+
public final Content constructorDetailsLabel;
public final Content enumConstantsDetailsLabel;
@@ -226,6 +228,7 @@
methodDetailsLabel = getResource("doclet.Method_Detail");
annotationTypeDetailsLabel = getResource("doclet.Annotation_Type_Member_Detail");
fieldDetailsLabel = getResource("doclet.Field_Detail");
+ propertyDetailsLabel = getResource("doclet.Property_Detail");
constructorDetailsLabel = getResource("doclet.Constructor_Detail");
enumConstantsDetailsLabel = getResource("doclet.Enum_Constant_Detail");
specifiedByLabel = getResource("doclet.Specified_By");
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard.properties Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard.properties Sun Feb 24 11:36:58 2013 -0800
@@ -36,6 +36,7 @@
doclet.navAnnotationTypeRequiredMember=Required
doclet.navAnnotationTypeMember=Element
doclet.navField=Field
+doclet.navProperty=Property
doclet.navEnum=Enum Constants
doclet.navConstructor=Constr
doclet.navMethod=Method
@@ -44,6 +45,7 @@
doclet.Window_Split_Index={0}-Index
doclet.Help=Help
doclet.Skip_navigation_links=Skip navigation links
+doclet.Navigation=Navigation
doclet.New_Page=NewPage
doclet.navDeprecated=Deprecated
doclet.Window_Deprecated_List=Deprecated List
@@ -95,7 +97,7 @@
doclet.Subinterfaces=All Known Subinterfaces:
doclet.Implementing_Classes=All Known Implementing Classes:
doclet.Functional_Interface=Functional Interface:
-doclet.Functional_Interface_Message=This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.
+doclet.Functional_Interface_Message=This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.
doclet.also=also
doclet.Frames=Frames
doclet.No_Frames=No Frames
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java Sun Feb 24 11:36:58 2013 -0800
@@ -176,6 +176,12 @@
public boolean showauthor = false;
/**
+ * Generate documentation for JavaFX getters and setters automatically
+ * by copying it from the appropriate property definition.
+ */
+ public boolean javafx = false;
+
+ /**
* Generate version specific information for the all the classes
* if @version tag is used in the doc comment and if -version option is
* used. <code>showversion</code> is set to true if -version option is
@@ -317,6 +323,7 @@
option = option.toLowerCase();
if (option.equals("-author") ||
option.equals("-docfilessubdirs") ||
+ option.equals("-javafx") ||
option.equals("-keywords") ||
option.equals("-linksource") ||
option.equals("-nocomment") ||
@@ -422,6 +429,8 @@
encoding = os[1];
} else if (opt.equals("-author")) {
showauthor = true;
+ } else if (opt.equals("-javafx")) {
+ javafx = true;
} else if (opt.equals("-nosince")) {
nosince = true;
} else if (opt.equals("-version")) {
@@ -517,7 +526,7 @@
*/
private void initTagletManager(Set<String[]> customTagStrs) {
tagletManager = tagletManager == null ?
- new TagletManager(nosince, showversion, showauthor, message) :
+ new TagletManager(nosince, showversion, showauthor, javafx, message) :
tagletManager;
String[] args;
for (Iterator<String[]> it = customTagStrs.iterator(); it.hasNext(); ) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PropertyWriter.java Sun Feb 24 11:36:58 2013 -0800
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.doclets.internal.toolkit;
+
+import java.io.*;
+import com.sun.javadoc.*;
+
+/**
+ * The interface for writing property output.
+ *
+ * <p><b>This is NOT part of any supported API.
+ * If you write code that depends on this, you do so at your own risk.
+ * This code and its internal interfaces are subject to change or
+ * deletion without notice.</b>
+ *
+ * @author Jamie Ho
+ * @author Bhavesh Patel (Modified)
+ * @since 1.7
+ */
+
+public interface PropertyWriter {
+
+ /**
+ * Get the property details tree header.
+ *
+ * @param classDoc the class being documented
+ * @param memberDetailsTree the content tree representing member details
+ * @return content tree for the property details header
+ */
+ public Content getPropertyDetailsTreeHeader(ClassDoc classDoc,
+ Content memberDetailsTree);
+
+ /**
+ * Get the property documentation tree header.
+ *
+ * @param property the property being documented
+ * @param propertyDetailsTree the content tree representing property details
+ * @return content tree for the property documentation header
+ */
+ public Content getPropertyDocTreeHeader(MethodDoc property,
+ Content propertyDetailsTree);
+
+ /**
+ * Get the signature for the given property.
+ *
+ * @param property the property being documented
+ * @return content tree for the property signature
+ */
+ public Content getSignature(MethodDoc property);
+
+ /**
+ * Add the deprecated output for the given property.
+ *
+ * @param property the property being documented
+ * @param propertyDocTree content tree to which the deprecated information will be added
+ */
+ public void addDeprecated(MethodDoc property, Content propertyDocTree);
+
+ /**
+ * Add the comments for the given property.
+ *
+ * @param property the property being documented
+ * @param propertyDocTree the content tree to which the comments will be added
+ */
+ public void addComments(MethodDoc property, Content propertyDocTree);
+
+ /**
+ * Add the tags for the given property.
+ *
+ * @param property the property being documented
+ * @param propertyDocTree the content tree to which the tags will be added
+ */
+ public void addTags(MethodDoc property, Content propertyDocTree);
+
+ /**
+ * Get the property details tree.
+ *
+ * @param memberDetailsTree the content tree representing member details
+ * @return content tree for the property details
+ */
+ public Content getPropertyDetails(Content memberDetailsTree);
+
+ /**
+ * Get the property documentation.
+ *
+ * @param propertyDocTree the content tree representing property documentation
+ * @param isLastContent true if the content to be added is the last content
+ * @return content tree for the property documentation
+ */
+ public Content getPropertyDoc(Content propertyDocTree, boolean isLastContent);
+
+ /**
+ * Close the writer.
+ */
+ public void close() throws IOException;
+}
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java Sun Feb 24 11:36:58 2013 -0800
@@ -175,6 +175,16 @@
throws Exception;
/**
+ * Return the property writer for a given class.
+ *
+ * @param classWriter the writer for the class being documented.
+ * @return the property writer for the give class. Return null if this
+ * writer is not supported by the doclet.
+ */
+ public abstract PropertyWriter getPropertyWriter(ClassWriter classWriter)
+ throws Exception;
+
+ /**
* Return the constructor writer for a given class.
*
* @param classWriter the writer for the class being documented.
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java Sun Feb 24 11:36:58 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -86,7 +86,7 @@
this.classDoc = classDoc;
this.writer = writer;
this.visibleMemberMap = new VisibleMemberMap(classDoc, memberType,
- configuration.nodeprecated);
+ configuration);
this.members = new ArrayList<ProgramElementDoc>(
this.visibleMemberMap.getMembersFor(classDoc));
if (configuration.getMemberComparator() != null) {
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java Sun Feb 24 11:36:58 2013 -0800
@@ -228,6 +228,19 @@
}
/**
+ * Return an instance of the property builder for the given class.
+ *
+ * @return an instance of the field builder for the given class.
+ */
+ public AbstractBuilder getPropertyBuilder(ClassWriter classWriter) throws Exception {
+ final PropertyWriter propertyWriter =
+ writerFactory.getPropertyWriter(classWriter);
+ return PropertyBuilder.getInstance(context,
+ classWriter.getClassDoc(),
+ propertyWriter);
+ }
+
+ /**
* Return an instance of the constructor builder for the given class.
*
* @return an instance of the constructor builder for the given class.
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java Sun Feb 24 11:36:58 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -381,6 +381,17 @@
}
/**
+ * Build the property documentation.
+ *
+ * @param elements the XML elements that specify how a field is documented.
+ */
+ public void buildPropertyDetails(XMLNode node,
+ Content memberDetailsTree) throws Exception {
+ configuration.getBuilderFactory().
+ getPropertyBuilder(writer).buildChildren(node, memberDetailsTree);
+ }
+
+ /**
* Build the constructor documentation.
*
* @param node the XML element that specifies which components to document
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java Sun Feb 24 11:36:58 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -265,7 +265,7 @@
*/
private boolean hasConstantField (ClassDoc classDoc) {
VisibleMemberMap visibleMemberMapFields = new VisibleMemberMap(classDoc,
- VisibleMemberMap.FIELDS, configuration.nodeprecated);
+ VisibleMemberMap.FIELDS, configuration);
List<?> fields = visibleMemberMapFields.getLeafClassMembers(configuration);
for (Iterator<?> iter = fields.iterator(); iter.hasNext(); ) {
FieldDoc field = (FieldDoc) iter.next();
@@ -323,9 +323,9 @@
public ConstantFieldBuilder(ClassDoc classdoc) {
this.classdoc = classdoc;
visibleMemberMapFields = new VisibleMemberMap(classdoc,
- VisibleMemberMap.FIELDS, configuration.nodeprecated);
+ VisibleMemberMap.FIELDS, configuration);
visibleMemberMapEnumConst = new VisibleMemberMap(classdoc,
- VisibleMemberMap.ENUM_CONSTANTS, configuration.nodeprecated);
+ VisibleMemberMap.ENUM_CONSTANTS, configuration);
}
/**
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java Sun Feb 24 11:36:58 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -93,7 +93,7 @@
new VisibleMemberMap(
classDoc,
VisibleMemberMap.CONSTRUCTORS,
- configuration.nodeprecated);
+ configuration);
constructors =
new ArrayList<ProgramElementDoc>(visibleMemberMap.getMembersFor(classDoc));
for (int i = 0; i < constructors.size(); i++) {
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java Sun Feb 24 11:36:58 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -87,7 +87,7 @@
new VisibleMemberMap(
classDoc,
VisibleMemberMap.ENUM_CONSTANTS,
- configuration.nodeprecated);
+ configuration);
enumConstants =
new ArrayList<ProgramElementDoc>(visibleMemberMap.getMembersFor(classDoc));
if (configuration.getMemberComparator() != null) {
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java Sun Feb 24 11:36:58 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -88,7 +88,7 @@
new VisibleMemberMap(
classDoc,
VisibleMemberMap.FIELDS,
- configuration.nodeprecated);
+ configuration);
fields =
new ArrayList<ProgramElementDoc>(visibleMemberMap.getLeafClassMembers(
configuration));
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java Sun Feb 24 11:36:58 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
package com.sun.tools.doclets.internal.toolkit.builders;
import java.util.*;
+import java.text.MessageFormat;
import com.sun.javadoc.*;
import com.sun.tools.doclets.internal.toolkit.*;
@@ -82,7 +83,7 @@
new VisibleMemberMap(
classDoc,
i,
- configuration.nodeprecated);
+ configuration);
}
}
@@ -254,6 +255,17 @@
}
/**
+ * Build the summary for the fields.
+ */
+ public void buildPropertiesSummary(XMLNode node, Content memberSummaryTree) {
+ MemberSummaryWriter writer =
+ memberSummaryWriters[VisibleMemberMap.PROPERTIES];
+ VisibleMemberMap visibleMemberMap =
+ visibleMemberMaps[VisibleMemberMap.PROPERTIES];
+ addSummary(writer, visibleMemberMap, true, memberSummaryTree);
+ }
+
+ /**
* Build the summary for the nested classes.
*
* @param node the XML element that specifies which components to document
@@ -311,6 +323,11 @@
List<Content> tableContents = new LinkedList<Content>();
for (int i = 0; i < members.size(); i++) {
ProgramElementDoc member = members.get(i);
+ final ProgramElementDoc propertyDoc =
+ visibleMemberMap.getPropertyMemberDoc(member);
+ if (propertyDoc != null) {
+ processProperty(visibleMemberMap, member, propertyDoc);
+ }
Tag[] firstSentenceTags = member.firstSentenceTags();
if (member instanceof MethodDoc && firstSentenceTags.length == 0) {
//Inherit comments from overriden or implemented method if
@@ -330,6 +347,106 @@
}
/**
+ * Process the property method, property setter and/or property getter
+ * comment text so that it contains the documentation from
+ * the property field. The method adds the leading sentence,
+ * copied documentation including the defaultValue tag and
+ * the see tags if the appropriate property getter and setter are
+ * available.
+ *
+ * @param visibleMemberMap the members information.
+ * @param member the member which is to be augmented.
+ * @param propertyDoc the original property documentation.
+ */
+ private void processProperty(VisibleMemberMap visibleMemberMap,
+ ProgramElementDoc member,
+ ProgramElementDoc propertyDoc) {
+ StringBuilder commentTextBuilder = new StringBuilder();
+ final boolean isSetter = isSetter(member);
+ final boolean isGetter = isGetter(member);
+ if (isGetter || isSetter) {
+ //add "[GS]ets the value of the property PROPERTY_NAME."
+ if (isSetter) {
+ commentTextBuilder.append(
+ MessageFormat.format(
+ configuration.getText("doclet.PropertySetterWithName"),
+ Util.propertyNameFromMethodName(member.name())));
+ }
+ if (isGetter) {
+ commentTextBuilder.append(
+ MessageFormat.format(
+ configuration.getText("doclet.PropertyGetterWithName"),
+ Util.propertyNameFromMethodName(member.name())));
+ }
+ if (propertyDoc.commentText() != null
+ && !propertyDoc.commentText().isEmpty()) {
+ commentTextBuilder.append(" \n @propertyDescription ");
+ }
+ }
+ commentTextBuilder.append(propertyDoc.commentText());
+
+ Tag[] tags = propertyDoc.tags("@defaultValue");
+ if (tags != null) {
+ for (Tag tag: tags) {
+ commentTextBuilder.append("\n")
+ .append(tag.name())
+ .append(" ")
+ .append(tag.text());
+ }
+ }
+
+ //add @see tags
+ if (!isGetter && !isSetter) {
+ MethodDoc getter = (MethodDoc) visibleMemberMap.getGetterForProperty(member);
+ MethodDoc setter = (MethodDoc) visibleMemberMap.getSetterForProperty(member);
+
+ if ((null != getter)
+ && (commentTextBuilder.indexOf("@see #" + getter.name()) == -1)) {
+ commentTextBuilder.append("\n @see #")
+ .append(getter.name())
+ .append("() ");
+ }
+
+ if ((null != setter)
+ && (commentTextBuilder.indexOf("@see #" + setter.name()) == -1)) {
+ String typeName = setter.parameters()[0].typeName();
+ // Removal of type parameters and package information.
+ typeName = typeName.split("<")[0];
+ if (typeName.contains(".")) {
+ typeName = typeName.substring(typeName.lastIndexOf(".") + 1);
+ }
+ commentTextBuilder.append("\n @see #").append(setter.name());
+
+ if (setter.parameters()[0].type().asTypeVariable() == null) {
+ commentTextBuilder.append("(").append(typeName).append(")");
+ }
+ commentTextBuilder.append(" \n");
+ }
+ }
+ member.setRawCommentText(commentTextBuilder.toString());
+ }
+ /**
+ * Test whether the method is a getter.
+ * @param ped property method documentation. Needs to be either property
+ * method, property getter, or property setter.
+ * @return true if the given documentation belongs to a getter.
+ */
+ private boolean isGetter(ProgramElementDoc ped) {
+ final String pedName = ped.name();
+ return pedName.startsWith("get") || pedName.startsWith("is");
+ }
+
+ /**
+ * Test whether the method is a setter.
+ * @param ped property method documentation. Needs to be either property
+ * method, property getter, or property setter.
+ * @return true if the given documentation belongs to a setter.
+ */
+ private boolean isSetter(ProgramElementDoc ped) {
+ return ped.name().startsWith("set");
+ }
+
+ /**
* Build the inherited member summary for the given methods.
*
* @param writer the writer for this member summary.
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java Sun Feb 24 11:36:58 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -88,7 +88,7 @@
visibleMemberMap = new VisibleMemberMap(
classDoc,
VisibleMemberMap.METHODS,
- configuration.nodeprecated);
+ configuration);
methods =
new ArrayList<ProgramElementDoc>(visibleMemberMap.getLeafClassMembers(
configuration));
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java Sun Feb 24 11:36:58 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -176,6 +176,7 @@
? packageDoc.interfaces()
: configuration.classDocCatalog.interfaces(
Util.getPackageName(packageDoc));
+ interfaces = Util.filterOutPrivateClasses(interfaces, configuration.javafx);
if (interfaces.length > 0) {
packageWriter.addClassesSummary(
interfaces,
@@ -205,6 +206,7 @@
? packageDoc.ordinaryClasses()
: configuration.classDocCatalog.ordinaryClasses(
Util.getPackageName(packageDoc));
+ classes = Util.filterOutPrivateClasses(classes, configuration.javafx);
if (classes.length > 0) {
packageWriter.addClassesSummary(
classes,
@@ -234,6 +236,7 @@
? packageDoc.enums()
: configuration.classDocCatalog.enums(
Util.getPackageName(packageDoc));
+ enums = Util.filterOutPrivateClasses(enums, configuration.javafx);
if (enums.length > 0) {
packageWriter.addClassesSummary(
enums,
@@ -263,6 +266,7 @@
? packageDoc.exceptions()
: configuration.classDocCatalog.exceptions(
Util.getPackageName(packageDoc));
+ exceptions = Util.filterOutPrivateClasses(exceptions, configuration.javafx);
if (exceptions.length > 0) {
packageWriter.addClassesSummary(
exceptions,
@@ -292,6 +296,7 @@
? packageDoc.errors()
: configuration.classDocCatalog.errors(
Util.getPackageName(packageDoc));
+ errors = Util.filterOutPrivateClasses(errors, configuration.javafx);
if (errors.length > 0) {
packageWriter.addClassesSummary(
errors,
@@ -321,6 +326,7 @@
? packageDoc.annotationTypes()
: configuration.classDocCatalog.annotationTypes(
Util.getPackageName(packageDoc));
+ annotationTypes = Util.filterOutPrivateClasses(annotationTypes, configuration.javafx);
if (annotationTypes.length > 0) {
packageWriter.addClassesSummary(
annotationTypes,
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PropertyBuilder.java Sun Feb 24 11:36:58 2013 -0800
@@ -0,0 +1,228 @@
+/*
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.doclets.internal.toolkit.builders;
+
+import java.util.*;
+
+import com.sun.tools.doclets.internal.toolkit.util.*;
+import com.sun.tools.doclets.internal.toolkit.*;
+import com.sun.javadoc.*;
+
+/**
+ * Builds documentation for a property.
+ *
+ * <p><b>This is NOT part of any supported API.
+ * If you write code that depends on this, you do so at your own risk.
+ * This code and its internal interfaces are subject to change or
+ * deletion without notice.</b>
+ *
+ * @author Jamie Ho
+ * @author Bhavesh Patel (Modified)
+ * @since 1.7
+ */
+public class PropertyBuilder extends AbstractMemberBuilder {
+
+ /**
+ * The class whose properties are being documented.
+ */
+ private final ClassDoc classDoc;
+
+ /**
+ * The visible properties for the given class.
+ */
+ private final VisibleMemberMap visibleMemberMap;
+
+ /**
+ * The writer to output the property documentation.
+ */
+ private final PropertyWriter writer;
+
+ /**
+ * The list of properties being documented.
+ */
+ private final List<ProgramElementDoc> properties;
+
+ /**
+ * The index of the current property that is being documented at this point
+ * in time.
+ */
+ private int currentPropertyIndex;
+
+ /**
+ * Construct a new PropertyBuilder.
+ *
+ * @param context the build context.
+ * @param classDoc the class whoses members are being documented.
+ * @param writer the doclet specific writer.
+ */
+ private PropertyBuilder(Context context,
+ ClassDoc classDoc,
+ PropertyWriter writer) {
+ super(context);
+ this.classDoc = classDoc;
+ this.writer = writer;
+ visibleMemberMap =
+ new VisibleMemberMap(
+ classDoc,
+ VisibleMemberMap.PROPERTIES,
+ configuration);
+ properties =
+ new ArrayList<ProgramElementDoc>(visibleMemberMap.getMembersFor(classDoc));
+ if (configuration.getMemberComparator() != null) {
+ Collections.sort(properties, configuration.getMemberComparator());
+ }
+ }
+
+ /**
+ * Construct a new PropertyBuilder.
+ *
+ * @param context the build context.
+ * @param classDoc the class whoses members are being documented.
+ * @param writer the doclet specific writer.
+ */
+ public static PropertyBuilder getInstance(Context context,
+ ClassDoc classDoc,
+ PropertyWriter writer) {
+ return new PropertyBuilder(context, classDoc, writer);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getName() {
+ return "PropertyDetails";
+ }
+
+ /**
+ * Returns a list of properties that will be documented for the given class.
+ * This information can be used for doclet specific documentation
+ * generation.
+ *
+ * @param classDoc the {@link ClassDoc} we want to check.
+ * @return a list of properties that will be documented.
+ */
+ public List<ProgramElementDoc> members(ClassDoc classDoc) {
+ return visibleMemberMap.getMembersFor(classDoc);
+ }
+
+ /**
+ * Returns the visible member map for the properties of this class.
+ *
+ * @return the visible member map for the properties of this class.
+ */
+ public VisibleMemberMap getVisibleMemberMap() {
+ return visibleMemberMap;
+ }
+
+ /**
+ * summaryOrder.size()
+ */
+ public boolean hasMembersToDocument() {
+ return properties.size() > 0;
+ }
+
+ /**
+ * Build the property documentation.
+ *
+ * @param node the XML element that specifies which components to document
+ * @param memberDetailsTree the content tree to which the documentation will be added
+ */
+ public void buildPropertyDoc(XMLNode node, Content memberDetailsTree) {
+ if (writer == null) {
+ return;
+ }
+ int size = properties.size();
+ if (size > 0) {
+ Content propertyDetailsTree = writer.getPropertyDetailsTreeHeader(
+ classDoc, memberDetailsTree);
+ for (currentPropertyIndex = 0; currentPropertyIndex < size;
+ currentPropertyIndex++) {
+ Content propertyDocTree = writer.getPropertyDocTreeHeader(
+ (MethodDoc) properties.get(currentPropertyIndex),
+ propertyDetailsTree);
+ buildChildren(node, propertyDocTree);
+ propertyDetailsTree.addContent(writer.getPropertyDoc(
+ propertyDocTree, (currentPropertyIndex == size - 1)));
+ }
+ memberDetailsTree.addContent(
+ writer.getPropertyDetails(propertyDetailsTree));
+ }
+ }
+
+ /**
+ * Build the signature.
+ *
+ * @param node the XML element that specifies which components to document
+ * @param propertyDocTree the content tree to which the documentation will be added
+ */
+ public void buildSignature(XMLNode node, Content propertyDocTree) {
+ propertyDocTree.addContent(
+ writer.getSignature((MethodDoc) properties.get(currentPropertyIndex)));
+ }
+
+ /**
+ * Build the deprecation information.
+ *
+ * @param node the XML element that specifies which components to document
+ * @param propertyDocTree the content tree to which the documentation will be added
+ */
+ public void buildDeprecationInfo(XMLNode node, Content propertyDocTree) {
+ writer.addDeprecated(
+ (MethodDoc) properties.get(currentPropertyIndex), propertyDocTree);
+ }
+
+ /**
+ * Build the comments for the property. Do nothing if
+ * {@link Configuration#nocomment} is set to true.
+ *
+ * @param node the XML element that specifies which components to document
+ * @param propertyDocTree the content tree to which the documentation will be added
+ */
+ public void buildPropertyComments(XMLNode node, Content propertyDocTree) {
+ if (!configuration.nocomment) {
+ writer.addComments((MethodDoc) properties.get(currentPropertyIndex), propertyDocTree);
+ }
+ }
+
+ /**
+ * Build the tag information.
+ *
+ * @param node the XML element that specifies which components to document
+ * @param propertyDocTree the content tree to which the documentation will be added
+ */
+ public void buildTagInfo(XMLNode node, Content propertyDocTree) {
+ writer.addTags((MethodDoc) properties.get(currentPropertyIndex), propertyDocTree);
+ }
+
+ /**
+ * Return the property writer for this builder.
+ *
+ * @return the property writer for this builder.
+ */
+ public PropertyWriter getWriter() {
+ return writer;
+ }
+}
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclet.xml Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclet.xml Sun Feb 24 11:36:58 2013 -0800
@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<!--
- Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
@@ -107,6 +107,7 @@
<ClassTagInfo/>
</ClassInfo>
<MemberSummary>
+ <PropertiesSummary/>
<NestedClassesSummary/>
<EnumConstantsSummary/>
<FieldsSummary/>
@@ -122,6 +123,13 @@
<TagInfo/>
</EnumConstant>
</EnumConstantsDetails>
+ <PropertyDetails>
+ <PropertyDoc>
+ <Signature/>
+ <PropertyComments/>
+ <TagInfo/>
+ </PropertyDoc>
+ </PropertyDetails>
<FieldDetails>
<FieldDoc>
<Signature/>
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties Sun Feb 24 11:36:58 2013 -0800
@@ -40,6 +40,12 @@
doclet.Error_taglet_not_registered=Error - Exception {0} thrown while trying to register Taglet {1}...
doclet.Error_invalid_custom_tag_argument=Error - {0} is an invalid argument to the -tag option...
doclet.Author=Author:
+doclet.DefaultValue=Default value:
+doclet.PropertyDescription=Property description:
+doclet.PropertyGetter=Gets the value of the property
+doclet.PropertySetter=Sets the value of the property
+doclet.PropertyGetterWithName=Gets the value of the property {0}.
+doclet.PropertySetterWithName=Sets the value of the property {0}.
doclet.Default=Default:
doclet.Parameters=Parameters:
doclet.TypeParameters=Type Parameters:
@@ -61,6 +67,7 @@
doclet.noInheritedDoc=@inheritDoc used but {0} does not override or implement any method.
doclet.malformed_html_link_tag=<a> tag is malformed:\n"{0}"
doclet.tag_misuse=Tag {0} cannot be used in {1} documentation. It can only be used in the following types of documentation: {2}.
+doclet.javafx_tag_misuse=Tags @propertyGetter, @propertySetter and @propertyDescription can only be used in JavaFX properties getters and setters.
doclet.Package_Summary=Package Summary
doclet.Profile_Summary=Profile Summary
doclet.Interface_Summary=Interface Summary
@@ -73,6 +80,7 @@
doclet.Annotation_Type_Optional_Member_Summary=Optional Element Summary
doclet.Annotation_Type_Required_Member_Summary=Required Element Summary
doclet.Field_Summary=Field Summary
+doclet.Property_Summary=Property Summary
doclet.Enum_Constant_Summary=Enum Constant Summary
doclet.Constructor_Summary=Constructor Summary
doclet.Method_Summary=Method Summary
@@ -115,10 +123,13 @@
doclet.Methods_Inherited_From_Interface=Methods inherited from interface
doclet.Fields_Inherited_From_Class=Fields inherited from class
doclet.Fields_Inherited_From_Interface=Fields inherited from interface
+doclet.Properties_Inherited_From_Class=Properties inherited from class
+doclet.Properties_Inherited_From_Interface=Properties inherited from interface
doclet.Annotation_Type_Member_Detail=Element Detail
doclet.Enum_Constant_Detail=Enum Constant Detail
doclet.Constants_Summary=Constant Field Values
doclet.Field_Detail=Field Detail
+doclet.Property_Detail=Property Detail
doclet.Method_Detail=Method Detail
doclet.Constructor_Detail=Constructor Detail
doclet.Deprecated=Deprecated.
@@ -132,6 +143,8 @@
doclet.Member_Table_Summary={0} table, listing {1}, and an explanation
doclet.fields=fields
doclet.Fields=Fields
+doclet.properties=properties
+doclet.Properties=Properties
doclet.constructors=constructors
doclet.Constructors=Constructors
doclet.methods=methods
@@ -149,6 +162,7 @@
doclet.Modifier=Modifier
doclet.Type=Type
doclet.Field=Field
+doclet.Property=Property
doclet.Constructor=Constructor
doclet.Method=Method
doclet.Annotation_Type_Optional_Member=Optional Element
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BasePropertyTaglet.java Sun Feb 24 11:36:58 2013 -0800
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.doclets.internal.toolkit.taglets;
+
+import com.sun.javadoc.Tag;
+
+/**
+ * An abstract class that implements the {@link Taglet} interface and
+ * serves as a base for JavaFX property getter and setter taglets.
+ *
+ * <p><b>This is NOT part of any supported API.
+ * If you write code that depends on this, you do so at your own risk.
+ * This code and its internal interfaces are subject to change or
+ * deletion without notice.</b>
+ *
+ */
+public abstract class BasePropertyTaglet extends BaseTaglet {
+
+ public BasePropertyTaglet() {
+ }
+
+ /**
+ * This method returns the text to be put in the resulting javadoc before
+ * the property name.
+ *
+ * @param tagletWriter the taglet writer for output
+ * @return the string to be put in the resulting javadoc.
+ */
+ abstract String getText(TagletWriter tagletWriter);
+
+ /**
+ * Given the <code>Tag</code> representation of this custom
+ * tag, return its string representation, which is output
+ * to the generated page.
+ * @param tag the <code>Tag</code> representation of this custom tag.
+ * @param tagletWriter the taglet writer for output.
+ * @return the TagletOutput representation of this <code>Tag</code>.
+ */
+ public TagletOutput getTagletOutput(Tag tag, TagletWriter tagletWriter) {
+ TagletOutput tagletOutput = tagletWriter.getOutputInstance();
+ StringBuilder output = new StringBuilder("<P>");
+ output.append(getText(tagletWriter));
+ output.append(" <CODE>");
+ output.append(tag.text());
+ output.append("</CODE>.</P>");
+ tagletOutput.setOutput(output.toString());
+ return tagletOutput;
+ }
+
+ /**
+ * Will return false because this tag may
+ * only appear in Methods.
+ * @return false since this is not a method.
+ */
+ public boolean inConstructor() {
+ return false;
+ }
+
+ /**
+ * Will return false because this tag may
+ * only appear in Methods.
+ * @return false since this is not a method.
+ */
+ public boolean inOverview() {
+ return false;
+ }
+
+ /**
+ * Will return false because this tag may
+ * only appear in Methods.
+ * @return false since this is not a method.
+ */
+ public boolean inPackage() {
+ return false;
+ }
+
+ /**
+ * Will return false because this tag may
+ * only appear in Methods.
+ * @return false since this is not a method.
+ */
+ public boolean inType() {
+ return false;
+ }
+
+ /**
+ * Will return false because this tag is not inline.
+ * @return false since this is not an inline tag.
+ */
+ public boolean isInlineTag() {
+ return false;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ExpertTaglet.java Sun Feb 24 11:36:58 2013 -0800
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.doclets.internal.toolkit.taglets;
+
+import java.util.Map;
+
+import com.sun.tools.doclets.Taglet;
+import com.sun.javadoc.Tag;
+
+/**
+ * An inline Taglet used to denote information for experts.
+ *
+ * <p><b>This is NOT part of any supported API.
+ * If you write code that depends on this, you do so at your own risk.
+ * This code and its internal interfaces are subject to change or
+ * deletion without notice.</b>
+ *
+ */
+public class ExpertTaglet implements Taglet {
+
+ private static final String NAME = "expert";
+ private static final String START_TAG = "<sub id=\"expert\">";
+ private static final String END_TAG = "</sub>";
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean inField() {
+ return true;
+ }
+
+ public boolean inConstructor() {
+ return true;
+ }
+
+ public boolean inMethod() {
+ return true;
+ }
+
+ public boolean inOverview() {
+ return true;
+ }
+
+ public boolean inPackage() {
+ return true;
+ }
+
+ public boolean inType() {
+ return true;
+ }
+
+ public boolean isInlineTag() {
+ return false;
+ }
+
+ public String getName() {
+ return NAME;
+ }
+
+ public static void register(Map<String, Taglet> map) {
+ map.remove(NAME);
+ map.put(NAME, new ExpertTaglet());
+ }
+
+ public String toString(Tag tag) {
+ return (tag.text() == null || tag.text().length() == 0) ? null :
+ START_TAG + LiteralTaglet.textToString(tag.text()) + END_TAG;
+ }
+
+
+ public String toString(Tag[] tags) {
+ if (tags == null || tags.length == 0) return null;
+
+ StringBuffer sb = new StringBuffer(START_TAG);
+
+ for(Tag t:tags) {
+ sb.append(LiteralTaglet.textToString(t.text()));
+ }
+ sb.append(END_TAG);
+ return sb.toString();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/PropertyGetterTaglet.java Sun Feb 24 11:36:58 2013 -0800
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.doclets.internal.toolkit.taglets;
+
+/**
+ * A taglet that adds the initial line of documentation to the JavaFX
+ * property getters.
+ *
+ * <p><b>This is NOT part of any supported API.
+ * If you write code that depends on this, you do so at your own risk.
+ * This code and its internal interfaces are subject to change or
+ * deletion without notice.</b>
+ */
+public class PropertyGetterTaglet extends BasePropertyTaglet {
+
+ /**
+ * Construct a new PropertyGetterTaglet.
+ */
+ public PropertyGetterTaglet () {
+ name = "propertyGetter";
+ }
+
+ @Override
+ String getText(TagletWriter tagletWriter) {
+ return tagletWriter.configuration().getText("doclet.PropertyGetter");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/PropertySetterTaglet.java Sun Feb 24 11:36:58 2013 -0800
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.doclets.internal.toolkit.taglets;
+
+/**
+ * A taglet that adds the initial line of documentation to the JavaFX
+ * property setters.
+ *
+ * <p><b>This is NOT part of any supported API.
+ * If you write code that depends on this, you do so at your own risk.
+ * This code and its internal interfaces are subject to change or
+ * deletion without notice.</b>
+ */
+public class PropertySetterTaglet extends BasePropertyTaglet {
+
+ /**
+ * Construct a new PropertyGetterTaglet.
+ */
+ public PropertySetterTaglet () {
+ name = "propertySetter";
+ }
+
+ @Override
+ String getText(TagletWriter tagletWriter) {
+ return tagletWriter.configuration().getText("doclet.PropertySetter");
+ }
+}
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java Sun Feb 24 11:36:58 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -157,6 +157,13 @@
private boolean showauthor;
/**
+ * True if we want to use JavaFX-related tags (@propertyGetter,
+ * @propertySetter, @propertyDescription, @defaultValue, @treatAsPrivate,
+ * @expert).
+ */
+ private boolean javafx;
+
+ /**
* Construct a new <code>TagletManager</code>.
* @param nosince true if we do not want to use @since tags.
* @param showversion true if we want to use @version tags.
@@ -164,7 +171,8 @@
* @param message the message retriever to print warnings.
*/
public TagletManager(boolean nosince, boolean showversion,
- boolean showauthor, MessageRetriever message) {
+ boolean showauthor, boolean javafx,
+ MessageRetriever message) {
overridenStandardTags = new HashSet<String>();
potentiallyConflictingTags = new HashSet<String>();
standardTags = new HashSet<String>();
@@ -174,6 +182,7 @@
this.nosince = nosince;
this.showversion = showversion;
this.showauthor = showauthor;
+ this.javafx = javafx;
this.message = message;
initStandardTags();
initStandardTagsLowercase();
@@ -677,6 +686,33 @@
standardTags.add("Text");
standardTags.add("literal");
standardTags.add("code");
+
+ if (javafx) {
+ initJavaFXTags();
+ }
+ }
+
+ /**
+ * Initialize JavaFX-related tags.
+ */
+ private void initJavaFXTags() {
+ Taglet temp;
+ customTags.put((temp = new PropertyGetterTaglet()).getName(), temp);
+ customTags.put((temp = new PropertySetterTaglet()).getName(), temp);
+ customTags.put((temp = new SimpleTaglet("propertyDescription", message.getText("doclet.PropertyDescription"),
+ SimpleTaglet.FIELD + SimpleTaglet.METHOD)).getName(), temp);
+ customTags.put((temp = new SimpleTaglet("defaultValue", message.getText("doclet.DefaultValue"),
+ SimpleTaglet.FIELD + SimpleTaglet.METHOD)).getName(), temp);
+ customTags.put((temp = new SimpleTaglet("treatAsPrivate", null,
+ SimpleTaglet.FIELD + SimpleTaglet.METHOD + SimpleTaglet.TYPE)).getName(), temp);
+ customTags.put((temp = new LegacyTaglet(new ExpertTaglet())).getName(), temp);
+
+ standardTags.add("propertyGetter");
+ standardTags.add("propertySetter");
+ standardTags.add("propertyDescription");
+ standardTags.add("defaultValue");
+ standardTags.add("treatAsPrivate");
+ standardTags.add("expert");
}
/**
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletWriter.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletWriter.java Sun Feb 24 11:36:58 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -180,6 +180,7 @@
tagletManager.checkTags(doc, doc.inlineTags(), true);
TagletOutput currentOutput = null;
for (int i = 0; i < taglets.length; i++) {
+ currentOutput = null;
if (doc instanceof ClassDoc && taglets[i] instanceof ParamTaglet) {
//The type parameters are documented in a special section away
//from the tag info, so skip here.
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassTree.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassTree.java Sun Feb 24 11:36:58 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -132,6 +132,12 @@
Util.isDeprecated(classes[i].containingPackage()))) {
continue;
}
+
+ if (configuration.javafx
+ && classes[i].tags("treatAsPrivate").length > 0) {
+ continue;
+ }
+
if (classes[i].isEnum()) {
processType(classes[i], configuration, baseEnums, subEnums);
} else if (classes[i].isClass()) {
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/IndexBuilder.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/IndexBuilder.java Sun Feb 24 11:36:58 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -63,6 +63,11 @@
*/
private boolean classesOnly;
+ /**
+ * Indicates javafx mode.
+ */
+ private boolean javafx;
+
// make ProgramElementDoc[] when new toArray is available
protected final Object[] elements;
@@ -115,6 +120,7 @@
}
this.noDeprecated = noDeprecated;
this.classesOnly = classesOnly;
+ this.javafx = configuration.javafx;
buildIndexMap(configuration.root);
Set<Character> set = indexmap.keySet();
elements = set.toArray();
@@ -209,6 +215,12 @@
* Should this doc element be added to the index map?
*/
protected boolean shouldAddToIndexMap(Doc element) {
+ if (javafx) {
+ if (element.tags("treatAsPrivate").length > 0) {
+ return false;
+ }
+ }
+
if (element instanceof PackageDoc)
// Do not add to index map if -nodeprecated option is set and the
// package is marked as deprecated.
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java Sun Feb 24 11:36:58 2013 -0800
@@ -722,6 +722,56 @@
}
/**
+ * A convenience method to get property name from the name of the
+ * getter or setter method.
+ * @param name name of the getter or setter method.
+ * @return the name of the property of the given setter of getter.
+ */
+ public static String propertyNameFromMethodName(String name) {
+ String propertyName = null;
+ if (name.startsWith("get") || name.startsWith("set")) {
+ propertyName = name.substring(3);
+ } else if (name.startsWith("is")) {
+ propertyName = name.substring(2);
+ }
+ if ((propertyName == null) || propertyName.isEmpty()){
+ return "";
+ }
+ return propertyName.substring(0, 1).toLowerCase()
+ + propertyName.substring(1);
+ }
+
+ /**
+ * In case of JavaFX mode on, filters out classes that are private,
+ * package private or having the @treatAsPrivate annotation. Those are not
+ * documented in JavaFX mode.
+ *
+ * @param classes array of classes to be filtered.
+ * @param javafx set to true if in JavaFX mode.
+ * @return list of filtered classes.
+ */
+ public static ClassDoc[] filterOutPrivateClasses(final ClassDoc[] classes,
+ boolean javafx) {
+ if (!javafx) {
+ return classes;
+ }
+ final List<ClassDoc> filteredOutClasses =
+ new ArrayList<ClassDoc>(classes.length);
+ for (ClassDoc classDoc : classes) {
+ if (classDoc.isPrivate() || classDoc.isPackagePrivate()) {
+ continue;
+ }
+ Tag[] aspTags = classDoc.tags("treatAsPrivate");
+ if (aspTags != null && aspTags.length > 0) {
+ continue;
+ }
+ filteredOutClasses.add(classDoc);
+ }
+
+ return filteredOutClasses.toArray(new ClassDoc[0]);
+ }
+
+ /**
* Test whether the given FieldDoc is one of the declaration annotation ElementTypes
* defined in Java 5.
* Instead of testing for one of the new enum constants added in Java 8, test for
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java Sun Feb 24 11:36:58 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
package com.sun.tools.doclets.internal.toolkit.util;
import java.util.*;
+import java.util.regex.Pattern;
import com.sun.javadoc.*;
import com.sun.tools.doclets.internal.toolkit.*;
@@ -56,11 +57,12 @@
public static final int METHODS = 4;
public static final int ANNOTATION_TYPE_MEMBER_OPTIONAL = 5;
public static final int ANNOTATION_TYPE_MEMBER_REQUIRED = 6;
+ public static final int PROPERTIES = 7;
/**
* The total number of member types is {@value}.
*/
- public static final int NUM_MEMBER_TYPES = 7;
+ public static final int NUM_MEMBER_TYPES = 8;
public static final String STARTLEVEL = "start";
@@ -93,23 +95,34 @@
private final int kind;
/**
- * Deprected members should be excluded or not?
+ * The configuration this VisibleMemberMap was created with.
*/
- private final boolean nodepr;
+ private final Configuration configuration;
+
+ private static final Map<ClassDoc, ProgramElementDoc[]> propertiesCache =
+ new HashMap<ClassDoc, ProgramElementDoc[]>();
+ private static final Map<ProgramElementDoc, ProgramElementDoc> classPropertiesMap =
+ new HashMap<ProgramElementDoc, ProgramElementDoc>();
+ private static final Map<ProgramElementDoc, GetterSetter> getterSetterMap =
+ new HashMap<ProgramElementDoc, GetterSetter>();
/**
* Construct a VisibleMemberMap of the given type for the given
- * class. If nodepr is true, exclude the deprecated members from
- * the map.
+ * class.
*
* @param classdoc the class whose members are being mapped.
* @param kind the kind of member that is being mapped.
- * @param nodepr if true, exclude the deprecated members from the map.
+ * @param configuration the configuration to use to construct this
+ * VisibleMemberMap. If the field configuration.nodeprecated is true the
+ * deprecated members are excluded from the map. If the field
+ * configuration.javafx is true the JavaFX features are used.
*/
- public VisibleMemberMap(ClassDoc classdoc, int kind, boolean nodepr) {
+ public VisibleMemberMap(ClassDoc classdoc,
+ int kind,
+ Configuration configuration) {
this.classdoc = classdoc;
- this.nodepr = nodepr;
this.kind = kind;
+ this.configuration = configuration;
new ClassMembers(classdoc, STARTLEVEL).build();
}
@@ -124,6 +137,33 @@
}
/**
+ * Returns the property field documentation belonging to the given member.
+ * @param ped the member for which the property documentation is needed.
+ * @return the property field documentation, null if there is none.
+ */
+ public ProgramElementDoc getPropertyMemberDoc(ProgramElementDoc ped) {
+ return classPropertiesMap.get(ped);
+ }
+
+ /**
+ * Returns the getter documentation belonging to the given property method.
+ * @param propertyMethod the method for which the getter is needed.
+ * @return the getter documentation, null if there is none.
+ */
+ public ProgramElementDoc getGetterForProperty(ProgramElementDoc propertyMethod) {
+ return getterSetterMap.get(propertyMethod).getGetter();
+ }
+
+ /**
+ * Returns the setter documentation belonging to the given property method.
+ * @param propertyMethod the method for which the setter is needed.
+ * @return the setter documentation, null if there is none.
+ */
+ public ProgramElementDoc getSetterForProperty(ProgramElementDoc propertyMethod) {
+ return getterSetterMap.get(propertyMethod).getSetter();
+ }
+
+ /**
* Return the package private members inherited by the class. Only return
* if parent is package private and not documented.
*
@@ -334,8 +374,9 @@
ProgramElementDoc pgmelem = cdmembers.get(i);
if (!found(members, pgmelem) &&
memberIsVisible(pgmelem) &&
- !isOverridden(pgmelem, level)) {
- incllist.add(pgmelem);
+ !isOverridden(pgmelem, level) &&
+ !isTreatedAsPrivate(pgmelem)) {
+ incllist.add(pgmelem);
}
}
if (incllist.size() > 0) {
@@ -345,6 +386,16 @@
fillMemberLevelMap(getClassMembers(fromClass, false), level);
}
+ private boolean isTreatedAsPrivate(ProgramElementDoc pgmelem) {
+ if (!configuration.javafx) {
+ return false;
+ }
+
+ Tag[] aspTags = pgmelem.tags("@treatAsPrivate");
+ boolean result = (aspTags != null) && (aspTags.length > 0);
+ return result;
+ }
+
/**
* Is given doc item visible in given classdoc in terms fo inheritance?
* The given doc item is visible in the given classdoc if it is public
@@ -406,11 +457,16 @@
break;
case METHODS:
members = cd.methods(filter);
+ checkOnPropertiesTags((MethodDoc[])members);
+ break;
+ case PROPERTIES:
+ members = properties(cd, filter);
break;
default:
members = new ProgramElementDoc[0];
}
- if (nodepr) {
+ // Deprected members should be excluded or not?
+ if (configuration.nodeprecated) {
return Util.excludeDeprecatedMembersAsList(members);
}
return Arrays.asList(members);
@@ -472,6 +528,206 @@
}
return false;
}
+
+ private ProgramElementDoc[] properties(final ClassDoc cd, final boolean filter) {
+ final MethodDoc[] allMethods = cd.methods(filter);
+ final FieldDoc[] allFields = cd.fields(false);
+
+ if (propertiesCache.containsKey(cd)) {
+ return propertiesCache.get(cd);
+ }
+
+ final List<MethodDoc> result = new ArrayList<MethodDoc>();
+
+ for (final MethodDoc propertyMethod : allMethods) {
+
+ if (!isPropertyMethod(propertyMethod)) {
+ continue;
+ }
+
+ final MethodDoc getter = getterForField(allMethods, propertyMethod);
+ final MethodDoc setter = setterForField(allMethods, propertyMethod);
+ final FieldDoc field = fieldForProperty(allFields, propertyMethod);
+
+ addToPropertiesMap(setter, getter, propertyMethod, field);
+ getterSetterMap.put(propertyMethod, new GetterSetter(getter, setter));
+ result.add(propertyMethod);
+ }
+ final ProgramElementDoc[] resultAray =
+ result.toArray(new ProgramElementDoc[result.size()]);
+ propertiesCache.put(cd, resultAray);
+ return resultAray;
+ }
+
+ private void addToPropertiesMap(MethodDoc setter,
+ MethodDoc getter,
+ MethodDoc propertyMethod,
+ FieldDoc field) {
+ if ((field == null)
+ || (field.getRawCommentText() == null)
+ || field.getRawCommentText().length() == 0) {
+ addToPropertiesMap(setter, propertyMethod);
+ addToPropertiesMap(getter, propertyMethod);
+ addToPropertiesMap(propertyMethod, propertyMethod);
+ } else {
+ addToPropertiesMap(getter, field);
+ addToPropertiesMap(setter, field);
+ addToPropertiesMap(propertyMethod, field);
+ }
+ }
+
+ private void addToPropertiesMap(ProgramElementDoc propertyMethod,
+ ProgramElementDoc commentSource) {
+ if (null == propertyMethod || null == commentSource) {
+ return;
+ }
+ final String methodRawCommentText = propertyMethod.getRawCommentText();
+
+ /* The second condition is required for the property buckets. In
+ * this case the comment is at the property method (not at the field)
+ * and it needs to be listed in the map.
+ */
+ if ((null == methodRawCommentText || 0 == methodRawCommentText.length())
+ || propertyMethod.equals(commentSource)) {
+ classPropertiesMap.put(propertyMethod, commentSource);
+ }
+ }
+
+ private MethodDoc getterForField(MethodDoc[] methods,
+ MethodDoc propertyMethod) {
+ final String propertyMethodName = propertyMethod.name();
+ final String fieldName =
+ propertyMethodName.substring(0,
+ propertyMethodName.lastIndexOf("Property"));
+ final String fieldNameUppercased =
+ "" + Character.toUpperCase(fieldName.charAt(0))
+ + fieldName.substring(1);
+ final String getterNamePattern;
+ final String fieldTypeName = propertyMethod.returnType().toString();
+ if ("boolean".equals(fieldTypeName)
+ || fieldTypeName.endsWith("BooleanProperty")) {
+ getterNamePattern = "(is|get)" + fieldNameUppercased;
+ } else {
+ getterNamePattern = "get" + fieldNameUppercased;
+ }
+
+ for (MethodDoc methodDoc : methods) {
+ if (Pattern.matches(getterNamePattern, methodDoc.name())) {
+ if (0 == methodDoc.parameters().length
+ && (methodDoc.isPublic() || methodDoc.isProtected())) {
+ return methodDoc;
+ }
+ }
+ }
+ return null;
+ }
+
+ private MethodDoc setterForField(MethodDoc[] methods,
+ MethodDoc propertyMethod) {
+ final String propertyMethodName = propertyMethod.name();
+ final String fieldName =
+ propertyMethodName.substring(0,
+ propertyMethodName.lastIndexOf("Property"));
+ final String fieldNameUppercased =
+ "" + Character.toUpperCase(fieldName.charAt(0))
+ + fieldName.substring(1);
+ final String setter = "set" + fieldNameUppercased;
+
+ for (MethodDoc methodDoc : methods) {
+ if (setter.equals(methodDoc.name())) {
+ if (1 == methodDoc.parameters().length
+ && "void".equals(methodDoc.returnType().simpleTypeName())
+ && (methodDoc.isPublic() || methodDoc.isProtected())) {
+ return methodDoc;
+ }
+ }
+ }
+ return null;
+ }
+
+ private FieldDoc fieldForProperty(FieldDoc[] fields, MethodDoc property) {
+
+ for (FieldDoc field : fields) {
+ final String fieldName = field.name();
+ final String propertyName = fieldName + "Property";
+ if (propertyName.equals(property.name())) {
+ return field;
+ }
+ }
+ return null;
+ }
+
+ // properties aren't named setA* or getA*
+ private final Pattern pattern = Pattern.compile("[sg]et\\p{Upper}.*");
+ private boolean isPropertyMethod(MethodDoc method) {
+ if (!method.name().endsWith("Property")) {
+ return false;
+ }
+
+ if (! memberIsVisible(method)) {
+ return false;
+ }
+
+ if (pattern.matcher(method.name()).matches()) {
+ return false;
+ }
+
+ return 0 == method.parameters().length
+ && !"void".equals(method.returnType().simpleTypeName());
+ }
+
+ private void checkOnPropertiesTags(MethodDoc[] members) {
+ for (MethodDoc methodDoc: members) {
+ if (methodDoc.isIncluded()) {
+ for (Tag tag: methodDoc.tags()) {
+ String tagName = tag.name();
+ if (tagName.equals("@propertySetter")
+ || tagName.equals("@propertyGetter")
+ || tagName.equals("@propertyDescription")) {
+ if (!isPropertyGetterOrSetter(members, methodDoc)) {
+ configuration.message.warning(tag.position(),
+ "doclet.javafx_tag_misuse");
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ private boolean isPropertyGetterOrSetter(MethodDoc[] members,
+ MethodDoc methodDoc) {
+ boolean found = false;
+ String propertyName = Util.propertyNameFromMethodName(methodDoc.name());
+ if (!propertyName.isEmpty()) {
+ String propertyMethodName = propertyName + "Property";
+ for (MethodDoc member: members) {
+ if (member.name().equals(propertyMethodName)) {
+ found = true;
+ break;
+ }
+ }
+ }
+ return found;
+ }
+ }
+
+ private class GetterSetter {
+ private final ProgramElementDoc getter;
+ private final ProgramElementDoc setter;
+
+ public GetterSetter(ProgramElementDoc getter, ProgramElementDoc setter) {
+ this.getter = getter;
+ this.setter = setter;
+ }
+
+ public ProgramElementDoc getGetter() {
+ return getter;
+ }
+
+ public ProgramElementDoc getSetter() {
+ return setter;
+ }
}
/**
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/com/sun/javadoc/testJavaFX/C.java Sun Feb 24 11:36:58 2013 -0800
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @expert Expert tag text
+ */
+
+public class C {
+
+ /**
+ * @propertySetter Property
+ * @propertyDescription PropertyDescription
+ */
+ public void CC() {}
+
+ /**
+ * @propertyGetter Property
+ * @expert Expert tag text
+ *
+ */
+ public void B() {}
+
+ /**
+ * Method A documentation
+ * @treatAsPrivate
+ */
+ public void A() {}
+
+ /**
+ * Field i
+ * @defaultValue 1.0
+ */
+ public int i;
+
+
+ /**
+ * Defines the direction/speed at which the {@code Timeline} is expected to
+ * be played.
+ * @defaultValue 11
+ */
+ private DoubleProperty rate;
+
+ public final void setRate(double value) {}
+
+ public final double getRate() {}
+
+ public final DoubleProperty rateProperty() {}
+
+ private BooleanProperty paused;
+
+ public final void setPaused(boolean value) {}
+
+ public final double isPaused() {}
+
+ /**
+ * Defines if paused
+ * @defaultValue false
+ */
+ public final BooleanProperty pausedProperty() {}
+
+ class DoubleProperty {}
+
+ class BooleanProperty {}
+
+ public final BooleanProperty setTestMethodProperty() {}
+
+ private class Inner {
+ private BooleanProperty testMethodProperty() {}
+
+ /**
+ * Defines the direction/speed at which the {@code Timeline} is expected to
+ * be played.
+ * @defaultValue 11
+ */
+ private DoubleProperty rate;
+
+ public final void setRate(double value) {}
+
+ public final double getRate() {}
+
+ public final DoubleProperty rateProperty() {}
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/com/sun/javadoc/testJavaFX/D.java Sun Feb 24 11:36:58 2013 -0800
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @expert Expert tag text
+ */
+
+public class D extends C {}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/com/sun/javadoc/testJavaFX/TestJavaFX.java Sun Feb 24 11:36:58 2013 -0800
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7112427
+ * @summary Test of the JavaFX doclet features.
+ * @author jvalenta
+ * @library ../lib/
+ * @build JavadocTester TestJavaFX
+ * @run main TestJavaFX
+ */
+
+public class TestJavaFX extends JavadocTester {
+
+ private static final String BUG_ID = "7112427";
+
+ private static final String[][] TEST =
+ new String[][] {
+ {"./" + BUG_ID + "/C.html",
+ "<dt><span class=\"strong\">See Also:</span></dt><dd><a href=\"C.html#getRate()\"><code>getRate()</code></a>, " + NL +
+ "<a href=\"C.html#setRate(double)\"><code>setRate(double)</code></a></dd>"},
+ {"./" + BUG_ID + "/C.html",
+ "<pre>public final void setRate(double value)</pre>" + NL +
+ "<div class=\"block\">Sets the value of the property rate.</div>" + NL +
+ "<dl><dt><span class=\"strong\">Property description:</span></dt>" },
+ {"./" + BUG_ID + "/C.html",
+ "<pre>public final double getRate()</pre>" + NL +
+ "<div class=\"block\">Gets the value of the property rate.</div>" + NL +
+ "<dl><dt><span class=\"strong\">Property description:</span></dt>" },
+ {"./" + BUG_ID + "/C.html",
+ "<td class=\"colLast\"><code><strong><a href=\"C.html#rateProperty\">rate</a></strong></code>" + NL +
+ "<div class=\"block\">Defines the direction/speed at which the <code>Timeline</code> is expected to"},
+ {"./" + BUG_ID + "/C.html",
+ "<sub id=\"expert\">Expert tag text</sub>"},
+ {"./" + BUG_ID + "/C.html",
+ "<span class=\"strong\">Default value:</span>"},
+ {"./" + BUG_ID + "/C.html",
+ "<P>Sets the value of the property <CODE>Property</CODE>"},
+ {"./" + BUG_ID + "/C.html",
+ "<P>Gets the value of the property <CODE>Property</CODE>"},
+ {"./" + BUG_ID + "/C.html",
+ "<span class=\"strong\">Property description:</span>"},
+ {"./" + BUG_ID + "/C.html",
+ "<td class=\"colLast\"><code><strong><a href=\"C.html#setTestMethodProperty()\">setTestMethodProperty</a></strong>()</code> </td>" },
+ {"./" + BUG_ID + "/C.html",
+ "<h4>isPaused</h4>" + NL +
+ "<pre>public final double isPaused()</pre>" + NL +
+ "<div class=\"block\">Gets the value of the property paused.</div>" },
+ {"./" + BUG_ID + "/D.html",
+ "<h3>Properties inherited from class <a href=\"C.html\" title=\"class in <Unnamed>\">C</a></h3>" + NL +
+ "<code><a href=\"C.html#pausedProperty\">paused</a>, <a href=\"C.html#rateProperty\">rate</a></code></li>" },
+ };
+ private static final String[][] NO_TEST =
+ new String[][] {
+ {"./" + BUG_ID + "/C.html",
+ "A()"},
+ };
+
+
+ private static final String[] ARGS = new String[] {
+ "-d", BUG_ID, "-sourcepath", SRC_DIR, "-private", "-javafx",
+ SRC_DIR + FS + "C.java", SRC_DIR + FS + "D.java"
+ };
+
+ /**
+ * The entry point of the test.
+ * @param args the array of command line arguments.
+ */
+ public static void main(String[] args) {
+ TestJavaFX tester = new TestJavaFX();
+ run(tester, ARGS, TEST, NO_TEST);
+ tester.printSummary();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getBugId() {
+ return BUG_ID;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getBugName() {
+ return getClass().getName();
+ }
+}
--- a/langtools/test/com/sun/javadoc/testLambdaFeature/TestLambdaFeature.java Fri Feb 22 18:19:51 2013 +0000
+++ b/langtools/test/com/sun/javadoc/testLambdaFeature/TestLambdaFeature.java Sun Feb 24 11:36:58 2013 -0800
@@ -63,7 +63,7 @@
"<dl>" + NL + "<dt>Functional Interface:</dt>" + NL +
"<dd>This is a functional interface and can therefore be used as " +
"the assignment target for a lambda expression or method " +
- "reference. </dd>" + NL + "</dl>"}
+ "reference.</dd>" + NL + "</dl>"}
};
private static final String[][] NEGATED_TEST = {
{BUG_ID + FS + "pkg" + FS + "A.html",