uap.workflow.engine.cfg.ProcessEngineConfigurationImpl.java Source code

Java tutorial

Introduction

Here is the source code for uap.workflow.engine.cfg.ProcessEngineConfigurationImpl.java

Source

/* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
 * 
 * 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 uap.workflow.engine.cfg;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.net.URL;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Logger;

import javax.naming.InitialContext;
import javax.sql.DataSource;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import org.apache.commons.io.FileUtils;
import org.apache.ibatis.builder.xml.XMLConfigBuilder;
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.apache.ibatis.transaction.managed.ManagedTransactionFactory;
import org.apache.ibatis.type.JdbcType;
import uap.workflow.app.config.ParseConfigException;
import uap.workflow.engine.bpmn.data.ItemInstance;
import uap.workflow.engine.bpmn.deployer.BpmnDeployer;
import uap.workflow.engine.bpmn.parser.BpmnParseListener;
import uap.workflow.engine.bpmn.parser.BpmnParser;
import uap.workflow.engine.bpmn.webservice.MessageInstance;
import uap.workflow.engine.calendar.BusinessCalendarManager;
import uap.workflow.engine.calendar.CycleBusinessCalendar;
import uap.workflow.engine.calendar.DueDateBusinessCalendar;
import uap.workflow.engine.calendar.DurationBusinessCalendar;
import uap.workflow.engine.calendar.MapBusinessCalendarManager;
import uap.workflow.engine.db.DbSqlSessionFactory;
import uap.workflow.engine.db.IbatisVariableTypeHandler;
import uap.workflow.engine.db.UapPkGenerator;
import uap.workflow.engine.deploy.Deployer;
import uap.workflow.engine.deploy.DeploymentCache;
import uap.workflow.engine.el.ExpressionManager;
import uap.workflow.engine.el.ExtExpressionManager;
import uap.workflow.engine.event.CompensationEventHandler;
import uap.workflow.engine.event.EventHandler;
import uap.workflow.engine.event.SignalEventHandler;
import uap.workflow.engine.exception.WorkflowException;
import uap.workflow.engine.form.AbstractFormType;
import uap.workflow.engine.form.BooleanFormType;
import uap.workflow.engine.form.DateFormType;
import uap.workflow.engine.form.FormEngine;
import uap.workflow.engine.form.FormTypes;
import uap.workflow.engine.form.JuelFormEngine;
import uap.workflow.engine.form.LongFormType;
import uap.workflow.engine.form.StringFormType;
import uap.workflow.engine.handler.HistoryParseListener;
import uap.workflow.engine.interceptor.CommandContextFactory;
import uap.workflow.engine.interceptor.CommandExecutor;
import uap.workflow.engine.interceptor.CommandExecutorImpl;
import uap.workflow.engine.interceptor.CommandInterceptor;
import uap.workflow.engine.interceptor.DelegateInterceptor;
import uap.workflow.engine.interceptor.SessionFactory;
import uap.workflow.engine.invocation.DefaultDelegateInterceptor;
import uap.workflow.engine.io.IoUtil;
import uap.workflow.engine.jobexecutor.AsyncContinuationJobHandler;
import uap.workflow.engine.jobexecutor.DefaultJobExecutor;
import uap.workflow.engine.jobexecutor.JobExecutor;
import uap.workflow.engine.jobexecutor.JobHandler;
import uap.workflow.engine.jobexecutor.ProcessEventJobHandler;
import uap.workflow.engine.jobexecutor.TimerCatchIntermediateEventJobHandler;
import uap.workflow.engine.jobexecutor.TimerExecuteNestedActivityJobHandler;
import uap.workflow.engine.jobexecutor.TimerStartEventJobHandler;
import uap.workflow.engine.mail.MailScanner;
import uap.workflow.engine.mgr.AttachmentManager;
import uap.workflow.engine.mgr.CommentManager;
import uap.workflow.engine.mgr.DeploymentManager;
import uap.workflow.engine.mgr.EventSubscriptionManager;
import uap.workflow.engine.mgr.ExecutionManager;
import uap.workflow.engine.mgr.GroupManager;
import uap.workflow.engine.mgr.HistoricActivityInstanceManager;
import uap.workflow.engine.mgr.HistoricDetailManager;
import uap.workflow.engine.mgr.HistoricTaskInstanceManager;
import uap.workflow.engine.mgr.IdentityInfoManager;
import uap.workflow.engine.mgr.IdentityLinkManager;
import uap.workflow.engine.mgr.JobManager;
import uap.workflow.engine.mgr.MembershipManager;
import uap.workflow.engine.mgr.ProcessDefinitionManager;
import uap.workflow.engine.mgr.ProcessInstanceManager;
import uap.workflow.engine.mgr.PropertyManager;
import uap.workflow.engine.mgr.ResourceManager;
import uap.workflow.engine.mgr.TableDataManager;
import uap.workflow.engine.mgr.TaskManager;
import uap.workflow.engine.mgr.UserManager;
import uap.workflow.engine.mgr.VariableInstanceManager;
import uap.workflow.engine.persistence.GenericManagerFactory;
import uap.workflow.engine.query.FormServiceImpl;
import uap.workflow.engine.query.HistoryServiceImpl;
import uap.workflow.engine.query.IdentityServiceImpl;
import uap.workflow.engine.query.ManagementServiceImpl;
import uap.workflow.engine.query.ProcessEngineImpl;
import uap.workflow.engine.query.RepositoryServiceImpl;
import uap.workflow.engine.query.RuntimeServiceImpl;
import uap.workflow.engine.query.ServiceImpl;
import uap.workflow.engine.query.TaskServiceImpl;
import uap.workflow.engine.scripting.BeansResolverFactory;
import uap.workflow.engine.scripting.ResolverFactory;
import uap.workflow.engine.scripting.ScriptBindingsFactory;
import uap.workflow.engine.scripting.ScriptingEngines;
import uap.workflow.engine.scripting.VariableScopeResolverFactory;
import uap.workflow.engine.service.FormService;
import uap.workflow.engine.service.HistoryService;
import uap.workflow.engine.service.IdentityService;
import uap.workflow.engine.service.ManagementService;
import uap.workflow.engine.service.ProcessEngine;
import uap.workflow.engine.service.ProcessEngineConfiguration;
import uap.workflow.engine.service.RepositoryService;
import uap.workflow.engine.service.RuntimeService;
import uap.workflow.engine.service.TaskService;
import uap.workflow.engine.util.ReflectUtil;
import uap.workflow.engine.variable.BooleanType;
import uap.workflow.engine.variable.ByteArrayType;
import uap.workflow.engine.variable.CustomObjectType;
import uap.workflow.engine.variable.DateType;
import uap.workflow.engine.variable.DefaultVariableTypes;
import uap.workflow.engine.variable.DoubleType;
import uap.workflow.engine.variable.EntityManagerSession;
import uap.workflow.engine.variable.EntityManagerSessionFactory;
import uap.workflow.engine.variable.IntegerType;
import uap.workflow.engine.variable.JPAEntityVariableType;
import uap.workflow.engine.variable.LongType;
import uap.workflow.engine.variable.NullType;
import uap.workflow.engine.variable.SerializableType;
import uap.workflow.engine.variable.ShortType;
import uap.workflow.engine.variable.StringType;
import uap.workflow.engine.variable.VariableType;
import uap.workflow.engine.variable.VariableTypes;

/**
 * @author Tom Baeyens
 */
