Open Source Repository

Home /open-symphony/oscore-2.2.6 | Repository Home


com/opensymphony/provider/ProviderFactory.java
/*
 * Copyright (c) 2002-2003 by OpenSymphony
 * All rights reserved.
 */
package com.opensymphony.provider;


/**
 * Get specific provider implementation. This is a singleton.
 *
 @author <a href="mailto:[email protected]">Joe Walnes</a>
 @version $Revision: 5 $
 *
 @see com.opensymphony.provider.Provider
 */
public class ProviderFactory {
    //~ Static fields/initializers /////////////////////////////////////////////

    private static ProviderFactory instance;

    //~ Constructors ///////////////////////////////////////////////////////////

    /**
     * Private constructor. To obtain instance, use {@see #getInstance()}.
     */
    private ProviderFactory() {
    }

    //~ Methods ////////////////////////////////////////////////////////////////

    /**
     * Obtain singleton instance of factory.
     */
    public static ProviderFactory getInstance() {
        if (instance == null) {
            instance = new ProviderFactory();
        }

        return instance;
    }

    /**
     * Find appropriate provider.
     *
     @param property System property under which to find class name of provider implementation.
     @param defaultClass Name of provider to use if all else fails (this should always be able to instantiate).
     */
    public Provider getProvider(String property, String defaultClass) {
        String providerClassName = System.getProperty(property);
        Provider result = null;

        if ((providerClassName != null&& (providerClassName.trim().length() 0)) {
            result = load(providerClassName);

            if (result == null) {
                System.err.println("Provider " + providerClassName + " cannot be loaded. \nUsing " + defaultClass + " instead.");
                result = load(defaultClass);
            }
        else {
            result = load(defaultClass);
        }

        if (result == null) {
            // if defaultProvider cannot be started, this is bad (and should never happen).
            System.err.println("!!! CANNOT LOAD DEFAULT PROVIDER : " + defaultClass + "!!!");
        }

        return result;
    }

    private Provider load(String className) {
        try {
            Class providerClass = null;

            try {
                providerClass = Class.forName(className);
            catch (ClassNotFoundException e) {
                providerClass = Class.forName(className, true, Thread.currentThread().getContextClassLoader());
            }

            Provider result = (ProviderproviderClass.newInstance();
            result.init();

            return result;
        catch (ProviderConfigurationException e) {
            if (e.getCause() != null) {
                e.getCause().printStackTrace(System.err);
            else {
                e.printStackTrace(System.err);
            }

            return null;
        catch (Exception e) {
            return null;
        }
    }
}