//Tested with BCEL-5.1 //http://jakarta.apache.org/builds/jakarta-bcel/release/v5.1/ package com.puppycrawl.tools.checkstyle.bcel; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.apache.bcel.classfile.Code; import org.apache.bcel.classfile.ConstantPool; import org.apache.bcel.classfile.EmptyVisitor; import org.apache.bcel.classfile.Field; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.LocalVariable; import org.apache.bcel.classfile.LocalVariableTable; import org.apache.bcel.classfile.Method; import org.apache.bcel.classfile.Visitor; import org.apache.bcel.generic.InstructionHandle; import org.apache.bcel.generic.InstructionList; /** * Manages a set of visitors that are accepted by nodes visited by * a VisitorSet. Any visit to this object is passed on to its managed * visitors. * @author Rick Giles */ // TODO: review visitXXX public class VisitorSet extends EmptyVisitor { /** the managed visitors */ private Set mVisitors = new HashSet(); /** Creates a <code>VisitorSet</code> for a set of visitors. * @param aVisitors the set of managed visitors. */ public VisitorSet(Set aVisitors) { mVisitors = aVisitors; } /** * @see org.apache.bcel.classfile.Visitor#visitCode */ public void visitCode(Code aCode) { for (Iterator iter = mVisitors.iterator(); iter.hasNext();) { IDeepVisitor visitor = (IDeepVisitor) iter.next(); Visitor v = visitor.getClassFileVisitor(); aCode.accept(v); } // perform a deep visit final byte[] code = aCode.getCode(); final InstructionList list = new InstructionList(code); final Iterator it = list.iterator(); for (Iterator iter = list.iterator(); iter.hasNext();) { InstructionHandle instruction = (InstructionHandle) iter.next(); visitInstructionHandle(instruction); } } /** * Deep visit of an InstructionHandle * @param aInstruction the InstructionHandle */ private void visitInstructionHandle(InstructionHandle aInstruction) { for (Iterator iter = mVisitors.iterator(); iter.hasNext();) { final IDeepVisitor visitor = (IDeepVisitor) iter.next(); org.apache.bcel.generic.Visitor v = visitor.getGenericVisitor(); aInstruction.accept(v); } } /** * @see org.apache.bcel.classfile.Visitor */ public void visitConstantPool(ConstantPool aConstantPool) { for (Iterator iter = mVisitors.iterator(); iter.hasNext();) { IDeepVisitor visitor = (IDeepVisitor) iter.next(); Visitor v = visitor.getClassFileVisitor(); aConstantPool.accept(v); } } /** * @see org.apache.bcel.classfile.Visitor */ public void visitField(Field aField) { for (Iterator iter = mVisitors.iterator(); iter.hasNext();) { IDeepVisitor visitor = (IDeepVisitor) iter.next(); Visitor v = visitor.getClassFileVisitor(); aField.accept(v); } } /** * @see org.apache.bcel.classfile.Visitor */ public void visitJavaClass(JavaClass aJavaClass) { for (Iterator iter = mVisitors.iterator(); iter.hasNext();) { IDeepVisitor visitor = (IDeepVisitor) iter.next(); Visitor v = visitor.getClassFileVisitor(); aJavaClass.accept(v); } } // /** // * @see org.apache.bcel.classfile.Visitor // */ // public void visitLocalVariable(LocalVariable aLocalVariable) // { // for (Iterator iter = mVisitors.iterator(); iter.hasNext();) { // IDeepVisitor visitor = (IDeepVisitor) iter.next(); // Visitor v = visitor.getClassFileVisitor(); // aLocalVariable.accept(v); // } // } // /** * @see org.apache.bcel.classfile.Visitor */ public void visitLocalVariableTable(LocalVariableTable aTable) { for (Iterator iter = mVisitors.iterator(); iter.hasNext();) { IDeepVisitor visitor = (IDeepVisitor) iter.next(); Visitor v = visitor.getClassFileVisitor(); aTable.accept(v); } } /** * @see org.apache.bcel.classfile.Visitor */ public void visitMethod(Method aMethod) { for (Iterator iter = mVisitors.iterator(); iter.hasNext();) { IDeepVisitor visitor = (IDeepVisitor) iter.next(); Visitor v = visitor.getClassFileVisitor(); aMethod.accept(v); } } }