1 /*
2  * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package com.sun.tools.doclets.formats.html;
27 
28 import java.io.*;
29 
30 import com.sun.tools.javac.sym.Profiles;
31 import com.sun.tools.doclets.formats.html.markup.*;
32 import com.sun.tools.doclets.internal.toolkit.*;
33 import com.sun.tools.doclets.internal.toolkit.util.DocPath;
34 
35 /**
36  * Abstract class to generate the profile overview files in
37  * Frame and Non-Frame format. This will be sub-classed to
38  * generate profile-overview-frame.html as well as profile-overview-summary.html.
39  *
40  *  <p><b>This is NOT part of any supported API.
41  *  If you write code that depends on this, you do so at your own risk.
42  *  This code and its internal interfaces are subject to change or
43  *  deletion without notice.</b>
44  *
45  * @author Bhavesh Patel
46  */
47 public abstract class AbstractProfileIndexWriter extends HtmlDocletWriter {
48 
49     /**
50      * Profiles to be documented.
51      */
52     protected Profiles profiles;
53 
54     /**
55      * Constructor. Also initializes the profiles variable.
56      *
57      * @param configuration  The current configuration
58      * @param filename Name of the profile index file to be generated.
59      */
AbstractProfileIndexWriter(ConfigurationImpl configuration, DocPath filename)60     public AbstractProfileIndexWriter(ConfigurationImpl configuration,
61                                       DocPath filename) throws IOException {
62         super(configuration, filename);
63         profiles = configuration.profiles;
64     }
65 
66     /**
67      * Adds the navigation bar header to the documentation tree.
68      *
69      * @param body the document tree to which the navigation bar header will be added
70      */
addNavigationBarHeader(Content body)71     protected abstract void addNavigationBarHeader(Content body);
72 
73     /**
74      * Adds the navigation bar footer to the documentation tree.
75      *
76      * @param body the document tree to which the navigation bar footer will be added
77      */
addNavigationBarFooter(Content body)78     protected abstract void addNavigationBarFooter(Content body);
79 
80     /**
81      * Adds the overview header to the documentation tree.
82      *
83      * @param body the document tree to which the overview header will be added
84      */
addOverviewHeader(Content body)85     protected abstract void addOverviewHeader(Content body);
86 
87     /**
88      * Adds the profiles list to the documentation tree.
89      *
90      * @param profiles profiles object
91      * @param text caption for the table
92      * @param tableSummary summary for the table
93      * @param body the document tree to which the profiles list will be added
94      */
addProfilesList(Profiles profiles, String text, String tableSummary, Content body)95     protected abstract void addProfilesList(Profiles profiles, String text,
96             String tableSummary, Content body);
97 
98     /**
99      * Adds the profile packages list to the documentation tree.
100      *
101      * @param profiles profiles object
102      * @param text caption for the table
103      * @param tableSummary summary for the table
104      * @param body the document tree to which the profiles list will be added
105      * @param profileName the name for the profile being documented
106      */
addProfilePackagesList(Profiles profiles, String text, String tableSummary, Content body, String profileName)107     protected abstract void addProfilePackagesList(Profiles profiles, String text,
108             String tableSummary, Content body, String profileName);
109 
110     /**
111      * Generate and prints the contents in the profile index file. Call appropriate
112      * methods from the sub-class in order to generate Frame or Non
113      * Frame format.
114      *
115      * @param title the title of the window.
116      * @param includeScript boolean set true if windowtitle script is to be included
117      */
buildProfileIndexFile(String title, boolean includeScript)118     protected void buildProfileIndexFile(String title, boolean includeScript) throws IOException {
119         String windowOverview = configuration.getText(title);
120         Content body = getBody(includeScript, getWindowTitle(windowOverview));
121         addNavigationBarHeader(body);
122         addOverviewHeader(body);
123         addIndex(body);
124         addOverview(body);
125         addNavigationBarFooter(body);
126         printHtmlDocument(configuration.metakeywords.getOverviewMetaKeywords(title,
127                 configuration.doctitle), includeScript, body);
128     }
129 
130     /**
131      * Generate and prints the contents in the profile packages index file. Call appropriate
132      * methods from the sub-class in order to generate Frame or Non
133      * Frame format.
134      *
135      * @param title the title of the window.
136      * @param includeScript boolean set true if windowtitle script is to be included
137      * @param profileName the name of the profile being documented
138      */
buildProfilePackagesIndexFile(String title, boolean includeScript, String profileName)139     protected void buildProfilePackagesIndexFile(String title,
140             boolean includeScript, String profileName) throws IOException {
141         String windowOverview = configuration.getText(title);
142         Content body = getBody(includeScript, getWindowTitle(windowOverview));
143         addNavigationBarHeader(body);
144         addOverviewHeader(body);
145         addProfilePackagesIndex(body, profileName);
146         addOverview(body);
147         addNavigationBarFooter(body);
148         printHtmlDocument(configuration.metakeywords.getOverviewMetaKeywords(title,
149                 configuration.doctitle), includeScript, body);
150     }
151 
152     /**
153      * Default to no overview, override to add overview.
154      *
155      * @param body the document tree to which the overview will be added
156      */
addOverview(Content body)157     protected void addOverview(Content body) throws IOException {
158     }
159 
160     /**
161      * Adds the frame or non-frame profile index to the documentation tree.
162      *
163      * @param body the document tree to which the index will be added
164      */
addIndex(Content body)165     protected void addIndex(Content body) {
166         addIndexContents(profiles, "doclet.Profile_Summary",
167                 configuration.getText("doclet.Member_Table_Summary",
168                 configuration.getText("doclet.Profile_Summary"),
169                 configuration.getText("doclet.profiles")), body);
170     }
171 
172     /**
173      * Adds the frame or non-frame profile packages index to the documentation tree.
174      *
175      * @param body the document tree to which the index will be added
176      * @param profileName  the name of the profile being documented
177      */
addProfilePackagesIndex(Content body, String profileName)178     protected void addProfilePackagesIndex(Content body, String profileName) {
179         addProfilePackagesIndexContents(profiles, "doclet.Profile_Summary",
180                 configuration.getText("doclet.Member_Table_Summary",
181                 configuration.getText("doclet.Profile_Summary"),
182                 configuration.getText("doclet.profiles")), body, profileName);
183     }
184 
185     /**
186      * Adds profile index contents. Call appropriate methods from
187      * the sub-classes. Adds it to the body HtmlTree
188      *
189      * @param profiles profiles to be documented
190      * @param text string which will be used as the heading
191      * @param tableSummary summary for the table
192      * @param body the document tree to which the index contents will be added
193      */
addIndexContents(Profiles profiles, String text, String tableSummary, Content body)194     protected void addIndexContents(Profiles profiles, String text,
195             String tableSummary, Content body) {
196         if (profiles.getProfileCount() > 0) {
197             HtmlTree div = new HtmlTree(HtmlTag.DIV);
198             div.addStyle(HtmlStyle.indexHeader);
199             addAllClassesLink(div);
200             addAllPackagesLink(div);
201             body.addContent(div);
202             addProfilesList(profiles, text, tableSummary, body);
203         }
204     }
205 
206     /**
207      * Adds profile packages index contents. Call appropriate methods from
208      * the sub-classes. Adds it to the body HtmlTree
209      *
210      * @param profiles profiles to be documented
211      * @param text string which will be used as the heading
212      * @param tableSummary summary for the table
213      * @param body the document tree to which the index contents will be added
214      * @param profileName the name of the profile being documented
215      */
addProfilePackagesIndexContents(Profiles profiles, String text, String tableSummary, Content body, String profileName)216     protected void addProfilePackagesIndexContents(Profiles profiles, String text,
217             String tableSummary, Content body, String profileName) {
218         HtmlTree div = new HtmlTree(HtmlTag.DIV);
219         div.addStyle(HtmlStyle.indexHeader);
220         addAllClassesLink(div);
221         addAllPackagesLink(div);
222         addAllProfilesLink(div);
223         body.addContent(div);
224         addProfilePackagesList(profiles, text, tableSummary, body, profileName);
225     }
226 
227     /**
228      * Adds the doctitle to the documentation tree, if it is specified on the command line.
229      *
230      * @param body the document tree to which the title will be added
231      */
addConfigurationTitle(Content body)232     protected void addConfigurationTitle(Content body) {
233         if (configuration.doctitle.length() > 0) {
234             Content title = new RawHtml(configuration.doctitle);
235             Content heading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING,
236                     HtmlStyle.title, title);
237             Content div = HtmlTree.DIV(HtmlStyle.header, heading);
238             body.addContent(div);
239         }
240     }
241 
242     /**
243      * Returns highlighted "Overview", in the navigation bar as this is the
244      * overview page.
245      *
246      * @return a Content object to be added to the documentation tree
247      */
getNavLinkContents()248     protected Content getNavLinkContents() {
249         Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, overviewLabel);
250         return li;
251     }
252 
253     /**
254      * Do nothing. This will be overridden in ProfileIndexFrameWriter.
255      *
256      * @param div the document tree to which the all classes link will be added
257      */
addAllClassesLink(Content div)258     protected void addAllClassesLink(Content div) {
259     }
260 
261     /**
262      * Do nothing. This will be overridden in ProfileIndexFrameWriter.
263      *
264      * @param div the document tree to which the all packages link will be added
265      */
addAllPackagesLink(Content div)266     protected void addAllPackagesLink(Content div) {
267     }
268 
269     /**
270      * Do nothing. This will be overridden in ProfilePackageIndexFrameWriter.
271      *
272      * @param div the document tree to which the all profiles link will be added
273      */
addAllProfilesLink(Content div)274     protected void addAllProfilesLink(Content div) {
275     }
276 }
277