package ca.janeg.cb;

import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

/**
 *  A method group object contains class method information separated into
 *  groups based on their access privileges. Each grouping is sorted on the
 *  methods simple name.
 *
 *  @author     Jane Griscti jane@janeg.ca
 *  @created    January 13, 2002
 */
class MethodGroup {

    private final Class owner;
    private Method[] methods;
    private Method[] publicMethods;
    private Method[] protectedMethods;
    private Method[] packageMethods;
    private Method[] privateMethods;

    boolean hasMethods;


    /**
     *  Creates a MethodGroup object.
     *
     *@param  owner  the class object the methods are derived from
     */
    MethodGroup( final Class owner ) {
        this.owner = owner;
        methods = owner.getDeclaredMethods();
        Arrays.sort( methods, NameComparator.getInstance() );

        hasMethods = Array.getLength( methods ) > 0;

        if( hasMethods ) separateByAccess();
    }


    // separate methods based on their access level
    private void separateByAccess() {
        Object[] obj  = AccessSeparator.separate( methods );

        ArrayList al  = (ArrayList)obj[0];
        publicMethods = (Method[])al.toArray( new Method[0] );

        al = (ArrayList)obj[1];
        protectedMethods = (Method[])al.toArray( new Method[0] );

        al = (ArrayList)obj[2];
        privateMethods = (Method[])al.toArray( new Method[0] );

        al = (ArrayList)obj[3];
        packageMethods = (Method[])al.toArray( new Method[0] );
    }



    Method[] getPublicMethods() {
        return publicMethods;
    }


    Method[] getProtectedMethods() {
        return protectedMethods;
    }


    Method[] getPrivateMethods() {
        return privateMethods;
    }


    Method[] getPackageMethods() {
        return packageMethods;
    }


    Method[] getAllMethods() {
        return methods;
    }

}