aoqi@0: /* aoqi@0: * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. Oracle designates this aoqi@0: * particular file as subject to the "Classpath" exception as provided aoqi@0: * by Oracle in the LICENSE file that accompanied this code. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: package com.sun.tools.doclets.internal.toolkit.util; aoqi@0: aoqi@0: import java.util.*; aoqi@0: aoqi@0: import com.sun.javadoc.*; aoqi@0: import com.sun.tools.javac.jvm.Profile; aoqi@0: import com.sun.tools.doclets.internal.toolkit.*; aoqi@0: aoqi@0: /** aoqi@0: * Provides methods for creating an array of class, method and aoqi@0: * field names to be included as meta keywords in the HTML header aoqi@0: * of class pages. These keywords improve search results aoqi@0: * on browsers that look for keywords. aoqi@0: * aoqi@0: *

This is NOT part of any supported API. aoqi@0: * If you write code that depends on this, you do so at your own risk. aoqi@0: * This code and its internal interfaces are subject to change or aoqi@0: * deletion without notice. aoqi@0: * aoqi@0: * @author Doug Kramer aoqi@0: */ aoqi@0: public class MetaKeywords { aoqi@0: aoqi@0: /** aoqi@0: * The global configuration information for this run. aoqi@0: */ aoqi@0: private final Configuration configuration; aoqi@0: aoqi@0: /** aoqi@0: * Constructor aoqi@0: */ aoqi@0: public MetaKeywords(Configuration configuration) { aoqi@0: this.configuration = configuration; aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * Returns an array of strings where each element aoqi@0: * is a class, method or field name. This array is aoqi@0: * used to create one meta keyword tag for each element. aoqi@0: * Method parameter lists are converted to "()" and aoqi@0: * overloads are combined. aoqi@0: * aoqi@0: * Constructors are not included because they have the same aoqi@0: * name as the class, which is already included. aoqi@0: * Nested class members are not included because their aoqi@0: * definitions are on separate pages. aoqi@0: */ aoqi@0: public String[] getMetaKeywords(ClassDoc classdoc) { aoqi@0: ArrayList results = new ArrayList(); aoqi@0: aoqi@0: // Add field and method keywords only if -keywords option is used aoqi@0: if( configuration.keywords ) { aoqi@0: results.addAll(getClassKeyword(classdoc)); aoqi@0: results.addAll(getMemberKeywords(classdoc.fields())); aoqi@0: results.addAll(getMemberKeywords(classdoc.methods())); aoqi@0: } aoqi@0: return results.toArray(new String[]{}); aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * Get the current class for a meta tag keyword, as the first aoqi@0: * and only element of an array list. aoqi@0: */ aoqi@0: protected ArrayList getClassKeyword(ClassDoc classdoc) { aoqi@0: String cltypelower = classdoc.isInterface() ? "interface" : "class"; aoqi@0: ArrayList metakeywords = new ArrayList(1); aoqi@0: metakeywords.add(classdoc.qualifiedName() + " " + cltypelower); aoqi@0: return metakeywords; aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * Get the package keywords. aoqi@0: */ aoqi@0: public String[] getMetaKeywords(PackageDoc packageDoc) { aoqi@0: if( configuration.keywords ) { aoqi@0: String pkgName = Util.getPackageName(packageDoc); aoqi@0: return new String[] { pkgName + " " + "package" }; aoqi@0: } else { aoqi@0: return new String[] {}; aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * Get the profile keywords. aoqi@0: * aoqi@0: * @param profile the profile being documented aoqi@0: */ aoqi@0: public String[] getMetaKeywords(Profile profile) { aoqi@0: if( configuration.keywords ) { aoqi@0: String profileName = profile.name; aoqi@0: return new String[] { profileName + " " + "profile" }; aoqi@0: } else { aoqi@0: return new String[] {}; aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * Get the overview keywords. aoqi@0: */ aoqi@0: public String[] getOverviewMetaKeywords(String title, String docTitle) { aoqi@0: if( configuration.keywords ) { aoqi@0: String windowOverview = configuration.getText(title); aoqi@0: String[] metakeywords = { windowOverview }; aoqi@0: if (docTitle.length() > 0 ) { aoqi@0: metakeywords[0] += ", " + docTitle; aoqi@0: } aoqi@0: return metakeywords; aoqi@0: } else { aoqi@0: return new String[] {}; aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * Get members for meta tag keywords as an array, aoqi@0: * where each member name is a string element of the array. aoqi@0: * The parameter lists are not included in the keywords; aoqi@0: * therefore all overloaded methods are combined.
aoqi@0: * Example: getValue(Object) is returned in array as getValue() aoqi@0: * aoqi@0: * @param memberdocs array of MemberDoc objects to be added to keywords aoqi@0: */ aoqi@0: protected ArrayList getMemberKeywords(MemberDoc[] memberdocs) { aoqi@0: ArrayList results = new ArrayList(); aoqi@0: String membername; aoqi@0: for (int i=0; i < memberdocs.length; i++) { aoqi@0: membername = memberdocs[i].name() aoqi@0: + (memberdocs[i].isMethod() ? "()" : ""); aoqi@0: if ( ! results.contains(membername) ) { aoqi@0: results.add(membername); aoqi@0: } aoqi@0: } aoqi@0: return results; aoqi@0: } aoqi@0: }