001// Copyright 2004, 2005 The Apache Software Foundation
002//
003// Licensed under the Apache License, Version 2.0 (the "License");
004// you may not use this file except in compliance with the License.
005// You may obtain a copy of the License at
006//
007//     http://www.apache.org/licenses/LICENSE-2.0
008//
009// Unless required by applicable law or agreed to in writing, software
010// distributed under the License is distributed on an "AS IS" BASIS,
011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012// See the License for the specific language governing permissions and
013// limitations under the License.
014
015package org.apache.hivemind;
016
017import java.net.URL;
018
019/**
020 * An object which is used to resolve classes and class-path resources. This is needed because, in
021 * an application server, different class loaders may be involved in loading different HiveMind
022 * modules. For example, the HiveMind library may be on the system claasspath, and modules may
023 * include EJBs and WARs, each loaded by a different classloader.
024 * <p>
025 * The class loader for the framework needs to be able to see resources in the application, but the
026 * application's class loader is a descendent of the framework's class loader. To resolve this, we
027 * need a 'hook', an instance that provides access to the application's class loader.
028 * 
029 * @author Howard Lewis Ship
030 */
031
032public interface ClassResolver
033{
034    /**
035     * Forwarded, unchanged, to the class loader. Returns null if the resource is not found.
036     */
037
038    public URL getResource(String name);
039
040    /**
041     * Forwarded, to the the method <code>Class.forName(String, boolean, ClassLoader)</code>,
042     * using the resolver's class loader.
043     * <p>
044     * Since 1.1, the type may include primitive types and arrays (of primitives or of objects).
045     * 
046     * @throws ApplicationRuntimeException
047     *             on any error.
048     */
049
050    public Class findClass(String type);
051
052    /**
053     * Like {@link #findClass(String)}, but simply returns null if the class does not exist (i.e.,
054     * if {@link ClassNotFoundException} is thrown). This is used in certain spots when (typically)
055     * the exact package for a class is not known.
056     */
057
058    public Class checkForClass(String type);
059
060    /**
061     * Returns a {@link java.lang.ClassLoader} that can see all the classes the resolver can access.
062     */
063
064    public ClassLoader getClassLoader();
065}