duke@1: /* jjg@893: * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: * duke@1: * This code is free software; you can redistribute it and/or modify it duke@1: * under the terms of the GNU General Public License version 2 only, as ohair@554: * published by the Free Software Foundation. Oracle designates this duke@1: * particular file as subject to the "Classpath" exception as provided ohair@554: * by Oracle in the LICENSE file that accompanied this code. duke@1: * duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: * version 2 for more details (a copy is included in the LICENSE file that duke@1: * accompanied this code). duke@1: * duke@1: * You should have received a copy of the GNU General Public License version duke@1: * 2 along with this work; if not, write to the Free Software Foundation, duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: * ohair@554: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ohair@554: * or visit www.oracle.com if you need additional information or have any ohair@554: * questions. duke@1: */ duke@1: duke@1: package com.sun.tools.javadoc; duke@1: duke@1: import java.io.PrintWriter; duke@1: import java.text.MessageFormat; duke@1: import java.util.ResourceBundle; duke@1: import java.util.MissingResourceException; duke@1: duke@1: import com.sun.javadoc.*; duke@1: duke@1: import com.sun.tools.javac.util.Context; duke@1: duke@1: import com.sun.tools.javac.util.Log; // Access to 'javac' output streams duke@1: duke@1: /** duke@1: * Utility for integrating with javadoc tools and for localization. duke@1: * Handle Resources. Access to error and warning counts. duke@1: * Message formatting. duke@1: *
duke@1: * Also provides implementation for DocErrorReporter. duke@1: * duke@1: * @see java.util.ResourceBundle duke@1: * @see java.text.MessageFormat duke@1: * @author Neal Gafter (rewrite) duke@1: */ duke@1: public class Messager extends Log implements DocErrorReporter { duke@1: duke@1: /** Get the current messager, which is also the compiler log. */ duke@1: public static Messager instance0(Context context) { duke@1: Log instance = context.get(logKey); duke@1: if (instance == null || !(instance instanceof Messager)) duke@1: throw new InternalError("no messager instance!"); duke@1: return (Messager)instance; duke@1: } duke@1: jjg@893: public static void preRegister(Context context, duke@1: final String programName) { duke@1: context.put(logKey, new Context.Factory() { jjg@893: public Log make(Context c) { jjg@893: return new Messager(c, duke@1: programName); duke@1: } duke@1: }); duke@1: } jjg@893: public static void preRegister(Context context, duke@1: final String programName, duke@1: final PrintWriter errWriter, duke@1: final PrintWriter warnWriter, duke@1: final PrintWriter noticeWriter) { duke@1: context.put(logKey, new Context.Factory() { jjg@893: public Log make(Context c) { jjg@893: return new Messager(c, duke@1: programName, duke@1: errWriter, duke@1: warnWriter, duke@1: noticeWriter); duke@1: } duke@1: }); duke@1: } duke@1: duke@1: public class ExitJavadoc extends Error { duke@1: private static final long serialVersionUID = 0; duke@1: } duke@1: jjg@584: final String programName; duke@1: duke@1: private ResourceBundle messageRB = null; duke@1: duke@1: /** The default writer for diagnostics duke@1: */ duke@1: static final PrintWriter defaultErrWriter = new PrintWriter(System.err); duke@1: static final PrintWriter defaultWarnWriter = new PrintWriter(System.err); duke@1: static final PrintWriter defaultNoticeWriter = new PrintWriter(System.out); duke@1: duke@1: /** duke@1: * Constructor duke@1: * @param programName Name of the program (for error messages). duke@1: */ duke@1: protected Messager(Context context, String programName) { duke@1: this(context, programName, defaultErrWriter, defaultWarnWriter, defaultNoticeWriter); duke@1: } duke@1: duke@1: /** duke@1: * Constructor duke@1: * @param programName Name of the program (for error messages). duke@1: * @param errWriter Stream for error messages duke@1: * @param warnWriter Stream for warnings duke@1: * @param noticeWriter Stream for other messages duke@1: */ jjg@198: @SuppressWarnings("deprecation") duke@1: protected Messager(Context context, duke@1: String programName, duke@1: PrintWriter errWriter, duke@1: PrintWriter warnWriter, duke@1: PrintWriter noticeWriter) { duke@1: super(context, errWriter, warnWriter, noticeWriter); duke@1: this.programName = programName; duke@1: } duke@1: jjg@584: @Override jjg@584: protected int getDefaultMaxErrors() { jjg@584: return Integer.MAX_VALUE; jjg@584: } jjg@584: jjg@584: @Override jjg@584: protected int getDefaultMaxWarnings() { jjg@584: return Integer.MAX_VALUE; jjg@584: } jjg@584: duke@1: /** duke@1: * Reset resource bundle, eg. locale has changed. duke@1: */ duke@1: public void reset() { duke@1: messageRB = null; duke@1: } duke@1: duke@1: /** duke@1: * Get string from ResourceBundle, initialize ResourceBundle duke@1: * if needed. duke@1: */ duke@1: private String getString(String key) { duke@1: if (messageRB == null) { duke@1: try { jjg@912: messageRB = ResourceBundle.getBundle( duke@1: "com.sun.tools.javadoc.resources.javadoc"); duke@1: } catch (MissingResourceException e) { duke@1: throw new Error("Fatal: Resource for javadoc is missing"); duke@1: } duke@1: } duke@1: return messageRB.getString(key); duke@1: } duke@1: duke@1: /** duke@1: * get and format message string from resource duke@1: * duke@1: * @param key selects message from resource duke@1: */ duke@1: String getText(String key) { duke@1: return getText(key, (String)null); duke@1: } duke@1: duke@1: /** duke@1: * get and format message string from resource duke@1: * duke@1: * @param key selects message from resource duke@1: * @param a1 first argument duke@1: */ duke@1: String getText(String key, String a1) { duke@1: return getText(key, a1, null); duke@1: } duke@1: duke@1: /** duke@1: * get and format message string from resource duke@1: * duke@1: * @param key selects message from resource duke@1: * @param a1 first argument duke@1: * @param a2 second argument duke@1: */ duke@1: String getText(String key, String a1, String a2) { duke@1: return getText(key, a1, a2, null); duke@1: } duke@1: duke@1: /** duke@1: * get and format message string from resource duke@1: * duke@1: * @param key selects message from resource duke@1: * @param a1 first argument duke@1: * @param a2 second argument duke@1: * @param a3 third argument duke@1: */ duke@1: String getText(String key, String a1, String a2, String a3) { duke@1: return getText(key, a1, a2, a3, null); duke@1: } duke@1: duke@1: /** duke@1: * get and format message string from resource duke@1: * duke@1: * @param key selects message from resource duke@1: * @param a1 first argument duke@1: * @param a2 second argument duke@1: * @param a3 third argument duke@1: * @param a4 fourth argument duke@1: */ duke@1: String getText(String key, String a1, String a2, String a3, duke@1: String a4) { duke@1: try { duke@1: String message = getString(key); duke@1: String[] args = new String[4]; duke@1: args[0] = a1; duke@1: args[1] = a2; duke@1: args[2] = a3; duke@1: args[3] = a4; duke@1: return MessageFormat.format(message, (Object[])args); duke@1: } catch (MissingResourceException e) { duke@1: return "********** Resource for javadoc is broken. There is no " + duke@1: key + " key in resource."; duke@1: } duke@1: } duke@1: duke@1: /** duke@1: * Print error message, increment error count. duke@1: * Part of DocErrorReporter. duke@1: * duke@1: * @param msg message to print duke@1: */ duke@1: public void printError(String msg) { duke@1: printError(null, msg); duke@1: } duke@1: duke@1: /** duke@1: * Print error message, increment error count. duke@1: * Part of DocErrorReporter. duke@1: * duke@1: * @param pos the position where the error occurs duke@1: * @param msg message to print duke@1: */ duke@1: public void printError(SourcePosition pos, String msg) { jjg@584: if (nerrors < MaxErrors) { jjg@584: String prefix = (pos == null) ? programName : pos.toString(); jjg@584: errWriter.println(prefix + ": " + getText("javadoc.error") + " - " + msg); jjg@584: errWriter.flush(); jjg@584: prompt(); jjg@584: nerrors++; jjg@584: } duke@1: } duke@1: duke@1: /** duke@1: * Print warning message, increment warning count. duke@1: * Part of DocErrorReporter. duke@1: * duke@1: * @param msg message to print duke@1: */ duke@1: public void printWarning(String msg) { duke@1: printWarning(null, msg); duke@1: } duke@1: duke@1: /** duke@1: * Print warning message, increment warning count. duke@1: * Part of DocErrorReporter. duke@1: * duke@1: * @param pos the position where the error occurs duke@1: * @param msg message to print duke@1: */ duke@1: public void printWarning(SourcePosition pos, String msg) { jjg@584: if (nwarnings < MaxWarnings) { jjg@584: String prefix = (pos == null) ? programName : pos.toString(); jjg@584: warnWriter.println(prefix + ": " + getText("javadoc.warning") +" - " + msg); jjg@584: warnWriter.flush(); jjg@584: nwarnings++; jjg@584: } duke@1: } duke@1: duke@1: /** duke@1: * Print a message. duke@1: * Part of DocErrorReporter. duke@1: * duke@1: * @param msg message to print duke@1: */ duke@1: public void printNotice(String msg) { duke@1: printNotice(null, msg); duke@1: } duke@1: duke@1: /** duke@1: * Print a message. duke@1: * Part of DocErrorReporter. duke@1: * duke@1: * @param pos the position where the error occurs duke@1: * @param msg message to print duke@1: */ duke@1: public void printNotice(SourcePosition pos, String msg) { duke@1: if (pos == null) duke@1: noticeWriter.println(msg); duke@1: else duke@1: noticeWriter.println(pos + ": " + msg); duke@1: noticeWriter.flush(); duke@1: } duke@1: duke@1: /** duke@1: * Print error message, increment error count. duke@1: * duke@1: * @param key selects message from resource duke@1: */ duke@1: public void error(SourcePosition pos, String key) { duke@1: printError(pos, getText(key)); duke@1: } duke@1: duke@1: /** duke@1: * Print error message, increment error count. duke@1: * duke@1: * @param key selects message from resource duke@1: * @param a1 first argument duke@1: */ duke@1: public void error(SourcePosition pos, String key, String a1) { duke@1: printError(pos, getText(key, a1)); duke@1: } duke@1: duke@1: /** duke@1: * Print error message, increment error count. duke@1: * duke@1: * @param key selects message from resource duke@1: * @param a1 first argument duke@1: * @param a2 second argument duke@1: */ duke@1: public void error(SourcePosition pos, String key, String a1, String a2) { duke@1: printError(pos, getText(key, a1, a2)); duke@1: } duke@1: duke@1: /** duke@1: * Print error message, increment error count. duke@1: * duke@1: * @param key selects message from resource duke@1: * @param a1 first argument duke@1: * @param a2 second argument duke@1: * @param a3 third argument duke@1: */ duke@1: public void error(SourcePosition pos, String key, String a1, String a2, String a3) { duke@1: printError(pos, getText(key, a1, a2, a3)); duke@1: } duke@1: duke@1: /** duke@1: * Print warning message, increment warning count. duke@1: * duke@1: * @param key selects message from resource duke@1: */ duke@1: public void warning(SourcePosition pos, String key) { duke@1: printWarning(pos, getText(key)); duke@1: } duke@1: duke@1: /** duke@1: * Print warning message, increment warning count. duke@1: * duke@1: * @param key selects message from resource duke@1: * @param a1 first argument duke@1: */ duke@1: public void warning(SourcePosition pos, String key, String a1) { duke@1: printWarning(pos, getText(key, a1)); duke@1: } duke@1: duke@1: /** duke@1: * Print warning message, increment warning count. duke@1: * duke@1: * @param key selects message from resource duke@1: * @param a1 first argument duke@1: * @param a2 second argument duke@1: */ duke@1: public void warning(SourcePosition pos, String key, String a1, String a2) { duke@1: printWarning(pos, getText(key, a1, a2)); duke@1: } duke@1: duke@1: /** duke@1: * Print warning message, increment warning count. duke@1: * duke@1: * @param key selects message from resource duke@1: * @param a1 first argument duke@1: * @param a2 second argument duke@1: * @param a3 third argument duke@1: */ duke@1: public void warning(SourcePosition pos, String key, String a1, String a2, String a3) { duke@1: printWarning(pos, getText(key, a1, a2, a3)); duke@1: } duke@1: duke@1: /** duke@1: * Print warning message, increment warning count. duke@1: * duke@1: * @param key selects message from resource duke@1: * @param a1 first argument duke@1: * @param a2 second argument duke@1: * @param a3 third argument duke@1: */ duke@1: public void warning(SourcePosition pos, String key, String a1, String a2, String a3, duke@1: String a4) { duke@1: printWarning(pos, getText(key, a1, a2, a3, a4)); duke@1: } duke@1: duke@1: /** duke@1: * Print a message. duke@1: * duke@1: * @param key selects message from resource duke@1: */ duke@1: public void notice(String key) { duke@1: printNotice(getText(key)); duke@1: } duke@1: duke@1: /** duke@1: * Print a message. duke@1: * duke@1: * @param key selects message from resource duke@1: * @param a1 first argument duke@1: */ duke@1: public void notice(String key, String a1) { duke@1: printNotice(getText(key, a1)); duke@1: } duke@1: duke@1: /** duke@1: * Print a message. duke@1: * duke@1: * @param key selects message from resource duke@1: * @param a1 first argument duke@1: * @param a2 second argument duke@1: */ duke@1: public void notice(String key, String a1, String a2) { duke@1: printNotice(getText(key, a1, a2)); duke@1: } duke@1: duke@1: /** duke@1: * Print a message. duke@1: * duke@1: * @param key selects message from resource duke@1: * @param a1 first argument duke@1: * @param a2 second argument duke@1: * @param a3 third argument duke@1: */ duke@1: public void notice(String key, String a1, String a2, String a3) { duke@1: printNotice(getText(key, a1, a2, a3)); duke@1: } duke@1: duke@1: /** duke@1: * Return total number of errors, including those recorded duke@1: * in the compilation log. duke@1: */ duke@1: public int nerrors() { return nerrors; } duke@1: duke@1: /** duke@1: * Return total number of warnings, including those recorded duke@1: * in the compilation log. duke@1: */ duke@1: public int nwarnings() { return nwarnings; } duke@1: duke@1: /** duke@1: * Print exit message. duke@1: */ duke@1: public void exitNotice() { duke@1: if (nerrors > 0) { duke@1: notice((nerrors > 1) ? "main.errors" : "main.error", duke@1: "" + nerrors); duke@1: } duke@1: if (nwarnings > 0) { duke@1: notice((nwarnings > 1) ? "main.warnings" : "main.warning", duke@1: "" + nwarnings); duke@1: } duke@1: } duke@1: duke@1: /** duke@1: * Force program exit, e.g., from a fatal error. duke@1: *

duke@1: * TODO: This method does not really belong here. duke@1: */ duke@1: public void exit() { duke@1: throw new ExitJavadoc(); duke@1: } duke@1: duke@1: }