public abstract class ProcessEngineConfigurationImpl extends ProcessEngineConfiguration {
    private static Logger log = Logger.getLogger(ProcessEngineConfigurationImpl.class.getName());
    public static final String DB_SCHEMA_UPDATE_CREATE = "create";
    public static final String DB_SCHEMA_UPDATE_DROP_CREATE = "drop-create";
    public static final int HISTORYLEVEL_NONE = 0;
    public static final int HISTORYLEVEL_ACTIVITY = 1;
    public static final int HISTORYLEVEL_AUDIT = 2;
    public static final int HISTORYLEVEL_FULL = 3;
    public static final String DEFAULT_WS_SYNC_FACTORY = "org.activiti.engine.impl.webservice.CxfWebServiceClientFactory";
    // SERVICES
    // /////////////////////////////////////////////////////////////////
    protected RepositoryService repositoryService = new RepositoryServiceImpl();
    protected RuntimeService runtimeService = new RuntimeServiceImpl();
    protected HistoryService historyService = new HistoryServiceImpl();
    protected IdentityService identityService = new IdentityServiceImpl();
    protected TaskService taskService = new TaskServiceImpl();
    protected FormService formService = new FormServiceImpl();
    protected ManagementService managementService = new ManagementServiceImpl();
    // COMMAND EXECUTORS
    // ////////////////////////////////////////////////////////
    // Command executor and interceptor stack
    /**
     * the configurable list which will be
     * {@link #initInterceptorChain(java.util.List) processed} to build the
     * {@link #commandExecutorTxRequired}
     */
    protected List<CommandInterceptor> customPreCommandInterceptorsTxRequired;
    protected List<CommandInterceptor> customPostCommandInterceptorsTxRequired;
    protected List<CommandInterceptor> commandInterceptorsTxRequired;
    /** this will be initialized during the configurationComplete() */
    protected CommandExecutor commandExecutorTxRequired;
    /**
     * the configurable list which will be {@link #initInterceptorChain(List)
     * processed} to build the {@link #commandExecutorTxRequiresNew}
     */
    protected List<CommandInterceptor> customPreCommandInterceptorsTxRequiresNew;
    protected List<CommandInterceptor> customPostCommandInterceptorsTxRequiresNew;
    protected List<CommandInterceptor> commandInterceptorsTxRequiresNew;
    /** this will be initialized during the configurationComplete() */
    protected CommandExecutor commandExecutorTxRequiresNew;
    // SESSION FACTORIES
    // ////////////////////////////////////////////////////////
    protected List<SessionFactory> customSessionFactories;
    protected DbSqlSessionFactory dbSqlSessionFactory;
    protected Map<Class<?>, SessionFactory> sessionFactories;
    // DEPLOYERS
    // ////////////////////////////////////////////////////////////////
    protected List<Deployer> customPreDeployers;
    protected List<Deployer> customPostDeployers;
    protected List<Deployer> deployers;
    protected DeploymentCache deploymentCache;
    // JOB EXECUTOR
    // /////////////////////////////////////////////////////////////
    protected List<JobHandler> customJobHandlers;
    protected Map<String, JobHandler> jobHandlers;
    protected JobExecutor jobExecutor;
    // MAIL SCANNER
    // /////////////////////////////////////////////////////////////
    protected MailScanner mailScanner;
    // MYBATIS SQL SESSION FACTORY
    // //////////////////////////////////////////////
    protected SqlSessionFactory sqlSessionFactory;
    protected TransactionFactory transactionFactory;
    // ID GENERATOR
    // /////////////////////////////////////////////////////////////
    protected IdGenerator idGenerator;
    // OTHER
    // ////////////////////////////////////////////////////////////////////
    protected List<FormEngine> customFormEngines;
    protected Map<String, FormEngine> formEngines;
    protected List<AbstractFormType> customFormTypes;
    protected FormTypes formTypes;
    protected List<VariableType> customPreVariableTypes;
    protected List<VariableType> customPostVariableTypes;
    protected VariableTypes variableTypes;
    protected ExpressionManager expressionManager;
    protected List<String> customScriptingEngineClasses;
    protected ScriptingEngines scriptingEngines;
    protected List<ResolverFactory> resolverFactories;
    protected BusinessCalendarManager businessCalendarManager;
    protected String wsSyncFactoryClassName = DEFAULT_WS_SYNC_FACTORY;
    protected CommandContextFactory commandContextFactory;
    protected TransactionContextFactory transactionContextFactory;
    protected int historyLevel;
    protected List<BpmnParseListener> preParseListeners;
    protected List<BpmnParseListener> postParseListeners;
    protected Map<Object, Object> beans;
    protected boolean isDbIdentityUsed = true;
    protected boolean isDbHistoryUsed = true;
    protected DelegateInterceptor delegateInterceptor;
    protected CommandInterceptor actualCommandExecutor;
    protected Map<String, EventHandler> eventHandlers;
    protected List<EventHandler> customEventHandlers;

    protected ExtensionConfig extensionconfig = null;

    // buildProcessEngine
    // ///////////////////////////////////////////////////////
    public ProcessEngine buildProcessEngine() {
        init();
        return new ProcessEngineImpl(this);
    }

    // init
    // /////////////////////////////////////////////////////////////////////
    protected void init() {
        initExtensionConfig();
        initHistoryLevel();
        initExpressionManager();
        initVariableTypes();
        initBeans();
        initFormEngines();
        initFormTypes();
        initScriptingEngines();
        initBusinessCalendarManager();
        initCommandContextFactory();
        initTransactionContextFactory();
        initCommandExecutors();
        initServices();
        initIdGenerator();
        initDeployers();
        initJobExecutor();
        initMailScanner();
        initDataSource();
        initTransactionFactory();
        initSqlSessionFactory();
        initSessionFactories();
        initJpa();
        initDelegateInterceptor();
        initEventHandlers();
    }

    // command executors
    // ////////////////////////////////////////////////////////
    protected abstract Collection<? extends CommandInterceptor> getDefaultCommandInterceptorsTxRequired();

    protected abstract Collection<? extends CommandInterceptor> getDefaultCommandInterceptorsTxRequiresNew();

    protected void initCommandExecutors() {
        initActualCommandExecutor();
        initCommandInterceptorsTxRequired();
        initCommandExecutorTxRequired();
        initCommandInterceptorsTxRequiresNew();
        initCommandExecutorTxRequiresNew();
    }

    protected void initActualCommandExecutor() {
        actualCommandExecutor = new CommandExecutorImpl();
    }

