001 /* 002 * JBoss DNA (http://www.jboss.org/dna) 003 * See the COPYRIGHT.txt file distributed with this work for information 004 * regarding copyright ownership. Some portions may be licensed 005 * to Red Hat, Inc. under one or more contributor license agreements. 006 * See the AUTHORS.txt file in the distribution for a full listing of 007 * individual contributors. 008 * 009 * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA 010 * is licensed to you under the terms of the GNU Lesser General Public License as 011 * published by the Free Software Foundation; either version 2.1 of 012 * the License, or (at your option) any later version. 013 * 014 * JBoss DNA is distributed in the hope that it will be useful, 015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 017 * Lesser General Public License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public 020 * License along with this software; if not, write to the Free 021 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 022 * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 023 */ 024 package org.jboss.dna.sequencer.jpdl3; 025 026 import java.io.InputStream; 027 import java.util.ArrayList; 028 import java.util.List; 029 import java.util.Map; 030 import java.util.Set; 031 import org.jbpm.graph.def.Node; 032 import org.jbpm.graph.def.ProcessDefinition; 033 import org.jbpm.graph.def.Transition; 034 import org.jbpm.graph.node.EndState; 035 import org.jbpm.graph.node.StartState; 036 import org.jbpm.graph.node.TaskNode; 037 import org.jbpm.instantiation.Delegation; 038 import org.jbpm.taskmgmt.def.Swimlane; 039 import org.jbpm.taskmgmt.def.Task; 040 import org.jbpm.taskmgmt.def.TaskMgmtDefinition; 041 import static org.jboss.dna.sequencer.jpdl3.JPDL3MetadataConstants.*; 042 043 /** 044 * The jBPM Process definition language meta data. 045 * 046 * @author Serge Pagop 047 */ 048 public class JPDL3Metadata { 049 050 /** 051 * The process definition name. 052 */ 053 private String pdName; 054 055 /** 056 * The start node of the process definition. 057 */ 058 private JPDL3StartStateMetadata jPDL3StartStateMetadata; 059 060 /** 061 * The end node of the process definition. 062 */ 063 private JPDL3EndStateMetadata jPDL3EndStateMetadata; 064 065 /** 066 * The swimlanes of the process definitions 067 */ 068 List<JPDL3SwimlaneMetadata> swimlanes = new ArrayList<JPDL3SwimlaneMetadata>(); 069 070 /** 071 * The task nodes of the process definitions. 072 */ 073 private List<JPDL3TaskNodeMetadata> taskNodes = new ArrayList<JPDL3TaskNodeMetadata>(); 074 075 private JPDL3Metadata() { 076 // prevent construction 077 } 078 079 /** 080 * Create an instance of {@link JPDL3Metadata} with all data of a specific jpdl xml document. 081 * 082 * @param stream - the {@link InputStream}, that represents a stream of jpdl. 083 * @return a object of {@link JPDL3Metadata}. 084 */ 085 @SuppressWarnings( {"unchecked", "cast"} ) 086 public static JPDL3Metadata instance( InputStream stream ) { 087 ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(stream); 088 List<JPDL3SwimlaneMetadata> swimlaneContainer = new ArrayList<JPDL3SwimlaneMetadata>(); 089 List<JPDL3TaskNodeMetadata> taskNodeContainer = new ArrayList<JPDL3TaskNodeMetadata>(); 090 091 if (processDefinition != null) { 092 JPDL3Metadata jplMetadata = new JPDL3Metadata(); 093 if (processDefinition.getName() != null) { 094 jplMetadata.setPdName(processDefinition.getName()); 095 } 096 097 TaskMgmtDefinition taskMgmtDefinition = processDefinition.getTaskMgmtDefinition(); 098 if (taskMgmtDefinition != null) { 099 // Get the swimlanes of the process definition, if there is one. 100 Map<String, Swimlane> mapOfSwimlanes = taskMgmtDefinition.getSwimlanes(); 101 Set<String> swimlaneKeys = mapOfSwimlanes.keySet(); 102 for (String swimlaneKey : swimlaneKeys) { 103 Swimlane swimlane = mapOfSwimlanes.get(swimlaneKey); 104 JPDL3SwimlaneMetadata jPDL3SwimlaneMetadata = new JPDL3SwimlaneMetadata(); 105 jPDL3SwimlaneMetadata.setName(swimlane.getName()); 106 if (swimlane.getActorIdExpression() != null) jPDL3SwimlaneMetadata.setActorIdExpression(swimlane.getActorIdExpression()); 107 if (swimlane.getPooledActorsExpression() != null) jPDL3SwimlaneMetadata.setPooledActorsExpression(swimlane.getPooledActorsExpression()); 108 Delegation delegation = swimlane.getAssignmentDelegation(); 109 if (delegation != null) { 110 JPDL3AssignmentMetadata jPDL3AssignmentMetadata = new JPDL3AssignmentMetadata(); 111 // full qualified class name. 112 jPDL3AssignmentMetadata.setFqClassName(delegation.getClassName()); 113 // config type 114 if (delegation.getConfigType() != null) jPDL3AssignmentMetadata.setConfigType(delegation.getConfigType()); 115 // expression assignment 116 if (EXPRESSION_ASSIGNMENT_HANLDER_DELEGATION_CN.equals(delegation.getClassName())) jPDL3AssignmentMetadata.setExpression(delegation.getConfiguration()); 117 jPDL3SwimlaneMetadata.setAssignment(jPDL3AssignmentMetadata); 118 } 119 swimlaneContainer.add(jPDL3SwimlaneMetadata); 120 // with expression 121 } 122 } 123 jplMetadata.setSwimlanes(swimlaneContainer); 124 125 List<Node> nodes = (List<Node>)processDefinition.getNodes(); 126 127 for (Node node : nodes) { 128 if (node instanceof StartState) { 129 StartState startState = (StartState)node; 130 JPDL3StartStateMetadata jPDL3StartStateMetadata = new JPDL3StartStateMetadata(); 131 if (startState.getName() != null) { 132 jPDL3StartStateMetadata.setName(startState.getName()); 133 } 134 List<JPDL3TransitionMetadata> transitions = new ArrayList<JPDL3TransitionMetadata>(); 135 for (Transition transition : (List<Transition>)startState.getLeavingTransitions()) { 136 JPDL3TransitionMetadata jPDL3TransitionMetadata = new JPDL3TransitionMetadata(); 137 if (transition.getName() != null) { 138 jPDL3TransitionMetadata.setName(transition.getName()); 139 } 140 Node toNode = transition.getTo(); 141 if (toNode != null) { 142 jPDL3TransitionMetadata.setTo(toNode.getName()); 143 } 144 transitions.add(jPDL3TransitionMetadata); 145 } 146 jPDL3StartStateMetadata.setTransitions(transitions); 147 jplMetadata.setStartStateMetadata(jPDL3StartStateMetadata); 148 } 149 150 if (node instanceof EndState) { 151 EndState endState = (EndState)node; 152 JPDL3EndStateMetadata jPDL3EndStateMetadata = new JPDL3EndStateMetadata(); 153 if (endState.getName() != null) { 154 jPDL3EndStateMetadata.setName(endState.getName()); 155 } 156 jplMetadata.setEndStateMetadata(jPDL3EndStateMetadata); 157 } 158 159 // TaskNode 160 if (node instanceof TaskNode) { 161 TaskNode taskNode = (TaskNode)node; 162 JPDL3TaskNodeMetadata jPDL3TaskNodeMetadata = new JPDL3TaskNodeMetadata(); 163 164 if(taskNode.getName() != null) { 165 jPDL3TaskNodeMetadata.setName(taskNode.getName()); 166 } 167 168 Map<String, Task> tasks = taskNode.getTasksMap(); 169 List<JPDL3TaskMetadata> taskList = new ArrayList<JPDL3TaskMetadata>(); 170 171 if(!tasks.isEmpty()) { 172 Set<String> keys = tasks.keySet(); 173 for (String key : keys) { 174 Task task = tasks.get(key); 175 JPDL3TaskMetadata jPDL3TaskMetadata = new JPDL3TaskMetadata(); 176 if(task.getName() != null) 177 jPDL3TaskMetadata.setName(task.getName()); 178 if(task.getDueDate() != null) 179 jPDL3TaskMetadata.setDueDate(task.getDueDate()); 180 taskList.add(jPDL3TaskMetadata); 181 182 if(task.getSwimlane() != null) { 183 Swimlane swimlane = task.getSwimlane(); 184 jPDL3TaskMetadata.setSwimlane(swimlane.getName()); 185 } 186 } 187 } 188 jPDL3TaskNodeMetadata.setTasks(taskList); 189 190 // transitions 191 List<JPDL3TransitionMetadata> transitions = new ArrayList<JPDL3TransitionMetadata>(); 192 for (Transition transition : (List<Transition>)taskNode.getLeavingTransitions()) { 193 JPDL3TransitionMetadata jPDL3TransitionMetadata = new JPDL3TransitionMetadata(); 194 if (transition.getName() != null) { 195 jPDL3TransitionMetadata.setName(transition.getName()); 196 } 197 Node toNode = transition.getTo(); 198 if (toNode != null) { 199 jPDL3TransitionMetadata.setTo(toNode.getName()); 200 } 201 transitions.add(jPDL3TransitionMetadata); 202 } 203 jPDL3TaskNodeMetadata.setTransitions(transitions); 204 205 taskNodeContainer.add(jPDL3TaskNodeMetadata); 206 jplMetadata.setTaskNodes(taskNodeContainer); 207 } 208 } 209 return jplMetadata; 210 } 211 return null; 212 } 213 214 /** 215 * Get the name of process definition. 216 * 217 * @return the name of the process definition. 218 */ 219 public String getPdName() { 220 return pdName; 221 } 222 223 /** 224 * Set the name of process definition. 225 * 226 * @param pdName - the name of process definition. 227 */ 228 public void setPdName( String pdName ) { 229 this.pdName = pdName; 230 } 231 232 /** 233 * @return the jPDL3StartStateMetadata. 234 */ 235 public JPDL3StartStateMetadata getStartStateMetadata() { 236 return this.jPDL3StartStateMetadata; 237 } 238 239 /** 240 * @return the jPDL3EndStateMetadata. 241 */ 242 public JPDL3EndStateMetadata getEndStateMetadata() { 243 return this.jPDL3EndStateMetadata; 244 } 245 246 /** 247 * @param jPDL3StartStateMetadata the jPDL3StartStateMetadata to set 248 */ 249 public void setStartStateMetadata( JPDL3StartStateMetadata jPDL3StartStateMetadata ) { 250 this.jPDL3StartStateMetadata = jPDL3StartStateMetadata; 251 } 252 253 /** 254 * @param jPDL3EndStateMetadata the jPDL3EndStateMetadata to set 255 */ 256 public void setEndStateMetadata( JPDL3EndStateMetadata jPDL3EndStateMetadata ) { 257 this.jPDL3EndStateMetadata = jPDL3EndStateMetadata; 258 } 259 260 /** 261 * Get a list of all swimlane of the process definition 262 * 263 * @return a list of all swimlane of the process definition. this can also be a empty list. 264 */ 265 public List<JPDL3SwimlaneMetadata> getSwimlanes() { 266 return this.swimlanes; 267 } 268 269 /** 270 * Set a list with some swimlanes for the process definition. 271 * 272 * @param swimlanes - the swimlanes. 273 */ 274 public void setSwimlanes( List<JPDL3SwimlaneMetadata> swimlanes ) { 275 this.swimlanes = swimlanes; 276 } 277 278 /** 279 * @return the task nodes 280 */ 281 public List<JPDL3TaskNodeMetadata> getTaskNodes() { 282 return this.taskNodes; 283 } 284 285 /** 286 * @param taskNodes Sets taskNodes to the specified value. 287 */ 288 public void setTaskNodes( List<JPDL3TaskNodeMetadata> taskNodes ) { 289 this.taskNodes = taskNodes; 290 } 291 }