//Tested with BCEL-5.1 //http://jakarta.apache.org/builds/jakarta-bcel/release/v5.1/ package com.puppycrawl.tools.checkstyle.bcel; import java.util.Set; import com.puppycrawl.tools.checkstyle.api.AbstractViolationReporter; import com.puppycrawl.tools.checkstyle.api.LocalizedMessage; import com.puppycrawl.tools.checkstyle.api.LocalizedMessages; import java.util.HashMap; import org.apache.bcel.classfile.JavaClass; /** * Abstract class for checks with visitors. * @author Rick Giles */ //TODO: Refactor with class Check public abstract class AbstractCheckVisitor extends AbstractViolationReporter implements IObjectSetVisitor, IDeepVisitor { /** the object for collecting messages. */ private HashMap mMessageMap; // <String fileName, LocalizedMessages msg> /** Filename for when no file can be found */ private String NO_FILE = "File not available"; /** @see com.puppycrawl.tools.checkstyle.bcel.IDeepVisitor */ public org.apache.bcel.classfile.Visitor getClassFileVisitor() { return new EmptyClassFileVisitor(); } /** * @see com.puppycrawl.tools.checkstyle.bcel.IDeepVisitor */ public org.apache.bcel.generic.Visitor getGenericVisitor() { return new EmptyGenericVisitor(); } /** * Initialse the check. This is the time to verify that the check has * everything required to perform it job. */ public void init() { } /** * Destroy the check. It is being retired from service. */ public void destroy() { } /** * Set the global object used to collect messages. * @param aMessages the messages to log with */ public final void setMessageMap(HashMap aMessageMap) { mMessageMap = aMessageMap; } /** * Log an error message. * * @param aLine the line number where the error was found * @param aKey the message that describes the error * @param aArgs the details of the message * * @see java.text.MessageFormat */ protected final void log(JavaClass javaClass, int aLine, String aKey, Object aArgs[]) { // Should this be on the .java file instead of the .class file? final String file = javaClass.getFileName(); log(file, aLine, aKey, aArgs); } /** * Log an error message. * * @param aLine the line number where the error was found * @param aKey the message that describes the error * @param aArgs the details of the message * * @see java.text.MessageFormat */ private final void log(String fileName, int aLine, String aKey, Object aArgs[]) { LocalizedMessages localizedMessages = (LocalizedMessages) mMessageMap.get(fileName); if (localizedMessages == null) { localizedMessages = new LocalizedMessages(); mMessageMap.put(fileName, localizedMessages); } localizedMessages.add( new LocalizedMessage( aLine, getMessageBundle(), aKey, aArgs, getSeverityLevel(), this.getClass())); } /** * Log an error message. * * @param aLine the line number where the error was found * @param aKey the message that describes the error * @param aArgs the details of the message * * @see java.text.MessageFormat */ protected final void log(int aLine, String aKey, Object aArgs[]) { log(NO_FILE, aLine, aKey, aArgs); } /** * @see com.puppycrawl.tools.checkstyle.api.AbstractViolationReporter */ protected void log(int aLine, int aCol, String aKey, Object[] aArgs) { // Ignore the column, it is not relevant for .class files log(aLine, aKey, aArgs); } /** @see com.puppycrawl.tools.checkstyle.bcel.IObjectSetVisitor */ public void visitObject(Object aObject) { } /** @see com.puppycrawl.tools.checkstyle.bcel.IObjectSetVisitor */ public void leaveObject(Object aObject) { } /** @see com.puppycrawl.tools.checkstyle.bcel.IObjectSetVisitor */ public void visitSet(Set aJavaClassDefs) { } /** @see com.puppycrawl.tools.checkstyle.bcel.IObjectSetVisitor */ public void leaveSet(Set aJavaClassDefs) { } /** * Gets the deep BCEL visitor. * @return the deep BCEL visitor for this check. */ public abstract IDeepVisitor getVisitor(); }