mdahm       2002/06/06 04:35:43

  Modified:    src/java/org/apache/bcel/classfile JavaClass.java
  Log:
  Added repository functionality
  
  Revision  Changes    Path
  1.9       +151 -76   jakarta-bcel/src/java/org/apache/bcel/classfile/JavaClass.java
  
  Index: JavaClass.java
  ===================================================================
  RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/classfile/JavaClass.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- JavaClass.java    3 Jun 2002 09:06:37 -0000       1.8
  +++ JavaClass.java    6 Jun 2002 11:35:43 -0000       1.9
  @@ -55,8 +55,7 @@
    */
   
   import  org.apache.bcel.Constants;
  -// import  org.apache.bcel.Repository;
  -import  org.apache.bcel.util.Repository;
  +import  org.apache.bcel.Repository;
   import  org.apache.bcel.util.SyntheticRepository;
   import  org.apache.bcel.util.ClassVector;
   import  org.apache.bcel.util.ClassQueue;
  @@ -74,7 +73,7 @@
    * class file.  Those interested in programatically generating classes
    * should see the <a href="../generic/ClassGen.html">ClassGen</a> class.
   
  - * @version $Id: JavaClass.java,v 1.8 2002/06/03 09:06:37 mdahm Exp $
  + * @version $Id: JavaClass.java,v 1.9 2002/06/06 11:35:43 mdahm Exp $
    * @see org.apache.bcel.generic.ClassGen
    * @author  <A HREF="mailto:[EMAIL PROTECTED]";>M. Dahm</A>
    */
  @@ -102,13 +101,13 @@
     static boolean debug = false; // Debugging on/off
     static char    sep   = '/';   // directory separator
   
  -    /**
  -     * In cases where we go ahead and create something,
  -     * use the default SyntheticRepository, because we
  -     * don't know any better.
  -     */
  -    private org.apache.bcel.util.Repository repository = 
  -     SyntheticRepository.getInstance();
  +  /**
  +   * In cases where we go ahead and create something,
  +   * use the default SyntheticRepository, because we
  +   * don't know any better.
  +   */
  +  private org.apache.bcel.util.Repository repository = 
  +    SyntheticRepository.getInstance();
   
     /**
      * Constructor gets all contents as arguments.
  @@ -170,7 +169,7 @@
        break;
         }
       }
  -     
  +
       /* According to the specification the following entries must be of type
        * `ConstantClass' but we check that anyway via the 
        * `ConstPool.getConstant' method.
  @@ -289,11 +288,10 @@
   
       try {
         dump(ds);
  -      ds.close();
       } catch(IOException e) {
         e.printStackTrace();
       } finally {
  -     try { ds.close(); } catch(IOException e2) { e2.printStackTrace(); }
  +      try { ds.close(); } catch(IOException e2) { e2.printStackTrace(); }
       }
   
       return s.toByteArray();
  @@ -393,9 +391,9 @@
     public String[] getInterfaceNames()  { return interface_names; }    
   
     /**
  -   * @return Implemented interfaces.
  +   * @return Indices in constant pool of implemented interfaces.
      */
  -  public int[] getInterfaces()     { return interfaces; }    
  +  public int[] getInterfaceIndices()     { return interfaces; }    
   
     /**
      * @return Major number of compiler version.
  @@ -440,7 +438,7 @@
       if(sep != null)
         try {
        JavaClass.sep = sep.charAt(0);
  -    } catch(StringIndexOutOfBoundsException e) {} // Never reached
  +      } catch(StringIndexOutOfBoundsException e) {} // Never reached
     }
   
     /**
  @@ -635,10 +633,6 @@
       return c;
     }
   
  -  public final boolean instanceOf(JavaClass super_class) {
  -    return org.apache.bcel.Repository.instanceOf(this, super_class);
  -  }
  -
     public final boolean isSuper() {
       return (access_flags & Constants.ACC_SUPER) != 0;
     }
  @@ -653,70 +647,151 @@
       return source;
     }
   
  -    // Added on 4/16/2002 to deprecate the old Repository class. -- DDP
  +  /********************* New repository functionality *********************/
   
  -    /**
  -     * Gets the ClassRepository which holds its definition.
  -     */
  -    public org.apache.bcel.util.Repository getRepository() {
  -     return repository;
  +  /**
  +   * Gets the ClassRepository which holds its definition. By default
  +   * this is the same as SyntheticRepository.getInstance();
  +   */
  +  public org.apache.bcel.util.Repository getRepository() {
  +    return repository;
  +  }
  +
  +  /**
  +   * Sets the ClassRepository which loaded the JavaClass.
  +   * Should be called immediately after parsing is done.
  +   */
  +  public void setRepository(org.apache.bcel.util.Repository repository) {
  +    this.repository = repository;
  +  }
  +
  +  /** Equivalent to runtime "instanceof" operator.
  +   *
  +   * @return true if this JavaClass is derived from teh super class
  +   */
  +  public final boolean instanceOf(JavaClass super_class) {
  +    if(this.equals(super_class))
  +      return true;
  +
  +    JavaClass[] super_classes = getSuperClasses();
  +
  +    for(int i=0; i < super_classes.length; i++) {
  +      if(super_classes[i].equals(super_class)) {
  +     return true;
  +      }
       }
   
  -    /**
  -     * Sets the ClassRepository which loaded the JavaClass.
  -     * Should be called immediately after parsing is done.
  -     */
  -    public void setRepository( org.apache.bcel.util.Repository repository ) {
  -     this.repository = repository;
  +    if(super_class.isInterface()) {
  +      return implementationOf(super_class);
       }
   
  -    /**
  -     * Get the Superclass for this JavaClass object.
  -     */
  -    public JavaClass getSuperclass() {
  -     try {
  -         return repository.loadClass( getSuperclassName() );
  -     } catch (ClassNotFoundException cnfe) {
  -         System.err.println("WARNING:  Could not find Superclass.");
  -         cnfe.printStackTrace();
  -         return null;
  -     }
  +    return false;
  +  }
  +
  +  /**
  +   * @return true, if clazz is an implementation of interface inter
  +   */
  +  public boolean implementationOf(JavaClass inter) {
  +    if(!inter.isInterface()) {
  +      throw new IllegalArgumentException(inter.getClassName() + " is no interface");
       }
   
  -    /**
  -     * Get all interfaces implemented by the JavaClass object.
  -     */
  -    public JavaClass [] getAllInterfaces() {
  -     try {
  -         ClassQueue queue = new ClassQueue();
  -         ClassVector vec = new ClassVector();
  -         
  -         queue.enqueue( this );
  -         
  -         while (!queue.empty()) {
  -             JavaClass clazz = queue.dequeue();
  +    if(this.equals(inter)) {
  +      return true;
  +    }
   
  -             JavaClass souper    = clazz.getSuperclass();
  -             String interfaces[] = clazz.getInterfaceNames();
  -             
  -             if (clazz.isInterface()) {
  -                 vec.addElement( clazz );
  -             } else {
  -                 if (souper != null) {
  -                     queue.enqueue( souper );
  -                 }
  -             }
  -             
  -             for (int i = 0; i < interfaces.length; i++) {
  -                 queue.enqueue( repository.loadClass( interfaces[i] ));
  -             }
  -         }
  -         
  -         return vec.toArray();
  -     } catch (ClassNotFoundException cnfe) {
  -         System.err.println("WARNING: Class not found.");
  -         cnfe.printStackTrace();
  -         return null;
  +    JavaClass[] super_interfaces = getAllInterfaces();
  +
  +    for(int i=0; i < super_interfaces.length; i++) {
  +      if(super_interfaces[i].equals(inter)) {
  +     return true;
  +      }
  +    }
  +
  +    return false;
  +  }
  +
  +  /**
  +   * @return the superclass for this JavaClass object, or null if this
  +   * is java.lang.Object
  +   */
  +  public JavaClass getSuperClass() {
  +    if("java.lang.Object".equals(getSuperclassName())) {
  +      return null;
  +    }
  +
  +    try {
  +      return repository.loadClass(getSuperclassName());
  +    } catch(ClassNotFoundException e) {
  +      System.err.println(e);
  +      return null;
  +    }
  +  }
  +
  +  /**
  +   * @return list of super classes of this class in ascending order, i.e.,
  +   * java.lang.Object is always the last element
  +   */
  +  public JavaClass[] getSuperClasses() {
  +    JavaClass   clazz = this;
  +    ClassVector vec   = new ClassVector();
  +
  +    for(clazz = clazz.getSuperClass(); clazz != null;
  +     clazz = clazz.getSuperClass())
  +    {
  +      vec.addElement(clazz);
  +    }
  +
  +    return vec.toArray();
  +  }
  +
  +  /**
  +   * Get interfaces directly implemented by this JavaClass.
  +   */
  +  public JavaClass[] getInterfaces() {
  +    String[]    interfaces = getInterfaceNames();
  +    JavaClass[] classes    = new JavaClass[interfaces.length];
  +
  +    try {
  +      for(int i = 0; i < interfaces.length; i++) {
  +     classes[i] = repository.loadClass(interfaces[i]);
  +      }
  +    } catch(ClassNotFoundException e) {
  +      System.err.println(e);
  +      return null;
  +    }
  +
  +    return classes;
  +  }
  +
  +  /**
  +   * Get all interfaces implemented by this JavaClass (transitively).
  +   */
  +  public JavaClass[] getAllInterfaces() {
  +    ClassQueue  queue = new ClassQueue();
  +    ClassVector vec   = new ClassVector();
  +    
  +    queue.enqueue(this);
  +    
  +    while(!queue.empty()) {
  +      JavaClass clazz = queue.dequeue();
  +      
  +      JavaClass   souper     = clazz.getSuperClass();
  +      JavaClass[] interfaces = clazz.getInterfaces();
  +      
  +      if(clazz.isInterface()) {
  +     vec.addElement(clazz);
  +      } else {
  +     if(souper != null) {
  +       queue.enqueue(souper);
        }
  +      }
  +      
  +      for(int i = 0; i < interfaces.length; i++) {
  +     queue.enqueue(interfaces[i]);
  +      }
       }
  +         
  +    return vec.toArray();
  +  }
   }
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to