1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  package org.apache.bcel.verifier;
18  
19  import java.util.HashMap;
20  import java.util.Iterator;
21  import java.util.List;
22  import java.util.Map;
23  import java.util.Vector;
24  
25  /***
26   * This class produces instances of the Verifier class. Its purpose is to make
27   * sure that they are singleton instances with respect to the class name they
28   * operate on. That means, for every class (represented by a unique fully qualified
29   * class name) there is exactly one Verifier.
30   *
31   * @version $Id: VerifierFactory.java 386056 2006-03-15 11:31:56Z tcurdt $
32   * @author Enver Haase
33   * @see org.apache.bcel.verifier.Verifier
34   */
35  public class VerifierFactory {
36  
37      /***
38       * The HashMap that holds the data about the already-constructed Verifier instances.
39       */
40      private static Map hashMap = new HashMap();
41      /***
42       * The VerifierFactoryObserver instances that observe the VerifierFactory.
43       */
44      private static List observers = new Vector();
45  
46  
47      /***
48       * The VerifierFactory is not instantiable.
49       */
50      private VerifierFactory() {
51      }
52  
53  
54      /***
55       * Returns the (only) verifier responsible for the class with the given name.
56       * Possibly a new Verifier object is transparently created.
57       * @return the (only) verifier responsible for the class with the given name.
58       */
59      public static Verifier getVerifier( String fully_qualified_classname ) {
60          Verifier v = (Verifier) (hashMap.get(fully_qualified_classname));
61          if (v == null) {
62              v = new Verifier(fully_qualified_classname);
63              hashMap.put(fully_qualified_classname, v);
64              notify(fully_qualified_classname);
65          }
66          return v;
67      }
68  
69  
70      /***
71       * Notifies the observers of a newly generated Verifier.
72       */
73      private static void notify( String fully_qualified_classname ) {
74          
75          Iterator i = observers.iterator();
76          while (i.hasNext()) {
77              VerifierFactoryObserver vfo = (VerifierFactoryObserver) i.next();
78              vfo.update(fully_qualified_classname);
79          }
80      }
81  
82  
83      /***
84       * Returns all Verifier instances created so far.
85       * This is useful when a Verifier recursively lets
86       * the VerifierFactory create other Verifier instances
87       * and if you want to verify the transitive hull of
88       * referenced class files.
89       */
90      public static Verifier[] getVerifiers() {
91          Verifier[] vs = new Verifier[hashMap.values().size()];
92          return (Verifier[]) (hashMap.values().toArray(vs)); 
93      }
94  
95  
96      /***
97       * Adds the VerifierFactoryObserver o to the list of observers.
98       */
99      public static void attach( VerifierFactoryObserver o ) {
100         observers.add(o);
101     }
102 
103 
104     /***
105      * Removes the VerifierFactoryObserver o from the list of observers.
106      */
107     public static void detach( VerifierFactoryObserver o ) {
108         observers.remove(o);
109     }
110 }