/** * Copyright 2007-2010 非也 * 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.invocation.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.fireflow.client.WorkflowSession; import org.fireflow.client.impl.WorkflowSessionLocalImpl; import org.fireflow.engine.context.RuntimeContext; import org.fireflow.engine.entity.runtime.ActivityInstance; import org.fireflow.engine.entity.runtime.ProcessInstance; import org.fireflow.engine.entity.runtime.WorkItemProperty; import org.fireflow.engine.invocation.AssignmentHandler; import org.fireflow.engine.modules.beanfactory.BeanFactory; import org.fireflow.engine.modules.ousystem.User; import org.fireflow.engine.modules.processlanguage.ProcessLanguageManager; import org.fireflow.engine.resource.ResourceResolver; import org.fireflow.model.binding.ResourceBinding; import org.fireflow.model.resourcedef.ResourceDef; import org.fireflow.model.resourcedef.WorkItemAssignmentStrategy; /** * * * @author 非也 * @version 2.0 */ public class DefaultAssignmentHandler extends AbsAssignmentHandler implements AssignmentHandler { /** * */ private static final long serialVersionUID = 772130701903585306L; /** * 解析参数 TODO 解析参数有必要吗?会不会把事情搞复杂,可以直接从processInstance中获取,用不着配置 * * @param parameterAssignment * @return */ // protected Map<String, Object> resolveParameters(WorkflowSession session, // ProcessInstance processInstance, ActivityInstance activityInstance, // ResourceDef resource, List<Assignment> parameterAssignments) // throws ScriptException { // Map<String, Object> results = new HashMap<String, Object>(); // // // 首先初始化results // List<Input> parameters = resource.getResolverParameters(); // if (parameters != null) { // for (Input parameter : parameters) { // String strValue = parameter.getDefaultValueAsString(); // if (strValue != null && !strValue.trim().equals("")) { // Object value; // try { // value = // JavaDataTypeConvertor.dataTypeConvert(parameter.getDataType(),strValue, // null); // } catch (ClassCastException e) { // throw new ScriptException(e); // } catch (ClassNotFoundException e) { // throw new ScriptException(e); // } // results.put(parameter.getName(), value); // } else { // results.put(parameter.getName(), null); // } // } // } // // if (parameterAssignments == null || parameterAssignments.size() == 0) { // return results; // } // // Map<String, Object> tmpResult = null; // Map<String, Object> contextVars = // ScriptEngineHelper.fulfillScriptContext(session, // runtimeContext, processInstance, activityInstance); // tmpResult = ScriptEngineHelper.resolveInputParameters( // runtimeContext, parameterAssignments, contextVars); // // results.putAll(tmpResult); // // return results; // } protected List<User> resolveResources(WorkflowSession session, ProcessInstance processInstance, ActivityInstance activityInstance, List<ResourceDef> resourceRefs) { if (resourceRefs == null || resourceRefs.size() == 0) { return null; } RuntimeContext runtimeContext = ((WorkflowSessionLocalImpl)session).getRuntimeContext(); BeanFactory beanFactory = runtimeContext.getEngineModule( BeanFactory.class, activityInstance.getProcessType()); List<User> users = new ArrayList<User>(); for (ResourceDef resource : resourceRefs) { if (resource == null) { // TODO 记录警告日志, continue; } // try { ResourceResolver resourceResolver = null; String resolverBeanName = resource.getResolverBeanName(); String resolverClassName = resource.getResolverClassName(); // 首先应用resolver bean name if (!StringUtils.isEmpty(resolverBeanName)) { resourceResolver = (ResourceResolver) beanFactory .getBean(resolverBeanName); } else if (!StringUtils.isEmpty(resolverClassName)){ // 然后应用resolver class name resourceResolver = (ResourceResolver) beanFactory .createBean(resolverClassName); } // 最后 ,通过resource type取得resolver if (resourceResolver == null) { resourceResolver = ResourceResolver .getResourceResolverForType(resource.getResourceType()); } if (resourceResolver != null) { List<User> _users = resourceResolver.resolve(session, processInstance, activityInstance, resource); users.addAll(_users); } } return users; } @Override public List<User> resolvePotentialOwners(WorkflowSession session, ResourceBinding resourceBinding, Object theActivity,ProcessInstance processInstance,ActivityInstance activityInstance) { List<String> resourceIdList = resourceBinding.getPotentialOwnerRefs(); List<ResourceDef> potentialOwnersResourceRef = new ArrayList<ResourceDef>(); RuntimeContext runtimeContext = ((WorkflowSessionLocalImpl)session).getRuntimeContext(); ProcessLanguageManager processUtil = runtimeContext.getEngineModule(ProcessLanguageManager.class, processInstance.getProcessType()); if (resourceIdList!=null && resourceIdList.size()>0){ for (String id : resourceIdList){ ResourceDef resourceDef = processUtil.getResourceDef(activityInstance, theActivity, id); potentialOwnersResourceRef.add(resourceDef); } } if (potentialOwnersResourceRef != null && potentialOwnersResourceRef.size() > 0) { return this.resolveResources(session, processInstance, activityInstance, potentialOwnersResourceRef); } else { return null; } } @Override public List<User> resolveReaders(WorkflowSession session, ResourceBinding resourceBinding, Object theActivity,ProcessInstance processInstance,ActivityInstance activityInstance) { List<String> resourceIdList = resourceBinding.getReaderRefs(); List<ResourceDef> potentialOwnersResourceRef = new ArrayList<ResourceDef>(); RuntimeContext runtimeContext = ((WorkflowSessionLocalImpl)session).getRuntimeContext(); ProcessLanguageManager processUtil = runtimeContext.getEngineModule(ProcessLanguageManager.class, processInstance.getProcessType()); if (resourceIdList!=null && resourceIdList.size()>0){ for (String id : resourceIdList){ ResourceDef resourceDef = processUtil.getResourceDef(activityInstance, theActivity, id); potentialOwnersResourceRef.add(resourceDef); } } if (potentialOwnersResourceRef != null && potentialOwnersResourceRef.size() > 0) { return this.resolveResources(session, processInstance, activityInstance, potentialOwnersResourceRef); } else { return null; } } @Override public List<User> resolveAdministrators(WorkflowSession session, ResourceBinding resourceBinding, Object theActivity,ProcessInstance processInstance,ActivityInstance activityInstance) { List<String> administratorIdList = resourceBinding.getAdministratorRefs(); List<ResourceDef> potentialOwnersResourceRef = new ArrayList<ResourceDef>(); RuntimeContext runtimeContext = ((WorkflowSessionLocalImpl)session).getRuntimeContext(); ProcessLanguageManager processUtil = runtimeContext.getEngineModule(ProcessLanguageManager.class, processInstance.getProcessType()); if (administratorIdList!=null && administratorIdList.size()>0){ for (String id : administratorIdList){ ResourceDef resourceDef = processUtil.getResourceDef(activityInstance, theActivity, id); potentialOwnersResourceRef.add(resourceDef); } } if (potentialOwnersResourceRef != null && potentialOwnersResourceRef.size() > 0) { return this.resolveResources(session, processInstance, activityInstance, potentialOwnersResourceRef); } else { return null; } } public Map<WorkItemProperty,Object> resolveWorkItemPropertyValues(){ return new HashMap<WorkItemProperty,Object>(); } @Override public WorkItemAssignmentStrategy resolveAssignmentStrategy(WorkflowSession session, ResourceBinding resourceBinding, Object theActivity) { return resourceBinding.getAssignmentStrategy(); } }