/* * Copyright (c) 1997, 2016, 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 jdk.javadoc.internal.doclets.formats.html; import java.util.*; import javax.lang.model.element.ModuleElement; import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; import jdk.javadoc.doclet.Doclet.Option; import jdk.javadoc.doclet.DocletEnvironment; import jdk.javadoc.doclet.Reporter; import jdk.javadoc.internal.doclets.toolkit.AbstractDoclet; import jdk.javadoc.internal.doclets.toolkit.DocletException; import jdk.javadoc.internal.doclets.toolkit.Messages; import jdk.javadoc.internal.doclets.toolkit.builders.AbstractBuilder; import jdk.javadoc.internal.doclets.toolkit.util.ClassTree; import jdk.javadoc.internal.doclets.toolkit.util.DocFile; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.IndexBuilder; /** * The class with "start" method, calls individual Writers. * * <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 Atul M Dambalkar * @author Robert Field * @author Jamie Ho * */ public class HtmlDoclet extends AbstractDoclet { public HtmlDoclet() { configuration = new ConfigurationImpl(); } @Override // defined by Doclet public String getName() { return "Html"; } /** * The global configuration information for this run. */ private final ConfigurationImpl configuration; private Messages messages; private static final DocPath DOCLET_RESOURCES = DocPath .create("/jdk/javadoc/internal/doclets/formats/html/resources"); @Override // defined by Doclet public void init(Locale locale, Reporter reporter) { configuration.reporter = reporter; configuration.locale = locale; messages = configuration.getMessages(); } /** * Create the configuration instance. * Override this method to use a different * configuration. * * @return the configuration */ @Override // defined by AbstractDoclet public ConfigurationImpl getConfiguration() { return configuration; } /** * Start the generation of files. Call generate methods in the individual * writers, which will in turn generate the documentation files. Call the * TreeWriter generation first to ensure the Class Hierarchy is built * first and then can be used in the later generation. * * For new format. * * @throws DocletException if there is a problem while writing the other files * @see jdk.doclet.DocletEnvironment */ @Override // defined by AbstractDoclet protected void generateOtherFiles(DocletEnvironment docEnv, ClassTree classtree) throws DocletException { super.generateOtherFiles(docEnv, classtree); if (configuration.linksource) { SourceToHTMLConverter.convertRoot(configuration, docEnv, DocPaths.SOURCE_OUTPUT); } if (configuration.topFile.isEmpty()) { messages.error("doclet.No_Non_Deprecated_Classes_To_Document"); return; } boolean nodeprecated = configuration.nodeprecated; performCopy(configuration.helpfile); performCopy(configuration.stylesheetfile); // do early to reduce memory footprint if (configuration.classuse) { ClassUseWriter.generate(configuration, classtree); } IndexBuilder indexbuilder = new IndexBuilder(configuration, nodeprecated); if (configuration.createtree) { TreeWriter.generate(configuration, classtree); } if (configuration.createindex) { configuration.buildSearchTagIndex(); if (configuration.splitindex) { SplitIndexWriter.generate(configuration, indexbuilder); } else { SingleIndexWriter.generate(configuration, indexbuilder); } } if (!(configuration.nodeprecatedlist || nodeprecated)) { DeprecatedListWriter.generate(configuration); } AllClassesFrameWriter.generate(configuration, new IndexBuilder(configuration, nodeprecated, true)); if (configuration.frames) { FrameOutputWriter.generate(configuration); } if (configuration.createoverview) { if (configuration.showModules) { ModuleIndexWriter.generate(configuration); } else { PackageIndexWriter.generate(configuration); } } if (!configuration.frames && !configuration.createoverview) { IndexRedirectWriter.generate(configuration); } if (configuration.helpfile.isEmpty() && !configuration.nohelp) { HelpWriter.generate(configuration); } // If a stylesheet file is not specified, copy the default stylesheet // and replace newline with platform-specific newline. DocFile f; if (configuration.stylesheetfile.length() == 0) { f = DocFile.createFileForOutput(configuration, DocPaths.STYLESHEET); f.copyResource(DocPaths.RESOURCES.resolve(DocPaths.STYLESHEET), false, true); } f = DocFile.createFileForOutput(configuration, DocPaths.JAVASCRIPT); f.copyResource(DocPaths.RESOURCES.resolve(DocPaths.JAVASCRIPT), true, true); if (configuration.createindex) { f = DocFile.createFileForOutput(configuration, DocPaths.SEARCH_JS); f.copyResource(DOCLET_RESOURCES.resolve(DocPaths.SEARCH_JS), true, true); f = DocFile.createFileForOutput(configuration, DocPaths.RESOURCES.resolve(DocPaths.GLASS_IMG)); f.copyResource(DOCLET_RESOURCES.resolve(DocPaths.GLASS_IMG), true, false); f = DocFile.createFileForOutput(configuration, DocPaths.RESOURCES.resolve(DocPaths.X_IMG)); f.copyResource(DOCLET_RESOURCES.resolve(DocPaths.X_IMG), true, false); copyJqueryFiles(); } } protected void copyJqueryFiles() throws DocletException { List<String> files = Arrays.asList( "jquery-1.10.2.js", "jquery-ui.js", "jquery-ui.css", "jquery-ui.min.js", "jquery-ui.min.css", "jquery-ui.structure.min.css", "jquery-ui.structure.css", "external/jquery/jquery.js", "jszip/dist/jszip.js", "jszip/dist/jszip.min.js", "jszip-utils/dist/jszip-utils.js", "jszip-utils/dist/jszip-utils.min.js", "jszip-utils/dist/jszip-utils-ie.js", "jszip-utils/dist/jszip-utils-ie.min.js", "images/ui-bg_flat_0_aaaaaa_40x100.png", "images/ui-icons_454545_256x240.png", "images/ui-bg_glass_95_fef1ec_1x400.png", "images/ui-bg_glass_75_dadada_1x400.png", "images/ui-bg_highlight-soft_75_cccccc_1x100.png", "images/ui-icons_888888_256x240.png", "images/ui-icons_2e83ff_256x240.png", "images/ui-bg_glass_65_ffffff_1x400.png", "images/ui-icons_cd0a0a_256x240.png", "images/ui-bg_glass_55_fbf9ee_1x400.png", "images/ui-icons_222222_256x240.png", "images/ui-bg_glass_75_e6e6e6_1x400.png", "images/ui-bg_flat_75_ffffff_40x100.png"); DocFile f; for (String file : files) { DocPath filePath = DocPaths.JQUERY_FILES.resolve(file); f = DocFile.createFileForOutput(configuration, filePath); f.copyResource(DOCLET_RESOURCES.resolve(filePath), true, false); } } /** * {@inheritDoc} */ @Override // defined by AbstractDoclet protected void generateClassFiles(SortedSet<TypeElement> arr, ClassTree classtree) throws DocletException { List<TypeElement> list = new ArrayList<>(arr); ListIterator<TypeElement> iterator = list.listIterator(); TypeElement klass = null; while (iterator.hasNext()) { TypeElement prev = iterator.hasPrevious() ? klass : null; klass = iterator.next(); TypeElement next = iterator.nextIndex() == list.size() ? null : list.get(iterator.nextIndex()); if (utils.isHidden(klass) || !(configuration.isGeneratedDoc(klass) && utils.isIncluded(klass))) { continue; } if (utils.isAnnotationType(klass)) { AbstractBuilder annotationTypeBuilder = configuration.getBuilderFactory() .getAnnotationTypeBuilder(klass, prev == null ? null : prev.asType(), next == null ? null : next.asType()); annotationTypeBuilder.build(); } else { AbstractBuilder classBuilder = configuration.getBuilderFactory().getClassBuilder(klass, prev, next, classtree); classBuilder.build(); } } } /** * {@inheritDoc} */ @Override // defined by AbstractDoclet protected void generateModuleFiles() throws DocletException { if (configuration.showModules) { if (configuration.frames) { ModuleIndexFrameWriter.generate(configuration); } ModuleElement prevModule = null, nextModule; List<ModuleElement> mdles = new ArrayList<>(configuration.modulePackages.keySet()); int i = 0; for (ModuleElement mdle : mdles) { if (configuration.frames) { ModulePackageIndexFrameWriter.generate(configuration, mdle); ModuleFrameWriter.generate(configuration, mdle); } nextModule = (i + 1 < mdles.size()) ? mdles.get(i + 1) : null; AbstractBuilder moduleSummaryBuilder = configuration.getBuilderFactory().getModuleSummaryBuilder( mdle, prevModule, nextModule); moduleSummaryBuilder.build(); prevModule = mdle; i++; } } } PackageElement getNamedPackage(List<PackageElement> list, int idx) { if (idx < list.size()) { PackageElement pkg = list.get(idx); if (pkg != null && !pkg.isUnnamed()) { return pkg; } } return null; } /** * {@inheritDoc} */ @Override // defined by AbstractDoclet protected void generatePackageFiles(ClassTree classtree) throws DocletException { Set<PackageElement> packages = configuration.packages; if (packages.size() > 1 && configuration.frames) { PackageIndexFrameWriter.generate(configuration); } List<PackageElement> pList = new ArrayList<>(packages); PackageElement prev = null; for (int i = 0 ; i < pList.size() ; i++) { // if -nodeprecated option is set and the package is marked as // deprecated, do not generate the package-summary.html, package-frame.html // and package-tree.html pages for that package. PackageElement pkg = pList.get(i); if (!(configuration.nodeprecated && utils.isDeprecated(pkg))) { if (configuration.frames) { PackageFrameWriter.generate(configuration, pkg); } int nexti = i + 1; PackageElement next = null; if (nexti < pList.size()) { next = pList.get(nexti); // If the next package is unnamed package, skip 2 ahead if possible if (next.isUnnamed() && ++nexti < pList.size()) { next = pList.get(nexti); } } AbstractBuilder packageSummaryBuilder = configuration.getBuilderFactory().getPackageSummaryBuilder( pkg, prev, next); packageSummaryBuilder.build(); if (configuration.createtree) { PackageTreeWriter.generate(configuration, pkg, prev, next, configuration.nodeprecated); } prev = pkg; } } } @Override // defined by Doclet public Set<Option> getSupportedOptions() { return configuration.getSupportedOptions(); } private void performCopy(String filename) throws DocFileIOException { if (filename.isEmpty()) return; DocFile fromfile = DocFile.createFileForInput(configuration, filename); DocPath path = DocPath.create(fromfile.getName()); DocFile toFile = DocFile.createFileForOutput(configuration, path); if (toFile.isSameFile(fromfile)) return; messages.notice("doclet.Copying_File_0_To_File_1", fromfile.toString(), path.getPath()); toFile.copyFile(fromfile); } }