/**
* Copyright 2007-2008 非也
* All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation。
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses. *
*/
package org.fireflow.engine.context;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import org.fireflow.engine.exception.EngineException;
import org.fireflow.engine.exception.UnsupportedProcessTypeException;
import org.fireflow.engine.modules.processlanguage.ProcessLanguageManager;
import org.fireflow.pvm.kernel.KernelException;
/**
* RuntimeContext是Fire workflow Engine的总线。所有的服务都挂接在这个总线上,并通过这个总线获取。<br>
* RuntimeContext也是业务代码调用工作流引擎的入口,通过runtimeContext.getWorkflowSession()获得IWorkflowSession 对象,
* 然后通过IWorkflowSession调用各种工作流实例对象及其API。<<br> *
* context管理的各种服务
* @author 非也,nychen2000@163.com
*
*/
public class RuntimeContext {
private static RuntimeContext instance = null;
public static RuntimeContext getInstance(){
if (instance==null){
instance = new RuntimeContext();
}
return instance;
}
/**
* FPDL2.0缺省需要Spring作为容器,该常量定义transaction template的名字
*/
// public static final String Spring_Transaction_Template_Name = "springTransactionTemplate";
/**
* FPDL2.0 缺省采用Hibernate作为存储层ORM方案,该常量定义hibernate session factory的名字
*/
// public static final String Spring_Hibernate_Session_Factory_Name = "hibernateSessionFactory";
/**
* FPDL2.0缺省采用Spring作为容器,该常量定义Transaction Manager的名字
*/
// public static final String Spring_Transaction_Manager_Name = "springTransactionManager";
/**
* Fire workflow runtime context的bean name(或者id)
*/
public static final String Fireflow_Runtime_Context_Name = "fireflowRuntimeContext";
private List<ProcessLanguageManager> processLanguageRegistry = new ArrayList<ProcessLanguageManager>();
private Map<String,EngineModule> defaultEngineModules = new HashMap<String,EngineModule>();
/**
* 是否已经初始化
*/
private boolean isInitialized = false;
/**
* 是否打开流程跟踪,如果打开,则会往T_FF_HIST_TRACE表中插入纪录。
*/
private boolean enableTrace = false;
// private TransactionTemplate transactionTemplate = null;
private String defaultScript = "JEXL";//缺省的脚本语言
private String defaultProcessType="FPDL";//缺省的流程类型
private RuntimeContext() {
}
public boolean isIsInitialized() {
return isInitialized;
}
/**
* 初始化方法
* @throws EngineException
* @throws KernelException
*/
public void initialize() throws EngineException, KernelException {
if (!isInitialized) {
if (this.defaultEngineModules!=null){
Iterator<String> keys = this.defaultEngineModules.keySet().iterator();
while (keys.hasNext()){
String s = keys.next();
EngineModule module = defaultEngineModules.get(s);
if (module instanceof RuntimeContextAware){
((RuntimeContextAware)module).setRuntimeContext(this);
}
/* 需要将spring 分离,20140618
if (module instanceof TransactionTemplateAware){
((TransactionTemplateAware)module).setTransactionTemplate(this.transactionTemplate);
}*/
}
}
if (this.processLanguageRegistry != null) {
for (ProcessLanguageManager extension : processLanguageRegistry) {
if (extension instanceof RuntimeContextAware) {
((RuntimeContextAware) extension)
.setRuntimeContext(this);
}
/* 需要将spring分离
if (extension instanceof TransactionTemplateAware) {
((TransactionTemplateAware) extension)
.setTransactionTemplate(this.transactionTemplate);
}
*/
}
}
if (this.defaultEngineModules.size()>0){
Iterator<EngineModule> iter = this.defaultEngineModules.values().iterator();
while(iter.hasNext()){
EngineModule module = iter.next();
module.init(this);
}
}
if (processLanguageRegistry.size()>0){
Iterator<ProcessLanguageManager> processDefExtReg = this.processLanguageRegistry.iterator();
while(processDefExtReg.hasNext()){
ProcessLanguageManager ext = processDefExtReg.next();
ext.init(this);
}
}
isInitialized = true;
}
}
/**
* 初始化所有的工作流网实例
* @throws KernelException
*/
// protected void initAllNetInstances() throws KernelException {
//
// }
public boolean isEnableTrace() {
return enableTrace;
}
public void setEnableTrace(boolean enableTrace) {
this.enableTrace = enableTrace;
}
/**
* @return the defaultScript
*/
public String getDefaultScript() {
return defaultScript;
}
/**
* @param defaultScript the defaultScript to set
*/
public void setDefaultScript(String defaultScript) {
this.defaultScript = defaultScript;
}
private ProcessLanguageManager findProcessLanguageManager(String processType){
if (processType==null)return null;
if (processLanguageRegistry!=null && processLanguageRegistry.size()>0){
for (ProcessLanguageManager mgr : processLanguageRegistry){
if (processType.equals((mgr.getProcessType()))){
return mgr;
}
}
}
return null;
}
@SuppressWarnings("unchecked")
public <T extends EngineModule> T getEngineModule(Class<T> interfaceClass,String processType){
ProcessLanguageManager pdlExtension = this.findProcessLanguageManager(processType);
if (pdlExtension==null){
throw new UnsupportedProcessTypeException("The definition language "+processType+" is unsupported!");
}
if (ProcessLanguageManager.class.getName().equals(interfaceClass.getName())){
return (T)pdlExtension;
}
EngineModule module = pdlExtension.getEngineModule(interfaceClass);
if (module==null){
module = this.defaultEngineModules.get(interfaceClass.getName());
}
return (T)module;
}
@SuppressWarnings("unchecked")
public <T extends EngineModule> T getDefaultEngineModule(Class<T> interfaceClass){
EngineModule module = null;
module = this.defaultEngineModules.get(interfaceClass.getName());
return (T)module;
}
public ScriptEngine getScriptEngine(String expressionLanguageName){
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName(expressionLanguageName);
return engine;
}
public List<ProcessLanguageManager> getProcessLanguages(){
return this.processLanguageRegistry;
}
public Map<String,EngineModule> getDefaultEngineModules(){
return defaultEngineModules;
}
public void setDefaultEngineModules(Map<String,EngineModule> _engineModules){
this.defaultEngineModules = _engineModules;
}
public void setProcessLanguages(List<ProcessLanguageManager> pdlExtensions){
processLanguageRegistry = pdlExtensions;
}
/**
* @return the defaultProcessType
*/
public String getDefaultProcessType() {
return defaultProcessType;
}
/**
* @param defaultProcessType the defaultProcessType to set
*/
public void setDefaultProcessType(String defaultProcessType) {
this.defaultProcessType = defaultProcessType;
}
// public void setTransactionTemplate(TransactionTemplate template){
// this.transactionTemplate = template;
// }
//
// public TransactionTemplate getTransactionTemplate(){
// return this.transactionTemplate;
// }
}