001    /*
002     * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
003     * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004     *
005     * This code is free software; you can redistribute it and/or modify it
006     * under the terms of the GNU General Public License version 2 only, as
007     * published by the Free Software Foundation.  Sun designates this
008     * particular file as subject to the "Classpath" exception as provided
009     * by Sun in the LICENSE file that accompanied this code.
010     *
011     * This code is distributed in the hope that it will be useful, but WITHOUT
012     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013     * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
014     * version 2 for more details (a copy is included in the LICENSE file that
015     * accompanied this code).
016     *
017     * You should have received a copy of the GNU General Public License version
018     * 2 along with this work; if not, write to the Free Software Foundation,
019     * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020     *
021     * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022     * CA 95054 USA or visit www.sun.com if you need additional information or
023     * have any questions.
024     */
025    
026    package com.sun.tools.doclets.internal.toolkit.builders;
027    
028    import com.sun.tools.doclets.internal.toolkit.util.*;
029    import com.sun.tools.doclets.internal.toolkit.*;
030    import com.sun.javadoc.*;
031    import java.util.*;
032    import java.lang.reflect.*;
033    
034    /**
035     * Builds documentation for a enum constants.
036     *
037     * This code is not part of an API.
038     * It is implementation that is subject to change.
039     * Do not use it as an API
040     *
041     * @author Jamie Ho
042     * @since 1.5
043     */
044    public class EnumConstantBuilder extends AbstractMemberBuilder {
045    
046            /**
047             * The class whose enum constants are being documented.
048             */
049            private ClassDoc classDoc;
050    
051            /**
052             * The visible enum constantss for the given class.
053             */
054            private VisibleMemberMap visibleMemberMap;
055    
056            /**
057             * The writer to output the enum constants documentation.
058             */
059            private EnumConstantWriter writer;
060    
061            /**
062             * The list of enum constants being documented.
063             */
064            private List<ProgramElementDoc> enumConstants;
065    
066            /**
067             * The index of the current enum constant that is being documented at this point
068             * in time.
069             */
070            private int currentEnumConstantsIndex;
071    
072            /**
073             * Construct a new EnumConstantsBuilder.
074             *
075             * @param configuration the current configuration of the
076             *                      doclet.
077             */
078            private EnumConstantBuilder(Configuration configuration) {
079                    super(configuration);
080            }
081    
082            /**
083             * Construct a new EnumConstantsBuilder.
084             *
085             * @param configuration the current configuration of the doclet.
086             * @param classDoc the class whoses members are being documented.
087             * @param writer the doclet specific writer.
088             */
089            public static EnumConstantBuilder getInstance(
090                    Configuration configuration,
091                    ClassDoc classDoc,
092                    EnumConstantWriter writer) {
093                    EnumConstantBuilder builder = new EnumConstantBuilder(configuration);
094                    builder.classDoc = classDoc;
095                    builder.writer = writer;
096                    builder.visibleMemberMap =
097                            new VisibleMemberMap(
098                                    classDoc,
099                                    VisibleMemberMap.ENUM_CONSTANTS,
100                                    configuration.nodeprecated);
101                    builder.enumConstants =
102                            new ArrayList<ProgramElementDoc>(builder.visibleMemberMap.getMembersFor(classDoc));
103                    if (configuration.getMemberComparator() != null) {
104                            Collections.sort(
105                                    builder.enumConstants,
106                                    configuration.getMemberComparator());
107                    }
108                    return builder;
109            }
110    
111            /**
112             * {@inheritDoc}
113             */
114            public String getName() {
115                    return "EnumConstantDetails";
116            }
117    
118            /**
119             * {@inheritDoc}
120             */
121            public void invokeMethod(
122                    String methodName,
123                    Class<?>[] paramClasses,
124                    Object[] params)
125                    throws Exception {
126                    if (DEBUG) {
127                            configuration.root.printError(
128                                    "DEBUG: " + this.getClass().getName() + "." + methodName);
129                    }
130                    Method method = this.getClass().getMethod(methodName, paramClasses);
131                    method.invoke(this, params);
132            }
133    
134            /**
135             * Returns a list of enum constants that will be documented for the given class.
136             * This information can be used for doclet specific documentation
137             * generation.
138             *
139             * @param classDoc the {@link ClassDoc} we want to check.
140             * @return a list of enum constants that will be documented.
141             */
142            public List<ProgramElementDoc> members(ClassDoc classDoc) {
143                    return visibleMemberMap.getMembersFor(classDoc);
144            }
145    
146            /**
147             * Returns the visible member map for the enum constants of this class.
148             *
149             * @return the visible member map for the enum constants of this class.
150             */
151            public VisibleMemberMap getVisibleMemberMap() {
152                    return visibleMemberMap;
153            }
154    
155            /**
156             * summaryOrder.size()
157             */
158            public boolean hasMembersToDocument() {
159                    return enumConstants.size() > 0;
160            }
161    
162            /**
163             * Build the enum constant documentation.
164             *
165             * @param elements the XML elements that specify how to construct this
166             *                documentation.
167             */
168            public void buildEnumConstant(List<?> elements) {
169                    if (writer == null) {
170                            return;
171                    }
172                    for (currentEnumConstantsIndex = 0;
173                            currentEnumConstantsIndex < enumConstants.size();
174                            currentEnumConstantsIndex++) {
175                            build(elements);
176                    }
177            }
178    
179            /**
180             * Build the overall header.
181             */
182            public void buildHeader() {
183                    writer.writeHeader(
184                            classDoc,
185                            configuration.getText("doclet.Enum_Constant_Detail"));
186            }
187    
188            /**
189             * Build the header for the individual enum constants.
190             */
191            public void buildEnumConstantHeader() {
192                    writer.writeEnumConstantHeader(
193                            (FieldDoc) enumConstants.get(currentEnumConstantsIndex),
194                            currentEnumConstantsIndex == 0);
195            }
196    
197            /**
198             * Build the signature.
199             */
200            public void buildSignature() {
201                    writer.writeSignature(
202                            (FieldDoc) enumConstants.get(currentEnumConstantsIndex));
203            }
204    
205            /**
206             * Build the deprecation information.
207             */
208            public void buildDeprecationInfo() {
209                    writer.writeDeprecated(
210                            (FieldDoc) enumConstants.get(currentEnumConstantsIndex));
211            }
212    
213            /**
214             * Build the comments for the enum constant.  Do nothing if
215             * {@link Configuration#nocomment} is set to true.
216             */
217            public void buildEnumConstantComments() {
218                    if (!configuration.nocomment) {
219                            writer.writeComments(
220                                    (FieldDoc) enumConstants.get(currentEnumConstantsIndex));
221                    }
222            }
223    
224            /**
225             * Build the tag information.
226             */
227            public void buildTagInfo() {
228                    writer.writeTags(
229                            (FieldDoc) enumConstants.get(currentEnumConstantsIndex));
230            }
231    
232            /**
233             * Build the footer for the individual enum constants.
234             */
235            public void buildEnumConstantFooter() {
236                    writer.writeEnumConstantFooter();
237            }
238    
239            /**
240             * Build the overall footer.
241             */
242            public void buildFooter() {
243                    writer.writeFooter(classDoc);
244            }
245    
246            /**
247             * Return the enum constant writer for this builder.
248             *
249             * @return the enum constant writer for this builder.
250             */
251            public EnumConstantWriter getWriter() {
252                    return writer;
253            }
254    }