/** * Copyright 2003-2008 非也 * All rights reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser 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.pdl.fpdl.process.impl; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.fireflow.model.AbstractModelElement; import org.fireflow.model.ModelElement; import org.fireflow.model.misc.Duration; import org.fireflow.model.process.WorkflowElement; import org.fireflow.model.resourcedef.ResourceDef; import org.fireflow.model.servicedef.ServiceDef; import org.fireflow.pdl.fpdl.diagram.Diagram; import org.fireflow.pdl.fpdl.diagram.impl.DiagramImpl; import org.fireflow.pdl.fpdl.process.Activity; import org.fireflow.pdl.fpdl.process.Import; import org.fireflow.pdl.fpdl.process.Node; import org.fireflow.pdl.fpdl.process.SubProcess; import org.fireflow.pdl.fpdl.process.Transition; import org.fireflow.pdl.fpdl.process.WorkflowProcess; import org.firesoa.common.util.Utils; @SuppressWarnings("serial") public class WorkflowProcessImpl extends AbstractModelElement implements WorkflowProcess { // ******************************************************************** // ******************************************************************** // private String targetNamespace = null;//2012-02-26 该属性在service中定义 private String packageId = null; // private String classpathUri = null;//该属性放在WorkflowProcess中不合理,已经被packageId代替,2014-01-07 private Map<String,ServiceDef> localServices = new HashMap<String,ServiceDef>(); private Map<String,ResourceDef> localResources = new HashMap<String,ResourceDef>(); private Map<String,SubProcess> localFlowsMap = new HashMap<String,SubProcess>(); //private List<Import<ResourceDef>> importsForResource = new ArrayList<Import<ResourceDef>>();//2014-01-07 resource 以及service不单独作为资源文件存在,注释掉 //private List<Import<ServiceDef>> importsForService = new ArrayList<Import<ServiceDef>>();//2014-01-07 resource 以及service不单独作为资源文件存在,注释掉 private List<Import> importsForProcess = new ArrayList<Import>(); /** * Diagram表,key是subprocess的id */ private Map<String,Diagram> diagramsMap = new HashMap<String,Diagram>(); // ******************************************************************** // ******************************************************************** /** * 构造函数 * * @param id * @param name * @param pkg */ public WorkflowProcessImpl(String name,String displayName) { super(null, name,displayName); //构造一个缺省的main flow SubProcessImpl flow = new SubProcessImpl(this,WorkflowProcess.MAIN_PROCESS_NAME,WorkflowProcess.MAIN_PROCESS_NAME); localFlowsMap.put(flow.getId(), flow); } public SubProcess getMainSubProcess(){ String mainFlowId = this.getName()+"."+WorkflowProcess.MAIN_PROCESS_NAME; return this.localFlowsMap.get(mainFlowId); } public SubProcess getLocalSubProcess(String flowId){ return this.localFlowsMap.get(flowId); } public void addSubProcess(SubProcess flow){ this.localFlowsMap.put(flow.getId(), flow); } public void deleteDiagram(String subprocessId){ this.diagramsMap.remove(subprocessId); } public void deleteSubProcess(String subProcessId){ SubProcess subProcess = this.localFlowsMap.get(subProcessId); //1、首先删除SubProcess和对应的diagram this.localFlowsMap.remove(subProcessId); deleteDiagram(subProcessId); //如果是main subprocess,则创建一个空的 if (WorkflowProcess.MAIN_PROCESS_NAME.equals(subProcess.getName())){ SubProcessImpl newSubProcess = new SubProcessImpl(this,WorkflowProcess.MAIN_PROCESS_NAME); this.addSubProcess(newSubProcess); String diagramId = Utils.newUUID(); Diagram subflowDiagram = new DiagramImpl(diagramId,newSubProcess); this.addDiagram(subflowDiagram); } } public List<Activity> findNextActivities(String elementId){ WorkflowElement element = this.findWorkflowElementById(elementId); if (element==null)return null; else if (element instanceof Transition){ return ((Transition)element).getNextActivities(); }else if (element instanceof Node){ return ((Node)element).getNextActivities(); } else { return null; } } public WorkflowElement findWorkflowElementById(String workflowElementId){ SubProcess subflow = this.getLocalSubProcess(workflowElementId); if (subflow!=null)return subflow; List<SubProcess> subflowList = this.getLocalSubProcesses(); for (SubProcess tmpSubflow : subflowList){ WorkflowElement we = tmpSubflow.findWFElementById(workflowElementId); if (we!=null) return we; } return null; } /* * (non-Javadoc) * * @see org.fireflow.pdl.fpdl.process.WorkflowProcess#getDuration() */ public Duration getDuration() { SubProcess mainflow = this.getMainSubProcess(); if (mainflow!=null){ return mainflow.getDuration(); } return null; } public String getPackageId(){ return packageId; } public void setPackageId(String pkgId){ this.packageId = pkgId; } // public String getClasspathUri(){ // return this.classpathUri; // } // // public void setClasspathUri(String classPathUri){ // this.classpathUri = classPathUri; // } public void addService(ServiceDef svc){ this.localServices.put(svc.getId(),svc); } public void deleteService(ServiceDef svc){ this.localServices.remove(svc.getId()); } public void addResource(ResourceDef resource){ this.localResources.put(resource.getId(),resource); } public void deleteResource(ResourceDef resource){ this.localResources.remove(resource.getId()); } /* * (non-Javadoc) * * @see * org.fireflow.pdl.fpdl.process.WorkflowProcess#getResource(java.lang * .String) */ public ResourceDef getResource(String resourceId) { if (resourceId == null || resourceId.trim().equals("")) return null; List<ResourceDef> allResource = this.getResources(); for (ResourceDef resource : allResource) { if (resourceId.equals(resource.getId())) { return resource; } } return null; } /* * (non-Javadoc) * * @see org.fireflow.pdl.fpdl.process.WorkflowProcess#getResources() */ public List<ResourceDef> getResources() { //getLocalResources被废除,该方法返回的即是localResources。2014-01-07 PrivateList<ResourceDef> privateList = new PrivateList<ResourceDef>(); privateList.privateAddAll(this.localResources.values()); return privateList; /* PrivateList<ResourceDef> privateList = new PrivateList<ResourceDef>(); privateList.privateAddAll(this.localResources.values()); // 将import进来的service也加入到列表中 for (Import<ResourceDef> processImport : this.importsForResource) { List<ResourceDef> content = (List<ResourceDef>) processImport .getContents(); privateList.privateAddAll(content); } return privateList; */ } /** * 2014-01-07 resource 以及service不单独作为资源文件存在,注释掉该方法 * @return */ /* public List<ResourceDef> getLocalResources(){ PrivateList<ResourceDef> privateList = new PrivateList<ResourceDef>(); privateList.privateAddAll(this.localResources.values()); return privateList; } */ /* * (non-Javadoc) * * @see * org.fireflow.pdl.fpdl.process.WorkflowProcess#getService(java.lang. * String) */ public ServiceDef getService(String serviceId) { if (serviceId == null || serviceId.trim().equals("")) return null; List<ServiceDef> allServices = this.getServices(); for (ServiceDef service : allServices) { if (serviceId.equals(service.getId())) { return service; } } return null; } /* * (non-Javadoc) * * @see org.fireflow.pdl.fpdl.process.WorkflowProcess#getServices() */ public List<ServiceDef> getServices() { PrivateList<ServiceDef> privateList = new PrivateList<ServiceDef>(); privateList.privateAddAll(localServices.values()); return privateList; /* PrivateList<ServiceDef> privateList = new PrivateList<ServiceDef>(); privateList.privateAddAll(localServices.values()); // 将import进来的service也加入到列表中 for (Import<ServiceDef> processImport : this.importsForService) { List<ServiceDef> content = (List<ServiceDef>) processImport.getContents(); privateList.privateAddAll(content); } return privateList; */ } /* public List<ServiceDef> getLocalServices(){ PrivateList<ServiceDef> privateList = new PrivateList<ServiceDef>(); privateList.privateAddAll(localServices.values()); return privateList; } */ @SuppressWarnings("unchecked") public Import getImportByLocation(String location) { if (location == null || location.trim().equals("")) return null; /* for (Import processImport : importsForResource) { if (processImport.getLocation().equals(location)) { return processImport; } } for (Import processImport : this.importsForService){ if (processImport.getLocation().equals(location)){ return processImport; } } */ for (Import processImport : this.importsForProcess){ if (processImport.getLocation().equals(location)){ return processImport; } } return null; } /* public List<Import<ServiceDef>> getImportsForService() { return this.importsForService; } public List<Import<ResourceDef>> getImportsForResource() { return this.importsForResource; } */ public List<Import> getImports(){ return this.importsForProcess; } /* (non-Javadoc) * @see org.fireflow.pdl.fpdl.process.WorkflowProcess#getSubflows() */ // public List<SubProcess> getSubflows() { // PrivateList<SubProcess> privateList = new PrivateList<SubProcess>(); // privateList.privateAddAll(this.localFlowsMap.values()); // // //将import进来的流程加入到Subflow List // for (Import<WorkflowProcess> import4Process : this.importsForProcess){ // List<WorkflowProcess> processList = import4Process.getContents(); // // // for (WorkflowProcess process: processList){ // privateList.privateAdd(process.getMainflow()); // } // } // // return privateList; // } /* (non-Javadoc) * @see org.fireflow.pdl.fpdl.process.WorkflowProcess#getLocalSubflows() */ public List<SubProcess> getLocalSubProcesses() { PrivateList<SubProcess> privateList = new PrivateList<SubProcess>(); privateList.privateAddAll(this.localFlowsMap.values()); return privateList; } //2012-02-26 该属性在servicedef中定义 // public String getTargetNamespace(){ // if (StringUtils.isEmpty(targetNamespace)){ // this.targetNamespace = "http://www.fireflow.org/project_powered_by_fireworkflow/tns/"+this.getName(); // } // return targetNamespace; // } // // public void setTargetNamespace(String tns){ // this.targetNamespace = tns; // } public void addDiagram(Diagram diagram){ if (diagram==null)return; ModelElement wfElmRef = diagram.getWorkflowElementRef(); if (wfElmRef!=null){ this.diagramsMap.put(wfElmRef.getId(), diagram); } } public List<Diagram> getDiagrams(){ PrivateList<Diagram> privateList = new PrivateList<Diagram>(); privateList.privateAddAll( diagramsMap.values()); return privateList; } public Diagram getDiagramBySubProcessId(String subflowId){ return this.diagramsMap.get(subflowId); } /* (non-Javadoc) * @see org.fireflow.pdl.fpdl.process.WorkflowProcess#addServiceImport(org.fireflow.pdl.fpdl.process.Import) */ // public void addServiceImport(Import<ServiceDef> svcImport) { // this.importsForService.add(svcImport); // } /* (non-Javadoc) * @see org.fireflow.pdl.fpdl.process.WorkflowProcess#addResourceImport(org.fireflow.pdl.fpdl.process.Import) */ // public void addResourceImport(Import<ResourceDef> rscImport) { // this.importsForResource.add(rscImport); // } /* (non-Javadoc) * @see org.fireflow.pdl.fpdl.process.WorkflowProcess#addProcessImport(org.fireflow.pdl.fpdl.process.Import) */ public void addImport(Import processImport) { this.importsForProcess.add(processImport); } public void deleteImport(Import impt){ this.importsForProcess.remove(impt); } } class PrivateList<T> extends ArrayList<T> { public boolean add(T element) { throw new UnsupportedOperationException( "Can not add element to this List."); } /* * (non-Javadoc) * * @see java.util.ArrayList#add(int, java.lang.Object) */ @Override public void add(int arg0, T arg1) { throw new UnsupportedOperationException( "Can not add element to this List."); } protected void privateAddAll(Collection<? extends T> arg0) { super.addAll(arg0); } protected boolean privateAdd(T arg0){ return super.add(arg0); } /* * (non-Javadoc) * * @see java.util.ArrayList#addAll(java.util.Collection) */ @Override public boolean addAll(Collection<? extends T> arg0) { throw new UnsupportedOperationException( "Can not add element to this List."); } /* * (non-Javadoc) * * @see java.util.ArrayList#addAll(int, java.util.Collection) */ @Override public boolean addAll(int arg0, Collection<? extends T> arg1) { throw new UnsupportedOperationException( "Can not add element to this List."); } /* * (non-Javadoc) * * @see java.util.ArrayList#clear() */ @Override public void clear() { throw new UnsupportedOperationException("Can not clear this List."); } /* * (non-Javadoc) * * @see java.util.ArrayList#remove(int) */ @Override public T remove(int arg0) { throw new UnsupportedOperationException( "Can not remove element from this List."); } /* * (non-Javadoc) * * @see java.util.ArrayList#remove(java.lang.Object) */ @Override public boolean remove(Object arg0) { throw new UnsupportedOperationException( "Can not remove element from this List."); } /* * (non-Javadoc) * * @see java.util.ArrayList#removeRange(int, int) */ @Override protected void removeRange(int arg0, int arg1) { throw new UnsupportedOperationException( "Can not remove element from this List."); } /* * (non-Javadoc) * * @see java.util.ArrayList#set(int, java.lang.Object) */ @Override public T set(int arg0, T arg1) { throw new UnsupportedOperationException( "Can not add element to this List."); } }