| 1 11 12 package org.enhydra.jawe; 13 14 import org.enhydra.jawe.PackageEditor; 15 import org.enhydra.jawe.graph.*; 16 import org.enhydra.jawe.xml.*; 17 import org.enhydra.jawe.xml.elements.Activities; 18 import org.enhydra.jawe.xml.elements.ActivitySet; 19 import org.enhydra.jawe.xml.elements.ActivitySets; 20 import org.enhydra.jawe.xml.elements.Join; 21 import org.enhydra.jawe.xml.elements.Package; 22 import org.enhydra.jawe.xml.elements.Participants; 23 import org.enhydra.jawe.xml.elements.Performer; 24 import org.enhydra.jawe.xml.elements.Split; 25 import org.enhydra.jawe.xml.elements.Transitions; 26 import org.enhydra.jawe.xml.elements.WorkflowProcess; 27 import org.enhydra.jawe.xml.elements.WorkflowProcesses; 28 29 import org.jgraph.graph.*; 30 import org.jgraph.*; 31 32 import java.util.*; 33 import java.awt.*; 34 import java.awt.geom.Point2D ; 35 import java.awt.geom.Rectangle2D ; 36 import javax.swing.*; 37 import javax.swing.tree.*; 38 39 import java.io.*; 40 41 58 public class WorkflowManager implements Serializable { 59 60 61 private transient AbstractGraph graph; 62 63 66 private int horizontalOffset=0; 67 68 70 private static final int defProcessWidth=JaWEConfig.getInstance().getProcessWidth(); 71 72 private static final int defProcessHeight=JaWEConfig.getInstance().getProcessHeight(); 73 74 private static final int minParWidth=JaWEConfig.getInstance().getMinParticipantWidth(); 75 76 private static final int minParHeight=JaWEConfig.getInstance().getMinParticipantHeight(); 77 78 private static final int defParNameWidth=JaWEConfig.getInstance().getParticipantNameWidth(); 79 80 private static final int defActivityWidth=JaWEConfig.getInstance().getActivityWidth(); 81 82 private static final int defActivityHeight=JaWEConfig.getInstance().getActivityHeight(); 83 84 private boolean creatingGraph=false; 85 86 90 public WorkflowManager (AbstractGraph g) { 91 this.graph=g; 92 } 93 94 95 public AbstractGraph getGraph () { 96 return graph; 97 } 98 99 103 public Package getXMLPackage () { 104 return graph.getXMLPackage(); 105 } 106 107 111 public JaWEGraphModel graphModel () { 112 return (JaWEGraphModel)graph.getModel(); 113 } 114 115 124 public void createWorkflowGraph (WorkflowProcess wp) { 125 creatingGraph=true; 126 boolean isMine=true; 128 if (!getXMLPackage().isMadeByJaWE()) { 129 isMine=false; 130 } 131 134 java.util.List entitiesToInsert=wp.getEntitiesToInsert(getVisualOwner()); 135 136 createGraphParticipants(wp,entitiesToInsert); 139 140 createGraphActivitiesAndBlockActivities(wp,entitiesToInsert,isMine); 142 143 createGraphTransitions(wp,entitiesToInsert,isMine); 145 146 if (JaWEConfig.getInstance().getUseBubblesStatus()) { 148 createGraphStarts(wp,isMine,false); 149 150 createGraphEnds(wp,isMine,false); 152 } 153 154 if (!isMine) { 157 layoutActivities(); 158 ProcessEditor pe=(ProcessEditor)graph.getEditor(); 159 Set startDescs=Utils.getStartDescriptions(pe); 160 Set endDescs=Utils.getEndDescriptions(pe); 161 XMLComplexElement vo=getVisualOwner(); 162 if (vo instanceof WorkflowProcess) { 163 ((WorkflowProcess)vo).setStartDescriptions(startDescs); 164 ((WorkflowProcess)vo).setEndDescriptions(endDescs); 165 } else { 166 ((org.enhydra.jawe.xml.elements.Activity)vo). 167 setStartDescriptions(startDescs); 168 ((org.enhydra.jawe.xml.elements.Activity)vo). 169 setEndDescriptions(endDescs); 170 } 171 } 172 creatingGraph=false; 173 try { 174 Dimension prefSize=new Dimension(getRootParticipantWidth(null,null)+50, 175 getNewRootParYPos(null,null)+50); 176 graph.setPreferredSize(prefSize); 177 } catch (Exception ex) {} 178 } 179 180 188 public XMLComplexElement getVisualOwner () { 189 if (graph instanceof BlockActivityGraph) { 190 return (org.enhydra.jawe.xml.elements.Activity) 191 ((BlockActivityGraph)graph).getMyBlockActivity().getUserObject(); 192 } else if (graph instanceof ProcessGraph) { 193 return (WorkflowProcess)graph.getPropertyObject(); 194 } else { 195 return (Package )graph.getPropertyObject(); 196 } 197 } 198 199 207 private Activities getActivitiesCollection () { 208 Activities acts; 209 XMLComplexElement myOwner=getVisualOwner(); 210 if (myOwner instanceof WorkflowProcess) { 211 acts=(Activities)myOwner.get("Activities"); 212 } else { 213 BlockActivity ba=((BlockActivityGraph)graph).getMyBlockActivity(); 214 ActivitySet as=getBlockActivitySet(ba); 215 acts=(Activities)as.get("Activities"); 216 } 217 return acts; 218 } 219 220 228 public Transitions getTransitionsCollection () { 229 Transitions trans; 230 XMLComplexElement myOwner=getVisualOwner(); 231 if (myOwner instanceof WorkflowProcess) { 232 trans=(Transitions)myOwner.get("Transitions"); 233 } else { 234 BlockActivity ba=((BlockActivityGraph)graph).getMyBlockActivity(); 235 ActivitySet as=getBlockActivitySet(ba); 236 trans=(Transitions)as.get("Transitions"); 237 } 238 return trans; 239 } 240 241 245 private ActivitySet getBlockActivitySet (BlockActivity ba) { 246 try { 247 String ID=ba.getBlockID(); 248 ActivitySet as=((ActivitySets)getWorkflowProcess(). 249 get("ActivitySets")).getActivitySet(ID); 250 return as; 251 } catch (Exception ex) { 252 return null; 253 } 254 } 255 256 264 private WorkflowProcess getWorkflowProcess () { 265 if (graph.getPropertyObject() instanceof WorkflowProcess) { 266 return (WorkflowProcess)graph.getPropertyObject(); 267 } else { 268 return null; 269 } 270 } 271 272 290 public org.enhydra.jawe.graph.Process insertProcess (Point p,boolean updateCollection) { 291 Point realP=(Point)graph.fromScreen(new Point(p)); int ulx=realP.x; 293 int uly=realP.y; 294 Rectangle bounds=new Rectangle(ulx,uly,defProcessWidth,defProcessHeight); 295 296 Map viewMap = new Hashtable(); 297 Map map = GraphConstants.createMap(); 298 299 org.enhydra.jawe.graph.Process pr = 300 new org.enhydra.jawe.graph.Process((PackageEditor)getGraph().getEditor()); 301 WorkflowProcess wp=new WorkflowProcess((WorkflowProcesses)getXMLPackage(). 302 get("WorkflowProcesses"),getXMLPackage()); 303 wp.get("Name").setValue(ResourceManager.getLanguageDependentString("ProcessKey")); 304 pr.setUserObject(wp); 305 306 GraphConstants.setBounds(map,bounds); 307 GraphConstants.setOpaque(map,true); 308 GraphConstants.setBorderColor(map,Color.darkGray); 309 GraphConstants.setFont(map,GraphConstants.defaultFont.deriveFont(JaWEConfig.getInstance().getFontSize())); 310 311 viewMap.put(pr,map); 312 Object [] insert = new Object []{pr}; 313 String actionName= 315 ResourceManager.getLanguageDependentString("MessageInsertingProcessIntoPackage"); 316 graphModel().insertAndEdit(insert,viewMap,null,null,null,actionName); 317 318 if (updateCollection) { 319 refreshCollections (insert,true); 320 } 321 322 return pr; 323 } 324 325 337 public void insertCellsAndArrangeParticipants (Object [] insert,Map viewMap, ConnectionSet cs) { 338 if(JaWEGraphModel.getRootParticipants(graphModel()) != null) { 339 updateModelAndArrangeParticipants(insert,null,null,viewMap, 340 ResourceManager.getLanguageDependentString("MessageDuplicatingObject"),true,cs); 341 } 342 else { 343 JOptionPane.showMessageDialog(graph.getEditor().getWindow(), 344 ResourceManager.getLanguageDependentString( 345 "WarningCannotInsertObjectsOutsideParticipant"), 346 JaWE.getAppTitle(),JOptionPane.WARNING_MESSAGE); 347 } 348 } 349 350 363 public void moveCellsAndArrangeParticipants (Map propertyMap) { 364 updateModelAndArrangeParticipants(null,propertyMap,null,null, 365 ResourceManager.getLanguageDependentString("MessageMovingObjects"),false,null); 366 } 367 368 380 public void insertSubflowAndArrangeParticipants (Point p) { 381 Set rootParticipants=JaWEGraphModel.getRootParticipants(graphModel()); 382 if(rootParticipants != null && rootParticipants.size()>0) { 383 Map viewMap = new Hashtable(); 384 Subflow sbf=createSubflow(p,viewMap); 385 updateModelAndArrangeParticipants(new Object [] {sbf},null,null,viewMap, 387 ResourceManager.getLanguageDependentString("MessageInsertingSubflowActivity"), 388 true,null); 389 } 390 else { 391 JOptionPane.showMessageDialog(graph.getEditor().getWindow(), 392 ResourceManager.getLanguageDependentString( 393 "WarningCannotInsertSubflowActivityOutsideParticipant"), 394 JaWE.getAppTitle(),JOptionPane.WARNING_MESSAGE); 395 } 396 } 397 398 410 public void insertBlockActivityAndArrangeParticipants (Point p) { 411 Set rootParticipants=JaWEGraphModel.getRootParticipants(graphModel()); 412 if(rootParticipants != null && rootParticipants.size()>0) { 413 Map viewMap = new Hashtable(); 414 BlockActivity bla=createBlockActivity(p,viewMap); 415 updateModelAndArrangeParticipants(new Object [] {bla},null,null,viewMap, 417 ResourceManager.getLanguageDependentString("MessageInsertingBlockActivity"), 418 true,null); 419 } 420 else { 421 JOptionPane.showMessageDialog(graph.getEditor().getWindow(), 422 ResourceManager.getLanguageDependentString( 423 "WarningCannotInsertBlockActivityOutsideParticipant"), 424 JaWE.getAppTitle(),JOptionPane.WARNING_MESSAGE); 425 } 426 } 427 428 440 public void insertStartAndArrangeParticipants (Point p) { 441 Set rootParticipants=JaWEGraphModel.getRootParticipants(graphModel()); 442 if(rootParticipants != null && rootParticipants.size()>0) { 443 Map viewMap = new Hashtable(); 444 Start s=createStart(p,viewMap); 445 updateModelAndArrangeParticipants(new Object [] {s},null,null,viewMap, 447 ResourceManager.getLanguageDependentString("MessageInsertingStart"), 448 true,null); 449 } 450 else { 451 String msg=ResourceManager.getLanguageDependentString( 452 "WarningCannotInsertStartOutsideParticipant"); 453 JOptionPane.showMessageDialog(graph.getEditor().getWindow(), 454 msg,JaWE.getAppTitle(),JOptionPane.WARNING_MESSAGE); 455 } 456 } 457 458 470 public void insertEndAndArrangeParticipants (Point p) { 471 Set rootParticipants=JaWEGraphModel.getRootParticipants(graphModel()); 472 if(rootParticipants != null && rootParticipants.size()>0) { 473 Map viewMap = new Hashtable(); 474 Activity e=createEnd(p,viewMap); 475 updateModelAndArrangeParticipants(new Object [] {e},null,null,viewMap, 477 ResourceManager.getLanguageDependentString("MessageInsertingEnd"), 478 true,null); 479 } 480 else { 481 JOptionPane.showMessageDialog(graph.getEditor().getWindow(), 482 ResourceManager.getLanguageDependentString( 483 "WarningCannotInsertEndOutsideParticipant"), 484 JaWE.getAppTitle(),JOptionPane.WARNING_MESSAGE); 485 } 486 } 487 488 500 public void insertActivityAndArrangeParticipants (Point p) { 501 Set rootParticipants=JaWEGraphModel.getRootParticipants(graphModel()); 502 if(rootParticipants != null && rootParticipants.size()>0) { 503 Map viewMap = new Hashtable(); 504 Activity act=createActivity(p,viewMap); 505 updateModelAndArrangeParticipants(new Object [] {act},null,null,viewMap, 507 ResourceManager.getLanguageDependentString("MessageInsertingGenericActivity"), 508 true,null); 509 } 510 else { 511 JOptionPane.showMessageDialog(graph.getEditor().getWindow(), 512 ResourceManager.getLanguageDependentString( 513 "WarningCannotInsertGenericActivityOutsideParticipant"), 514 JaWE.getAppTitle(),JOptionPane.WARNING_MESSAGE); 515 } 516 } 517 518 530 public void insertRouteAndArrangeParticipants (Point p) { 531 Set rootParticipants=JaWEGraphModel.getRootParticipants(graphModel()); 532 if(rootParticipants != null && rootParticipants.size()>0) { 533 Map viewMap = new Hashtable(); 534 Route r=createRoute(p,viewMap); 535 updateModelAndArrangeParticipants(new Object [] {r},null,null,viewMap, 537 ResourceManager.getLanguageDependentString("MessageInsertingRouteActivity"), 538 true,null); 539 } 540 else { 541 JOptionPane.showMessageDialog(graph.getEditor().getWindow(), 542 ResourceManager.getLanguageDependentString( 543 "WarningCannotInsertRouteActivityOutsideParticipant"), 544 JaWE.getAppTitle(),JOptionPane.WARNING_MESSAGE); 545 } 546 } 547 548 566 public Participant insertParticipantAndArrangeParticipants (Point p, 567 org.enhydra.jawe.xml.elements.Participant parUO) { 568 569 ToolTipManager.sharedInstance().setEnabled(false); 570 571 Participant par=null; 572 573 Map viewMap=new HashMap(); 574 ParentMap parentMap=null; 575 Map propertyMap=null; 576 577 Object cell=((ProcessGraph)graph). 580 getFirstParticipantForLocation(p.x,p.y); 581 582 if (cell==null) { 585 par=createParticipant( 586 new Rectangle(horizontalOffset,getNewRootParYPos(null,null), 587 getRootParticipantWidth(null,null),minParHeight), 588 viewMap); 589 propertyMap=new HashMap(viewMap); 590 } else { 593 JOptionPane.showMessageDialog(graph.getEditor().getWindow(), 594 ResourceManager.getLanguageDependentString( 595 "WarningParticipantCannotHaveParticipants"), 596 JaWE.getAppTitle(),JOptionPane.WARNING_MESSAGE); 597 return null; 598 } 599 600 Participants wfp =(Participants)getWorkflowProcess().get("Participants"); 601 if (parUO!=null) { 603 Object [] insert = new Object []{par}; 604 graphModel().insertAndEdit(insert,propertyMap,null,parentMap,null, 606 ResourceManager.getLanguageDependentString("MessageInsertingParticipant")); 607 par.setUserObject(parUO); 608 if (!getXMLPackage().isReadOnly()) { 613 parUO.graphReferenceAdded(); 614 } 615 } else { 618 parUO=(org.enhydra.jawe.xml.elements.Participant) 619 wfp.generateNewElement(); 620 Window w=graph.getEditor().getWindow(); 622 XMLElementDialog de=new XMLElementDialog((JDialog)w, 623 ResourceManager.getLanguageDependentString("DialogNewParticipant")); 624 625 de.editXMLElement(parUO.getPanel(),true,false); 626 if (!de.isCanceled()) { 628 Object [] insert = new Object []{par}; 629 graphModel().insertAndEdit(insert,propertyMap,null,parentMap,null, 631 ResourceManager.getLanguageDependentString("MessageInsertingParticipant")); 632 par.setUserObject(parUO); 633 if (!getXMLPackage().isReadOnly()) { 638 parUO.graphReferenceAdded(); 639 } 640 wfp.add(parUO); 642 } 643 } 644 645 if (JaWEConfig.getInstance().getTooltipStatus()) { 646 ToolTipManager.sharedInstance().setEnabled(true); 647 } 648 649 if (!creatingGraph) { 650 try { 651 Dimension prefSize=new Dimension(getRootParticipantWidth(propertyMap,parentMap)+50, 652 getNewRootParYPos(propertyMap,parentMap)+50); 653 graph.setPreferredSize(prefSize); 654 } catch (Exception ex) {} 655 } 656 657 return par; 658 } 659 660 667 public boolean showNode (org.enhydra.jawe.xml.elements.Participant parUO) { 668 if (parUO==null) return false; 669 670 Point ofInsert = new Point(10,Integer.MAX_VALUE); 671 Object graphObj = getGraphObjectForXMLParticipant(parUO); 672 if (null != graphObj) { 674 return true; 675 } 676 677 Object ins=insertParticipantAndArrangeParticipants(ofInsert,parUO); 678 679 if (ins==null) { 680 return false; 681 } else { 682 return true; 683 } 684 } 685 686 692 public void hideNode(org.enhydra.jawe.xml.elements.Participant parUO) { 693 Participant p=getGraphObjectForXMLParticipant(parUO); 694 if (p!=null && !p.hasAnyActivity()) { 695 removeCellsAndArrangeParticipants(new Object []{p}); 696 } 697 } 698 699 707 private Participant getGraphObjectForXMLParticipant( 708 org.enhydra.jawe.xml.elements.Participant source) { 709 710 Set graphParts=JaWEGraphModel.getAllParticipantsInModel(graphModel()); 711 if (graphParts!=null) { 712 Participant graphPart; 713 Iterator it=graphParts.iterator(); 714 while (it.hasNext()) { 715 graphPart=(Participant)it.next(); 716 if (graphPart.getUserObject()==source) { 717 return graphPart; 718 } 719 } 720 } 721 return null; 722 } 723 724 725 748 public Transition insertTransition (Point start,Point end,PortView source, 749 PortView target,boolean isRouting,boolean updateCollection) { 750 751 Point p = (Point)graph.fromScreen(new Point(start)); Point p2 = (Point)graph.fromScreen(new Point(end)); ArrayList list = new ArrayList(); 754 755 Map map = GraphConstants.createMap(); 757 if (source.equals(target)) { 758 GraphConstants.setLineStyle(map,GraphConstants.STYLE_BEZIER); 759 list.add(p); 760 if (updateCollection) { 761 list.add(new Point(p.x-50,p.y-75)); 762 list.add(new Point(p.x+50,p.y-75)); 763 } 764 list.add(p2); 765 } else { 766 list.add(p); 767 list.add(p2); 768 } 769 GraphConstants.setPoints(map,list); 770 if (isRouting) { 771 GraphConstants.setRouting(map, GraphConstants.ROUTING_SIMPLE); 772 } 773 GraphConstants.setLineEnd(map,GraphConstants.ARROW_TECHNICAL); 775 GraphConstants.setEndFill(map,true); 776 GraphConstants.setEndSize(map,10); 777 GraphConstants.setFont(map,GraphConstants.defaultFont.deriveFont(JaWEConfig.getInstance().getFontSize())); 778 779 Map viewMap = new Hashtable(); 780 Transition transition = new Transition(); 781 782 viewMap.put(transition,map); 783 784 Object [] insert = new Object []{transition}; 785 ConnectionSet cs = new ConnectionSet(); 786 787 cs.connect(transition,source.getCell(),target.getCell()); 788 789 org.enhydra.jawe.xml.elements.Transition uo=null; 790 Transitions ts=getTransitionsCollection(); 791 uo=new org.enhydra.jawe.xml.elements.Transition(ts); 792 transition.setUserObject(uo); 794 795 String undoMsg=ResourceManager.getLanguageDependentString("MessageInsertingTransition"); 798 graphModel().insertAndEdit(insert,viewMap,cs,null,null,undoMsg); 800 Activity s=null; 801 Activity t=null; 802 try { 803 s=transition.getSourceActivity(); 804 } catch (Exception ex) { 805 } 806 try { 807 t=transition.getTargetActivity(); 808 } catch (Exception ex) { 809 } 810 811 org.enhydra.jawe.xml.elements.Activity sourceAct=null; 813 if (s!=null && t!=null && !(s instanceof Start) && !(t instanceof End)) { 815 try { 816 sourceAct=(org.enhydra.jawe.xml.elements.Activity) 817 s.getPropertyObject(); 818 uo.setFrom(sourceAct); 819 } catch (Exception e) {} 820 try { 821 uo.setTo(t.getPropertyObject()); 822 } catch (Exception e) {} 823 } 824 825 if (updateCollection) { 827 refreshCollections (insert,true); 828 } 829 830 return transition; 831 } 832 833 |