Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Workflow Management with Espresso Workflow


Published on

PAVONE Espresso Workflow is a workflow management solution, based on Java EE technology. The focus is on team-oriented processes, known as human workflow management. It has an easy-to-use and powerful API.

Published in: Business, Technology
  • Be the first to comment

  • Be the first to like this

Workflow Management with Espresso Workflow

  1. 1. Startfolie mit Titel der Präsentation Workflow Management with PAVONE Espresso Workflow for Java EE Vorname Nachname -Business Titel- Dr. Rolf Kremer - Director Product Development -
  2. 2. Agenda <ul><li>Introduction </li></ul><ul><li>Components </li></ul><ul><li>Modeling and Form Design </li></ul><ul><li>Capabilities </li></ul><ul><li>Runtime Engine API </li></ul><ul><li>Questions </li></ul>
  3. 3. PAVONE Espresso Workflow <ul><li>Part of the PAVONE Process Control Suite </li></ul><ul><li>Available on two platforms: IBM Lotus Notes/Domino, Java EE </li></ul><ul><li>History </li></ul><ul><ul><li>1995: First release for IBM Lotus Notes/Domino (as PAVONE GroupFlow) </li></ul></ul><ul><ul><li>2006: First release for Java EE </li></ul></ul><ul><li>Many users </li></ul><ul><ul><li>Installed basis: > 85.000 users </li></ul></ul><ul><ul><li>Customer projects: > 880 </li></ul></ul><ul><li>See </li></ul>
  4. 4. Focus: Team-oriented Processes <ul><li>Transaction-oriented processes </li></ul><ul><ul><li>Business integration and process automation </li></ul></ul><ul><ul><li> Examples: Invoice processing, Accounting, Logistics, Financial services </li></ul></ul><ul><ul><li>Strong structured and high number execution </li></ul></ul><ul><li>Team-oriented processes ('Human Workflow Management') </li></ul><ul><ul><li>Human interaction </li></ul></ul><ul><ul><li>Difficult to automate and weak structured </li></ul></ul><ul><ul><li>Forwarding of documengs and forms between different editors </li></ul></ul><ul><ul><li>Content could be changed in each task </li></ul></ul><ul><ul><li>Examples: Employee selection, Document release, Travelling expenses </li></ul></ul><ul><ul><li>accounting, Investment proposal, Claims settlement, Process changes </li></ul></ul>
  5. 5. Components
  6. 6. From Model to Analysis PAVONE ProcessModeler PAVONE ProcessModeler (PAVONE ProcessModeler), Application PAVONE ProcessModeler <ul><li>Modeling : Modeling of Workflow controlled business processes, specification of control conditions </li></ul><ul><li>Animation : Step by step execution of modeled processes </li></ul><ul><li>Simulation : Comparison of alternative solutions under different conditions </li></ul><ul><li>Analysis : Analyze existing process instances, graphical visualization, option to export data </li></ul>
  7. 7. First: Defining the Process Definition PAVONE ProcessModeler
  8. 8. Second: Defining the Data Model PAVONE ProcessModeler
  9. 9. Types of fields <ul><li>Standard </li></ul><ul><ul><li>Text </li></ul></ul><ul><ul><li>Date/Time </li></ul></ul><ul><ul><li>Number </li></ul></ul><ul><ul><li>Rich Text </li></ul></ul><ul><ul><li>Names, (Autors), (Readers) </li></ul></ul><ul><li>Extended </li></ul><ul><ul><li>Action: Call of an uri with parameters </li></ul></ul><ul><ul><li>Separator: Line break between fields </li></ul></ul><ul><ul><li>Section: Grouping of fields to a section </li></ul></ul><ul><ul><li>Tab: Grouping of fields/section in a tab </li></ul></ul><ul><ul><li>Widget: Thematically section or tab </li></ul></ul>
  10. 10. Widget: Progress Display <ul><li>Position of the current task in the process </li></ul><ul><li>Definition in the process definition </li></ul><ul><ul><li>Definition per task </li></ul></ul><ul><ul><li>Take-over from other tasks possible </li></ul></ul>
  11. 11. Widget: Project Start <ul><li>Start of a project directly from a process form </li></ul><ul><li>Statement of </li></ul><ul><ul><li>Project id </li></ul></ul><ul><ul><li>Manager </li></ul></ul><ul><ul><li>Start date of the project </li></ul></ul><ul><ul><li>Selection of a project template (if available) </li></ul></ul>
  12. 12. Widget: File Attachment <ul><li>Management of files of a process task </li></ul><ul><li>Actions </li></ul><ul><ul><li>Add, Delete, Open </li></ul></ul><ul><ul><li>Download </li></ul></ul><ul><ul><li>Preview area </li></ul></ul>
  13. 13. Several widgets available <ul><li>System widgets </li></ul><ul><ul><li>Progress display </li></ul></ul><ul><ul><li>Project start </li></ul></ul><ul><ul><li>File attachments </li></ul></ul><ul><ul><li>Bookmarks </li></ul></ul><ul><ul><li>Comment </li></ul></ul><ul><ul><li>Log </li></ul></ul><ul><ul><li>Acquisition of efforts </li></ul></ul><ul><li>User defined widgets </li></ul><ul><ul><li>Creation of own widget </li></ul></ul><ul><ul><li>Adding of JavaScript code </li></ul></ul><ul><ul><li>Example: Google Gadgets </li></ul></ul>
  14. 14. Third: Designing the Forms <ul><li>Options </li></ul><ul><ul><li>Modifying of order of fields </li></ul></ul><ul><ul><li>Add separator </li></ul></ul><ul><ul><li>Grouping of fields (sections) </li></ul></ul><ul><ul><li>Grouping of fields/section in tabs </li></ul></ul><ul><ul><li>Read-only fields </li></ul></ul><ul><ul><li>Must fields </li></ul></ul><ul><ul><li>Hidden fields </li></ul></ul>
  15. 15. Form Design: Read-only and Must fields <ul><li>Read-only field : Modification of content is not possible </li></ul><ul><li>Must field : A value has to be entered </li></ul><ul><li>Hidden field : Field exists in html code, but is not visible </li></ul>
  16. 16. Form Design: Separator <ul><li>Without separator ('Line break'): </li></ul><ul><li>With separator: </li></ul>
  17. 17. Form Design: Section <ul><li>Grouping of fields to an unit </li></ul>
  18. 18. Form Design: Tab <ul><li>Grouping of fields/widgets in a tab </li></ul>
  19. 19. Fourth: Initiate and Execute a Process <ul><li>Administration area </li></ul><ul><li>Tasks area and Welcome Page </li></ul>
  20. 20. View for Business Data <ul><li>For each process definition a view </li></ul><ul><li>Show field values in columns </li></ul>
  21. 21. View for Business Data (2) <ul><li>Definition of names & columns </li></ul>
  22. 22. Capabilities <ul><li>Process Hosting </li></ul><ul><ul><li>SaaS-Lösung: PAVONElive </li></ul></ul><ul><ul><li>Install PAVONE ProcessModeler local </li></ul></ul><ul><ul><li>Suitable for small, simple processes </li></ul></ul><ul><ul><li>Suitable for prototypical implementation </li></ul></ul><ul><ul><li>See </li></ul></ul><ul><li>In-house solution </li></ul><ul><ul><li>Easy installation of the PAVONE Pross Control Suite </li></ul></ul><ul><ul><li>Suitable for processes any complexity </li></ul></ul><ul><ul><li>Suitable for connections to third-party systems (Data exchange) </li></ul></ul><ul><ul><li>See </li></ul></ul>
  23. 23. In-house Solution: Installation <ul><li>Installed software </li></ul><ul><ul><li>Apache Derby Server 10.4.2 </li></ul></ul><ul><ul><li>JBoss Application Server 4.2.3 </li></ul></ul><ul><ul><li>Apache Jackrabbit 1.5.3 (Content Repository) </li></ul></ul><ul><ul><li>PAVONE PCS Java EE 2.2 </li></ul></ul><ul><li>Setup: </li></ul><ul><ul><li>PCS databases with examples </li></ul></ul><ul><ul><li>Path to the JCR repository </li></ul></ul>
  24. 24. Used Open Source Modules <ul><li>Server: JBoss Application Server, (Apache Tomcat) </li></ul><ul><li>DBMS: Apache Derby, (MySQL Community Edition) </li></ul><ul><li>Frontend: Apache Struts, Dojo Toolkit, jQuery </li></ul><ul><li>Persistence: Hibernate </li></ul><ul><li>File management: Apache Jackrabbit </li></ul><ul><li>Operating system: Debian, Ubuntu </li></ul><ul><li>Other: Rhino, Apache Commons, Log4J, JibX, JavaDoc, InstallJammer, MPXJ, XPP3 </li></ul>
  25. 25. Extensibility Workflow Application Standard Application Other Application Standard Forms Add Widgets Own Forms & Standard Business Objects Own Forms & Own Business Objects Existing Application New Application Frontend Backend Widget Documentation Java API Documentation JSON API Documentation White Paper Designing Workflows ProcessEngine Installation ProcessEngine Installation Standard? Java API Documentation JSON API Documentation
  26. 26. PAVONE Process Engine
  27. 27. PAVONE Process Engine <ul><li>Part of PAVONE Espresso Workflow </li></ul><ul><li>Runtime Engine, responsible for the routing </li></ul><ul><li>Support activities, workflow tasks, project tasks </li></ul><ul><li>Extensive and easy-usable API (Application Programming Interface) </li></ul><ul><li>Multi-client capability </li></ul><ul><li>Integrated Event handling </li></ul><ul><li>Integrated Business data handling </li></ul>
  28. 28. Open for serveral Application Types
  29. 29. Databases ag app manager app pm od process engine security Organization Directory Process Engine Application Agent Manager Security
  30. 30. Deployment Options <ul><li>Minimal installation </li></ul><ul><ul><li>Direct jar import </li></ul></ul><ul><ul><li>UI independence </li></ul></ul><ul><li>Service installation </li></ul><ul><ul><li>Core object access via JNDI lookups </li></ul></ul><ul><ul><li>UI independence </li></ul></ul><ul><li>Web application </li></ul><ul><ul><li>Struts-based UI, JSPs, Javascript, etc. </li></ul></ul><ul><ul><li>Predefined, extensible UI </li></ul></ul><ul><ul><li>Reuseable elements </li></ul></ul>
  31. 31. Multi-client Capability
  32. 32. Object types <ul><li>Types </li></ul><ul><ul><li>Project </li></ul></ul><ul><ul><li>Workflow </li></ul></ul><ul><ul><li>Simple (Activity) </li></ul></ul><ul><li>All types share a largely common interface </li></ul>
  33. 33. Runtime & Definition Objects
  34. 34. Basic Types: Status & AccessLevel <ul><li>Standard types: </li></ul><ul><ul><li>enforce type safety </li></ul></ul><ul><ul><li>ease localization </li></ul></ul><ul><ul><li>make values independent of persistent representation </li></ul></ul>
  35. 35. NameAssignment Class <ul><li>Resolution types: </li></ul><ul><ul><li>Fixed </li></ul></ul><ul><ul><li>Computed by property </li></ul></ul><ul><ul><li>Computed by script </li></ul></ul><ul><ul><li>Computed by field in business object </li></ul></ul><ul><ul><li>Automated (not yet available) </li></ul></ul><ul><ul><li>Computed by custom property (not yet available) </li></ul></ul><ul><li>Type dynamic-by-field refers to default bizobject </li></ul><ul><li>Used by: </li></ul><ul><ul><li>Process </li></ul></ul><ul><ul><li>Task </li></ul></ul><ul><ul><li>ProcessDefinition </li></ul></ul><ul><ul><li>TaskDefinition </li></ul></ul>
  36. 36. Persistence API <ul><li>Repository </li></ul><ul><ul><li>Encapsulates persistent data store </li></ul></ul><ul><li>Connection </li></ul><ul><ul><li>Connection to data store </li></ul></ul><ul><li>PCSEntity </li></ul><ul><ul><li>Base class for all persistent objects </li></ul></ul><ul><li>UuidGenerator </li></ul><ul><ul><li>Interface allows for flexible creation of unique keys </li></ul></ul>
  37. 37. Persistence API: Repository & Connection <ul><li>Repository </li></ul><ul><ul><li>Manage connections to a particular datastore </li></ul></ul><ul><li>Connection </li></ul><ul><ul><li>Manage objects in a data store </li></ul></ul><ul><li>Purpose: Create a layer of abstraction around Hibernate </li></ul>
  38. 38. API Example: Creation of Session Object import javax.naming.InitialContext; import com.pavone.base.util.config.PCS_config; import com.pavone.pcs.Session; InitialContext ic = new InitialContext(); SessionFactory pcsFactory = (SessionFactory) ic.lookup(PCS_config.get(PCS_config. PCSENGINE_JNDINAME )); Session pcsSession = pcsFactory.createSession(userName);
  39. 39. API Example: Repository and Connection import com.pavone.pcs.Repository; import com.pavone.pcs.Connection; Repository repository = pcsSession.getRepository(); Connection connection = repository.createConnection();
  40. 40. API Example: Frame for Transaction Handling try { connection.beginTransaction(); ... Place your operations here ... connection.commitTransaction(); } catch (PCSBusinessException pcse) { connection.rollbackTransaction(); } catch (RuntimeException e) { connection.rollbackTransaction(); e.printStackTrace(); } finally { connection.close(); }
  41. 41. API Example: Get Simple Task Objects import com.pavone.pcs.TaskType, import com.pavone.pcs.ObjectType; Set tasks = pcsSession.getTasksByUser ( &quot;&quot;, ObjectType. SIMPLE , pcsSession.getUserName(), TaskStatus. IN_PROGRESS );
  42. 42. API Example: Loop to Access Simple Tasks import com.pavone.pcs.SimpleTask; Iterator iterator = tasks.iterator(); while (iterator.hasNext()) { SimpleTask task = (SimpleTask); ... Place your operations here ... }
  43. 43. API Example: Creation of Simple Task Object import com.pavone.pcs.SimpleTask; SimpleTask task = pcsSession.createSimpleTask( &quot;&quot; );
  44. 44. API Example: Simple Task Completion import com.pavone.pcs.SimpleTask; boolean bo = task.complete(); // or boolean bo = task.complete( <TimeStamp> );
  45. 45. API Example: Deletion of Simple Task Object pcsSession.deleteSimpleTask( task );
  46. 46. API Example: Retrieving Workflow Tasks import com.pavone.pcs.TaskType, import com.pavone.pcs.ObjectType; Set tasks = pcsSession.getTasksByUser ( &quot;&quot;, ObjectType. WORKFLOW , &quot;*&quot; , TaskStatus. IN_PROGRESS );
  47. 47. API Example: Workflow Task Completion boolean success = task.complete();
  48. 48. API Example: Casting Task into Workflow Task import com.pavone.pcs.WfTask; WfTask wfTask = (WfTask) task;
  49. 49. API Example: Retrieving Process <ul><li>import com.pavone.pcs.Process; </li></ul><ul><li>Process process = task.getProcess(); </li></ul><ul><li>OR </li></ul><ul><li>import com.pavone.pcs.ProcessStatus; </li></ul><ul><li>Set processes = pcsSession.getProcesses( &quot;&quot; , ObjectType. WORKFLOW , ProcessStatus. IN_PROGRESS ); </li></ul>
  50. 50. API Example: Retrieving Processes (1) <ul><li>Set processes = pcsSession.getProcesses( <ProcessDefinition> ); </li></ul><ul><li>Set processes = pcsSession.getProcesses( <AppInstanceId>, <ProcessDefinition> ); </li></ul><ul><li>Set processes = pcsSession.getProcesses( <AppInstanceId> , <ObjectType> , <ProcessStatus> ); </li></ul><ul><li>Set processes = pcsSession.getProcesses( <AppInstanceId> , <ProcessDefiniton> , <ProcessStatus> ); </li></ul><ul><li>Set processes = pcsSession.getProcesses( <AppInstanceId> , <ObjectType> , <int1>, <int2>, <TimeStamp>, <TimeStamp>, <boolean> ); </li></ul><ul><li>Set processes = pcsSession.getProcesses( <AppInstanceId> , <ProcessDefinition> , <int1>, <int2>, <TimeStamp>, <TimeStamp>, <boolean> ); </li></ul>
  51. 51. API Example: Retrieving Processes (2) <ul><li>Set processes = pcsSession.getProcessesByInitiator( < AppInstanceId > , <ObjectType> , <ProcessStatus>, <Initiator> ); </li></ul><ul><li>Set processes = pcsSession.getProcessesByInitiator( <AppInstanceId> , <ProcessDefinition> , <ProcessStatus>, <Initiator> ); </li></ul><ul><li>Set processes = pcsSession.getProcessesByManager( <AppInstanceId> , <ObjectType> , <ProcessStatus>, <Manager> ); </li></ul><ul><li>Set processes = pcsSession.getProcessesByManager( <AppInstanceId> , <ProcessDefinition> , <ProcessStatus>, <Manager> ); </li></ul><ul><li>Set processes = pcsSession.getProcessesByName( <AppInstanceId> , <ObjectType> , <ProcessStatus>, <Process name> ); </li></ul><ul><li>Set processes = pcsSession.getProcessesByPriority( <AppInstanceId> , <ObjectType> , <ProcessStatus>, <Priority> ); </li></ul><ul><li>... </li></ul>
  52. 52. API Example: Import Process Definition <ul><li>import com.pavone.pcs.Administration; </li></ul><ul><li>WfProcessDefinition wf = Administration. importXMLProcessDefinition ( <fileName>, <appInstanceId> ); </li></ul><ul><li>---------------------- </li></ul><ul><li>// lock the process definition </li></ul><ul><li>wf.setLocked( true ); </li></ul><ul><li>// unlock the process definition </li></ul><ul><li>wf.setLocked( false ); </li></ul>
  53. 53. API Example: Retrieving Process Definition Object <ul><li>import com.pavone.pcs.ProcessDefinition; </li></ul><ul><li>// get process definition </li></ul><ul><li>String strDefName = &quot;<Name of the process definition>&quot;; </li></ul><ul><li>ProcessDefinition def = (ProcessDefinition) </li></ul><ul><li>pcsSession.getProcessDefinition( strDefName ); </li></ul>
  54. 54. API Example: Creating Process Definition Object <ul><li>import com.pavone.pcs.ProcessDefinition; </li></ul><ul><li>// create process definition </li></ul><ul><li>String strDefName = &quot;<Name of the process definition>&quot;; </li></ul><ul><li>ProcessDefinition def = pcsSession.createProcessDefinition </li></ul><ul><li>( ObjectType. WORKFLOW , strDefName ); </li></ul>
  55. 55. API Example: Retrieving all Task Definition Objects <ul><li>import com.pavone.pcs.WfTaskDefinition; </li></ul><ul><li>if ( wfDef != null ){ </li></ul><ul><li>// get all task definitions </li></ul><ul><li>Set list = wfDef.getTaskDefinitions(); </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
  56. 56. API Example: Initiating Process <ul><li>WfProcess process = pcsSession.initiateWfProcess( <AppInstanceId> , <Name> , &quot;&quot; , &quot;&quot; ); </li></ul><ul><li>// get tasks </li></ul><ul><li>Set tasks = process.getTasks ( TaskStatus. IN_PROGRESS ); </li></ul><ul><li>// get first task </li></ul><ul><li>Iterator iterator = tasks.iterator(); </li></ul><ul><li>WfTask task = (WfTask); </li></ul>
  57. 57. Business Objects <ul><li>BizObjectContainer </li></ul><ul><ul><li>Interface for classes that contain bizobjects (Process, Task) </li></ul></ul><ul><li>BizObjectInterface </li></ul><ul><ul><li>Interface for accessing one or more classes of bizobjects </li></ul></ul><ul><li>BizObjectLink </li></ul><ul><ul><li>Base class for links to bizobjects </li></ul></ul><ul><li>BizObjectDefault </li></ul><ul><ul><li>Standard bizobject that is always available as a place to hold process/task-related data so that custom objects are often not necessary. </li></ul></ul>
  58. 58. Business Objects <ul><li>BizObjectContainer </li></ul><ul><ul><li>Interface contains bizobjects (extensions of java.lang.Object) </li></ul></ul><ul><ul><li>Process and Task implement interface </li></ul></ul><ul><li>BizObjectDefault </li></ul><ul><ul><li>Default bizobject to eliminate need for custom objects </li></ul></ul><ul><ul><li>Available from Process and Task </li></ul></ul>
  59. 59. DataItems (Predefined Fields) <ul><li>Data values defined in process model </li></ul><ul><li>Defined for: </li></ul><ul><ul><li>ProcessDefinition </li></ul></ul><ul><ul><li>TaskDefinition </li></ul></ul><ul><li>Access: </li></ul><ul><ul><li>processDefinition.getDataItems() </li></ul></ul><ul><ul><li>taskDefinition.getDataItems() </li></ul></ul><ul><li>Values copied to default bizobject when specified </li></ul>
  60. 60. API Example: Retrieve DataItem 'comment' <ul><li>import com.pavone.pcs.BizObjectDefault; </li></ul><ul><li>import com.pavone.pcs.DataItem; </li></ul><ul><li>BizObjectDefault bo = task.getDefaultBizObject(); </li></ul><ul><li>DataItem item = bo.getItem ( &quot;comment&quot; ); </li></ul>
  61. 61. API Example: Check whether DataItem exists <ul><li>String name = &quot;&quot;; </li></ul><ul><li>if ( bo.hasItem ( &quot;name&quot; )) { </li></ul><ul><li>name = bo.getItemValueString ( &quot;name&quot; ); </li></ul><ul><li>} </li></ul>
  62. 62. API Example: Access all DataItems <ul><li>import com.pavone.pcs.WfTaskDefinition; </li></ul><ul><li>import com.pavone.pcs.DataItem; </li></ul><ul><li>List itemList = taskdef.getDataItems(); </li></ul><ul><li>Iterator iter = itemList.iterator(); </li></ul><ul><li>while ( iter.hasNext() ) { </li></ul><ul><li>DataItem item = (DataItem); </li></ul><ul><li>... Place your operations here ... </li></ul><ul><li>} </li></ul>
  63. 63. Usage of JavaScript <ul><li>Uses Rhino from Mozilla (JavaScript for Java) </li></ul><ul><ul><li>Wraps Java classes for JavaScript. </li></ul></ul><ul><ul><li>Allows for selective exposure of Java objects. </li></ul></ul><ul><ul><li> </li></ul></ul><ul><li>Use cases: </li></ul><ul><ul><li>Task validation </li></ul></ul><ul><ul><li>Routing conditions </li></ul></ul><ul><ul><li>Name assignments </li></ul></ul><ul><ul><li>Operations </li></ul></ul><ul><li>API objects are available for scripting as appropriate </li></ul><ul><ul><li>session </li></ul></ul><ul><ul><li>process </li></ul></ul><ul><ul><li>task </li></ul></ul>
  64. 64. Example: Routing Condition <ul><li>Condition => formula-based (JavaScript) condition </li></ul><ul><li>Use bizobject for values </li></ul><ul><li>Return true to route, otherwise false </li></ul>
  65. 65. Event Handling: Classes <ul><li>WfEventListener </li></ul><ul><ul><li>Interface defines event method signatures </li></ul></ul><ul><li>WfEventAdapter </li></ul><ul><ul><li>Empty class that implements WfEventListener for ease of creating new handlers </li></ul></ul><ul><li>Example code: </li></ul><ul><ul><li>com.pavone.pcs.example.MyEventHandler </li></ul></ul>
  66. 66. Event Handling: Configuration <ul><li>Configure handler via full class name </li></ul>
  67. 67. API Example: Event Handling Code
  68. 68. Materials
  69. 69. Questions & Answers <ul><li>Feel free to contact us if you have other questions! </li></ul>
  70. 70. For more information please visit our homepage and Contact PAVONE Ltd, UK School House, Hackforth BEDALE, N. Yorks. DL8 1PE United Kingdom Phone: +44 (0) 1748 811527 E-Mail: PAVONE Inc. 13 NW 13th Avenue Portland, Oregon 97209 USA Phone: +1.503.754.3144 E-Mail: PAVONE AG Technologiepark 9 33100 Paderborn Tel.: +49 52 51 / 31 02-0 Fax: +49 52 51 / 31 02-99 E-Mail: