cvs commit: jakarta-bcel/src/java/org/apache/bcel Repository.java

[email protected]
Newsgroups gmane.comp.jakarta.bcel.devel
Message-ID <[email protected]>
mdahm       2002/06/06 04:31:17

  Modified:    src/java/org/apache/bcel Repository.java
  Log:
  Delegate to Synthetic repository
  
  Revision  Changes    Path
  1.8       +31 -134   jakarta-bcel/src/java/org/apache/bcel/Repository.java
  
  Index: Repository.java
  ===================================================================
  RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/Repository.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- Repository.java	3 Jun 2002 09:11:26 -0000	1.7
  +++ Repository.java	6 Jun 2002 11:31:17 -0000	1.8
  @@ -54,56 +54,30 @@
    * <http://www.apache.org/>.
    */
   
  -import org.apache.bcel.classfile.*;
  +import org.apache.bcel.classfile.JavaClass;
   import org.apache.bcel.util.*;
  -import java.util.HashMap;
   import java.io.*;
   
   /** 
    * The repository maintains informations about class interdependencies, e.g.,
  - * whether a class is a sub-class of another. JavaClass objects are put
  - * into a cache which can be purged with clearCache().
  + * whether a class is a sub-class of another. Delegates actual class loading
  + * to SyntheticRepository.
    *
  - * All JavaClass objects used as arguments must have been obtained via
  - * the repository or been added with addClass() manually. This is
  - * because we have to check for real object identity (==).
  - *
  - * @version $Id: Repository.java,v 1.7 2002/06/03 09:11:26 mdahm Exp $
  - * @author <A HREF="mailto:[email protected]">M. Dahm</A
  + * @version $Id: Repository.java,v 1.8 2002/06/06 11:31:17 mdahm Exp $
  + * @author <A HREF="mailto:[email protected]">M. Dahm</A>
    */
   public abstract class Repository {
  -  private static ClassPath class_path = new ClassPath();
  -  private static HashMap classes;
  -  private static JavaClass OBJECT; // should be final ...
  -
  -  static { clearCache(); }
  +  private static org.apache.bcel.util.SyntheticRepository _repository =
  +    SyntheticRepository.getInstance();
   
     /** Lookup class somewhere found in your CLASSPATH.
      * @return class object for given fully qualified class name, or null
      * if the class could not be found or parsed correctly
      */
     public static JavaClass lookupClass(String class_name) {
  -    if(class_name == null || class_name.equals(""))
  -      throw new RuntimeException("Invalid class name");
  -
  -    class_name = class_name.replace('/', '.');
  -
  -    JavaClass clazz = (JavaClass)classes.get(class_name);
  -
  -    if(clazz == null) {
  -      try {
  -	InputStream is = class_path.getInputStream(class_name);
  -	clazz = new ClassParser(is, class_name).parse();
  -	class_name = clazz.getClassName();
  -      } catch(IOException e) {
  -	// Don't throw exception since there may be other ways to load
  -	return null;
  -      }
  -
  -      classes.put(class_name, clazz);
  -    }
  -
  -    return clazz;
  +    try {
  +      return _repository.loadClass(class_name);
  +    } catch(ClassNotFoundException ex) { return null; }
     }
   
     /**
  @@ -112,49 +86,23 @@
      * @return JavaClass object for given runtime class
      */
     public static JavaClass lookupClass(Class clazz) {
  -    String class_name = clazz.getName();
  -
  -    JavaClass j_class = (JavaClass)classes.get(class_name);
  -
  -    if(j_class == null) {
  -      String name = class_name;
  -      int    i    = name.lastIndexOf('.');
  -
  -      if(i > 0)
  -	name = name.substring(i + 1);
  -
  -      try {
  -	InputStream is = clazz.getResourceAsStream(name + ".class");
  -	j_class = new ClassParser(is, class_name).parse();
  -      } catch(IOException e) {
  -	//System.err.println(e);
  -	return null; // Use same behaviour as above
  -      }
  -
  -      classes.put(class_name, j_class);
  -    }
  -
  -    return j_class;
  +    try {
  +      return _repository.loadClass(clazz);
  +    } catch(ClassNotFoundException ex) { return null; }
     }
   
     /** @return class file object for given Java class.
      */
     public static ClassPath.ClassFile lookupClassFile(String class_name) {
       try {
  -      return class_path.getClassFile(class_name);
  +      return ClassPath.SYSTEM_CLASS_PATH.getClassFile(class_name);
       } catch(IOException e) { return null; }
     }
   
     /** Clear the repository.
      */
     public static void clearCache() {
  -    classes = new HashMap();
  -    OBJECT  = lookupClass("java.lang.Object");
  -
  -    if(OBJECT == null)
  -      System.err.println("Warning: java.lang.Object not found on CLASSPATH!");
  -    else
  -      classes.put("java.lang.Object", OBJECT);
  +    _repository.clear();
     }
   
     /**
  @@ -163,35 +111,27 @@
      * @return old entry in repository
      */
     public static JavaClass addClass(JavaClass clazz) {
  -    String    name = clazz.getClassName();
  -    JavaClass cl   = (JavaClass)classes.get(name);
  -
  -    if(cl == null)
  -      classes.put(name, cl = clazz);
  -
  -    return cl;
  +    JavaClass old = _repository.findClass(clazz.getClassName());
  +    _repository.storeClass(clazz);
  +    return old;
     }
   
     /**
  -   * Remove class with given (fully qualifid) name from repository.
  +   * Remove class with given (fully qualified) name from repository.
      */
     public static void removeClass(String clazz) {
  -    classes.remove(clazz);
  +    _repository.removeClass(_repository.findClass(clazz));
     }
   
     /**
      * Remove given class from repository.
      */
     public static void removeClass(JavaClass clazz) {
  -    removeClass(clazz.getClassName());
  +    _repository.removeClass(clazz);
     }
   
  -
     private static final JavaClass getSuperClass(JavaClass clazz) {
  -    if(clazz == OBJECT)
  -      return null;
  -
  -    return lookupClass(clazz.getSuperclassName());
  +    return clazz.getSuperClass();
     }
   
     /**
  @@ -199,17 +139,13 @@
      * Object is always the last element
      */
     public static JavaClass[] getSuperClasses(JavaClass clazz) {
  -    ClassVector vec = new ClassVector();
  -
  -    for(clazz = getSuperClass(clazz); clazz != null; clazz = getSuperClass(clazz))
  -      vec.addElement(clazz);
  -
  -    return vec.toArray();
  +    return clazz.getSuperClasses();
     }
   
     /**
      * @return list of super classes of clazz in ascending order, i.e.,
  -   * Object is always the last element. "null", if clazz cannot be found.
  +   * Object is always the last element. return "null", if class
  +   * cannot be found.
      */
     public static JavaClass[] getSuperClasses(String class_name) {
       JavaClass jc = lookupClass(class_name);
  @@ -218,30 +154,11 @@
   
     /**
      * @return all interfaces implemented by class and its super
  -   * classes and the interfaces that those interfaces extend, and so on
  +   * classes and the interfaces that those interfaces extend, and so on.
  +   * (Some people call this a transitive hull).
      */
     public static JavaClass[] getInterfaces(JavaClass clazz) {
  -    ClassVector vec   = new ClassVector();
  -    ClassQueue  queue = new ClassQueue();
  -
  -    queue.enqueue(clazz);
  -
  -    while(!queue.empty()) {
  -      clazz = queue.dequeue();
  -
  -      String   s          = clazz.getSuperclassName();
  -      String[] interfaces = clazz.getInterfaceNames();
  -
  -      if(clazz.isInterface())
  -	vec.addElement(clazz);
  -      else if(!s.equals("java.lang.Object"))
  -	queue.enqueue(lookupClass(s));
  -      
  -      for(int i=0; i < interfaces.length; i++)
  -	queue.enqueue(lookupClass(interfaces[i]));
  -    }
  -
  -    return vec.toArray();
  +    return clazz.getAllInterfaces();
     }
   
     /**
  @@ -253,22 +170,11 @@
     }
   
     /**
  +   * Equivalent to runtime "instanceof" operator.
      * @return true, if clazz is an instance of super_class
      */
     public static boolean instanceOf(JavaClass clazz, JavaClass super_class) {
  -    if(clazz == super_class)
  -      return true;
  -
  -    JavaClass[] super_classes = getSuperClasses(clazz);
  -
  -    for(int i=0; i < super_classes.length; i++)
  -      if(super_classes[i] == super_class)
  -	return true;
  -
  -    if(super_class.isInterface())
  -      return implementationOf(clazz, super_class);
  -
  -    return false;
  +    return clazz.instanceOf(super_class);
     }
   
     /**
  @@ -296,16 +202,7 @@
      * @return true, if clazz is an implementation of interface inter
      */
     public static boolean implementationOf(JavaClass clazz, JavaClass inter) {
  -    if(clazz == inter)
  -      return true;
  -
  -    JavaClass[] super_interfaces = getInterfaces(clazz);
  -
  -    for(int i=0; i < super_interfaces.length; i++)
  -      if(super_interfaces[i] == inter)
  -	return true;
  -
  -    return false;
  +    return clazz.implementationOf(inter);
     }
   
     /**
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.