    001    /*
    002     * Copyright (c) 2007-2014 Concurrent, Inc. All Rights Reserved.
    003     *
    004     * Project and contact information: http://www.cascading.org/
    005     *
    006     * This file is part of the Cascading project.
    007     *
    008     * Licensed under the Apache License, Version 2.0 (the "License");
    009     * you may not use this file except in compliance with the License.
    010     * You may obtain a copy of the License at
    011     *
    012     *     http://www.apache.org/licenses/LICENSE-2.0
    013     *
    014     * Unless required by applicable law or agreed to in writing, software
    015     * distributed under the License is distributed on an "AS IS" BASIS,
    016     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    017     * See the License for the specific language governing permissions and
    018     * limitations under the License.
    019     */
    020
    021    package cascading.provider;
    022
    023    import cascading.flow.FlowProcess;
    024
    025    /**
    026     * Class FactoryLoader is an implementation of a {@link ProviderLoader} and is used to load
    027     * {@link CascadingFactory} instances used by internal frameworks.
    028     *
    029     * @see CascadingFactory
    030     */
    031    public class FactoryLoader extends ProviderLoader<CascadingFactory>
    032      {
    033      private static FactoryLoader factoryLoader;
    034
    035      public synchronized static FactoryLoader getInstance()
    036        {
    037        if( factoryLoader == null )
    038          factoryLoader = new FactoryLoader();
    039
    040        return factoryLoader;
    041        }
    042
    043      public <Factory extends CascadingFactory> Factory loadFactoryFrom( FlowProcess flowProcess, String property, Class<Factory> defaultFactory )
    044        {
    045        Object value = flowProcess.getProperty( property );
    046
    047        String className;
    048
    049        if( value == null )
    050          className = defaultFactory.getName();
    051        else
    052          className = value.toString();
    053
    054        Factory factory = (Factory) createProvider( className ); // todo remove this cast
    055
    056        if( factory != null )
    057          factory.initialize( flowProcess );
    058
    059        return factory;
    060        }
    061      }