    protected void initCommandInterceptorsTxRequired() {
        if (commandInterceptorsTxRequired == null) {
            if (customPreCommandInterceptorsTxRequired != null) {
                commandInterceptorsTxRequired = new ArrayList<CommandInterceptor>(
                        customPreCommandInterceptorsTxRequired);
            } else {
                commandInterceptorsTxRequired = new ArrayList<CommandInterceptor>();
            }
            commandInterceptorsTxRequired.addAll(getDefaultCommandInterceptorsTxRequired());
            if (customPostCommandInterceptorsTxRequired != null) {
                commandInterceptorsTxRequired.addAll(customPostCommandInterceptorsTxRequired);
            }
            commandInterceptorsTxRequired.add(actualCommandExecutor);
        }
    }

    protected void initCommandInterceptorsTxRequiresNew() {
        if (commandInterceptorsTxRequiresNew == null) {
            if (customPreCommandInterceptorsTxRequiresNew != null) {
                commandInterceptorsTxRequiresNew = new ArrayList<CommandInterceptor>(
                        customPreCommandInterceptorsTxRequiresNew);
            } else {
                commandInterceptorsTxRequiresNew = new ArrayList<CommandInterceptor>();
            }
            commandInterceptorsTxRequiresNew.addAll(getDefaultCommandInterceptorsTxRequiresNew());
            if (customPostCommandInterceptorsTxRequiresNew != null) {
                commandInterceptorsTxRequiresNew.addAll(customPostCommandInterceptorsTxRequiresNew);
            }
            commandInterceptorsTxRequiresNew.add(actualCommandExecutor);
        }
    }

    protected void initCommandExecutorTxRequired() {
        if (commandExecutorTxRequired == null) {
            commandExecutorTxRequired = initInterceptorChain(commandInterceptorsTxRequired);
        }
    }

    protected void initCommandExecutorTxRequiresNew() {
        if (commandExecutorTxRequiresNew == null) {
            commandExecutorTxRequiresNew = initInterceptorChain(commandInterceptorsTxRequiresNew);
        }
    }

    protected CommandInterceptor initInterceptorChain(List<CommandInterceptor> chain) {
        if (chain == null || chain.isEmpty()) {
            throw new WorkflowException("invalid command interceptor chain configuration: " + chain);
        }
        for (int i = 0; i < chain.size() - 1; i++) {
            chain.get(i).setNext(chain.get(i + 1));
        }
        return chain.get(0);
    }

    // services
    // /////////////////////////////////////////////////////////////////
    protected void initServices() {
        initService(repositoryService);
        initService(runtimeService);
        initService(historyService);
        initService(identityService);
        initService(taskService);
        initService(formService);
        initService(managementService);
    }

    protected void initService(Object service) {
        if (service instanceof ServiceImpl) {
            ((ServiceImpl) service).setCommandExecutor(commandExecutorTxRequired);
        }
    }

    // DataSource
    // ///////////////////////////////////////////////////////////////
    protected void initDataSource() {
        if (dataSource == null) {
            if (dataSourceJndiName != null) {
                try {
                    dataSource = (DataSource) new InitialContext().lookup(dataSourceJndiName);
                } catch (Exception e) {
                    throw new WorkflowException(
                            "couldn't lookup datasource from " + dataSourceJndiName + ": " + e.getMessage(), e);
                }
            } else if (jdbcUrl != null) {
                if ((jdbcDriver == null) || (jdbcUrl == null) || (jdbcUsername == null)) {
                    throw new WorkflowException(
                            "DataSource or JDBC properties have to be specified in a process engine configuration");
                }
                log.fine("initializing datasource to db: " + jdbcUrl);
                PooledDataSource pooledDataSource = new PooledDataSource(ReflectUtil.getClassLoader(), jdbcDriver,
                        jdbcUrl, jdbcUsername, jdbcPassword);
                if (jdbcMaxActiveConnections > 0) {
                    pooledDataSource.setPoolMaximumActiveConnections(jdbcMaxActiveConnections);
                }
                if (jdbcMaxIdleConnections > 0) {
                    pooledDataSource.setPoolMaximumIdleConnections(jdbcMaxIdleConnections);
                }
                if (jdbcMaxCheckoutTime > 0) {
                    pooledDataSource.setPoolMaximumCheckoutTime(jdbcMaxCheckoutTime);
                }
                if (jdbcMaxWaitTime > 0) {
                    pooledDataSource.setPoolTimeToWait(jdbcMaxWaitTime);
                }
                if (jdbcPingEnabled == true) {
                    pooledDataSource.setPoolPingEnabled(true);
                    if (jdbcPingQuery != null) {
                        pooledDataSource.setPoolPingQuery(jdbcPingQuery);
                    }
                    pooledDataSource.setPoolPingConnectionsNotUsedFor(jdbcPingConnectionNotUsedFor);
                }
                dataSource = pooledDataSource;
            }
            if (dataSource instanceof PooledDataSource) {
                // ACT-233: connection pool of Ibatis is not properely
                // initialized if this is not called!
                ((PooledDataSource) dataSource).forceCloseAll();
            }
        }
        if (databaseType == null) {
            initDatabaseType();
        }
    }

    protected static Properties databaseTypeMappings = getDefaultDatabaseTypeMappings();

    protected static Properties getDefaultDatabaseTypeMappings() {
        Properties databaseTypeMappings = new Properties();
        databaseTypeMappings.setProperty("H2", "h2");
        databaseTypeMappings.setProperty("MySQL", "mysql");
        databaseTypeMappings.setProperty("Oracle", "oracle");
        databaseTypeMappings.setProperty("PostgreSQL", "postgres");
        databaseTypeMappings.setProperty("Microsoft SQL Server", "mssql");
        databaseTypeMappings.setProperty("DB2", "db2");
        databaseTypeMappings.setProperty("DB2", "db2");
        databaseTypeMappings.setProperty("DB2/NT", "db2");
        databaseTypeMappings.setProperty("DB2/NT64", "db2");
        databaseTypeMappings.setProperty("DB2 UDP", "db2");
        databaseTypeMappings.setProperty("DB2/LINUX", "db2");
        databaseTypeMappings.setProperty("DB2/LINUX390", "db2");
        databaseTypeMappings.setProperty("DB2/LINUXX8664", "db2");
        databaseTypeMappings.setProperty("DB2/LINUXZ64", "db2");
        databaseTypeMappings.setProperty("DB2/400 SQL", "db2");
        databaseTypeMappings.setProperty("DB2/6000", "db2");
        databaseTypeMappings.setProperty("DB2 UDB iSeries", "db2");
        databaseTypeMappings.setProperty("DB2/AIX64", "db2");
        databaseTypeMappings.setProperty("DB2/HPUX", "db2");
        databaseTypeMappings.setProperty("DB2/HP64", "db2");
        databaseTypeMappings.setProperty("DB2/SUN", "db2");
        databaseTypeMappings.setProperty("DB2/SUN64", "db2");
        databaseTypeMappings.setProperty("DB2/PTX", "db2");
        databaseTypeMappings.setProperty("DB2/2", "db2");
        return databaseTypeMappings;
    }

