FileDocCategorySizeDatePackage
Verifier.javaAPI DocJava SE 5 API9727Fri Aug 26 14:55:24 BST 2005com.sun.org.apache.bcel.internal.verifier

Verifier

public class Verifier extends Object
A Verifier instance is there to verify a class file according to The Java Virtual Machine Specification, 2nd Edition. Pass-3b-verification includes pass-3a-verification; pass-3a-verification includes pass-2-verification; pass-2-verification includes pass-1-verification. A Verifier creates PassVerifier instances to perform the actual verification.
version
$Id: Verifier.java,v 1.1.1.1 2001/10/29 20:00:31 jvanzyl Exp $
author
Enver Haase
see
com.sun.org.apache.bcel.internal.verifier.PassVerifier

Fields Summary
private final String
classname
The name of the class this verifier operates on.
private Pass1Verifier
p1v
A Pass1Verifier for this Verifier instance.
private Pass2Verifier
p2v
A Pass2Verifier for this Verifier instance.
private HashMap
p3avs
The Pass3aVerifiers for this Verifier instance. Key: Interned string specifying the method number.
private HashMap
p3bvs
The Pass3bVerifiers for this Verifier instance. Key: Interned string specifying the method number.
Constructors Summary
private Verifier()
This class may not be no-args instantiated.

		classname = ""; // never executed anyway, make compiler happy.
	
Verifier(String fully_qualified_classname)
Instantiation is done by the VerifierFactory.

see
VerifierFactory

		classname = fully_qualified_classname;
		flush();
	
Methods Summary
public static void_main(java.lang.String[] args)
Verifies class files. This is a simple demonstration of how the API of BCEL's class file verifier "JustIce" may be used. You should supply command-line arguments which are fully qualified namea of the classes to verify. These class files must be somewhere in your CLASSPATH (refer to Sun's documentation for questions about this) or you must have put the classes into the BCEL Repository yourself (via 'addClass(JavaClass)').

		System.out.println("JustIce by Enver Haase, (C) 2001. http://bcel.sourceforge.net\n");
	  for(int k=0; k < args.length; k++) {

			if (args[k].endsWith(".class")){
				int dotclasspos = args[k].lastIndexOf(".class");
				if (dotclasspos != -1) args[k] = args[k].substring(0,dotclasspos);
			}
		
			args[k] = args[k].replace('/", '.");
		
			System.out.println("Now verifiying: "+args[k]+"\n");

			Verifier v = VerifierFactory.getVerifier(args[k]);
			VerificationResult vr;
		
			vr = v.doPass1();
			System.out.println("Pass 1:\n"+vr);

			vr = v.doPass2();
			System.out.println("Pass 2:\n"+vr);

			if (vr == VerificationResult.VR_OK){
				JavaClass jc = Repository.lookupClass(args[k]);
				for (int i=0; i<jc.getMethods().length; i++){
					vr = v.doPass3a(i);
					System.out.println("Pass 3a, method "+i+" ['"+jc.getMethods()[i]+"']:\n"+vr);

					vr = v.doPass3b(i);
					System.out.println("Pass 3b, method number "+i+" ['"+jc.getMethods()[i]+"']:\n"+vr);
				}
			}
		
			System.out.println("Warnings:");
			String[] warnings = v.getMessages();
			if (warnings.length == 0) System.out.println("<none>");
			for (int j=0; j<warnings.length; j++){
				System.out.println(warnings[j]);
			}

			System.out.println("\n");
	  
			// avoid swapping.
	  	v.flush();
	  	Repository.clearCache();
			System.gc();
	  }
	
public VerificationResultdoPass1()
Returns the VerificationResult for the given pass.


	        
	  
		if (p1v == null){
			p1v = new Pass1Verifier(this);
		}
		return p1v.verify();
	
public VerificationResultdoPass2()
Returns the VerificationResult for the given pass.

		if (p2v == null){
			p2v = new Pass2Verifier(this);
		}
		return p2v.verify();
	
public VerificationResultdoPass3a(int method_no)
Returns the VerificationResult for the given pass.

		String key = Integer.toString(method_no);
		Pass3aVerifier p3av;
		p3av = (Pass3aVerifier) (p3avs.get(key));
		if (p3avs.get(key) == null){
			p3av = new Pass3aVerifier(this, method_no);
			p3avs.put(key, p3av);
		}
		return p3av.verify();
	
public VerificationResultdoPass3b(int method_no)
Returns the VerificationResult for the given pass.

		String key = Integer.toString(method_no);
		Pass3bVerifier p3bv;
		p3bv = (Pass3bVerifier) (p3bvs.get(key));
		if (p3bvs.get(key) == null){
			p3bv = new Pass3bVerifier(this, method_no);
			p3bvs.put(key, p3bv);
		}
		return p3bv.verify();
	
public voidflush()
Forget everything known about the class file; that means, really start a new verification of a possibly different class file from BCEL's repository.

		p1v = null;
		p2v = null;
		p3avs.clear();
		p3bvs.clear();
	
public final java.lang.StringgetClassName()
Returns the name of the class this verifier operates on. This is particularly interesting when this verifier was created recursively by another Verifier and you got a reference to this Verifier by the getVerifiers() method of the VerifierFactory.

see
VerifierFactory

		return classname;
	
public java.lang.String[]getMessages()
This returns all the (warning) messages collected during verification. A prefix shows from which verifying pass a message originates.

		ArrayList messages = new ArrayList();

		if (p1v != null){
			String[] p1m = p1v.getMessages();
			for (int i=0; i<p1m.length; i++){
				messages.add("Pass 1: "+p1m[i]);
			}
		}
		if (p2v != null){
			String[] p2m = p2v.getMessages();
			for (int i=0; i<p2m.length; i++){
				messages.add("Pass 2: "+p2m[i]);
			}
		}
		Iterator p3as = p3avs.values().iterator();
		while (p3as.hasNext()){
			Pass3aVerifier pv = (Pass3aVerifier) p3as.next();
			String[] p3am = pv.getMessages();
			int meth = pv.getMethodNo();
			for (int i=0; i<p3am.length; i++){
				messages.add("Pass 3a, method "+meth+" ('"+Repository.lookupClass(classname).getMethods()[meth]+"'): "+p3am[i]);
			}
		}
		Iterator p3bs = p3bvs.values().iterator();
		while (p3bs.hasNext()){
			Pass3bVerifier pv = (Pass3bVerifier) p3bs.next();
			String[] p3bm = pv.getMessages();
			int meth = pv.getMethodNo();
			for (int i=0; i<p3bm.length; i++){
				messages.add("Pass 3b, method "+meth+" ('"+Repository.lookupClass(classname).getMethods()[meth]+"'): "+p3bm[i]);
			}
		}

		String[] ret = new String[messages.size()];
		for (int i=0; i< messages.size(); i++){
			ret[i] = (String) messages.get(i);
		}
		
		return ret;