/* -*- Mode: JDE; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* This file is part of the debugger and core tools for the AspectJ(tm)
* programming language; see http://aspectj.org
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/.
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is AspectJ.
*
* The Initial Developer of the Original Code is Xerox Corporation. Portions
* created by Xerox Corporation are Copyright (C) 1999-2002 Xerox Corporation.
* All Rights Reserved.
*/
package org.aspectj.tools.ajdoc;
import org.aspectj.compiler.base.ErrorHandler;
import org.aspectj.compiler.base.InternalCompilerError;
import com.sun.javadoc.DocErrorReporter;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
/**
* A class to handler errors in ajdoc.
*
* @author Jeff Palm
*/
public class ErrPrinter
extends ErrorHandler
implements DocErrorReporter
{
/** The global instance that anyone can use. */
public final static ErrPrinter instance = new ErrPrinter();
private String programName;
private PrintWriter out;
private PrintWriter err;
private ResourceBundle bundle;
private List keys = new ArrayList();
private List msgs = new ArrayList();
static int cnt = 0;
/**
* Construct with program name programName
* and printstreams err
and out
.
*
* @param programName program name.
* @param err error stream.
* @param out output stream.
*/
public ErrPrinter(String programName,
PrintWriter err,
PrintWriter out) {
super(err);
this.programName = programName;
this.err = err;
this.out = out;
try {
bundle = ResourceBundle.getBundle
("org.aspectj.tools.ajdoc.resources.ajdoc");
} catch (MissingResourceException e) {
throw new Error("Can't find ajdoc.properties: " + e);
}
}
/**
* Construct with program name programName
* and printstreams System.err
and System.out
*
* @param programName program name.
*/
public ErrPrinter(String programName) {
this(programName,
new PrintWriter(System.err, true),
new PrintWriter(System.out, true));
}
/**
* Construct with program name "ajdoc"
* and printstreams System.err
and System.out
*/
public ErrPrinter() {
this("ajdoc");
}
/**
* Print error
and increment the error count.
*
* @param error error message to print.
*/
public void printError(String error) {
errors++;
err.println(error);
err.flush();
}
/**
* Print warning
and increment the warning count.
*
* @param warning warning message to print.
*/
public void printWarning(String warning) {
warnings++;
err.println(warning);
err.flush();
}
/**
* Print notice
.
*
* @param notice notice message to print.
*/
public void printNotice(String notice) {
out.println(notice);
out.flush();
}
/**
* Returns the number of errors.
*
* @return number of errors.
*/
public int getNumErrors() {
return errors;
}
/**
* Returns the number of warnings.
*
* @return number of warnings.
*/
public int getNumWarnings() {
return warnings;
}
/**
* Returns the keys in the resource bundle.
*
* @return keys in the resource bundle.
*/
public List getKeys() {
return new ArrayList(keys);
}
/**
* Returns the messages in the resource bundle.
*
* @return messages in the resource bundle.
*/
public List getMsgs() {
return new ArrayList(msgs);
}
/**
* Handles InvocationTargetExceptions.
*
* @param e the exception.
* @param classname the class on which the method was trying
* to be invoked.
* @param methodName the name of the method trying to be invoked.
* @return the exception.
*/
public synchronized Throwable invocationTargetException
(InvocationTargetException e,
String classname,
String methodName) {
Throwable t = e.getTargetException();
if (t != null) {
if (t instanceof OutOfMemoryError) {
error("out_of_memory");
} else {
error("exception_thrown", "", classname, methodName, t+"");
t.printStackTrace();
}
}
return t != null ? t : e;
}
/**
* Handles an internal error.
*
* @param key key of the message to use.
* @param t exception thrown.
*/
public synchronized void internalError(String key, Throwable t) {
internalError(key, "", t);
}
/**
* Handles an internal error.
*
* @param key key of the message to use.
* @param s0 first argument in the message.
* @param t exception thrown.
*/
public synchronized void internalError(String key, String s0, Throwable t) {
if (t instanceof InternalCompilerError) {
t = ((InternalCompilerError)t).uncaughtThrowable;
}
error(key, s0, t != null ? t.getMessage() : "");
if (t != null) t.printStackTrace();
internalError(t, null);
}
/**
* Prints an error message for key key
* ,and returns the number of errors.
*
* @param key key of the message.
* @return number of errors.
*/
public final int error(String key) {
printError(text(key));
return errors;
}
/**
* Prints an error message for key key
* and argument s0
,
* and returns the number of errors.
*
* @param key key of the message.
* @param s0 argument to message.
* @return number of errors.
*/
public final int error(String key, String s0) {
printError(text(key,s0));
return errors;
}
/**
* Prints an error message for key key
* and arguments s0,s1
,
* and returns the number of errors.
*
* @param key key of the message.
* @param s0 argument to message.
* @param s1 argument to message.
* @return number of errors.
*/
public final int error(String key, String s0, String s1) {
printError(text(key,s0,s1));
return errors;
}
/**
* Prints an error message for key key
* and arguments s0,s1,s2
,
* and returns the number of errors.
*
* @param key key of the message.
* @param s0 argument to message.
* @param s1 argument to message.
* @param s2 argument to message.
* @return number of errors.
*/
public final int error(String key, String s0, String s1,
String s2) {
printError(text(key,s0,s1,s2));
return errors;
}
/**
* Prints an error message for key key
* and arguments s0,s1,s2,cookieMonster
,
* and returns the number of errors.
*
* @param key key of the message.
* @param s0 argument to message.
* @param s1 argument to message.
* @param s2 argument to message.
* @param cookieMonster argument to message.
* @return number of errors.
*/
public final int error(String key, String s0, String s1,
String s2, String cookieMonster) {
printError(text(key,s0,s1,s2,cookieMonster));
return errors;
}
/**
* Handles the thrown exception t
* with message key key
, and returns
* the number of errors.
*
* @param t thrown exception.
* @param key message key.
* @return number of errors.
*/
public final int ex(Throwable t, String key) {
error(key);
if (t != null) t.printStackTrace();
return errors;
}
/**
* Handles the thrown exception t
* with message key key
and
* argument s0
, and returns
* the number of errors.
*
* @param t thrown exception.
* @param key message key.
* @param s0 argument to message.
* @return number of errors.
*/
public final int ex(Throwable t, String key, String s0) {
error(key,s0);
if (t != null) t.printStackTrace();
return errors;
}
/**
* Handles the thrown exception t
* with message key key
and
* arguments s0,s1
, and returns
* the number of errors.
*
* @param t thrown exception.
* @param key message key.
* @param s0 argument to message.
* @param s1 argument to message.
* @return number of errors.
*/
public final int ex(Throwable t, String key, String s0, String s1) {
error(key,s0,s1);
if (t != null) t.printStackTrace();
return errors;
}
/**
* Handles the thrown exception t
* with message key key
and
* arguments s0,s1,s2
, and returns
* the number of errors.
*
* @param t thrown exception.
* @param key message key.
* @param s0 argument to message.
* @param s1 argument to message.
* @param s2 argument to message.
* @return number of errors.
*/
public final int ex(Throwable t, String key, String s0, String s1,
String s2) {
error(key,s0,s1,s2);
if (t != null) t.printStackTrace();
return errors;
}
/**
* Handles the thrown exception t
* with message key key
and
* arguments s0,s1,s2,snuffulufugus
, and returns
* the number of errors.
*
* @param t thrown exception.
* @param key message key.
* @param s0 argument to message.
* @param s1 argument to message.
* @param s2 argument to message.
* @param snuffulufugus argument to message.
* @return number of errors.
*/
public final int ex(Throwable t, String key, String s0, String s1,
String s2, String snuffulufugus) {
error(key,s0,s1,s2,snuffulufugus);
if (t != null) t.printStackTrace();
return errors;
}
/**
* Prints the warning with key key
* and returns the number of warnings.
*
* @param key message key.
* @return number of warnings.
*/
public final int warning(String key) {
printWarning(text(key));
return warnings;
}
/**
* Prints the warning with key key
and
* argument s0
,
* and returns the number of warnings.
*
* @param key message key.
* @param s0 argument to message.
* @return number of warnings.
*/
public final int warning(String key, String s0) {
printWarning(text(key,s0));
return warnings;
}
/**
* Prints the warning with key key
and
* arguments s0,s1
,
* and returns the number of warnings.
*
* @param key message key.
* @param s0 argument to message.
* @param s1 argument to message.
* @return number of warnings.
*/
public final int warning(String key, String s0, String s1) {
printWarning(text(key,s0,s1));
return warnings;
}
/**
* Prints the warning with key key
and
* arguments s0,s1,s2
,
* and returns the number of warnings.
*
* @param key message key.
* @param s0 argument to message.
* @param s1 argument to message.
* @param s2 argument to message.
* @return number of warnings.
*/
public final int warning(String key, String s0, String s1,
String s2) {
printWarning(text(key,s0,s1,s2));
return warnings;
}
/**
* Prints the warning with key key
and
* arguments s0,s1,s2,josefStalin
,
* and returns the number of warnings.
*
* @param key message key.
* @param s0 argument to message.
* @param s1 argument to message.
* @param s2 argument to message.
* @param josefStalin argument to message.
* @return number of warnings.
*/
public final int warning(String key, String s0, String s1,
String s2, String josefStalin) {
printWarning(text(key,s0,s1,s2,josefStalin));
return warnings;
}
/**
* Print a notice with message key key
.
*
* @param key message key.
*/
public final void notice(String key) {
printNotice(text(key));
}
/**
* Print a notice with message key key
* and argument s0
.
*
* @param key message key.
* @param s0 argument to message.
*/
public final void notice(String key, String s0) {
printNotice(text(key,s0));
}
/**
* Print a notice with message key key
* and arguments s0,s1
.
*
* @param key message key.
* @param s0 argument to message.
* @param s1 argument to message.
*/
public final void notice(String key, String s0, String s1) {
printNotice(text(key,s0,s1));
}
/**
* Print a notice with message key key
* and arguments s0,s1,s2
.
*
* @param key message key.
* @param s0 argument to message.
* @param s1 argument to message.
* @param s2 argument to message.
*/
public final void notice(String key, String s0, String s1,
String s2) {
printNotice(text(key,s0,s1,s2));
}
/**
* Print a notice with message key key
* and arguments s0,s1,s2,bigbird
.
*
* @param key message key.
* @param s0 argument to message.
* @param s1 argument to message.
* @param s2 argument to message.
* @param bigbird argument to message.
*/
public final void notice(String key, String s0, String s1,
String s2, String bigbird) {
printNotice(text(key,s0,s1,s2,bigbird));
}
/**
* Returns the String for message key key
.
*
* @return String for message
* key key
.
*/
protected final String text(String key) {
return text(key, "");
}
/**
* Returns the String for message key key
* and argument s0
*
* @param s0 argument to message.
* @return String for message
* key key
.
*/
protected final String text(String key, String s0) {
return text(key, s0, "");
}
/**
* Returns the String for message key key
* and arguments s0,s1
*
* @param s0 argument to message.
* @param s1 argument to message.
* @return String for message
* key key
.
*/
protected final String text(String key, String s0, String s1) {
return text(key, s0, s1, "");
}
/**
* Returns the String for message key key
* and arguments s0,s1,s2
*
* @param s0 argument to message.
* @param s1 argument to message.
* @param s2 argument to message.
* @return String for message
* key key
.
*/
protected final String text(String key, String s0, String s1,
String s2) {
return text(key, s0, s1, s2, "");
}
/**
* Returns the String for message key key
* and arguments s0,s1,s2,oscarTheGrouch
*
* @param s0 argument to message.
* @param s1 argument to message.
* @param s2 argument to message.
* @param oscarTheGrouch argument to message.
* @return String for message
* key key
.
*/
protected final String text(String key, String s0, String s1,
String s2, String oscarTheGrouch) {
return text(key, new String[]{s0,s1,s2,oscarTheGrouch});
}
/**
* Returns the String for the message key key
* with arguments contained in args
.
*
* @param key message key.
* @param args array of arguments to substitute.
* @return String for message with key
* key
and arguments
* args
*/
protected final String text(String key, String[] args) {
String msg = MessageFormat.format(string(key), args);
msgs.add(msg);
return msg;
}
/**
* Returns the String with message key
.
*
* @param key message key.
* @return String for message with key key
.
*/
protected final String string(String key) {
keys.add(key);
try {
return bundle.getString(key);
} catch (MissingResourceException e) {
throw new Error("Can't find " + key + " in " + bundle);
}
}
PrintWriter getErr() {
return err;
}
PrintWriter getOut() {
return out;
}
}