BPM https://www.avioconsulting.com/blog/categories/bpm en Documentation - You'll Thank Yourself Later https://www.avioconsulting.com/blog/documentation-youll-thank-yourself-later <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/documentation-youll-thank-yourself-later" hreflang="en">Documentation - You&#039;ll Thank Yourself Later</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p>Documentation. Hardly anybody wants to write it, but it is one of the most important deliverables in a software project. Without documentation, it becomes very difficult to understand why things were done the way they were and if the project is operating as expected. </p> <p>I have joined several projects where there was a lack of documentation. Sometimes you’ll be blessed with comments, but, in my experience, the only comments to be found are commented-out code. In Oracle SOA/BPM projects and Mulesoft projects, documentation is even rarer than in other projects. I’m not perfect - I’ve contributed to this problem as well. I’ve completed some code for a project and then, a month later, had to come back to the same code and figure out what the code is supposed to be doing in order to make modifications. Many developers will tell you the “code is self-documenting”, but the code doesn't show you the intent. In order to ascertain intent, one must consult documentation or requirements, and it isn’t always clear which code fulfills which requirements.</p> <p><img alt="Commented Code" data-entity-type="file" data-entity-uuid="43364b49-d141-484b-b9f0-16cc483e2808" height="131" src="/sites/default/files/inline-images/Screen%20Shot%202019-01-07%20at%201.20.40%20PM.png" width="655" class="align-left" /></p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>We are all better than this!</p> <p> </p> <p><img alt="Mulesoft Notes Field" data-entity-type="file" data-entity-uuid="c0233439-8a75-4080-9dba-1d4fc57a2f2e" height="330" src="/sites/default/files/inline-images/Screen%20Shot%202019-01-04%20at%203.47.00%20PM.png" width="652" /><img alt="Oracle Documentation" data-entity-type="file" data-entity-uuid="99c29f98-1b67-41ac-a57a-955eb78665b5" height="256" src="/sites/default/files/inline-images/Screen%20Shot%202019-01-04%20at%203.44.24%20PM.png" width="505" /></p> <p>Save your colleagues and yourself some unnecessary time and document your code. It is possible to figure out what a chunk of code is supposed to do, but it takes much less time to read a sentence that says what the code is meant to do. The comment doesn’t have to be extremely detailed, it just needs to express the general idea. Put a comment in your Java code, fill in the Description field in your BPMN or BPEL activities, or write something in that Notes attribute on your Mulesoft message processors. Don’t leave the comments blank - you will thank yourself later!</p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=738&amp;2=comment_node_blog&amp;3=comment_node_blog" token="Xxgpqfan-pc6CC8yR5FIbxX217LJ64swBJCwEYY6THI"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog/categories/adf" hreflang="en">ADF</a></div> <div><a href="/blog%3Fbid%3D332" hreflang="en">MuleSoft</a></div> <div><a href="/taxonomy/term/365" hreflang="en">Oracle</a></div> <div><a href="/blog/categories/bpm" hreflang="en">BPM</a></div> <div><a href="/blog/categories/soa" hreflang="en">SOA</a></div> <div><a href="/blog/categories/other" hreflang="en">Other</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Mon, 07 Jan 2019 19:38:32 +0000 Adam Mead 738 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/documentation-youll-thank-yourself-later#comments Using Oracle BPEL Direct Bindings in Java https://www.avioconsulting.com/blog/using-oracle-bpel-direct-bindings-java <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/using-oracle-bpel-direct-bindings-java" hreflang="en">Using Oracle BPEL Direct Bindings in Java</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p>This blog contains best practices for interfacing Java to external systems through Oracle BPEL components. Java will often be used to integrated functionality within the SOA framework since the framework allows wiring of Java code in order to perform various operations during human task assignment, and execution, as an example. And since these Java classes are embedded in the framework, and these classes may need to pull data from databases, Active Directory, REST services, WSDLs, etc., what is the best way to do this? You guess it: Direct Bindings.</p> <p>Why use direct bindings? First of all, a direct binding creates a simple RMI interface between Java code and a BPEL process. Besides the speed and efficiency one gets from RMI, using direct bindings leverages the capabilities already available within the SOA framework. There’s no need to go outside the SOA framework to get assignment data (in this example) from a database or other data source. Using SOA libraries, BPEL and SOA adapters everything needed is already available.</p> <p>Note that our use case has to do with implementing a very specialized version of role or parameter-based team assignments. Another assignment strategy is give here for <a href="https://www.avioconsulting.com/blog/creating-parametric-roles-using-business-rules">creating parametric roles using business rules</a>. However there are many other use cases that can be applied that don't have to do with assignments at all. Dynamic Bindings can and should be used whenever you want to interact with BPEL code from within Java.</p> <h2>Design by Interface First</h2> <p>The first step is to create an interface that will be used between the BPEL process and Java code. In this blog we will implement an interface that will be used to return a list of assignments for a given work team. The work team will be determined from the project the team is working on and other project properties such as the work area and activity type. The work team will contain a list of BPM application roles or a particular individual in a role. </p> <h3>Input Requirements</h3> <ul><li>projectId - string</li> <li>workArea - string  </li> <li>activityType - string</li> </ul><h3>Output Requirements</h3> <p>The output will be a list of assignments. Since the task assignment may contain direct assignments or role-based assignments, this will support both.</p> <p>    List of Assignments</p> <ul><li>assignment - string</li> <li>type - string</li> </ul><h3>Example Interface Schema</h3> <p> </p> <p style="font-size: 15px;background-color: #EFEFEF">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br /> &lt;schema xmlns:tns="<a href="http://xmlns.oracle.com/default/DynamicTaskAssignment/GetProjectTaskAssignments">http://xmlns.oracle.com/default/DynamicTaskAssignment/GetProjectTaskAss…</a>"<br />         targetNamespace="<a href="http://xmlns.oracle.com/default/ynamicTaskAssignment/GetProjectTaskAssignments">http://xmlns.oracle.com/default/ynamicTaskAssignment/GetProjectTaskAssi…</a>"<br />         xmlns="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>"&gt;<br />  &lt;element name="process"&gt;<br />     &lt;complexType&gt;<br />        &lt;sequence&gt;<br />           &lt;element name="projectId" type="string"/&gt;<br />           &lt;element name="processActivityKey" type="string"/&gt;<br />           &lt;element name="workAread" type="string"/&gt;<br />      &lt;/sequence&gt;<br />     &lt;/complexType&gt;<br />  &lt;/element&gt;<br />  &lt;element name="processResponse"&gt;<br />      &lt;complexType&gt;<br />          &lt;sequence&gt;<br />               &lt;element name="dynamicRoleNamesList" type="tns:DynamicRoleNamesListType"/&gt;<br />          &lt;/sequence&gt;<br />       &lt;/complexType&gt;<br />  &lt;/element&gt;<br />  &lt;complexType name="DynamicRoleNamesListType"&gt;<br />        &lt;sequence&gt;<br />             &lt;element name="dynamicRoleName" type="tns:DynamicRoleNameType" minOccurs="0" maxOccurs="unbounded"/&gt;<br />         &lt;/sequence&gt;<br />  &lt;/complexType&gt;<br />  &lt;complexType name="DynamicRoleNameType"&gt;<br />      &lt;sequence&gt;<br />            &lt;element name="assignment" type="string"/&gt;<br />             &lt;element name="type" type="tns:AssignmentTypes"/&gt;<br />       &lt;/sequence&gt;<br />  &lt;/complexType&gt;<br />  &lt;simpleType name="AssignmentTypes"&gt;<br />         &lt;restriction base="string"&gt;<br />             &lt;enumeration value="USER"/&gt;<br />             &lt;enumeration value="APPLICATION_ROLE"/&gt;<br />         &lt;/restriction&gt;<br />     &lt;/simpleType&gt;<br /> &lt;/schema&gt;</p> <h3>The BPEL Process And Direct Binding</h3> <p> </p> <p>Now we create the BPEL process and edit the schema template created when the BPEL process is created. This screen shot shows the BPEL creation wizard. Here we are creating a BPEL process, called GetDynamicAssignment in a composite called DynamicAssignments. This has to be a synchronous process, and we will not be needing it to be exposed as a SOAP service, so the check-box can be cleared.</p> <p><img alt="BPEL Process Creation Wizard" data-entity-type="file" data-entity-uuid="5edadc3a-0a31-44c5-b8ef-d46e8fd403e7" height="442" src="/sites/default/files/inline-images/DirectBindings_create_bpel.png" width="552" /></p> <p>Although we will not be using it as a SOAP service, you may want to create it with a SOAP service for testing purposes. Below, we will create it without the SOAP Service, since the creation of the BPEL process will generate the WSDL and message schemas we need in either scenario. </p> <p><br /> Please note: Testing your BPEL process without a SOAP service may be an issue. You may want to wrap this code with another BPEL process and expose it as a web service, or don’t replace the SOAP service with a direct binding until you are finished testing it. When you are ready, you can delete the  SOAP service (or Direct Binding service) and replace it with one or the other as you test it or interact with it via Java. The following images shows how this can be done.</p> <p> </p> <p><img alt="Deleting SOAP Service or Direct Binding" data-entity-type="file" data-entity-uuid="61ef417f-7e0a-4880-a5ca-523706c13aea" height="502" src="/sites/default/files/inline-images/DirectBindings_del_wsdll.png" width="553" /></p> <p><br /> Next we create the direct binding (or web service interface) by dragging a new direct binding object over from the component pallet to the Exposed Service region of the composite editor. </p> <p><img alt="Creating Direct Binding From Component Pallet" data-entity-type="file" data-entity-uuid="eaabfecc-b0eb-4cbb-8d5d-541ecba4b4e7" height="234" src="/sites/default/files/inline-images/DirectBindings_createBinding.png" width="495" /></p> <p>The direct binding creation wizard will pop up, and you can enter the name of the direct binding service and reference the BPEL wsdl, GetDynamicAssigment.wsdl, created during the BPEL process creation step above.</p> <p><img alt="Direct Binding Creation Wizard" data-entity-type="file" data-entity-uuid="d90af6e8-4407-49e5-8a94-aa398ed8de03" height="495" src="/sites/default/files/inline-images/DirectBindings_create_bpel_0.png" width="619" /></p> <p>After you click ok, you will need to link the direct binding to the BPEL process using the partner link already generated during BPEL process creation.</p> <p><img alt="Linking to the BPEL Process" data-entity-type="file" data-entity-uuid="845589b1-4ffa-47cf-aa97-e42d46b972f6" height="387" src="/sites/default/files/inline-images/DirectBindings_attachBinding.png" width="546" /></p> <p>We now have a BPEL process that you can use within Java to leverage any service adapters available, such as for a database or web service. For our use case, the team assignments are stored in a database, so we will edit the template schema created for the BPEL process and use a database adapter to pull data from team assignments tables based on the project ID, work area and process-type inputs. This is basic SOA implementation, so details are not provided here.  </p> <p> </p> <p><img alt="BPEL Process Shell" data-entity-type="file" data-entity-uuid="58324474-8168-483d-ba27-e648d4a3e37d" height="385" src="/sites/default/files/inline-images/DirectBindings_bpel.png" width="543" /></p> <p><br /> The next thing we will describe is how to call invoke this service and marshal data into the request and back out of the response using JAXB classes and Oracle’s SOA Management API.</p> <h2>Java Code</h2> <p>This section describes the Java code that we will use to execute the BPEL process through the direct binding interface. Since we are using RMI, we will need to pass payload data between the BPEL process and our code using org.w3c.dom.Element classes. In this example, we will marshal and unmarshal data into org.w3c.dom classes using JAXB. You can use JDeveloper to create JAXB class or the following command line.</p> <p>xjc .\xsd\GetProjectTaskAssignments.xsd -p org.avio.assignments.domain -d .\src</p> <p>This will create the following Java classes in the org.avio.assignments.domain package:</p> <ul><li>AssigmentTypes.java</li> <li>DynamicRoleNamesListTypes.java</li> <li>DynamicRoleNameTypes.java</li> <li>ObjectFactory.java</li> <li>Package-info.java</li> <li>Process.java</li> <li>ProcessResponse.java</li> </ul><h3><br /> Oracle’s Direct Binding and RMI Java Libraries</h3> <p>Oracle’s documentation for using the Direct Bindings is documented here. <a href="https://docs.oracle.com/cd/E36909_01/dev.1111/e10224/invocapi.htm">https://docs.oracle.com/cd/E36909_01/dev.1111/e10224/invocapi.htm</a>. <br /> Implementing this, however, is rather complex. It requires the following:</p> <ul><li>An RMI connection</li> <li>The distinguishing name (DN) to the default composite version</li> <li>An org.w3c.dom Process request</li> <li>The BPEL process end-point</li> <li>An org.w3c.dom Process Response</li> </ul><p>To simplify the RMI interface (using Soa Management API or more specifically, the Locator class as documented here <a href="https://docs.oracle.com/cd/E28280_01/apirefs.1111/e10659/toc.htm">https://docs.oracle.com/cd/E28280_01/apirefs.1111/e10659/toc.htm</a>) we define this Java method, getCurrentLocator() that will be used in our code sample. It returns an RMI locator to the SOA system.</p> <p> </p> <p style="font-size: 15px;background-color: #EFEFEF"> private Locator getCurrentLocator(String providerUrl, String adminUserName, <br />                                            String adminPassword) throws Exception {<br />         Hashtable jndiProps = new Hashtable();<br />         jndiProps.put(Context.PROVIDER_URL, providerUrl);<br />         jndiProps.put(Context.INITIAL_CONTEXT_FACTORY,<br />                       "weblogic.jndi.WLInitialContextFactory");<br />         jndiProps.put(Context.SECURITY_PRINCIPAL, adminUserName);<br />         jndiProps.put(Context.SECURITY_CREDENTIALS, adminPassword);<br />        return LocatorFactory.createLocator(jndiProps);<br /> }</p> <p><br /> The two method addressed below,  getDefaultCompositeByNameabove() and executeCompositeServiceEndpoint(), use the getCurrentLocator method.</p> <h3>    <br /> Finding the Active Composite Version</h3> <p><br /> Since several versions of composite, DynamicAssignments may be deployed, we will need to get the composite DN of the default composite version. The composite DN takes the form of partition/compositename!version, or “default/DynamicAssignments!3.2.0. We have this method, getDefaultCompositeByName, to return the default Composite. </p> <p> </p> <p style="font-size: 15px;background-color: #EFEFEF">    public Composite getDefaultCompositeByName(String compositeNameStr,<br />                                                String providerUrl,<br />                                                String adminUserName,<br />                                                String adminPassword) throws Exception {<br />         CompositeFilter cFilter = new CompositeFilter();<br />         CompositeDN compositeDN = new CompositeDN(compositeNameStr);<br />         cFilter.setPartition(compositeDN.getDomainName());<br />         cFilter.setCompositeName(compositeDN.getCompositeName());<br />         List&lt;Composite&gt; composites =<br />             locatorFactory.getCurrentLocator(providerUrl, adminUserName,<br />                                              adminPassword).getComposites(cFilter);<br />         for (Composite composite : composites) {<br />             if (composite.isDefaultRevision())<br />                 return composite;<br />             }<br />         return null;<br />     }</p> <h3>Executing the BPEL Process From Java</h3> <p><br /> The execution of the BPEL process requires the default composite, obtained above, the WSDL port and operation, and the payload as a org.w3c.dom.Element. The RMI call requires us to wrap the payload in a Message class, and here again we use Oracle Java libraries, XMLMessageFactory, to create the payload we need. This is all wrapped by the Java method shown below that returns the response as a org.w3c.dom.Element class. </p> <p style="font-size: 15px;background-color: #EFEFEF"> public Element executeCompositeServiceEndpoint(Composite composite,<br />                                                    String port,<br />                                                    String operation,<br />                                                    String payloadName,<br />                                                    Element payloadElem,<br />                                                    String providerUrl,<br />                                                    String adminUserName,<br />                                                    String adminPassword) throws Exception {<br />        Map&lt;String, Element&gt; partData = new HashMap&lt;String, Element&gt;();<br />         partData.put(payloadName, payloadElem);        <br />         Message&lt;Element&gt; request = XMLMessageFactory.getInstance().createMessage();<br />         Payload&lt;Element&gt; payload = PayloadFactory.createXMLPayload(partData);<br />         request.setPayload(payload);<br />         DirectConnection connection =<br />             locatorFactory.getCurrentLocator(<br />                     providerUrl, adminUserName,<br />                     adminPassword).createDirectConnection(composite.getCompositeDN(),port);               <br />         Message&lt;Element&gt; response = connection.request(operation, request);<br />         ByteArrayOutputStream sw = new ByteArrayOutputStream();<br />         Node n = response.getPayload().getData().values().iterator().next();<br />         return (Element) n;<br /> }</p> <h3>Making the Call</h3> <p><br /> The last step ties this all together in the following Java method, getProjectTaskAssignments. This method takes as an argument the JAXB request class, Process.class, and connect properties. It then converts the request to a dom Element, gets the default composite, executes the BPEL process, and returns the response from the BPEL process in the JAXB ProcessResponse class.</p> <p style="font-size: 15px;background-color: #EFEFEF"> <br /> private ProcessResponse getProjectTaskAssignments(<br />           Process request,<br />           String providerUrl,<br />           String adminUserName,<br />           String adminPassword) {<br />                         <br />             // Create the Request Using the JAXB class, Process.class<br />             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();<br />             dbf.setNamespaceAware(true);<br />             DocumentBuilder db = dbf.newDocumentBuilder();<br />             Document document = db.newDocument();<br />             JAXBContext jc = JAXBContext.newInstance(Process.class);              <br />              // Marshal the Process.class object into a W3C.Document object<br />              Marshaller marshaller = jc.createMarshaller();<br />              marshaller.marshal(request, document);<br />              Element requestRoot= document.getDocumentElement();<br />    <br />            // Get the default composite version<br />             Composite dbComposite =<br />                     soaAdminService.getDefaultCompositeByName("default/DynamicAssignment",<br />                                                                      providerUrl,<br />                                                                      adminUserName,<br />                                                                      adminPassword);<br />             <br />             response =<br />                     soaAdminService.executeCompositeServiceEndpoint(dbComposite,<br />                                                                            "GetProjectTaskAssignments_client_db",<br />                                                                            "process",<br />                                                                            "payload",<br />                                                                            requestRoot,<br />                                                                            providerUrl,<br />                                                                            adminUserName,<br />                                                                            adminPassword);<br />             <br />            jc = JAXBContext.newInstance(ObjectFactory.class); <br />            Unmarshaller u = jc.createUnmarshaller();<br />            ProcessResponse processResponse= (ProcessResponse)u.unmarshal(response);<br />             return processResponse;<br /> }</p> <h2>Conclusion</h2> <p>Notice that all this code uses components and libraries contained in Oracle SOA Fusion Middleware. If you are consuming these Java classes from within a BPM or BPEL composite, then you won’t need to include any external libraries. If you are using JDev to create other SOA composite, then all the libraries will be included during design time. During deployment and run-time, you’ll just need to include the Java classes and methods described above.</p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=731&amp;2=comment_node_blog&amp;3=comment_node_blog" token="scCGswV1m4H7Z-OI5B5gva0gHu7lpRfI35OdNJTvPzE"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/taxonomy/term/365" hreflang="en">Oracle</a></div> <div><a href="/blog/categories/bpm" hreflang="en">BPM</a></div> <div><a href="/blog/categories/soa" hreflang="en">SOA</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Fri, 19 Oct 2018 21:54:11 +0000 Mark Peterson 731 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/using-oracle-bpel-direct-bindings-java#comments Unshackle the Business - Best Practices in UI and Process Designs https://www.avioconsulting.com/blog/unshackle-business-best-practices-ui-and-process-designs <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/2017-11/materialdesign.jpg" width="1147" height="706" alt="Material Design" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/unshackle-business-best-practices-ui-and-process-designs" hreflang="en">Unshackle the Business - Best Practices in UI and Process Designs</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p>To remain competitive, companies have to continually drive down costs while maintaining value in the products and services they offer. One area where companies look to reduce costs is in Business Process Management (BPM).</p> <p>When it comes to IT expenditures, some companies may invest a small fortune in BPM, while others may simply rely on basic tools, such as spreadsheets and Post-it notes. Regardless of the amount spent, if the tools are hard to use or the process is cumbersome then your business has become shackled and is wasting time and energy.</p> <p>Are your company’s internal business processes helping or hurting efficiency? Take this simple assessment: </p><ul><li>Do your employees have relevant and useful tools to complete their work or do they waste time navigating complicated or out-of-date systems?</li> <li>Do their tools or user interfaces (UIs) involve countless forms or spreadsheets or are they streamlined and concise?</li> <li>Do the business processes or workflow they must follow slow them down or accelerate their work?</li> </ul><p>AVIO has developed best practices in UI and business process design that help organizations reduce their cost of doing business and increase worker satisfaction. These practices and designs, when implemented, empower employees and help drive organizational change, which can ultimately affect the company’s bottom line.</p> <p>Here are three ways the AVIO’s best practices can unshackle your business from cumbersome systems and bring about positive change in your organization.</p> <ul><li>AVIO uses best practices and the latest in UI techniques and design strategies, such as material design, single-page applications, animation, suggestive item searches, and auto-fill mechanisms. These techniques and strategies, which are now common in applications such as Facebook and Twitter, can make your company’s UI intuitive, easy to use, and relevant to your business.</li> <li>AVIO can custom fit the system workspace so the UI conforms to how your employees work—rather than making them conform to the system. One size does not fit all; and one UI doesn’t either, as many companies have found out after installing off-the-shelf applications.</li> <li>AVIO can implement a business process that accelerates workflows, rather than just controlling or keeping track of them. AVIO does this through advanced process designs that account for the very nature in which work is performed within your organization because the actual business process does not follow a straight line from beginning to end, as most process models depict.</li> </ul><p>With these best practices, everyone in your organization will see the value in the tools they use rather than endure them. The UIs will be streamlined, relevant and useful. The workspace will draw users into their tasks and help them stay focused. And the business processes will mirror the way people actually do work—dynamic work-teams, changing assignments and variable deadlines.</p> <h3>Further Reading:</h3> <p><a href="http://www.avioconsulting.com/blog/now-under-development-avios-skunkworks-labs-customized-workspace-oracle-bpm">AVIO's Custom Workspace</a></p> <a href="http://www.avioconsulting.com/blog/now-under-development-avios-skunkworks-labs-customized-workspace-oracle-bpm"> </a> <p><a href="http://www.avioconsulting.com/blog/oracle-bpm-11g-process-screens-without-adf">AVIO's Rest Service API (for creating highly responsive  UIs without ADF)</a></p> <a href="http://www.avioconsulting.com/blog/oracle-bpm-11g-process-screens-without-adf"> </a> <p><a href="http://www.avioconsulting.com/blog/mobile-bpm-not-option-its-necessity">Mobile BPM is not an Option, but a Necessity</a></p> "&gt;</div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=693&amp;2=comment_node_blog&amp;3=comment_node_blog" token="cIljoZeYyWL3c1UmIGFDkjLwYKTzgcnCAsJc0G9ymkw"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog/categories/bpm" hreflang="en">BPM</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Tue, 21 Nov 2017 23:44:29 +0000 Mark Peterson 693 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/unshackle-business-best-practices-ui-and-process-designs#comments Quick look into Oracle BPM 12c REST APIs https://www.avioconsulting.com/blog/quick-look-oracle-bpm-12c-rest-apis <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/quick-look-oracle-bpm-12c-rest-apis" hreflang="en">Quick look into Oracle BPM 12c REST APIs</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p>Back in mid-2014, Oracle was releasing Oracle BPM 11g Bundle Patch 3 and with it, the first version of its BPM REST APIs. That first cut was a good starting point, but it just offered a limited amount of functionality (find my previous post <a href="http://www.avioconsulting.com/blog/reviewing-oracle-bpms-new-rest-api">here</a>). In this post, we’ll take a look at the BPM REST APIs version 12.2.1.2, released in August 2016, and see how they evolved after 2 years. </p> <p>The list of available services can be obtained by accessing to <a href="http://yourserver:port/bpm/services/rest/application.wadl">http://yourserver:port/bpm/services/rest/application.wadl</a>.</p> <p><img alt="BPM REST APIs WADL" data-entity-type="file" data-entity-uuid="cbe7d1b9-1fd1-4a45-9740-7c63d44091e8" height="679" src="/sites/default/files/inline-images/2017-11-11%2018_11_35-Clipboard.png" width="833" /></p> <p>The picture above shows all the REST services included in this new version; highlighted in yellow are the new services introduced since the first version of the REST APIs. There’s one curious thing, the two processes services (1.0/processes and /processes). Like in the very first version of <em>processes </em>service, if you execute <em>getProcess </em>operation, the response is just “Processes.”. Likewise with <em>runtime </em>service, if you execute <em>getRuntime </em>operation, the response is an empty string.</p> <p>Let’s now focus on one of the most important things we would like to do with these REST APIs: get and update the task payload. This can be achieved using <em>tasks </em>service and we need to know the <em>task number</em> of the task we want to work with. The <em>task number</em> is no other thing than an integer number that identifies the task, but internally the BPM APIs don’t use it, they use the <em>task id</em> instead, which is a string (GUID). So, the first thing the REST operation will do is, to call a service to get the <em>task id</em> for the given <em>task number</em>.</p> <p>The following picture shows the response of <em>getTask </em>operation.</p> <p style="margin:0in 0in 8pt"><img alt="getTask outcome" data-entity-type="file" data-entity-uuid="cfbaa0e2-11bb-4435-a7f4-bb4d827ba2fa" height="811" src="/sites/default/files/inline-images/2017-11-11%2018_12_25-Clipboard.png" width="858" /></p> <p>In this version, the URL of the operation to get the task payload is <em>tasks/:taskNumber/summaryFields</em> but in the very first version, it was <em>tasks/:taskNumber/payload</em>.</p> <p>Below, there is the response of the call to <em>getSummaryFields </em>operation.</p> <p style="margin:0in 0in 8pt"><img alt="getSummaryFields outcome" data-entity-type="file" data-entity-uuid="0a772912-1f2b-47e1-aa28-76d4df5000cb" height="274" src="/sites/default/files/inline-images/2017-11-11%2018_12_47-Clipboard.png" width="862" /></p> <p>I’ve tried several times this operation with different tasks numbers and the response was always the same. In a further analysis I found out that internally, the <em>getSummaryFields </em>REST operation is calling the Human Workflow Web Service operation <em>getSummaryFieldsInfoForTask</em>.</p> <p style="margin:0in 0in 8pt"><img alt="getSummaryFieldsInfoForTask outcome" data-entity-type="file" data-entity-uuid="f98403d4-9d40-4df9-965b-b11f0658c2d2" height="606" src="/sites/default/files/inline-images/2017-11-11%2018_13_06-Clipboard.png" width="864" /></p> <p>It seems this web service is the culprit of the “Task payload not found” message returned by <em>getSummaryFields </em>operation.</p> <p>In brief, no major changes have been done in the BPM REST APIs. There are some new services but is still not possible to get and update the task payload.</p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=689&amp;2=comment_node_blog&amp;3=comment_node_blog" token="Kr2NuHGIvAgyP1dPPsvSQxMT2m5sKm7ifUyjxrSqlhA"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog/categories/bpm" hreflang="en">BPM</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Sat, 11 Nov 2017 21:22:52 +0000 Sebastian Marucci 689 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/quick-look-oracle-bpm-12c-rest-apis#comments Using a Multi-Instance Subprocess as a Complex Gateway in Oracle PCS https://www.avioconsulting.com/blog/using-multi-instance-subprocess-complex-gateway-oracle-pcs <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/2017-10/multi%203.png" width="600" height="600" alt="Using a Multi-Instance Subprocess to Duplicate Complex Gateway Functionality in PCS" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/using-multi-instance-subprocess-complex-gateway-oracle-pcs" hreflang="en">Using a Multi-Instance Subprocess as a Complex Gateway in Oracle PCS</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p>To speed the time it takes for a work item instance to flow through a process, copies of the instance can be sent to people in multiple roles simultaneously in the <a href="https://cloud.oracle.com/en_US/process">Oracle Integration Cloud Process Cloud Service (PCS)</a>.  Someone in each of the roles can then approve or reject the work item instance.  The challenge comes when an early release from all of the parallel copies is desired when anyone in any of the roles rejects their instance and the original work item instance should then continue in the process. </p> <p>                                                                                                                                                                                                  </p> <p>The Business Process Model and Notation (BPMN) has a complex gateway artifact with this process pattern in mind. When needed, the complex gateway's early release capability makes it one of the most powerful tools process modelers have today when designing executable BPMN processes.  Currently, PCS does not support complex gateways. Because its functionality often needed, this blog describes how to duplicate its functionality when modeling processes using PCS.                                                                                                                                                                                                          </p> <p> </p> <p>Recently added to PCS in May 2017, I recommend that the use of a multi-instance subprocess to do this because:                        </p> <ul><li>One of the multi-instance subprocess activity's options is to send work item instances to people in multiple roles simultaneously</li> <li>Each person in a role can approve or reject the work item instances sent to them</li> <li>If one person rejects the instance, an early release can occur by defining a termination condition in its properties and the original instance can then leave the multi-instance subprocess</li> <li>If a rejection occurs, all of the other copies can automatically be removed from the other role queues </li> </ul><p>Antonis Antoniou has written an <a href="http://antonis-antoniou.blogspot.com/2017/07/multi-instance-subprocess-in-oracle.html">excellent blog on the PCS multi-instance subprocess</a>.  This expands the scope of what he wrote a little to include how to assign the instances spawned to people in different roles, and shows how to cause an early release occur when a one person rejects their copy of the instance.                                                                                                                                                                                                                                               </p> <p> </p> <p>Shown below is a process that illustrates this pattern (in the <a href="https://drive.google.com/file/d/0Bwqetn0fpi74ZjJpa3kyT3lFTkE/view?usp=sharing">PCS application export file</a> this is the “Approval Using MultiInstance Subprocess” process).  If any of the three approvers performing the “Accounting Approval”, “Auditor Approval” or “IT Manager Approval” reject their copy of the instance, the instance will be rejected and immediately leave the multi-instance subprocess.                                                                                                                                                          </p> <p><img alt="Multi-Instance Subprocess with Three Assigned Activities" data-entity-type="file" data-entity-uuid="47633d08-0d47-4ac5-9e11-6b036304b89b" height="289" src="/sites/default/files/inline-images/2m.png" width="802" /></p> <p>To create this, first create a process that starts with a form in PCS.  In this example, the start event’s form only has 3 fields and looks like this.</p> <p><img alt="Process Start Event's Form with Three Fields" data-entity-type="file" data-entity-uuid="791ae280-9403-4ce2-8182-9e56a6bddc4a" height="307" src="/sites/default/files/inline-images/3%20form.png" width="868" /></p> <p>Next, from the System activities in the palette, add a Subprocess activity to the process. </p> <p><img alt="Add the Subprocess Activity to the Process" data-entity-type="file" data-entity-uuid="cedcc804-0687-4c81-bd41-991bd19860d3" height="510" src="/sites/default/files/inline-images/4%20sub%20add.png" width="858" /></p> <p>As shown above, define its properties to have a “Repetition Cycle” of “Generate multiple instances”, and select “In Parallel” so that they all are created at one time.  In this example, people in three different roles will be assigned copies of the instance so select the “Condition” radio button, and click the button to the right of the “How many instances do you want to create?” field and type the number 3.  We will come back later to the checkbox and field in the lower right corner to enable this activity’s early release functionality.                                                                                                                                                                    </p> <p> </p> <p>Add the 5 Approve and Submit Human activities as shown below.  Assign the form that was created to each of them.  Add the two exclusive gateways shown below into the process.  The “Assign” exclusive gateway’s purpose is to send the copy of the instance to only one of the three different Approve Human activities based on the multi-instance subprocess’s predefined “loopCounter” variable.  The first copy will be sent to the “Auditor Approval” activity, the second copy will be sent to the “IT Manager Approval” activity, and the third copy will be sent to the “Accounting Approval” activity.                                                           </p> <p><img alt="Multi-instance Subprocess with Activities Added" data-entity-type="file" data-entity-uuid="66e7ab12-ebfa-4710-a9bf-285adf87e8cd" height="300" src="/sites/default/files/inline-images/5%20prc.png" width="834" /></p> <p>Recall that the number “3” was entered previously in the multi-instance activity’s property panel.  This means at runtime, three copies are created simultaneously with the predefined loopCounter automatically set to 1, 2 and 3 respectively.  The logic in the conditional sequence flow going to the “Auditor Approval” activity is “loopCounter==1”.  This can either be typed in manually, or to be able to select “loopCounter” check the “Show predefined variables” checkbox as shown below.                                                                                                                                                                                                                   </p> <p><img alt="Logic in the Conditional Sequence Flows using the &quot;loopcounter&quot; Predefined Variable" data-entity-type="file" data-entity-uuid="0ad93651-99b2-49f1-aebe-19a3ddc26b9a" height="694" src="/sites/default/files/inline-images/6%20loopcounter.png" width="440" /></p> <p>Similarly, set the logic in the conditional sequence flow going to the “IT Manager Approval” activity to “loopCounter==2”.  The unconditional default sequence flow in this example goes to the “Accounting Approval” activity.                                                                                                                                                          </p> <p> </p> <p>Rather than using the default role modeled in the process, assign each of these activities to their respective roles by selecting one of the Approval activities inside the subprocess, open its “Properties”, and select the “Edit” button beside the “Assignees” field.                                                                                             </p> <p><img alt="Setting the Assignees in Each Activity" data-entity-type="file" data-entity-uuid="8f544a80-ae02-4b50-ac17-cd9f04ae2748" height="425" src="/sites/default/files/inline-images/7%20assignees.png" width="437" /></p> <p>Select “Names and Expressions” from the “Build a list of participants …” dropdown.  Click the + button to add a role to be assigned to the activity.  In the example below, it is assigned to people in the application role named “Vendor Management.IT Manager”.                                                                                         </p> <p><img alt="Assign the Role to the Activity" data-entity-type="file" data-entity-uuid="a87f4fad-352d-453b-8da3-28fd7acb7f52" src="/sites/default/files/inline-images/Add%20Assignees.png" /></p> <p>Do the same thing for the "Accounting Approval" and "Auditor Approval" activities, assigning them to different application roles or LDAP groups that exist.          </p> <p> </p> <p>So that there is an early release if one of the approvers rejects their task, select the multi-instance subprocess activity in the process, and open its properties panel.  Check the “Define a condition that terminates execution of subprocess instances” checkbox, and define the logic that will enable this early release by clicking the “Edit Expression” button shown below.                                                                                                                                                                             </p> <p><img alt="Early Release Termination Logic" data-entity-type="file" data-entity-uuid="cd875f6e-953a-4129-84ad-efb43dbaf505" src="/sites/default/files/inline-images/9.%20early%20release%20termination%20logic.png" /></p> <p>Adding the expression is a little tricky because there are two output string variables to select from that have the same name.  As shown below, use the "taskOutput" string data object under the process ("ApprovalUsing MultiInstanceSubprocess" in this case) and not the copy's output data object (under "Subprocess").                                                                                                                                                                                                                                     </p> <p><img alt="Adding the Early Release Termination Logic" data-entity-type="file" data-entity-uuid="4c669324-4c50-44e8-b97e-16410220948e" src="/sites/default/files/inline-images/10.%20Add%20Termination%20Logic.png" /></p> <p>Because a copy of the original work item instance is being used to populate the three copies, fix this by changing the data associations in each of the three Approval activities.  Select each one of the activities, select “Data Associations”, and change each one's "Input" data association.  As shown below, on the left note that the object under the “Subprocess” was automatically used for the initial input data association mapping.  Remove this and change it to instead use the process’s data object (“multiIntanceFormDataObject” in this case).  Similarly, on the right side set the title of this copy of the instance task by expanding “execData” on the right and dragging “title” in from the right.   For this activity, note that the title is set to: </p> <p>    “Acounting Approval for “ + loopCounter</p> <p><img alt="Assign the Activity Input Data Associations" data-entity-type="file" data-entity-uuid="2f5957c0-496a-4d39-865d-89c27154a9a3" height="270" src="/sites/default/files/inline-images/11.%20Data%20Assoc.png" width="962" /></p> <p>As shown below, click the “Output” tab.  For each one of the three activities remove the automatically mapped Subprocess data objects, and replace them with the process’s data objects “taskOutput” and “muiltiInstanceFormDataObject” as shown below.</p> <p><img alt="Assign the Output Data Associations" data-entity-type="file" data-entity-uuid="a0709d98-2b1f-4ab3-889b-916257e0f043" height="255" src="/sites/default/files/inline-images/12%20output.png" width="962" /></p> <p>Ensure these data association mapping changes have been made to the other two Approval activities in the process.  The final exclusive gateway and the two Human Submit activities shown below are simply there to help determine if the early release works correctly.  The conditional sequence flow going to the “Rejected by Multi” Submit Human activity has the logic:</p> <p>     taskOutput==”REJECT”</p> <p><img alt="Exclusive Gateway's Conditional Sequence Flow Logic" data-entity-type="file" data-entity-uuid="b1976a42-fcd4-4cea-af97-5961f6ba23e3" src="/sites/default/files/inline-images/13%20ex%20gw%20logic.png" /></p> <p>Although I would be the first to admit that the BPMN complex gateway is missed in PCS, and that this approach takes a bit of work to accomplish, the complex gateway's early release functionality can be achieved using the process modeling pattern described here. </p> <p>Reference:</p> <p>1. “<b>Multi-Instance Subprocess in Oracle Process Cloud Service</b>” by Antonis Antoniou - <a href="http://antonis-antoniou.blogspot.com/2017/07/multi-instance-subprocess-in-oracle.html">http://antonis-antoniou.blogspot.com/2017/07/multi-instance-subprocess-…</a></p> <p>2. "<strong>Dynamically Assigning an Oracle PCS Task to an Application Role</strong>" by Dan Atwood - <a href="http://www.avioconsulting.com/blog/dynamically-assigning-oracle-pcs-task-application-role">http://www.avioconsulting.com/blog/dynamically-assigning-oracle-pcs-tas…</a></p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=684&amp;2=comment_node_blog&amp;3=comment_node_blog" token="7869zgMTUFm9yq6iXkc8ybfAvjZjcInipzWkPMrSig8"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog/categories/bpm" hreflang="en">BPM</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Mon, 23 Oct 2017 15:56:45 +0000 Dan Atwood 684 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/using-multi-instance-subprocess-complex-gateway-oracle-pcs#comments Dynamically Assigning an Oracle PCS Task to an Application Role https://www.avioconsulting.com/blog/dynamically-assigning-oracle-pcs-task-application-role <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/2017-10/dyn_1.png" width="600" height="600" alt="Dynamically Assign Tasks in a PCS Process" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/dynamically-assigning-oracle-pcs-task-application-role" hreflang="en">Dynamically Assigning an Oracle PCS Task to an Application Role</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p>Instead of using the default process swimlane Application Roles to assign a task to people, the Oracle Integration Cloud's Process Cloud Service (PCS) processes can be made more flexible and reusable when a User task in a process is set to be performed by different people dynamically. </p> <p> </p> <p>In this process below, the swimlane role named “Dynamic Assignee” could have been named anything and have no one assigned.  At runtime when a work item instance enters the “Approve Supplier” User activity, the swimlane role is ignored, and a value passed into the process is instead used to dynamically assign the task to different people.  In this case, the value a data object element is set to the text of the ID of an Application Role somewhere upstream of the process. </p> <p> </p> <p><img alt="Process with a User Task Dynamically Assigned" data-entity-type="file" data-entity-uuid="21082ac8-329c-4990-b703-cab93de7e818" height="384" src="/sites/default/files/inline-images/1%20prc.png" width="644" /></p> <p>In the example below, the value that is in the data object element named <i>Supplier.applicationRole</i> contains the ID of the Application Role in the selected activity’s property panel.</p> <p> </p> <p><img alt="Data Object Element for the Dynamic Assignment" data-entity-type="file" data-entity-uuid="8b9e1e22-1a5c-48ae-8b18-5ab51c7986ed" height="497" src="/sites/default/files/inline-images/2%20prc.png" width="627" /></p> <p>It is not obvious, but the value set in this data object element needs to be the ID of the application role.  The mistake that is commonly made is to use the name shown when you click <b>Manage Roles</b> under <b>Configure</b> in PCS as shown below.</p> <p><img alt="Manage Roles option does not provide the ID needed for dynamic assignment" data-entity-type="file" data-entity-uuid="24b55083-b2ac-43c9-a620-203e20beef23" height="411" src="/sites/default/files/inline-images/3%20name%20vs%20id.png" width="662" /></p> <p>Although this is the name of the application Role, it is very frequently not the text you need to use to assign a task using a data object element's value.  If this text is used, at runtime this error will occur when the task reaches the activity in the process.</p> <p><img alt="Invalid task assignment runtime error" data-entity-type="file" data-entity-uuid="72e2758b-b309-44cd-9666-7e585cfa2e5a" src="/sites/default/files/inline-images/4%20comment.png" /></p> <p>Instead, to determine the Application Role’s ID, open any User task’s properties dialog in the application.  Beside the <b>Assignee(s) </b>property, click the edit button.</p> <p><img alt="Select the Edit button beside the Assignee(s) field" data-entity-type="file" data-entity-uuid="2c5d85e7-78db-404c-a92c-ab09bbe0bb04" height="511" src="/sites/default/files/inline-images/5%20assignees%20button.png" width="632" /></p> <p>Select <b>Names and Expressions </b>from the top dropdown -&gt; click the + button -&gt; select <b>Add Shared Role</b>.</p> <p><img alt="Select Shared Role" data-entity-type="file" data-entity-uuid="4d243116-1203-4452-bef0-759e172ef991" src="/sites/default/files/inline-images/6%20shared%20role.png" /></p> <p>Beside the Value field, click the search icon.  This list of Application Roles will likely be quite long, so type in the first few characters of your application’s name and click the <b>Search </b>button.  As shown below, select the Application Role.</p> <p><img alt="Select the Application Role " data-entity-type="file" data-entity-uuid="aa31dca8-7964-4fba-8984-26621bbf9d2e" height="407" src="/sites/default/files/inline-images/7%20sel%20ap%20role.png" width="649" /></p> <p>Copy the text beside “Details” (and not the “Name”).</p> <p><img alt="Copy the ID's text" data-entity-type="file" data-entity-uuid="b9e25af4-210d-46a1-b5dd-333a7875264a" height="341" src="/sites/default/files/inline-images/8%20text%20beside%20id.png" width="691" /></p> <p>When setting the data object element’s value upstream in the process, surround it with double quotes and use this text in the data association.</p> <p><img alt="Set the Application Role text for the downstream dynamic assignment" data-entity-type="file" data-entity-uuid="0d4b6772-c5a2-41f7-bf65-8ad84eb8ff52" height="193" src="/sites/default/files/inline-images/10%20set%20data%20assoc.png" width="717" /></p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=683&amp;2=comment_node_blog&amp;3=comment_node_blog" token="Qp5I7qnvlhRqMsqD8aM7RGd5knX0b1i43QsyNbH_Oo4"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog/categories/bpm" hreflang="en">BPM</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Thu, 12 Oct 2017 19:22:31 +0000 Dan Atwood 683 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/dynamically-assigning-oracle-pcs-task-application-role#comments Process Cloud Service (PCS) System Error Exception Handling https://www.avioconsulting.com/blog/process-cloud-service-pcs-system-error-exception-handling <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/2017-10/2017-10-09_16-49-25.png" width="600" height="600" alt="Error Boundary Event set to catch a System Exception" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/process-cloud-service-pcs-system-error-exception-handling" hreflang="en">Process Cloud Service (PCS) System Error Exception Handling</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p>A question that sometimes comes up is "Why aren't system exceptions caught by error boundary events in PCS?".</p> <p>Just like in life, not everything can be predicted as process instances execute in PCS, and exceptions can and do occur.  The purpose of this is to explain why some exceptions are not caught by the error boundary events shown below in PCS and why this is not necessarily a bad thing.</p> <p><img alt="Error Boundary Events in a process" data-entity-type="file" data-entity-uuid="cc16e86f-d48a-4ec2-a9fd-6cb6dbfe3740" height="302" src="/sites/default/files/inline-images/3.%20ErrorBoundaryEvents.png" width="644" /></p> <p>The ability for business users to handle exceptions and being able to continue work is one of the things I’ve liked most about PCS from the beginning.  The five recoverable instances shown below were not able to be caught by error boundary events in the process.</p> <p> </p> <p><img alt="PCS Recoverable Instance Tab" data-entity-type="file" data-entity-uuid="9e869907-07e8-432e-89e7-741fc1281447" height="144" src="/sites/default/files/inline-images/1.%20RecoverableInstances.png" width="621" /></p> <p>Once “Recoverable Instances” is clicked, the user sees the list of instances that can then be handled by a business or technical user.</p> <p><img alt="List of recoverable instances" data-entity-type="file" data-entity-uuid="e0f3814d-ef8b-4469-a290-8c91f00ffbcd" height="206" src="/sites/default/files/inline-images/2.%20Recoverable%20Instances.png" width="614" /></p> <p> </p> <p>There are two types of exceptions that can be caught in PCS processes, business and system exceptions.   Business exceptions occur due to things being outside the norm like when a fraud is detected or an item on an order has been discontinued.  System exceptions on the other hand can occur unpredictably when a service invoked by a task in a PCS process is down, it times out, it is sent incorrect parameters, or a connection to it simply cannot be made.  While it could be argued that PCS processes should be able to catch system exceptions (like it does business exceptions) using error boundary events, this explains how these are handled and something to guard against.</p> <p>If you have used Oracle BPM or SOA on-premise products, you might already know that a fault policy can be defined that defines how exceptions are handled for the deployed composite.  Similarly, when PCS applications are deployed, they automatically have a fault policy to handle system exceptions under the covers as well.   This fault policy simply retries the service that failed three times and makes the instance available to be handled in the Recoverable Instances tab shown above. </p> <p>What is causing some people problems is a new deployment option in PCS.  If you have deployed a PCS application recently, you might have noticed that the 4th step where you specify the "Deployment Options" has a new "Use Fault Policies" for system exceptions checkbox.  </p> <p><img alt="New PCS deployment option to handle system exceptions at the process level" data-entity-type="file" data-entity-uuid="25ece32a-f7fd-4b26-a563-d6f241fa2317" height="374" src="/sites/default/files/inline-images/5.%20DeploymentUseFaultPoliciesCheckbox.png" width="515" /></p> <p>Something to be aware of is that when error boundary events are added to Service Task activities, these events do not catch system exceptions by default. </p> <p><img alt="Single Error Boundary Event on an activity" data-entity-type="file" data-entity-uuid="4726ae98-54f1-41b2-a873-6fdbbe1d0598" src="/sites/default/files/inline-images/4.%20Single%20boundary%20error%20event.png" /></p> <p>Unless the new "Use Fault Policies" deployment checkbox is unchecked, instances with system exceptions ignore error boundary events.  Instead of being routed via the intended boundary event's sequence flow path, the instances are instead retried 3 times and are then left in the service task for manual recovery.</p> <p>By unchecking the "Use Fault Policies" checkbox during deployment, however, system exceptions are instead surfaced to the process and boundary error events have the potential of working for every process in the deployed PCS application.  Do this with caution though because:</p> <ol><li>If unchecked and the system exception is not caught in a boundary error event in the activity, the instance rolls back to the previous activity in the process.  To keep the instance from rolling back to the previous activity, each of the service activities would need to have boundary error events attached to them.</li> <li>Error boundary events handle system exceptions differently for Subprocess and Service activities.  Although boundary error events work for Service activities, system exceptions are not caught today in boundary error events for Subprocess activities.   </li> </ol><p>Here is a matrix that describes how system exceptions are handled with and without the fault policy and with and without boundary error events.</p> <p><img alt="System Exception Handling in PCS" data-entity-type="file" data-entity-uuid="bfc00b95-9ae7-49cc-a9c3-4ef6053a003a" height="338" src="/sites/default/files/inline-images/6.%20System%20exception%20handling%20in%20PCS.png" width="670" /></p> <p>Because PCS has no Error Event Subprocess activities that could catch all exceptions at the coarse grained process level, and because boundary error events do not catch system exceptions in Subprocess activities, during deployment leave the “Use Fault Policies” checkbox checked during PCS deployments and handle system exceptions in the “Recoverable Instances” tab. </p> <p> </p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=679&amp;2=comment_node_blog&amp;3=comment_node_blog" token="L8sb5beyI52M6T182o7RGVoPK3CwpY9Y6ucpvl0JA-Y"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog/categories/bpm" hreflang="en">BPM</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Wed, 04 Oct 2017 18:05:46 +0000 Dan Atwood 679 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/process-cloud-service-pcs-system-error-exception-handling#comments Excluding Previous Lane Participants in Oracle BPM 12c https://www.avioconsulting.com/blog/excluding-previous-lane-participants-oracle-bpm-12c <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/2017-08/4eyes3.png" width="604" height="601" alt="Exclude previous participant in Oracle BPM 12c" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/excluding-previous-lane-participants-oracle-bpm-12c" hreflang="en">Excluding Previous Lane Participants in Oracle BPM 12c</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p>The <a href="http://whatis.techtarget.com/definition/four-eyes-principle">4-Eyes principle</a> is the term used when you want to ensure that a task is approved by more than one person. This is needed in Oracle BPM approval processes to exclude previous participants from approving tasks in a process that they had approved upstream in a process.  The purpose of this blog is to explain how this is done differently in Oracle BPM 12c processes than it was in 11g (Marcel van de Glind wrote an outstanding blog on <a href="https://myfmw.wordpress.com/2014/02/20/humantask-assignment-not-the-same-lane-participant-as-previous-task-four-eyes-principle/">how to prevent the previous participant from approving the same task in Oracle BPM 11g</a>).  </p> <p> </p> <p>In this example even though the two activities are assigned to the same role, the business wants any user that approves a task in the "First User Task" activity not to be able to approve tasks in the "Second User Task" activity. </p> <p><img alt="Process with two user activities" data-entity-type="file" data-entity-uuid="847a8341-f28a-44ec-97b6-096dce9ba7e7" src="/sites/default/files/inline-images/4-eyesProcess_0.png" /></p> <p> </p> <p> </p> <p>In both releases Oracle BPM 11g and 12c, this can be accomplished when the human task is initially created by checking the "Exclude previous participants" checkbox.</p> <p><img alt="Exclude previous participant as human task is initially created" data-entity-type="file" data-entity-uuid="64b1d424-7498-4376-aae0-9b9434519a9f" height="474" src="/sites/default/files/inline-images/exclude%20previous%20participant%200%20human%20task.png" width="503" /></p> <p> </p> <p>The problem is when you try to set this property after the human task has already been created.  In 12c, in order to exclude the previous approver of a task from approving the same task downstream, open the downstream human task ("SecondUserTask" in this example) -&gt; click the "Assignment" tab -&gt; click "Early Completion" (I'd agree that "Early Completion" is a strange place to have placed this property).</p> <p><img alt="Human Task Early Completion" data-entity-type="file" data-entity-uuid="b901918a-3755-4265-a3b0-c23fb3590912" height="327" src="/sites/default/files/inline-images/exclude%20previous%20participant%201.png" width="565" /></p> <p>In the <em>Early Completion</em> dialog, check the "<strong>Exclude previous participants"</strong> checkbox.</p> <p><img alt="Exclude previous participant checkbox to enable 4-eyes" data-entity-type="file" data-entity-uuid="6c5a5d84-e84d-43be-863b-e0bb04d66d23" src="/sites/default/files/inline-images/exclude%20previous%20participant%202.png" /></p> <p><span class="im">After deploying the project, you are initially going to think this is not working.  The reason is the user who approved the task initially in the first activity will still be able to see the task in the second activity downstream.  Here are the actions that the user has available for tasks in the first activity in the process.</span></p> <p><img alt="Approval actions in first activity" data-entity-type="file" data-entity-uuid="bcbf4779-8368-4a6a-8fe0-c69f423a525e" height="305" src="/sites/default/files/inline-images/exclude%20previous%20participant%202a.png" width="494" /></p> <p>Once approved, the same user will still see the task in the second activity in the process (the one that they were supposed to be excluded from).</p> <p><span class="im"><img alt="The excluded user still sees the task in their inbox" data-entity-type="file" data-entity-uuid="949ccd4d-1a42-4bb8-a470-a8769b653bbb" height="145" src="/sites/default/files/inline-images/exclude%20previous%20participant%203_0.png" width="756" /></span></p> <p><span class="im">If you select the instance in the second activity, however, you see that that user is no longer able to approve the task when the "Actions" button is selected in the Workspace.</span></p> <p><img alt="The user is no longer able to approve the task in the second activity" data-entity-type="file" data-entity-uuid="3bfb514f-dbea-4867-b7b5-68e4afbeae06" src="/sites/default/files/inline-images/exclude%20previous%20participant%204_0.png" /></p> <p>Download the exported project used in this example from <a href="https://drive.google.com/file/d/0Bwqetn0fpi74dkpURnV6NmRxdUk/view?usp=sharing">here</a>.</p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <a id="comment-2067"></a> <div class="container blog-comments"> <div class="row"> <div class="col-sm-12"> <div class="pull-left author"> <div>Ronen</div> </div> <div class="comment-date"> <div>December 15, 2017</div> </div> </div> </div> <div class="row"> <div class="col-sm-12 comment-body"> <div><p>Hi Dan</p> <p>Thanks for the post. It helped me understand this strange behaviour... </p> <p>I'm trying to use Exclude Previous Participants together with the Round Robin assignment pattern and the result is problematic. The round robin algorithm doesn't exclude the user, so the user is assigned with the task but has only withdraw (the excluded use was the initiator like in your example) and Create ToDo options, and no other user is assigned with the task, so actually nobody can handle the task.</p> <p>Have you seen this behaviour?</p> <p>I'm using BPM 12.1.3 (project constraints).</p> <p>Thanks<br /> ronen</p></div> </div> </div> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=675&amp;2=comment_node_blog&amp;3=comment_node_blog" token="7PhJxGNUVRfVAp0vEHbJt3ckeQ2ucYCYm1L9oP5sfi0"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog/categories/bpm" hreflang="en">BPM</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Wed, 30 Aug 2017 00:05:01 +0000 Dan Atwood 675 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/excluding-previous-lane-participants-oracle-bpm-12c#comments Reducing the Number of PCS Email Notifications to Process Initiators https://www.avioconsulting.com/blog/reducing-number-pcs-email-notifications-process-initiators <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/2017-08/0%20completed.png" width="1151" height="601" alt="Completed email sent to process initators" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/reducing-number-pcs-email-notifications-process-initiators" hreflang="en">Reducing the Number of PCS Email Notifications to Process Initiators</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p>Much like the number of telemarketing phone calls we all receive daily on our phones, Oracle Process Cloud Service (PCS) sends out a lot of email notifications to the initiators of process instances.</p> <p> </p> <p>This is because the default behavior of the PCS is to send an email notification to the initiator of a process instance <u>every</u> time a human activity in the process completes.  Although these emails can be customized using the new email template feature, end users still find these notification emails filling up their inboxes both confusing and unnecessary. </p> <p><img alt="Human Activity completion email notification to the initiator of a process instance" data-entity-type="file" data-entity-uuid="7966d9f4-1beb-4169-b9ba-f342ba71defa" height="313" src="/sites/default/files/inline-images/0%20completed.png" width="595" class="align-left" /></p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <div class="paragraph-btn-body">Although there is currently no out of the box option in PCS to prevent these emails from being sent to process instance initiators, there is a fairly simple workaround to this issue.  First select the <em>Start</em> event of the process, and open its Data Association.</div> <p> </p> <p><img alt="Open the process start event's data association" data-entity-type="file" data-entity-uuid="1da9fb82-f41f-4e0a-b6f4-1baa2b10fbb7" src="/sites/default/files/inline-images/1%20open%20data%20association.png" class="align-left" /></p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Because it is often necessary to know who initiated an instance downstream in the process, first create a data association to save the <em>creator</em> predefined variable's value coming out of the Start event to a process variable (1 below).  Next, set the creator predefined variable to an empty string (2).</p> <p> </p> <p><img alt="Set output of the start event's data association" data-entity-type="file" data-entity-uuid="17eff01d-e9b4-44bf-8cf2-dea1c221cfeb" height="269" src="/sites/default/files/inline-images/2%20output%20of%20start%20event%20setting%20creator%20to%20empty.png" width="630" class="align-left" /></p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>As shown above, an empty string in a PCS process activity’s data association is set using two double quotes next to one another (e.g., “”).</p> <p> </p> <div class="paragraph-btn-body">Once the <em>Apply</em><strong> </strong>button is clicked in the data association dialog, and the PCS application is saved, published and redeployed, process instance initiators will no longer receive email notifications every time human activities complete downstream in the process.</div> <p> </p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=671&amp;2=comment_node_blog&amp;3=comment_node_blog" token="nvtvUVX6dYY7xbCYTuJZSSqYOqseLUJVJd8d4AP4kOk"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog/categories/bpm" hreflang="en">BPM</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Thu, 17 Aug 2017 20:47:29 +0000 Dan Atwood 671 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/reducing-number-pcs-email-notifications-process-initiators#comments Protected Flex Fields in Oracle BPM https://www.avioconsulting.com/blog/protected-flex-fields-oracle-bpm <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/protected-flex-fields-oracle-bpm" hreflang="en">Protected Flex Fields in Oracle BPM</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p>People are often confused when it comes to creating and using flex fields in Oracle BPM.  A while back, I wrote a <a href="http://www.avioconsulting.com/blog/flex-fields-oracle-bpm-11g">blog on public flex fields</a>, but this discusses protected flex fields, some best practices, and a how to avoid a bug when using them..</p> <p>Flex fields are important to know how to use because it is helpful to show instance information in the list of tasks in the Workspace.  This is done either using a protected or public flex field. </p> <p><img alt="Flex Fields in the Oracle BPM Workspace" data-entity-type="file" data-entity-uuid="be8cce5b-4574-4192-96ca-ec65e8569761" src="/sites/default/files/inline-images/ws.png" class="align-left" /></p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Both public or protected flex fields serve the same function.  They are simply created slightly differently and are mapped to a different set of flex field attributes.  I personally prefer using protected attributes because I'm a pretty simple guy, and find the path to creating and using them to be a simple three step process:</p> <p>1. Assigning a label to a protected flex field in the Workspace</p> <p>2. Adding a mapped attribute in the human task in your Oracle BPM project in JDeveloper</p> <p>3. Adding the protected flex field as a column in a view in the Workspace</p> <h3>1. Assigning a label to a protected flex field in the Workspace</h3> <p>First, to add the labels for the different protected flex fields, log in as an administrator in the Workspace.  In 12c, click the administrators' user id in the upper right corner -&gt; click <strong>Administration </strong>from the drop-down.  Select <strong>Protected Flex Fields</strong> -&gt; wait a minute for the Protected Flex Field Mapping form to display and then click  +.  </p> <p>If you wanted to display a candidate's name in a Workspace's inbox task list or view in the third step, you would enter text "Candidate Name" in the Label Name field (this is the text that will be displayed in the header of the column in the Workspace’s task list) -&gt; click the <strong>Create </strong>button.</p> <p><img alt="Assign a label to a protected flex field" data-entity-type="file" data-entity-uuid="15c25130-d4e0-4a5a-8574-b659f723265b" src="/sites/default/files/inline-images/cr.png" class="align-left" /></p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>A common problem I see is when several different protected flex fields are all given the same label (e.g., "Name").  If this is done, you're going to get confused in the third step because you will see text "Name" three times in the <em>Available Columns</em> list to be displayed.  As a best practice, give each of the flex fields different label names (e.g., "Candidate Name", "Company Name") to avoid getting confused in the third step. </p> <p>A problem occurs when you try to add more than one label for a specific protected flex field.  Do not do this.  There is a bug that prevents this from working correctly.</p> <p><img alt="Protected Flex Field assigned multiple labels" data-entity-type="file" data-entity-uuid="44451fbf-666c-4531-ae22-af506de3c3aa" src="/sites/default/files/inline-images/pflex.png" class="align-left" /></p> <p> </p> <p> </p> <p> </p> <p> </p> <p>As shown above, although the user interface appears to allow a single flex field (ProtectedTextAttribute1 in this case) to be assigned several labels, only the first label will be displayed ("Candidate Name" in this example), at runtime in the Workspace.</p> <p><img alt="Result of adding Protected Flex Field assigned multiple labels" data-entity-type="file" data-entity-uuid="cd8248ba-ea04-4b47-8e2e-493e0e10a3eb" src="/sites/default/files/inline-images/dup_0.png" class="align-left" /></p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>If only one label is added to the view and it is not the first label, the first label will be displayed instead of the one you wanted.</p> <p>The key thing is to avoid assigning multiple labels to the same protected flex field.  Work around this issue by not adding multiple labels to a single flex field, and instead use any one of the other Protected Text Attributes or 20 Public Text Attributes for the other label assignments.  </p> <h3>2. Adding a mapped attribute in the human task in your Oracle BPM project in JDeveloper</h3> <p>Because the Workspace’s task list shows information currently inside human tasks and because flex fields can only show primitive variables (e.g., strings, numbers, and integers), a new mapped attribute needs to be added inside the human task for each value to be displayed in the Workspace.  To add the mapped attribute, open the Oracle BPM project's human task in JDeveloper -&gt; click the human task’s <b>Data</b> tab -&gt; click + beside the <i>Mapped Attributes</i>.</p> <p><img alt="Add a protected flex field's mapped attribute" data-entity-type="file" data-entity-uuid="437426a9-1b87-4718-823d-118b3ca93d93" src="/sites/default/files/inline-images/m.png" class="align-left" /></p> <p> </p> <p> </p> <p> </p> <p> </p> <p>From the top drop-down, select the <em>Application Server</em> where the project is deployed -&gt; in the <i>Attribute</i> dropdown select the protected flex field label created in the first step ("Candidate Name (Protected Text Attribute1" in the example below<b>) </b>that was previously added to the Workspace  for the <i>Value </i>field -&gt; select the XPath Expression icon to the right of the <em>Value </em>field to map the flex field with the human task element.</p> <p><img alt="Assigning the mapped attribute to the flex field" data-entity-type="file" data-entity-uuid="7d9aa13a-984b-490d-bb5d-234f77a73eae" src="/sites/default/files/inline-images/m2.png" class="align-left" /></p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Expand payload from the list -&gt; select the primitive element to associate it to -&gt;<b> </b>click the <b>Insert Into Expression </b>button.</p> <p><img alt="Assign the payload element to the mapped attribute" data-entity-type="file" data-entity-uuid="1dc1ca4e-f27c-48e6-a307-d100b84dfdaf" src="/sites/default/files/inline-images/m3.png" class="align-left" /></p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Once you click <strong>OK</strong>, the new mapped attribute should now be present in the human task Data tab.</p> <p><img alt="Mapped attribute in the human task's Data tab" data-entity-type="file" data-entity-uuid="37984e18-7220-4648-94f3-c852fbc0833e" src="/sites/default/files/inline-images/m4.png" class="align-left" /></p> <p> </p> <p> </p> <p> </p> <p>Redeploy the BPM project so that the change can take effect. </p> <h3>3. Adding the protected flex field as a column in a view in the Workspace</h3> <p>Add the flex field columns to views in the Workspace by clicking the <em>Edit Settings </em>pencil button.</p> <p><img alt="Edit the inbox view" data-entity-type="file" data-entity-uuid="4a0b8452-2ab5-4884-9cbc-ad088d4fba8c" src="/sites/default/files/inline-images/ed.png" class="align-left" /></p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Scroll down the <em>Available Columns </em>list on the left to the bottom and select the desired protected flex fields to be added (in the example below, the protected flex field labels "Salary" and "Candidate Name" will be added) -&gt; click the &gt; button to add these to the <em>Selected </em>list -&gt; click OK.</p> <p><img alt="Select the protected flex fields labels to add to the view" data-entity-type="file" data-entity-uuid="95ae3945-2c25-401a-898c-19af1aba3bac" src="/sites/default/files/inline-images/se.png" class="align-left" /></p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p style="margin-right:-27.0pt">To test that the information is displayed in the Workspace, create a new work item instance in the process.  Ensure the new instance reaches the activity associated with the human task modified in the second step.  Note the specific instance information displayed in the view/inbox.</p> <p style="margin-right:-27.0pt"><img alt="Workspace displaying protected flex fields in the inbox" data-entity-type="file" data-entity-uuid="9e07c335-39cb-426c-932c-731d4437287d" height="107" src="/sites/default/files/inline-images/in.png" width="605" class="align-left" /></p> <p style="margin-right:-27.0pt"> </p> <p style="margin-right:-27.0pt"> </p> <p style="margin-right:-27.0pt"> </p> <p style="margin-right:-27.0pt">Again, avoid these two issues when using flex fields:</p> <p style="margin-right:-27.0pt">1. Do not use the same text for labels in different flex fields.  If in the first step you made the mistake of assigning the text "Name" to three different protected flex field labels, then you will see "Name" three times in the <em>Available Columns</em> list.  </p> <p style="margin-right:-27.0pt">2. Do not assign multiple labels to the same flex field.  If this is done, only the first label assigned to the flex field will be displayed on the view.</p> <p style="margin-right:-27.0pt"> </p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=665&amp;2=comment_node_blog&amp;3=comment_node_blog" token="-6QYpgK97MSP9-iVsB-Xak3gCC_X6tDSA597A74qMpU"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog/categories/bpm" hreflang="en">BPM</a></div> <div><a href="/blog/categories/soa" hreflang="en">SOA</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Thu, 13 Jul 2017 15:33:58 +0000 Dan Atwood 665 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/protected-flex-fields-oracle-bpm#comments