package com.bd.movie.accessapi;

import com.bd.framework.accessapi.*;

import com.bd.framework.util.FactoryConfiguration;
import com.bd.framework.util.FactoryHelper;

import com.bd.movie.domain.Library;

/**
 <p>
 * Abstract Factory that creates concrete factory for Library Access objects. 
 * By default the factory implementation is 
 * com.bd.movie.accessimpl.LibraryAccessFactoryImpl, 
 * but it can be changed by dependency injection of another FactoryConfiguration.
 </p>
 <p>
 * Abstract factory design pattern.
 </p>
 <!-- begin-user-doc -->
 <!-- end-user-doc -->
 *
 * @generated
 */
public abstract class LibraryAccessFactory {
    /** @generated */
    private static  LibraryAccessFactory singletonInstance;
    
    /**
     * By default com.bd.movie.accessimpl.LibraryAccessFactoryImpl 
     * will be used as concrete factory.
     * @generated
     */
    private static FactoryConfiguration config = new FactoryConfiguration() {
        public String getFactoryImplementationClassName() {
            return "com.bd.movie.accessimpl.LibraryAccessFactoryImpl";
        }
        
    };
    
    /**
     * Change configuration. Necessary for convenient unit testing.
     @param aConfig new configuration object
     * @generated
     */
    public static void setConfiguration(FactoryConfiguration aConfig) {
        config = aConfig;
    }
    
    /** @generated */
    public static LibraryAccessFactory getInstance() {
        if (singletonInstance == null) {
            singletonInstance = createInstance();
        }
        return singletonInstance;
    }

    /** @generated */
    private static  LibraryAccessFactory createInstance() {
        return (LibraryAccessFactoryFactoryHelper.newInstanceFromName(
            config.getFactoryImplementationClassName());
    }
    
    /** @generated */
    protected Class getPersistentClass() {
        return Library.class;
    }

    /**
     <!-- begin-user-doc -->
     <!-- end-user-doc -->
     * @generated
     */
    public abstract FindByIdAccess<Library, Integer> createFindByIdAccess();
     
    /**
     <!-- begin-user-doc -->
     <!-- end-user-doc -->
     * @generated
     */
    public abstract CreateAccess<Library> createCreateAccess();
     
    /**
     <!-- begin-user-doc -->
     <!-- end-user-doc -->
     * @generated
     */
    public abstract FindByQueryAccess<Library> createFindByQueryAccess();
     
    /**
     <!-- begin-user-doc -->
     <!-- end-user-doc -->
     * @generated
     */
    public abstract GetNumberOfMoviesAccess createGetNumberOfMoviesAccess();