001: /*
002: * Copyright 2000-2004 The Apache Software Foundation
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: *
016: */
017: package org.apache.bcel.verifier;
018:
019: import java.util.ArrayList;
020: import java.util.List;
021:
022: /**
023: * A PassVerifier actually verifies a class file; it is instantiated
024: * by a Verifier.
025: * The verification should conform with a certain pass as described
026: * in The Java Virtual Machine Specification, 2nd edition.
027: * This book describes four passes. Pass one means loading the
028: * class and verifying a few static constraints. Pass two actually
029: * verifies some other constraints that could enforce loading in
030: * referenced class files. Pass three is the first pass that actually
031: * checks constraints in the code array of a method in the class file;
032: * it has two parts with the first verifying static constraints and
033: * the second part verifying structural constraints (where a data flow
034: * analysis is used for). The fourth pass, finally, performs checks
035: * that can only be done at run-time.
036: * JustIce does not have a run-time pass, but certain constraints that
037: * are usually delayed until run-time for performance reasons are also
038: * checked during the second part of pass three.
039: * PassVerifier instances perform caching.
040: * That means, if you really want a new verification run of a certain
041: * pass you must use a new instance of a given PassVerifier.
042: *
043: * @version $Id: PassVerifier.java 386056 2006-03-15 11:31:56Z tcurdt $
044: * @author Enver Haase
045: * @see org.apache.bcel.verifier.Verifier
046: * @see #verify()
047: */
048: public abstract class PassVerifier {
049:
050: /** The (warning) messages. */
051: private List messages = new ArrayList(); //Type of elements: String
052: /** The VerificationResult cache. */
053: private VerificationResult verificationResult = null;
054:
055: /**
056: * This method runs a verification pass conforming to the
057: * Java Virtual Machine Specification, 2nd edition, on a
058: * class file.
059: * PassVerifier instances perform caching;
060: * i.e. if the verify() method once determined a VerificationResult,
061: * then this result may be returned after every invocation of this
062: * method instead of running the verification pass anew; likewise with
063: * the result of getMessages().
064: *
065: * @see #getMessages()
066: * @see #addMessage(String)
067: */
068: public VerificationResult verify() {
069: if (verificationResult == null) {
070: verificationResult = do_verify();
071: }
072: return verificationResult;
073: }
074:
075: /** Does the real verification work, uncached. */
076: public abstract VerificationResult do_verify();
077:
078: /**
079: * This method adds a (warning) message to the message pool of this
080: * PassVerifier. This method is normally only internally used by
081: * BCEL's class file verifier "JustIce" and should not be used from
082: * the outside.
083: *
084: * @see #getMessages()
085: */
086: public void addMessage(String message) {
087: messages.add(message);
088: }
089:
090: /**
091: * Returns the (warning) messages that this PassVerifier accumulated
092: * during its do_verify()ing work.
093: *
094: * @see #addMessage(String)
095: * @see #do_verify()
096: */
097: public String[] getMessages() {
098: verify(); // create messages if not already done (cached!)
099: return (String[]) messages.toArray(new String[messages.size()]);
100: }
101: }
|