/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * Licensed under the Eclipse Public License, Version 1.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.eclipse.org/org/documents/epl-v10.php
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.ide.eclipse.adt.internal.sdk;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import javax.management.InvalidAttributeValueException;

/**
 * Classes which implements this interface provide methods to access framework resource
 * data loaded from the SDK.
 */
interface IAndroidClassLoader {

    /**
     * Classes which implement this interface provide methods to describe a class.
     */
    public interface IClassDescriptor {

        String getFullClassName();

        IClassDescriptor getSuperclass();

        String getSimpleName();

        IClassDescriptor getEnclosingClass();

        IClassDescriptor[] getDeclaredClasses();

        boolean isInstantiable();
    }

    /**
     * Finds and loads all classes that derive from a given set of super classes.
     *
     * @param rootPackage Root package of classes to find. Use an empty string to find everyting.
     * @param superClasses The super classes of all the classes to find.
     * @return An hash map which keys are the super classes looked for and which values are
     *         ArrayList of the classes found. The array lists are always created for all the
     *         valid keys, they are simply empty if no deriving class is found for a given
     *         super class.
     * @throws IOException
     * @throws InvalidAttributeValueException
     * @throws ClassFormatError
     */
    public HashMap<String, ArrayList<IClassDescriptor>> findClassesDerivingFrom(
            String rootPackage, String[] superClasses)
        throws IOException, InvalidAttributeValueException, ClassFormatError;

    /**
     * Returns a {@link IClassDescriptor} by its fully-qualified name.
     * @param className the fully-qualified name of the class to return.
     * @throws ClassNotFoundException
     */
    public IClassDescriptor getClass(String className) throws ClassNotFoundException;

    /**
     * Returns a string indicating the source of the classes, typically for debugging
     * or in error messages. This would typically be a JAR file name or some kind of
     * identifier that would mean something to the user when looking at error messages.
     *
     * @return An informal string representing the source of the classes.
     */
    public String getSource();
}
