KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > bcel > verifier > PassVerifier


1 /*
2  * Copyright 2000-2004 The Apache Software Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */

17 package org.apache.bcel.verifier;
18
19 import java.util.ArrayList JavaDoc;
20 import java.util.List JavaDoc;
21
22 /**
23  * A PassVerifier actually verifies a class file; it is instantiated
24  * by a Verifier.
25  * The verification should conform with a certain pass as described
26  * in The Java Virtual Machine Specification, 2nd edition.
27  * This book describes four passes. Pass one means loading the
28  * class and verifying a few static constraints. Pass two actually
29  * verifies some other constraints that could enforce loading in
30  * referenced class files. Pass three is the first pass that actually
31  * checks constraints in the code array of a method in the class file;
32  * it has two parts with the first verifying static constraints and
33  * the second part verifying structural constraints (where a data flow
34  * analysis is used for). The fourth pass, finally, performs checks
35  * that can only be done at run-time.
36  * JustIce does not have a run-time pass, but certain constraints that
37  * are usually delayed until run-time for performance reasons are also
38  * checked during the second part of pass three.
39  * PassVerifier instances perform caching.
40  * That means, if you really want a new verification run of a certain
41  * pass you must use a new instance of a given PassVerifier.
42  *
43  * @version $Id: PassVerifier.java 386056 2006-03-15 11:31:56Z tcurdt $
44  * @author Enver Haase
45  * @see org.apache.bcel.verifier.Verifier
46  * @see #verify()
47  */

48 public abstract class PassVerifier {
49
50     /** The (warning) messages. */
51     private List JavaDoc messages = new ArrayList JavaDoc(); //Type of elements: String
52
/** The VerificationResult cache. */
53     private VerificationResult verificationResult = null;
54
55
56     /**
57      * This method runs a verification pass conforming to the
58      * Java Virtual Machine Specification, 2nd edition, on a
59      * class file.
60      * PassVerifier instances perform caching;
61      * i.e. if the verify() method once determined a VerificationResult,
62      * then this result may be returned after every invocation of this
63      * method instead of running the verification pass anew; likewise with
64      * the result of getMessages().
65      *
66      * @see #getMessages()
67      * @see #addMessage(String)
68      */

69     public VerificationResult verify() {
70         if (verificationResult == null) {
71             verificationResult = do_verify();
72         }
73         return verificationResult;
74     }
75
76
77     /** Does the real verification work, uncached. */
78     public abstract VerificationResult do_verify();
79
80
81     /**
82      * This method adds a (warning) message to the message pool of this
83      * PassVerifier. This method is normally only internally used by
84      * BCEL's class file verifier "JustIce" and should not be used from
85      * the outside.
86      *
87      * @see #getMessages()
88      */

89     public void addMessage( String JavaDoc message ) {
90         messages.add(message);
91     }
92
93
94     /**
95      * Returns the (warning) messages that this PassVerifier accumulated
96      * during its do_verify()ing work.
97      *
98      * @see #addMessage(String)
99      * @see #do_verify()
100      */

101     public String JavaDoc[] getMessages() {
102         verify(); // create messages if not already done (cached!)
103
return (String JavaDoc[]) messages.toArray(new String JavaDoc[messages.size()]);
104     }
105 }
106
Popular Tags