    public void initDatabaseType() {
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
            DatabaseMetaData databaseMetaData = connection.getMetaData();
            String databaseProductName = databaseMetaData.getDatabaseProductName();
            log.fine("database product name: '" + databaseProductName + "'");
            databaseType = databaseTypeMappings.getProperty(databaseProductName);
            if (databaseType == null) {
                throw new WorkflowException(
                        "couldn't deduct database type from database product name '" + databaseProductName + "'");
            }
            log.fine("using database type: " + databaseType);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    // myBatis SqlSessionFactory
    // ////////////////////////////////////////////////
    protected void initTransactionFactory() {
        if (transactionFactory == null) {
            if (transactionsExternallyManaged) {
                transactionFactory = new ManagedTransactionFactory();
            } else {
                transactionFactory = new JdbcTransactionFactory();
            }
        }
    }

    @SuppressWarnings("deprecation")
    protected void initSqlSessionFactory() {
        if (sqlSessionFactory == null) {
            InputStream inputStream = null;
            try {
                inputStream = ReflectUtil.getResourceAsStream("org/activiti/db/mapping/mappings.xml");
                if (inputStream == null)
                    return;
                // update the jdbc parameters to the configured ones...
                Environment environment = new Environment("default", transactionFactory, dataSource);
                Reader reader = new InputStreamReader(inputStream);
                XMLConfigBuilder parser = new XMLConfigBuilder(reader);
                Configuration configuration = parser.getConfiguration();
                configuration.setEnvironment(environment);
                configuration.getTypeHandlerRegistry().register(VariableType.class, JdbcType.VARCHAR,
                        new IbatisVariableTypeHandler());
                //configuration = parser.parse();
                sqlSessionFactory = new DefaultSqlSessionFactory(configuration);
            } catch (Exception e) {
                throw new WorkflowException("Error while building ibatis SqlSessionFactory: " + e.getMessage(), e);
            } finally {
                IoUtil.closeSilently(inputStream);
            }
        }
    }

    // session factories
    // ////////////////////////////////////////////////////////
    protected void initSessionFactories() {
        if (sessionFactories == null) {
            sessionFactories = new HashMap<Class<?>, SessionFactory>();
            dbSqlSessionFactory = new DbSqlSessionFactory();
            dbSqlSessionFactory.setDatabaseType(databaseType);
            dbSqlSessionFactory.setIdGenerator(idGenerator);
            dbSqlSessionFactory.setSqlSessionFactory(sqlSessionFactory);
            dbSqlSessionFactory.setDbIdentityUsed(isDbIdentityUsed);
            dbSqlSessionFactory.setDbHistoryUsed(isDbHistoryUsed);
            addSessionFactory(dbSqlSessionFactory);
            addSessionFactory(new GenericManagerFactory(AttachmentManager.class));
            addSessionFactory(new GenericManagerFactory(CommentManager.class));
            addSessionFactory(new GenericManagerFactory(DeploymentManager.class));
            addSessionFactory(new GenericManagerFactory(ExecutionManager.class));
            addSessionFactory(new GenericManagerFactory(HistoricActivityInstanceManager.class));
            addSessionFactory(new GenericManagerFactory(HistoricDetailManager.class));
            addSessionFactory(new GenericManagerFactory(ProcessInstanceManager.class));
            addSessionFactory(new GenericManagerFactory(HistoricTaskInstanceManager.class));
            addSessionFactory(new GenericManagerFactory(IdentityInfoManager.class));
            addSessionFactory(new GenericManagerFactory(IdentityLinkManager.class));
            addSessionFactory(new GenericManagerFactory(JobManager.class));
            addSessionFactory(new GenericManagerFactory(GroupManager.class));
            addSessionFactory(new GenericManagerFactory(MembershipManager.class));
            addSessionFactory(new GenericManagerFactory(ProcessDefinitionManager.class));
            addSessionFactory(new GenericManagerFactory(PropertyManager.class));
            addSessionFactory(new GenericManagerFactory(ResourceManager.class));
            addSessionFactory(new GenericManagerFactory(TableDataManager.class));
            addSessionFactory(new GenericManagerFactory(TaskManager.class));
            addSessionFactory(new GenericManagerFactory(UserManager.class));
            addSessionFactory(new GenericManagerFactory(VariableInstanceManager.class));
            addSessionFactory(new GenericManagerFactory(EventSubscriptionManager.class));
        }
        if (customSessionFactories != null) {
            for (SessionFactory sessionFactory : customSessionFactories) {
                addSessionFactory(sessionFactory);
            }
        }
    }

    protected void addSessionFactory(SessionFactory sessionFactory) {
        sessionFactories.put(sessionFactory.getSessionType(), sessionFactory);
    }

    // deployers
    // ////////////////////////////////////////////////////////////////
    protected void initDeployers() {
        if (this.deployers == null) {
            this.deployers = new ArrayList<Deployer>();
            if (customPreDeployers != null) {
                this.deployers.addAll(customPreDeployers);
            }
            this.deployers.addAll(getDefaultDeployers());
            if (customPostDeployers != null) {
                this.deployers.addAll(customPostDeployers);
            }
        }
        if (deploymentCache == null) {
            List<Deployer> deployers = new ArrayList<Deployer>();
            if (customPreDeployers != null) {
                deployers.addAll(customPreDeployers);
            }
            deployers.addAll(getDefaultDeployers());
            if (customPostDeployers != null) {
                deployers.addAll(customPostDeployers);
            }
            deploymentCache = new DeploymentCache();
            deploymentCache.setDeployers(deployers);
        }
    }

    protected Collection<? extends Deployer> getDefaultDeployers() {
        List<Deployer> defaultDeployers = new ArrayList<Deployer>();
        BpmnDeployer bpmnDeployer = new BpmnDeployer();
        bpmnDeployer.setExpressionManager(expressionManager);
        bpmnDeployer.setIdGenerator(idGenerator);
        BpmnParser bpmnParser = new BpmnParser(expressionManager);
        if (preParseListeners != null) {
            bpmnParser.getParseListeners().addAll(preParseListeners);
        }
        bpmnParser.getParseListeners().addAll(getDefaultBPMNParseListeners());
        if (postParseListeners != null) {
            bpmnParser.getParseListeners().addAll(postParseListeners);
        }
        bpmnDeployer.setBpmnParser(bpmnParser);
        defaultDeployers.add(bpmnDeployer);
        return defaultDeployers;
    }

    protected List<BpmnParseListener> getDefaultBPMNParseListeners() {
        List<BpmnParseListener> defaultListeners = new ArrayList<BpmnParseListener>();
        if (historyLevel >= ProcessEngineConfigurationImpl.HISTORYLEVEL_ACTIVITY) {
            defaultListeners.add(new HistoryParseListener(historyLevel));
        }
        return defaultListeners;
    }

    // job executor
    // /////////////////////////////////////////////////////////////
    protected void initJobExecutor() {
        if (jobExecutor == null) {
            jobExecutor = new DefaultJobExecutor();
        }
        jobHandlers = new HashMap<String, JobHandler>();
        TimerExecuteNestedActivityJobHandler timerExecuteNestedActivityJobHandler = new TimerExecuteNestedActivityJobHandler();
        jobHandlers.put(timerExecuteNestedActivityJobHandler.getType(), timerExecuteNestedActivityJobHandler);

        TimerCatchIntermediateEventJobHandler timerCatchIntermediateEvent = new TimerCatchIntermediateEventJobHandler();
        jobHandlers.put(timerCatchIntermediateEvent.getType(), timerCatchIntermediateEvent);

        TimerStartEventJobHandler timerStartEvent = new TimerStartEventJobHandler();
        jobHandlers.put(timerStartEvent.getType(), timerStartEvent);

        AsyncContinuationJobHandler asyncContinuationJobHandler = new AsyncContinuationJobHandler();
        jobHandlers.put(asyncContinuationJobHandler.getType(), asyncContinuationJobHandler);

        ProcessEventJobHandler processEventJobHandler = new ProcessEventJobHandler();
        jobHandlers.put(processEventJobHandler.getType(), processEventJobHandler);

        if (getCustomJobHandlers() != null) {
            for (JobHandler customJobHandler : getCustomJobHandlers()) {
                jobHandlers.put(customJobHandler.getType(), customJobHandler);
            }
        }
        jobExecutor.setCommandExecutor(commandExecutorTxRequired);
        jobExecutor.setAutoActivate(jobExecutorActivate);
    }

    protected void initMailScanner() {
        if (mailScanner == null) {
            mailScanner = new MailScanner();
        }
        mailScanner.setCommandExecutor(commandExecutorTxRequired);
    }

    public void initExtensionConfig() {
        String configPath = "uap/workflow/engine/cfg/BizImpl.cfg.xml";
        Reader reader = null;
        try {
            URL url = Thread.currentThread().getContextClassLoader().getResource(configPath);
            String filePath = url.getPath();
            File f = new File(filePath);
            if (!f.exists())
                return;
            String xmlText = FileUtils.readFileToString(new File(filePath), "UTF-8");
            reader = new StringReader(xmlText);

            JAXBContext jc;
            try {
                jc = JAXBContext.newInstance(ExtensionConfig.class);
                Unmarshaller us = jc.createUnmarshaller();
                // xmlinput
                XMLInputFactory inputFactory = XMLInputFactory.newInstance();
                // XMLStreamReader
                XMLStreamReader streamReader = inputFactory.createXMLStreamReader(reader);
                // 
                extensionconfig = (ExtensionConfig) us.unmarshal(streamReader);
            } catch (Exception e) {
                e.printStackTrace();
                throw new ParseConfigException(e.getMessage());
            }
        } catch (IOException e) {

        } finally {
            try {
                if (reader != null) {
                    reader.close();
                    reader = null;
                }
            } catch (IOException e) {
            }
        }
        return;

    }

    // history
    // //////////////////////////////////////////////////////////////////
    public void initHistoryLevel() {
        if (HISTORY_NONE.equalsIgnoreCase(history)) {
            historyLevel = 0;
        } else if (HISTORY_ACTIVITY.equalsIgnoreCase(history)) {
            historyLevel = 1;
        } else if (HISTORY_AUDIT.equalsIgnoreCase(history)) {
            historyLevel = 2;
        } else if (HISTORY_FULL.equalsIgnoreCase(history)) {
            historyLevel = 3;
        } else {
            throw new WorkflowException("invalid history level: " + history);
        }
    }

    // id generator
    // /////////////////////////////////////////////////////////////
    protected void initIdGenerator() {
        if (idGenerator == null) {
            UapPkGenerator dbIdGenerator = new UapPkGenerator();
            // dbIdGenerator.setIdBlockSize(idBlockSize);
            dbIdGenerator.setCommandExecutor(commandExecutorTxRequiresNew);
            idGenerator = dbIdGenerator;
        }
    }

    // OTHER
    // ////////////////////////////////////////////////////////////////////
    protected void initCommandContextFactory() {
        if (commandContextFactory == null) {
            commandContextFactory = new CommandContextFactory();
            commandContextFactory.setProcessEngineConfiguration(this);
        }
    }

    protected void initTransactionContextFactory() {
        if (transactionContextFactory == null) {
            transactionContextFactory = new StandaloneMybatisTransactionContextFactory();
        }
    }

    protected void initVariableTypes() {
        if (variableTypes == null) {
            variableTypes = new DefaultVariableTypes();
            if (customPreVariableTypes != null) {
                for (VariableType customVariableType : customPreVariableTypes) {
                    variableTypes.addType(customVariableType);
                }
            }
            variableTypes.addType(new NullType());
            variableTypes.addType(new StringType());
            variableTypes.addType(new BooleanType());
            variableTypes.addType(new ShortType());
            variableTypes.addType(new IntegerType());
            variableTypes.addType(new LongType());
            variableTypes.addType(new DateType());
            variableTypes.addType(new DoubleType());
            variableTypes.addType(new ByteArrayType());
            variableTypes.addType(new SerializableType());
            variableTypes.addType(new CustomObjectType("item", ItemInstance.class));
            variableTypes.addType(new CustomObjectType("message", MessageInstance.class));
            if (customPostVariableTypes != null) {
                for (VariableType customVariableType : customPostVariableTypes) {
                    variableTypes.addType(customVariableType);
                }
            }
        }
    }

    protected void initFormEngines() {
        if (formEngines == null) {
            formEngines = new HashMap<String, FormEngine>();
            FormEngine defaultFormEngine = new JuelFormEngine();
            formEngines.put(null, defaultFormEngine); // default form engine is
            // looked up with null
            formEngines.put(defaultFormEngine.getName(), defaultFormEngine);
        }
        if (customFormEngines != null) {
            for (FormEngine formEngine : customFormEngines) {
                formEngines.put(formEngine.getName(), formEngine);
            }
        }
    }

    protected void initFormTypes() {
        if (formTypes == null) {
            formTypes = new FormTypes();
            formTypes.addFormType(new StringFormType());
            formTypes.addFormType(new LongFormType());
            formTypes.addFormType(new DateFormType("dd/MM/yyyy"));
            formTypes.addFormType(new BooleanFormType());
        }
        if (customFormTypes != null) {
            for (AbstractFormType customFormType : customFormTypes) {
                formTypes.addFormType(customFormType);
            }
        }
    }

    protected void initScriptingEngines() {
        if (resolverFactories == null) {
            resolverFactories = new ArrayList<ResolverFactory>();
            resolverFactories.add(new VariableScopeResolverFactory());
            resolverFactories.add(new BeansResolverFactory());
        }
        if (scriptingEngines == null) {
            scriptingEngines = new ScriptingEngines(new ScriptBindingsFactory(resolverFactories));
        }
    }

    protected void initExpressionManager() {
        if (expressionManager == null) {
            expressionManager = new ExtExpressionManager();//
        }
    }

    protected void initBusinessCalendarManager() {
        if (businessCalendarManager == null) {
            MapBusinessCalendarManager mapBusinessCalendarManager = new MapBusinessCalendarManager();
            mapBusinessCalendarManager.addBusinessCalendar(DurationBusinessCalendar.NAME,
                    new DurationBusinessCalendar());
            mapBusinessCalendarManager.addBusinessCalendar(DueDateBusinessCalendar.NAME,
                    new DueDateBusinessCalendar());
            mapBusinessCalendarManager.addBusinessCalendar(CycleBusinessCalendar.NAME, new CycleBusinessCalendar());
            businessCalendarManager = mapBusinessCalendarManager;
        }
    }

    protected void initDelegateInterceptor() {
        if (delegateInterceptor == null) {
            delegateInterceptor = new DefaultDelegateInterceptor();
        }
    }

    protected void initEventHandlers() {
        if (eventHandlers == null) {
            eventHandlers = new HashMap<String, EventHandler>();
            SignalEventHandler signalEventHander = new SignalEventHandler();
            eventHandlers.put(signalEventHander.getEventHandlerType(), signalEventHander);
            CompensationEventHandler compensationEventHandler = new CompensationEventHandler();
            eventHandlers.put(compensationEventHandler.getEventHandlerType(), compensationEventHandler);
        }
        if (customEventHandlers != null) {
            for (EventHandler eventHandler : customEventHandlers) {
                eventHandlers.put(eventHandler.getEventHandlerType(), eventHandler);
            }
        }
    }

    // JPA
    // //////////////////////////////////////////////////////////////////////
    protected void initJpa() {
        if (jpaPersistenceUnitName != null) {
            jpaEntityManagerFactory = JpaHelper.createEntityManagerFactory(jpaPersistenceUnitName);
        }
        if (jpaEntityManagerFactory != null) {
            sessionFactories.put(EntityManagerSession.class, new EntityManagerSessionFactory(
                    jpaEntityManagerFactory, jpaHandleTransaction, jpaCloseEntityManager));
            VariableType jpaType = variableTypes.getVariableType(JPAEntityVariableType.TYPE_NAME);
            // Add JPA-type
            if (jpaType == null) {
                // We try adding the variable right before SerializableType, if
                // available
                int serializableIndex = variableTypes.getTypeIndex(SerializableType.TYPE_NAME);
                if (serializableIndex > -1) {
                    variableTypes.addType(new JPAEntityVariableType(), serializableIndex);
                } else {
                    variableTypes.addType(new JPAEntityVariableType());
                }
            }
        }
    }

    protected void initBeans() {
        if (beans == null) {
            beans = new HashMap<Object, Object>();
        }
    }

    // getters and setters
    // //////////////////////////////////////////////////////
    public String getProcessEngineName() {
        return processEngineName;
    }

    public int getHistoryLevel() {
        return historyLevel;
    }

    public void setHistoryLevel(int historyLevel) {
        this.historyLevel = historyLevel;
    }

    public ProcessEngineConfigurationImpl setProcessEngineName(String processEngineName) {
        this.processEngineName = processEngineName;
        return this;
    }

    public List<CommandInterceptor> getCustomPreCommandInterceptorsTxRequired() {
        return customPreCommandInterceptorsTxRequired;
    }

    public ProcessEngineConfigurationImpl setCustomPreCommandInterceptorsTxRequired(
            List<CommandInterceptor> customPreCommandInterceptorsTxRequired) {
        this.customPreCommandInterceptorsTxRequired = customPreCommandInterceptorsTxRequired;
        return this;
    }

    public List<CommandInterceptor> getCustomPostCommandInterceptorsTxRequired() {
        return customPostCommandInterceptorsTxRequired;
    }

    public ProcessEngineConfigurationImpl setCustomPostCommandInterceptorsTxRequired(
            List<CommandInterceptor> customPostCommandInterceptorsTxRequired) {
        this.customPostCommandInterceptorsTxRequired = customPostCommandInterceptorsTxRequired;
        return this;
    }

    public List<CommandInterceptor> getCommandInterceptorsTxRequired() {
        return commandInterceptorsTxRequired;
    }

    public ProcessEngineConfigurationImpl setCommandInterceptorsTxRequired(
            List<CommandInterceptor> commandInterceptorsTxRequired) {
        this.commandInterceptorsTxRequired = commandInterceptorsTxRequired;
        return this;
    }

    public CommandExecutor getCommandExecutorTxRequired() {
        return commandExecutorTxRequired;
    }

    public ProcessEngineConfigurationImpl setCommandExecutorTxRequired(CommandExecutor commandExecutorTxRequired) {
        this.commandExecutorTxRequired = commandExecutorTxRequired;
        return this;
    }

    public List<CommandInterceptor> getCustomPreCommandInterceptorsTxRequiresNew() {
        return customPreCommandInterceptorsTxRequiresNew;
    }

    public ProcessEngineConfigurationImpl setCustomPreCommandInterceptorsTxRequiresNew(
            List<CommandInterceptor> customPreCommandInterceptorsTxRequiresNew) {
        this.customPreCommandInterceptorsTxRequiresNew = customPreCommandInterceptorsTxRequiresNew;
        return this;
    }

    public List<CommandInterceptor> getCustomPostCommandInterceptorsTxRequiresNew() {
        return customPostCommandInterceptorsTxRequiresNew;
    }

    public ProcessEngineConfigurationImpl setCustomPostCommandInterceptorsTxRequiresNew(
            List<CommandInterceptor> customPostCommandInterceptorsTxRequiresNew) {
        this.customPostCommandInterceptorsTxRequiresNew = customPostCommandInterceptorsTxRequiresNew;
        return this;
    }

    public List<CommandInterceptor> getCommandInterceptorsTxRequiresNew() {
        return commandInterceptorsTxRequiresNew;
    }

    public ProcessEngineConfigurationImpl setCommandInterceptorsTxRequiresNew(
            List<CommandInterceptor> commandInterceptorsTxRequiresNew) {
        this.commandInterceptorsTxRequiresNew = commandInterceptorsTxRequiresNew;
        return this;
    }

    public CommandExecutor getCommandExecutorTxRequiresNew() {
        return commandExecutorTxRequiresNew;
    }

    public ProcessEngineConfigurationImpl setCommandExecutorTxRequiresNew(
            CommandExecutor commandExecutorTxRequiresNew) {
        this.commandExecutorTxRequiresNew = commandExecutorTxRequiresNew;
        return this;
    }

    public RepositoryService getRepositoryService() {
        return repositoryService;
    }

    public ProcessEngineConfigurationImpl setRepositoryService(RepositoryService repositoryService) {
        this.repositoryService = repositoryService;
        return this;
    }

    public RuntimeService getRuntimeService() {
        return runtimeService;
    }

    public ProcessEngineConfigurationImpl setRuntimeService(RuntimeService runtimeService) {
        this.runtimeService = runtimeService;
        return this;
    }

    public HistoryService getHistoryService() {
        return historyService;
    }

    public ProcessEngineConfigurationImpl setHistoryService(HistoryService historyService) {
        this.historyService = historyService;
        return this;
    }

    public IdentityService getIdentityService() {
        return identityService;
    }

    public ProcessEngineConfigurationImpl setIdentityService(IdentityService identityService) {
        this.identityService = identityService;
        return this;
    }

    public TaskService getTaskService() {
        return taskService;
    }

    public ProcessEngineConfigurationImpl setTaskService(TaskService taskService) {
        this.taskService = taskService;
        return this;
    }

    public FormService getFormService() {
        return formService;
    }

    public ProcessEngineConfigurationImpl setFormService(FormService formService) {
        this.formService = formService;
        return this;
    }

    public ManagementService getManagementService() {
        return managementService;
    }

    public ProcessEngineConfigurationImpl setManagementService(ManagementService managementService) {
        this.managementService = managementService;
        return this;
    }

    public Map<Class<?>, SessionFactory> getSessionFactories() {
        return sessionFactories;
    }

    public ProcessEngineConfigurationImpl setSessionFactories(Map<Class<?>, SessionFactory> sessionFactories) {
        this.sessionFactories = sessionFactories;
        return this;
    }

    public List<Deployer> getDeployers() {
        return deployers;
    }

    public ProcessEngineConfigurationImpl setDeployers(List<Deployer> deployers) {
        this.deployers = deployers;
        return this;
    }

    public JobExecutor getJobExecutor() {
        return jobExecutor;
    }

    public ProcessEngineConfigurationImpl setJobExecutor(JobExecutor jobExecutor) {
        this.jobExecutor = jobExecutor;
        return this;
    }

    public IdGenerator getIdGenerator() {
        return idGenerator;
    }

    public ProcessEngineConfigurationImpl setIdGenerator(IdGenerator idGenerator) {
        this.idGenerator = idGenerator;
        return this;
    }

    public String getWsSyncFactoryClassName() {
        return wsSyncFactoryClassName;
    }

    public ProcessEngineConfigurationImpl setWsSyncFactoryClassName(String wsSyncFactoryClassName) {
        this.wsSyncFactoryClassName = wsSyncFactoryClassName;
        return this;
    }

    public Map<String, FormEngine> getFormEngines() {
        return formEngines;
    }

    public ProcessEngineConfigurationImpl setFormEngines(Map<String, FormEngine> formEngines) {
        this.formEngines = formEngines;
        return this;
    }

    public FormTypes getFormTypes() {
        return formTypes;
    }

    public ProcessEngineConfigurationImpl setFormTypes(FormTypes formTypes) {
        this.formTypes = formTypes;
        return this;
    }

    public ScriptingEngines getScriptingEngines() {
        return scriptingEngines;
    }

    public ProcessEngineConfigurationImpl setScriptingEngines(ScriptingEngines scriptingEngines) {
        this.scriptingEngines = scriptingEngines;
        return this;
    }

    public VariableTypes getVariableTypes() {
        return variableTypes;
    }

    public ProcessEngineConfigurationImpl setVariableTypes(VariableTypes variableTypes) {
        this.variableTypes = variableTypes;
        return this;
    }

    public ExpressionManager getExpressionManager() {
        return expressionManager;
    }

    public ProcessEngineConfigurationImpl setExpressionManager(ExpressionManager expressionManager) {
        this.expressionManager = expressionManager;
        return this;
    }

    public BusinessCalendarManager getBusinessCalendarManager() {
        return businessCalendarManager;
    }

    public ProcessEngineConfigurationImpl setBusinessCalendarManager(
            BusinessCalendarManager businessCalendarManager) {
        this.businessCalendarManager = businessCalendarManager;
        return this;
    }

    public CommandContextFactory getCommandContextFactory() {
        return commandContextFactory;
    }

    public ProcessEngineConfigurationImpl setCommandContextFactory(CommandContextFactory commandContextFactory) {
        this.commandContextFactory = commandContextFactory;
        return this;
    }

    public TransactionContextFactory getTransactionContextFactory() {
        return transactionContextFactory;
    }

    public ProcessEngineConfigurationImpl setTransactionContextFactory(
            TransactionContextFactory transactionContextFactory) {
        this.transactionContextFactory = transactionContextFactory;
        return this;
    }

    public List<Deployer> getCustomPreDeployers() {
        return customPreDeployers;
    }

    public ProcessEngineConfigurationImpl setCustomPreDeployers(List<Deployer> customPreDeployers) {
        this.customPreDeployers = customPreDeployers;
        return this;
    }

    public List<Deployer> getCustomPostDeployers() {
        return customPostDeployers;
    }

    public ProcessEngineConfigurationImpl setCustomPostDeployers(List<Deployer> customPostDeployers) {
        this.customPostDeployers = customPostDeployers;
        return this;
    }

    public Map<String, JobHandler> getJobHandlers() {
        return jobHandlers;
    }

    public ProcessEngineConfigurationImpl setJobHandlers(Map<String, JobHandler> jobHandlers) {
        this.jobHandlers = jobHandlers;
        return this;
    }

    public SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }

    public ProcessEngineConfigurationImpl setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
        return this;
    }

    public DbSqlSessionFactory getDbSqlSessionFactory() {
        return dbSqlSessionFactory;
    }

    public ProcessEngineConfigurationImpl setDbSqlSessionFactory(DbSqlSessionFactory dbSqlSessionFactory) {
        this.dbSqlSessionFactory = dbSqlSessionFactory;
        return this;
    }

    public TransactionFactory getTransactionFactory() {
        return transactionFactory;
    }

    public ProcessEngineConfigurationImpl setTransactionFactory(TransactionFactory transactionFactory) {
        this.transactionFactory = transactionFactory;
        return this;
    }

    public List<SessionFactory> getCustomSessionFactories() {
        return customSessionFactories;
    }

    public ProcessEngineConfigurationImpl setCustomSessionFactories(List<SessionFactory> customSessionFactories) {
        this.customSessionFactories = customSessionFactories;
        return this;
    }

    public List<JobHandler> getCustomJobHandlers() {
        return customJobHandlers;
    }

    public ProcessEngineConfigurationImpl setCustomJobHandlers(List<JobHandler> customJobHandlers) {
        this.customJobHandlers = customJobHandlers;
        return this;
    }

    public List<FormEngine> getCustomFormEngines() {
        return customFormEngines;
    }

    public ProcessEngineConfigurationImpl setCustomFormEngines(List<FormEngine> customFormEngines) {
        this.customFormEngines = customFormEngines;
        return this;
    }

    public List<AbstractFormType> getCustomFormTypes() {
        return customFormTypes;
    }

    public ProcessEngineConfigurationImpl setCustomFormTypes(List<AbstractFormType> customFormTypes) {
        this.customFormTypes = customFormTypes;
        return this;
    }

    public List<String> getCustomScriptingEngineClasses() {
        return customScriptingEngineClasses;
    }

    public ProcessEngineConfigurationImpl setCustomScriptingEngineClasses(
            List<String> customScriptingEngineClasses) {
        this.customScriptingEngineClasses = customScriptingEngineClasses;
        return this;
    }

    public List<VariableType> getCustomPreVariableTypes() {
        return customPreVariableTypes;
    }

    public ProcessEngineConfigurationImpl setCustomPreVariableTypes(List<VariableType> customPreVariableTypes) {
        this.customPreVariableTypes = customPreVariableTypes;
        return this;
    }

    public List<VariableType> getCustomPostVariableTypes() {
        return customPostVariableTypes;
    }

    public ProcessEngineConfigurationImpl setCustomPostVariableTypes(List<VariableType> customPostVariableTypes) {
        this.customPostVariableTypes = customPostVariableTypes;
        return this;
    }

    public List<BpmnParseListener> getCustomPreBPMNParseListeners() {
        return preParseListeners;
    }

    public void setCustomPreBPMNParseListeners(List<BpmnParseListener> preParseListeners) {
        this.preParseListeners = preParseListeners;
    }

    public List<BpmnParseListener> getCustomPostBPMNParseListeners() {
        return postParseListeners;
    }

    public void setCustomPostBPMNParseListeners(List<BpmnParseListener> postParseListeners) {
        this.postParseListeners = postParseListeners;
    }

    public List<BpmnParseListener> getPreParseListeners() {
        return preParseListeners;
    }

    public void setPreParseListeners(List<BpmnParseListener> preParseListeners) {
        this.preParseListeners = preParseListeners;
    }

    public List<BpmnParseListener> getPostParseListeners() {
        return postParseListeners;
    }

    public void setPostParseListeners(List<BpmnParseListener> postParseListeners) {
        this.postParseListeners = postParseListeners;
    }

    public Map<Object, Object> getBeans() {
        return beans;
    }

    public void setBeans(Map<Object, Object> beans) {
        this.beans = beans;
    }

    @Override
    public ProcessEngineConfigurationImpl setClassLoader(ClassLoader classLoader) {
        super.setClassLoader(classLoader);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setDatabaseType(String databaseType) {
        super.setDatabaseType(databaseType);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setDataSource(DataSource dataSource) {
        super.setDataSource(dataSource);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setDatabaseSchemaUpdate(String databaseSchemaUpdate) {
        super.setDatabaseSchemaUpdate(databaseSchemaUpdate);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setHistory(String history) {
        super.setHistory(history);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setIdBlockSize(int idBlockSize) {
        super.setIdBlockSize(idBlockSize);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setJdbcDriver(String jdbcDriver) {
        super.setJdbcDriver(jdbcDriver);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setJdbcPassword(String jdbcPassword) {
        super.setJdbcPassword(jdbcPassword);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setJdbcUrl(String jdbcUrl) {
        super.setJdbcUrl(jdbcUrl);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setJdbcUsername(String jdbcUsername) {
        super.setJdbcUsername(jdbcUsername);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setJobExecutorActivate(boolean jobExecutorActivate) {
        super.setJobExecutorActivate(jobExecutorActivate);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setMailServerDefaultFrom(String mailServerDefaultFrom) {
        super.setMailServerDefaultFrom(mailServerDefaultFrom);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setMailServerHost(String mailServerHost) {
        super.setMailServerHost(mailServerHost);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setMailServerPassword(String mailServerPassword) {
        super.setMailServerPassword(mailServerPassword);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setMailServerPort(int mailServerPort) {
        super.setMailServerPort(mailServerPort);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setMailServerUseTLS(boolean useTLS) {
        super.setMailServerUseTLS(useTLS);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setMailServerUsername(String mailServerUsername) {
        super.setMailServerUsername(mailServerUsername);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setJdbcMaxActiveConnections(int jdbcMaxActiveConnections) {
        super.setJdbcMaxActiveConnections(jdbcMaxActiveConnections);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setJdbcMaxCheckoutTime(int jdbcMaxCheckoutTime) {
        super.setJdbcMaxCheckoutTime(jdbcMaxCheckoutTime);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setJdbcMaxIdleConnections(int jdbcMaxIdleConnections) {
        super.setJdbcMaxIdleConnections(jdbcMaxIdleConnections);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setJdbcMaxWaitTime(int jdbcMaxWaitTime) {
        super.setJdbcMaxWaitTime(jdbcMaxWaitTime);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setTransactionsExternallyManaged(boolean transactionsExternallyManaged) {
        super.setTransactionsExternallyManaged(transactionsExternallyManaged);
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setJpaEntityManagerFactory(Object jpaEntityManagerFactory) {
        this.jpaEntityManagerFactory = jpaEntityManagerFactory;
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setJpaHandleTransaction(boolean jpaHandleTransaction) {
        this.jpaHandleTransaction = jpaHandleTransaction;
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setJpaCloseEntityManager(boolean jpaCloseEntityManager) {
        this.jpaCloseEntityManager = jpaCloseEntityManager;
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setJdbcPingEnabled(boolean jdbcPingEnabled) {
        this.jdbcPingEnabled = jdbcPingEnabled;
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setJdbcPingQuery(String jdbcPingQuery) {
        this.jdbcPingQuery = jdbcPingQuery;
        return this;
    }

    @Override
    public ProcessEngineConfigurationImpl setJdbcPingConnectionNotUsedFor(int jdbcPingNotUsedFor) {
        this.jdbcPingConnectionNotUsedFor = jdbcPingNotUsedFor;
        return this;
    }

    public boolean isDbIdentityUsed() {
        return isDbIdentityUsed;
    }

    public void setDbIdentityUsed(boolean isDbIdentityUsed) {
        this.isDbIdentityUsed = isDbIdentityUsed;
    }

    public boolean isDbHistoryUsed() {
        return isDbHistoryUsed;
    }

    public void setDbHistoryUsed(boolean isDbHistoryUsed) {
        this.isDbHistoryUsed = isDbHistoryUsed;
    }

    public List<ResolverFactory> getResolverFactories() {
        return resolverFactories;
    }

    public void setResolverFactories(List<ResolverFactory> resolverFactories) {
        this.resolverFactories = resolverFactories;
    }

    public MailScanner getMailScanner() {
        return mailScanner;
    }

    public void setMailScanner(MailScanner mailScanner) {
        this.mailScanner = mailScanner;
    }

    public DeploymentCache getDeploymentCache() {
        return deploymentCache;
    }

    public void setDeploymentCache(DeploymentCache deploymentCache) {
        this.deploymentCache = deploymentCache;
    }

    public ProcessEngineConfigurationImpl setDelegateInterceptor(DelegateInterceptor delegateInterceptor) {
        this.delegateInterceptor = delegateInterceptor;
        return this;
    }

    public DelegateInterceptor getDelegateInterceptor() {
        return delegateInterceptor;
    }

    public EventHandler getEventHandler(String eventType) {
        return eventHandlers.get(eventType);
    }

    public void setEventHandlers(Map<String, EventHandler> eventHandlers) {
        this.eventHandlers = eventHandlers;
    }

    public Map<String, EventHandler> getEventHandlers() {
        return eventHandlers;
    }

    public List<EventHandler> getCustomEventHandlers() {
        return customEventHandlers;
    }

    public void setCustomEventHandlers(List<EventHandler> customEventHandlers) {
        this.customEventHandlers = customEventHandlers;
    }

    public ExtensionConfig getExtensionconfig() {
        return extensionconfig;
    }

    public void setExtensionconfig(ExtensionConfig extensionconfig) {
        this.extensionconfig = extensionconfig;
    }
}