package ca.janeg.cb;

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

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

class FieldGroup {

    private final Class owner;
    private Field[] flds;
    private Field[] publicFields;
    private Field[] protectedFields;
    private Field[] packageFields;
    private Field[] privateFields;

    boolean hasFields;


    /**
     *  Creates a new FieldGroup object.
     *
     *@param  owner  the class object the fields are derived from
     */
    FieldGroup( final Class owner ) {
        this.owner = owner;
        flds = owner.getDeclaredFields();
        Arrays.sort( flds, NameComparator.getInstance() );

        hasFields = Array.getLength( flds ) > 0;

        if( hasFields )  separateByAccess();
    }

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

        ArrayList al  = (ArrayList)obj[0];
        publicFields = (Field[])al.toArray( new Field[0] );

        al = (ArrayList)obj[1];
        protectedFields = (Field[])al.toArray( new Field[0] );

        al = (ArrayList)obj[2];
        privateFields = (Field[])al.toArray( new Field[0] );

        al = (ArrayList)obj[3];
        packageFields = (Field[])al.toArray( new Field[0] );
    }



    Field[] getPublicFields() {
        return publicFields;
    }


    Field[] getProtectedFields() {
        return protectedFields;
    }


    Field[] getPrivateFields() {
        return privateFields;
    }


    Field[] getPackageFields() {
        return packageFields;
    }


    Field[] getAllFields() {
        return flds;
    }

}