Blog Lead Image - Cloud Platform http://www.avioconsulting.com/taxonomy/term/362 en Docker with AWS Elastic Beanstalk: What's in it for you? http://www.avioconsulting.com/blog/docker-aws-elastic-beanstalk-whats-it-you <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/docker-aws-elastic-beanstalk-whats-it-you" hreflang="en">Docker with AWS Elastic Beanstalk: What&#039;s in it for you?</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 dir="ltr">The Docker revolution was based on the promise to add automation and customizability to both application development cycles and deployments. Microservices, which in Docker words means each container in a cluster performs only one specific task, is in fashion now. However, managing large numbers of containers may become a very complex and time-consuming task in the long run. Enter AWS Elastic Beanstalk.  </p> <p dir="ltr">Elastic Beanstalk service can abstract away several system administration levels, as AWS itself will take care of hardware provisioning and administration, networking, and more. But while running Docker Engine on a local machine, and to some extent exposing some public service to the web, is not necessarily going to be all that difficult. The real power of launching automated clusters of containers is a different story, and particularly if there is a need to launch those clusters into a public cloud like AWS. Technologies such as Ansible, Chef, Puppet, and ECS can help hiding the complexity. Nevertheless, the learning curve for such tools can sometimes be as complex as manually managing clusters.</p> <p dir="ltr">Elastic Beanstalk is a service that accepts your application code as input, and then invisibly embeds the code within a complete network and compute infrastructure. All that is needed is for users to select platform like Java, .NET, Python or Docker, and the service does the rest. This means that the EC2 and database instances, security groups, load balancers, auto scaling and other services the application needs, will be automatically added, integrated, and continuously maintained for you. Elastic Beanstalk can always be used from the web console, but as a developer, perhaps the command window would make more sense. Besides, everything always looks much more interesting from the command window. To be able to do that, the EB CLI needs to be install, which is fairly easy. All that is needed is to have pip, the Python package manager, and from there install the EB CLI. A detailed article on installing EB can be found on <a href="http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-install.html">here</a>. Once it is finished, typing EB alone should bring up the help page.</p> <p dir="ltr">From the application root directory, typing "eb init" will initialize a new EB application. Regions, name, platform (Docker and Docker version), as well as SSH access options, will be prompted for the selection. Behind the scenes when you initialize an application locally and push it to AWS, what really happens is AWS creates two entities. A space to hold your application files called a framework, and secondly, it creates an environment, which is the infrastructure automatically created by Beanstalk. This means everything from EC2 instance, a load balancer, auto scaling rules, CloudWatch alarms, and security groups are created as part of the supporting infrastructure, depending on how the questions after the "eb init" were answered. A useful command is eb platform show as it will display some of the platform and environment values that will be used to create subsequent applications.</p> <p dir="ltr">There are three ways to prepare an environment in Beanstalk. Two are primarily based on the version used in the Dockerrun.aws.json. Version 1 is the simplest one; It is used to run single containers and as a result, there is no setup or need for load balancing or auto-scaling. As expected version 2 is designed for multiple container architectures. A very interesting option is the “preconfigured” option. AWS makes Amazon machine images available that are preloaded with fully configured versions of popular deployment profiles on top of Amazon Linux. This is a rather convenient way to get developers a head start in building the application environment.</p> <p dir="ltr">AWS documentation provides a simple, yet popular, example of a pre configured environment. On the folder, the application was initialized, simply create a Dockerfile and copy-paste the details found in the AWS documentation <a href="http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_dockerpreconfig.dockerfile.html">here</a>. Next step is pulling the trigger and executing eb create and the name for the environment i.e. eb create DEV.  That’s it! It's all done. After a good 15 minutes, a pre-configured Docker platform for Glassfish and Python should have been created.The console will show you log messages throughout the creation. But, for curious developers, you can always go to the browser console and see the EC2 and everything that is being created at runtime.</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=666&amp;2=comment_node_blog&amp;3=comment_node_blog" token="Lzml63Gd5J2X6qXFsFBJDi763u7h360eRrIbxclmLh8"></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/digital-transformation" hreflang="en">Digital Transformation</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, 25 Jul 2017 18:18:59 +0000 Daniel Rodriguez 666 at http://www.avioconsulting.com http://www.avioconsulting.com/blog/docker-aws-elastic-beanstalk-whats-it-you#comments Come Visit AVIO at MuleSoft CONNECT 2017 http://www.avioconsulting.com/blog/come-visit-avio-mulesoft-connect-2017 <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/come-visit-avio-mulesoft-connect-2017" hreflang="en">Come Visit AVIO at MuleSoft CONNECT 2017</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 href="https://connect.mulesoft.com/">MuleSoft’s 2017 CONNECT</a> is shaping up to be a great one. So many opportunities to gain insights from MuleSoft experts, hands-on learning and networking opportunities, as well as learning about new MuleSoft capabilities. See my <a href="http://www.avioconsulting.com/blog/mulesoft-connect-top-sessions">blog</a> for further details regarding top sessions and workshops at CONNECT.</p> <p>In addition to the sessions and workshops, we invite you to stop by AVIO’s booth to learn about a new tool we are unveiling, OSB conversion accelerator. Leveraging our prior Oracle Service Bus knowledge, along with our MuleSoft expertise, we have developed a tool that converts Oracle Service Bus 11g projects into MuleSoft projects. OSB proxies, business services, message processing components, communication components, and flow control components all can be easily converted into Mule concepts within our tool. Along with this, best practices are adhered to including the Mule project structure, usage and definition of external properties, global connector definitions, and usage of the APIKit SOAP.</p> <p>At our booth, we will have a demo that shows how we convert 4 different real world OSB scenarios into functioning MuleSoft solutions. One of the scenarios comes from an employee on-boarding process in which a SaaS application invokes a REST service exposed in OSB, synchronizing new employee data with on premise applications:</p> <p><img alt="OSB Proxy for MuleSoft Conversion" data-entity-type="file" data-entity-uuid="182432a7-2684-4f76-bfed-7459738bf3b0" height="307" src="/sites/default/files/inline-images/osbproxy.jpg" width="457" /></p> <p>OSB converted into Mule using AVIO's conversion tool:</p> <p><img alt="MuleSoft Flow" data-entity-type="file" data-entity-uuid="68b4cb3a-a865-43f6-9b81-0d4565398a58" height="334" src="/sites/default/files/inline-images/muleflow.jpg" width="366" /></p> <p>Please stop by and chat with us at the AVIO booth or, if your calendar is already full, you can <a href="http://www.avioconsulting.com/mulesoft-connect-migration">schedule a specific time</a> to come by the booth to discuss the conversion process. We’d love the opportunity to meet you and share our new tool with you!</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=642&amp;2=comment_node_blog&amp;3=comment_node_blog" token="91TgwbB66pmJtrIP87Z-kpfadvf228f-VIlq_lha5zI"></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/mulesoft" hreflang="en">MuleSoft</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, 05 Apr 2017 17:13:56 +0000 Jennie DeRosa 642 at http://www.avioconsulting.com http://www.avioconsulting.com/blog/come-visit-avio-mulesoft-connect-2017#comments 3 Keys to Getting Up to Speed with Microservices http://www.avioconsulting.com/blog/3-keys-getting-speed-microservices <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/3-keys-getting-speed-microservices" hreflang="en">3 Keys to Getting Up to Speed with Microservices</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>Is your organization up to speed with microservices? Many people like to think their organizations are getting there, but in case you aren’t here’s some key points on why you should be. Abel Tong, Senior Director of Solutions Marketing at Ciena, argues that developers need to move away from the old, monolithic approach and start breaking down large applications into smaller ones. Tong highlights this concept in his post on LightReading.com, <a href="http://www.lightreading.com/nfv/nfv-elements/getting-up-to-speed-on-microservices-/a/d-id/730154">Getting Up to Speed on Microservices</a>, as he discusses the importance of microservices to an organization.</p> <blockquote> <p><em>Microservices address these challenges by providing a more streamlined development methodology made popular in cloud services, and specifically designed to make applications easier to enhance, maintain and scale as needed. A microservices architecture is crucial for any organizations seeking greater agility to remain competitive.</em></p> </blockquote> <p>As microservices grow into the primary way of building applications, it is important to remember the three point that Tong highlights in this article.</p> <blockquote> <p><strong>1. Microservices can help increase agility, accelerate development, and improve software quality.</strong></p> <p><strong>2. Software developers must rid themselves of the traditional way of thinking and start breaking down     large applications into smaller ones. This way, each individual component can be scaled up, down, or replicated to meet an application's scalability and reliability requirements.</strong></p> <p><strong>3. It takes some education and training, but microservices encourage collaboration across an organization's development and operations team.</strong></p> </blockquote> <p>If you believe that your organization is not up to speed with microservices, we’d be happy to share how AVIO is leveraging the <a href="http://www.avioconsulting.com/technologies/mulesoft-anypoint">MuleSoft Anypoint Platform</a> to help organizations create their own microservices architecture.  </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=623&amp;2=comment_node_blog&amp;3=comment_node_blog" token="tcApkV52Ko0vKVijMdgKgCgqFt3kztgXHj3kUPtQ0To"></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/digital-transformation" hreflang="en">Digital Transformation</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, 24 Feb 2017 16:27:44 +0000 Jordan Nichols 623 at http://www.avioconsulting.com http://www.avioconsulting.com/blog/3-keys-getting-speed-microservices#comments Solving the Innovation Challenge: Microservices http://www.avioconsulting.com/blog/solving-challenges-innovating-microservices <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/solving-challenges-innovating-microservices" hreflang="en">Solving the Innovation Challenge: Microservices</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>Sequoia partner Matt Miller has a Wall Street Journal article, <a href="http://blogs.wsj.com/cio/2015/10/05/innovate-or-die-the-rise-of-microservices/">Innovate or Die: The Rise of Microservices</a>, that discusses how organizations willing to innovate will be the organizations that not only survive, but thrive in the digital economy. However, innovation isn't something that comes naturally, or easily, for many people or organizations. Innovation requires taking risks, delving into the unknown, and the capability to move quickly. Those are not characteristics that many organizations are comfortable with. </p> <p>As Matt mentions, microservices are a key component to the innovation landscape. As a framework to help organizations modularize their systems, reuse IT assets, and increase the speed of application delivery, microservices are quickly becoming a necessity for every organization. Companies such as Facebook, Netflix, Uber, and Amazon have already fully embraced microservices philosophies and are leveraging the operational benefits to stay far ahead of their competition.</p> <p>However, microservices are not an end all be all solution that can quickly be adopted with results immediately seen. As Matt states, there is significant planning to be done and coordination between groups that may have not previously worked together. In order to fully take advantage of a microservices approach, organizations may have to reorganize, realign, or otherwise restructure teams to facilitate changing at the speed of business. </p> <p>Luckily, tools like <a href="http://www.mulesoft.com">Mulesoft Anypoint</a> provide an underlying platform on which to create a microservices architecture. Coupled with containerization software such as Docker, organizations can use Mulesoft Anypoint to quickly build APIs, deploy to the Anypoint cloud, and create a strong microservices architecture that provides significant advantages over traditional SOA and point to point integration approaches. </p> <p>We love talking about microservices, innovation, and digital transformation. Please <a href="http://www.avioconsulting.com/contact">contact us</a> to hear how our clients are accelerating their innovation capabilities and to see how we can help you as well. </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=616&amp;2=comment_node_blog&amp;3=comment_node_blog" token="LgWBYm0trxOKIReQ4K5u0p4ZCKRPsWGT4ZB6Goom2NQ"></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/digital-transformation" hreflang="en">Digital Transformation</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, 09 Jan 2017 19:55:28 +0000 Brandon Dean 616 at http://www.avioconsulting.com http://www.avioconsulting.com/blog/solving-challenges-innovating-microservices#comments Enabling Effective Data Stewardship http://www.avioconsulting.com/blog/enabling-effective-data-stewardship <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/enabling-effective-data-stewardship" hreflang="en">Enabling Effective Data Stewardship</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><h3 dir="ltr">The Value of Data</h3> <p dir="ltr">Data is the currency of digital enterprise. The fuel of technology, its influx and exchange power the digital capability to market products, reach and engage customers, manage business operations, and perform countless other functions. And because data is typically retained rather than expended in the process, it accumulates into vast, dynamic stockpiles of granularized digital fact.</p> <p>The intrinsic financial value of these stockpiles can be seen in the goodwill gap between the market values of companies built on data, like Twitter and Uber, and their actual market value. <a href="http://www.forbes.com/sites/howardbaldwin/2015/03/23/drilling-into-the-value-of-data/#3524a1432872">According to Forbes</a>, as of May 2015, Facebook was valued at $200 billion, while United Airlines, a company that owns and operates tangible objects of value, most notably a large fleet of passenger jets, was valued at $34 billion.</p> <p dir="ltr">Beyond its financial valuation, and especially in today’s world of big data and analytics, your data represents as well a latent reserve of potential competitive advantage. Analysis, interpretation, and correlation render raw data into useful information that can guide strategy, drive innovation, enrich customer engagement, and even contribute to the top line. The business value of data is limited only by the ingenuity and insight with which it’s rendered into information.</p> <h3>Enabling The Alchemy of Digital Enterprise</h3> <p>Given the practically limitless potential of data, this ongoing rendering process—from disconnected and uninterpreted facts and figures into usable, illuminative information—deserves the full weight of an organization’s collective creative insight. In order to accomplish this, its people need to be as comfortable and up-close with the data as possible. This requires that data be secure, easily accessible, and usably formatted. Data stewardship involves storing, securing, and formatting data to enable and facilitate the coordinated analytical attention most likely to yield competitively valuable insight. While IT departments have taken the lead in data stewardship, particularly around security and maintenance, it’s a responsibility shared across the entire digital enterprise.</p> <h3>Transforming Our Thinking</h3> <p>Digital transformation entails a change in our thinking, as we reimagine the relationships between people and technology, and the business models through which they interact. This includes a transformed understanding of the value of data and people’s relationships with it. Effective data stewardship flows from a deep organizational understanding of its critical importance, rooted in an informed and committed embrace of the potential breadth and scale of data’s value. Enabling data stewardship starts with fostering an organizational mindset that prioritizes fulfilling the promise of data and with engendering a culture in which everyone is creatively engaged in leveraging it towards competitive advantage.</p> <h3>AVIO</h3> <p>Let <a href="http://www.avioconsulting.com">AVIO Consulting</a> help you leverage your data into a greater competitive advantage by reshaping the way you understand and interact with it. We are digital transformation specialists, and our passion is helping companies like yours become agile, efficient digital enterprises, adept at turning data into information; and information into enlightened strategy, disruptive innovation, and meaningful customer engagement. <a href="http://www.avioconsulting.com/contact">Contact us today.</a></p> <p> </p> <p dir="ltr"> </p> <p> </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"> <a id="comment-1087"></a> <div class="container blog-comments"> <div class="row"> <div class="col-sm-12"> <div class="pull-left author"> <div>Melissa</div> </div> <div class="comment-date"> <div>August 18, 2016</div> </div> </div> </div> <div class="row"> <div class="col-sm-12 comment-body"> <div><p>Thanks, Jordan! I guess I didn't quite catch the transforming effect. What do you mean by organizational understanding? Working on the investigation, I'll need to explain the point thoroughly.</p></div> </div> </div> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=575&amp;2=comment_node_blog&amp;3=comment_node_blog" token="-Tc82GStUP-CcSsqFHOIUD_aIBVFlFaMBH9S53yYOz8"></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/digital-transformation" hreflang="en">Digital Transformation</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, 29 Jul 2016 21:33:03 +0000 Jordan Nichols 575 at http://www.avioconsulting.com http://www.avioconsulting.com/blog/enabling-effective-data-stewardship#comments Configure Maven ADF Integration Testing http://www.avioconsulting.com/blog/configure-maven-adf-integration-testing <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/configure-maven-adf-integration-testing" hreflang="en">Configure Maven ADF Integration Testing</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><h3 id="ConfigureADFIntegrationTestsforMaven-Overview">Overview</h3> <p>The ability to add ADF-BC JUnit Tests has been available since 11g and they worked nicely out-of-the-box within JDeveloper as well as in batch via Ant tasks.  Maven support was added in 12c (12.1.3) and running them in Maven, as of this writing, requires that a small number of adjustments be made to the JDeveloper Model project POM.   </p> <h3 id="ConfigureADFIntegrationTestsforMaven-SeparateTheModelProjectSourceFolders">Separate The Model Project Source Folders</h3> <p>Use of Maven convention over configuration would prescribe the use of certain folder structures for the source code in the ADF Model project. According to Maven convention the project java source code would resides in <strong>src/main/java</strong> while the JUnit tests would reside in <strong>src/test/java</strong>. The Maven build phases default to these source code locations and having them elsewhere requires POM customization. It is likely if you have created your project already that you may not have followed this convention.</p> <p>In the case provided here, the project was refactored to use the default Maven source directory structures. This was relatively easy to do as the ADF-BC JUnit tests had not yet been created. The original source code for the ADF-BC Model was moved into the <em>src/main/java</em> folder (recognizing that a small percentage of the files are in fact Java). This allowed the JUnit tests added to the project via a Gallery Wizard to be created in the project in the <em>src/test/java</em> folder. The Maven phases to build the project Java and tests were then separated nicely and does not require any modifications to the project POM to implement the source path locations for each.</p> <p id="ConfigureADFIntegrationTestsforMaven-DefineSourceCodeFolders"><strong>Define Source Code Folders</strong></p> <p>Before you add the JUnit tests to the Model project there should be two source folders defined in the Model project. Before you run the Gallery wizard to create the ADF-BC JUnit Suite you must move the src/test/java folder to the 1st source folder locations as this is where the Wizard will create them.</p> <figure role="group"><img alt="Define Source Folders" data-entity-type="file" data-entity-uuid="c49a9da5-f2e4-4649-b83f-48ca2a641ac5" height="304" src="/sites/default/files/inline-images/define-source-folders_0.png" width="628" /><figcaption><em>Define Source Folders in JDeveloper</em></figcaption></figure><p> </p> <p id="ConfigureADFIntegrationTestsforMaven-CreateJUnitTests"><strong>Create JUnit Tests</strong></p> <p>After setting the source test directory to the number #1 position the tests will be propagated to the src/test/java directory. If you discover there are view object tests classes missing (because the class that runs them all will complain), then run the Wizard again as a workaround (hopefully this has been corrected in 12.2.1). Before re-running the Wizard make sure the src/test/java directory is still positioned as the first source directory as JDeveloper likes to swap them back.</p> <h3 id="ConfigureADFIntegrationTestsforMaven-ModifyModelProjectPOM">Modify Model Project POM</h3> <p>The Maven POM will need several adjustments, to rerence the default Apache JUnit classes rather than the Oracle ADF Library version of it which at present is missing and to modify the surefire plugin to add various paths to the test phase classpath.</p> <p id="ConfigureADFIntegrationTestsforMaven-RemoveGeneratedJUnitDependencies"><strong>Remove Generated JUnit Dependencies</strong></p> <p>Remove the two generated dependencies for JUnit from the POM. Samples of the two to be removed are shown below.</p> <blockquote> <pre> <code>&lt;</code><code>dependency</code><code>&gt;</code> <code> </code><code>&lt;</code><code>groupId</code><code>&gt;com.oracle.adf.library&lt;/</code><code>groupId</code><code>&gt;</code> <code> </code><code>&lt;</code><code>artifactId</code><code>&gt;JUnit-4-Runtime&lt;/</code><code>artifactId</code><code>&gt;</code> <code> </code><code>&lt;</code><code>version</code><code>&gt;12.1.3-0-0&lt;/</code><code>version</code><code>&gt;</code> <code> </code><code>&lt;</code><code>type</code><code>&gt;pom&lt;/</code><code>type</code><code>&gt;</code> <code> </code><code>&lt;</code><code>scope</code><code>&gt;provided&lt;/</code><code>scope</code><code>&gt;</code> <code>&lt;/</code><code>dependency</code><code>&gt;</code> <code>&lt;</code><code>dependency</code><code>&gt;</code> <code> </code><code>&lt;</code><code>groupId</code><code>&gt;com.oracle.adf.library&lt;/</code><code>groupId</code><code>&gt;</code> <code> </code><code>&lt;</code><code>artifactId</code><code>&gt;JUnit-Runtime&lt;/</code><code>artifactId</code><code>&gt;</code> <code> </code><code>&lt;</code><code>version</code><code>&gt;12.1.3-0-0&lt;/</code><code>version</code><code>&gt;</code> <code> </code><code>&lt;</code><code>type</code><code>&gt;pom&lt;/</code><code>type</code><code>&gt;</code> <code> </code><code>&lt;</code><code>scope</code><code>&gt;provided&lt;/</code><code>scope</code><code>&gt;</code> <code>&lt;/</code><code>dependency</code><code>&gt;</code></pre> </blockquote> <p id="ConfigureADFIntegrationTestsforMaven-AddApacheJUnitDependency"><strong>Add Apache JUnit Dependency</strong></p> <p>In place of the two JUnit dependencies deleted in the previous step add the following which will be downloaded from Maven Central and added to your local repository.</p> <blockquote> <pre> <code>&lt;</code><code>dependency</code><code>&gt;</code> <code> </code><code>&lt;</code><code>groupId</code><code>&gt;junit&lt;/</code><code>groupId</code><code>&gt;</code> <code> </code><code>&lt;</code><code>artifactId</code><code>&gt;junit&lt;/</code><code>artifactId</code><code>&gt;</code> <code> </code><code>&lt;</code><code>version</code><code>&gt;4.12&lt;/</code><code>version</code><code>&gt;</code> <code> </code><code>&lt;</code><code>type</code><code>&gt;jar&lt;/</code><code>type</code><code>&gt;</code> <code> </code><code>&lt;</code><code>scope</code><code>&gt;compile&lt;/</code><code>scope</code><code>&gt;</code> <code>&lt;/</code><code>dependency</code><code>&gt;</code></pre> </blockquote> <p id="ConfigureADFIntegrationTestsforMaven-AddsurefirePlugin"><strong>Add surefire Plugin</strong></p> <p>The generated POM for a Model project that is to run JUnit must necessarily include the surefire plugin. The plugin must also include configuration properties that add several key paths into the Java classpath when the tests are to be run. The first is the ADF application's <strong>.adf</strong> folder which contains the <u><em>connections.xml</em></u>. The second addition is to avoid a ClassDefNotFoundException that would occurs without also including the <strong>jps-manifest.jar</strong>.</p> <blockquote> <pre> <code>&lt;</code><code>plugin</code><code>&gt;</code> <code> </code><code>&lt;</code><code>groupId</code><code>&gt;org.apache.maven.plugins&lt;/</code><code>groupId</code><code>&gt;</code> <code> </code><code>&lt;</code><code>artifactId</code><code>&gt;maven-surefire-plugin&lt;/</code><code>artifactId</code><code>&gt;</code> <code> </code><code>&lt;</code><code>version</code><code>&gt;2.14.1&lt;/</code><code>version</code><code>&gt;</code> <code> </code><code>&lt;</code><code>configuration</code><code>&gt;</code> <code> </code><code>&lt;</code><code>additionalClasspathElements</code><code>&gt;</code> <code> </code><code>&lt;</code><code>additionalClasspathElement</code><code>&gt;</code> <code> </code><code>${basedir}/../.adf</code> <code> </code><code>&lt;/</code><code>additionalClasspathElement</code><code>&gt;</code> <code> </code><code>&lt;</code><code>additionalClasspathElement</code><code>&gt;</code> <code> </code><code>${oracleHome}/oracle_common/modules/oracle.jps_12.1.3/jps-manifest.jar</code> <code> </code><code>&lt;/</code><code>additionalClasspathElement</code><code>&gt;</code> <code> </code><code>&lt;/</code><code>additionalClasspathElements</code><code>&gt;</code> <code> </code><code>&lt;/</code><code>configuration</code><code>&gt;</code> <code>&lt;/</code><code>plugin</code><code>&gt;</code></pre> </blockquote> <h3 id="ConfigureADFIntegrationTestsforMaven-Summary">Summary</h3> <p>From a Continuous Delivery perspective, these are considered <u>online</u> unit tests to be run in the Integration Test phase, as a database connection is required. To create true <u>offline</u> unit tests it would be necessary to use a tool like DBUnit and an in-memory database like H2.</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=559&amp;2=comment_node_blog&amp;3=comment_node_blog" token="0y9tTGedDbFhxX0vTd2VK_vLBENo3vXQNp3lgwVrRxQ"></drupal-render-placeholder> </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, 25 Jun 2016 21:13:33 +0000 Gregory Hughlett 559 at http://www.avioconsulting.com http://www.avioconsulting.com/blog/configure-maven-adf-integration-testing#comments Driving a Better Customer Experience Through Digital Transformation http://www.avioconsulting.com/blog/driving-better-customer-experience-through-digital-transformation <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/2016-06/Customer%20Experience.jpg" width="5760" height="3840" alt="Customer Experience" 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/driving-better-customer-experience-through-digital-transformation" hreflang="en">Driving a Better Customer Experience Through Digital Transformation</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>Digital transformation creates opportunities to drastically improve the customer experience. Today's consumers have high expectations from the organizations they do business with, especially when it comes to seeking out smooth and streamlined processes. Companies pay particular attention to the millennial generation, as <a href="https://www.accenture.com/us-en/insight-outlook-who-are-millennial-shoppers-what-do-they-really-want-retail.aspx">Accenture reports</a> this demographic is spending $600 billion annually. These digitally driven consumers demand seamless and consistent experiences across every touchpoint, which can only be accomplished through proper process digitization implementation.</p> <h2>Omnichannel Consistency</h2> <p>Companies use many customer touchpoints to reach consumers during the buyer's journey. Websites, mobile apps, social media profiles, advertisements, events, store locations and customer service lines represent common touchpoints encountered by buyers. Many organizations put each channel in a silo, which makes it difficult or impossible to maintain consistency between channels. <a href="http://whatsnext.nuance.com/customer-experience/delta-improves-customer-service-experience-with-ivr/">Nuance found</a> 38 percent of customers get frustrated when they have to provide identical information as they move to new channels. Process digitization eliminates this problem by unifying customer data across all touchpoints.</p> <p>For example, a customer needs support after she makes an in-store purchase. She talks with a representative through live chat. This support agent sees the product purchased and other customer details through integration with the in-store POS system. The customer gets referred to the phone line and the previous chat log and product information shows up for this support rep. After the buyer gets the help she needs, she receives a follow-up email a few days later checking in to make sure she encountered no additional issues. This omnichannel customer experience approach reduces friction throughout the process and helps the consumer feel valued.</p> <h2>Customer Behavior Data Collection and Analysis</h2> <p>Digitized processes allow businesses to collect and analyze data on customer behavior. This information plays a crucial role in personalized customer experiences. <a href="http://www.gigya.com/blog/5-stats-that-prove-businesses-must-personalize-to-win-customers/">Gigya reports</a> 73 percent of buyers look for organizations offering a highly relevant experience. The company uses key data points, such as content engagement, past purchases, email click-throughs, direct interaction and other information to fully customize each touchpoint.</p> <p>Ideally, organizations use this approach on every channel for consistency, as <a href="http://www.monetate.com/blog/the-tipping-point-for-personalized-website-experiences/">Monetate discovered</a> customers spend 40 percent more with omnichannel personalization in place. This means that e-commerce sites display recommended products and related content front and center. Emails reference wish lists, abandoned cart items. and self-service customer support resources display information relating to recent purchases and website browsing. Each touchpoint benefits from micro data customization and helps improve the overall customer experience.</p> <h2>Process Digitization Implementation Best Practices</h2> <p>Fully digitized processes provide the most value, with <a href="http://www.mckinsey.com/business-functions/business-technology/our-insights/accelerating-the-digitization-of-business-processes">McKinsey finding</a> operating cost reductions of up to 90 percent. Organizations may be tempted to "boil the ocean" and tackle the end to end process all at once. However, rapidly changing business processes leads to massive disruption at all staff levels. Employees need training to get up to speed on new systems and departments may need to be restructured. Additional hiring for specialized positions also takes time. If a company rushes the process digitization implementation, it may have a negative impact on the customer experience due to the back office disruption. Organizations should incrementally digitize the processes for a smooth and controlled deployment with limited company-wide disruption.</p> <p>Customers enjoy their experiences with highly digitized companies, and they want every business to offer the same level of service. Process digitization cuts operating costs, streamlines many business processes, frees up human resources from easily automated tasks and creates consistency across all channels. Organizations need to invest in a digital transformation before they're left behind by the tech-forward competition.</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=554&amp;2=comment_node_blog&amp;3=comment_node_blog" token="tPxH4nI8P_rGR4um7paLlCsvowby_4sGRwVhJAWrCYM"></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/digital-transformation" hreflang="en">Digital Transformation</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, 15 Jun 2016 15:33:21 +0000 Brandon Dean 554 at http://www.avioconsulting.com http://www.avioconsulting.com/blog/driving-better-customer-experience-through-digital-transformation#comments Getting Started with Oracle Process Cloud Service (PCS) http://www.avioconsulting.com/blog/getting-started-oracle-process-cloud-service-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/2016-04/cloud-vector-blog.jpg" width="2083" height="2083" alt="Cloud" 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/getting-started-oracle-process-cloud-service-pcs" hreflang="und">Getting Started with Oracle Process Cloud Service (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>One of the great frustrations businesses face today is the time, money and effort it takes to solve their own business problems.  Impatient waiting for corporate IT to deliver solutions, the business often resorts to delivering their own off-the-grid software solutions.  This shows how Oracle PCS addresses this recurring issue with a more business oriented approach using smaller less technical teams to deliver automated process solutions. </p> <p><strong>Part 1 - Oracle PCS Overview</strong></p> <p>In this, Oracle PCS the product is described along with its benefits to both the business and IT.</p> <p><iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/zrPA6yzzM1Q" width="560"></iframe></p> <p><strong>Part 2 - PCS Demonstration / Tutorial - "Hello World"</strong></p> <p>This 36 minute video shows you how to create a running application using Oracle PCS from scratch.  It includes tips on getting started, how processes are modeled, the use of business rule decisions, how user interfaces are designed and tested, the integration of services into the process, and how end users interact with the completed application.</p> <p>If you are following along with the video as a tutorial:</p> <ul><li> <p>Click <a href="https://drive.google.com/file/d/0Bwqetn0fpi74YWY4dXR6eG9mc1k/view?usp=sharing">here</a> to download a <strong>PCS Hello World step-by-step tutorial </strong>that follows the steps demonstrated in the video.</p> </li> <li> <p>Click <a href="https://drive.google.com/file/d/0Bwqetn0fpi74ZFJ1VU02VHJTdUE/view?usp=sharing">here</a> to download the <strong>AVIOPCSHelloWorldCandidate.xsd</strong> file used to create the business object in the tutorial.</p> </li> </ul><p><iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/ZEfYzq_HqfE" width="560"></iframe></p> <p><strong>Part 3 - PCS Use Cases</strong></p> <p>In this video, some of the different ways that we see PCS either being used or planned on being used by the companies are described.</p> <p><iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/C1l90Ibwxe8" width="560"></iframe></p> <p> </p> </div> </div> </div> </div> </div> <div> <div>Tags</div> <div> <div><a href="/tags/oracle-pcs-hello-world" hreflang="en">Oracle PCS Hello World</a></div> <div><a href="/tags/pcs-hello-world" hreflang="en">PCS Hello World</a></div> <div><a href="/tags/oracle-pcs" hreflang="en">Oracle PCS</a></div> <div><a href="/tags/dan-atwood" hreflang="en">Dan Atwood</a></div> <div><a href="/tags/avio" hreflang="en">Avio</a></div> <div><a href="/tags/pcs" hreflang="en">PCS</a></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-1374"></a> <div class="container blog-comments"> <div class="row"> <div class="col-sm-12"> <div class="pull-left author"> <div>Vikram Srinivasan</div> </div> <div class="comment-date"> <div>March 1, 2017</div> </div> </div> </div> <div class="row"> <div class="col-sm-12 comment-body"> <div><p>Hi Dan,</p> <p>This might seem a very basic question. Where is the Composite.xml in PCS?</p> <p>Regards,</p> <p>Vikram Srinivasan</p></div> </div> </div> </div> <a id="comment-1396"></a> <div class="container blog-comments"> <div class="row"> <div class="col-sm-12"> <div class="pull-left author"> <div>Vikram Srinivasan</div> </div> <div class="comment-date"> <div>March 14, 2017</div> </div> </div> </div> <div class="row"> <div class="col-sm-12 comment-body"> <div><p>How to retrieve email ids from a json collection loop? in which activity we can write looping condition?</p></div> </div> </div> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=423&amp;2=comment_node_blog&amp;3=comment_node_blog" token="3OyN-fvXUmXzjaBNtU3_1oy7sfk8EKCycLHvDT5rnkY"></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/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> Thu, 15 Oct 2015 23:53:26 +0000 Dan Atwood 423 at http://www.avioconsulting.com http://www.avioconsulting.com/blog/getting-started-oracle-process-cloud-service-pcs#comments UI Technology Options For Human Tasks in BPM Applications http://www.avioconsulting.com/blog/ui-technology-options-human-tasks-bpm-applications <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/ui-technology-options-human-tasks-bpm-applications" hreflang="und">UI Technology Options For Human Tasks in BPM Applications</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>While many SOA and BPM projects leverage ADF, a number of clients are looking towards using responsive UI strategies based on HTML, JavaScript and REST services. This means taking on projects where the custom UIs for human tasks and possibly the workspace are built in technologies other than ADF. In some cases, our clients have expertise in a certain technology and just need help in creating the REST services for BPM related service invocation. In other cases, they have requested help choosing an alternative to ADF. In these scenarios, AVIO has utilized AngularJS and Bootstrap CSS as our choice of technology to support this need. If you are wondering which technology to leverage, ADF or a HTML/JavaScript-based framework like AngularJS, this blog can help you decide.</p> <p>When choosing the best option, there are technical and business reasons for making your choice. I will address the business reasons first and then the technology reasons second. It should be noted that if you are looking into more responsive UI designs for your human tasks, you might consider replacing the out of the box BPM Workspace in order to have a comprehensive responsive application. AVIO is working on a custom workspace as introduced in this <a href="http://avioconsulting.com/blog/now-under-development-avios-skunkworks-labs-customized-workspace-oracle-bpm">blog.</a></p> <h3>Addressing the Business Need</h3> <p>Here are a few business issues you need to consider in whether to use a framework such as AngularJS or similar. If any of these issue are true, you may be better suited for another technology than ADF.</p> <ol><li>You want a forward looking user experience and functionality that take advantage of trendy UIs you've seen on the web. (See Note 1)</li> <li>You have complex relationships between data elements that require dynamic manipulation of data elements within the UI.</li> <li>You are using Adaptive Case Management (ACM). (See Note 2)</li> <li>You want the UI to feel like changes are being made locally, and not feel the lag from server changes.</li> <li>You have in house UI expertise in HTML/JavaScript frameworks or wish to develop expertise in these technologies.</li> </ol><p>Note 1: You should leverage Oracle's Mobile ADF Framework (MAF) to create applications on mobile devices. These applications run natively on the mobile device operating system like iOS or Android. This blog is only addressing web-based development.</p> <p>Note 2: ACM (Adaptive Case Management) is a new feature within BPM 11g BP3 and 12c. The current Oracle BPM Workspace is not efficiently design for managing ACM cases and their associated tasks.</p> <h3>Addressing Technology Needs</h3> <p>ADF contains a feature-rich framework for providing highly-functional and enterprise ready UIs in a short amount of time. A JavaScript framework like AngularJS, is obviously based in JavaScript and requires a lot of it. ADF has an IDE (JDeveloper) and tools that have been around for a while now. Because of this, it has made laying out UIs somewhat easy through drag and drop palettes and What-You-See-Is-What-You-Get (WYSIWYG) editors. However since AngularJS is based in JavaScript, you are going to be a lot closer to the UI, HTML and DOM. Fine tuning the UI experience from this vantage point will prove easier in this regard because you are working directly with the UI in browser with code also in the browser. You are not trying to indirectly control it through an API and from the server.</p> <p>With ADF, a main selling point is that you don't have to get involved with manipulating the DOM or even know HTML. You get a lot of capability easily but it can be too much if there's something you need to do in HTML that is not simplified through the IDE. When this happens you are going to spend time figuring out the intricacies of ADF. You need to understand how data controls, iterators and page phase states work, to get the UI to do what you want. This is especially true if you know what you want to do in HTML but are using ADF. This includes having to write server-side Java code to interact with HTML through data controls and iterators. You can also find yourself figuring out how to write JavaScript code using the client-side components settings in ADF. You'll end up having to know JavaScript and HTML anyway, along with the intricacies of ADF.</p> <p>The amount of code you generate between AngularJS and ADF isn't a good comparison to make, especially if you don't have to write code in ADF. The real question is how much time is it going to take to write code for ADF when you have to. If the project gets to this point, than some may start to wish they had started with a JavaScript framework like AngularJS. And even though you need to write code, there are IDEs like WebStorm that makes developing JavaScript UIs easier now. There are also lots of boilerplates and open source libraries to leverage that can accelerate the start of an JavaScript/HTML UI project.</p> <p>With AngularJS, there's an initial investment you need to make over ADF. The point where the investment pays off is when you try to implement a more modern user experience. This modern experience can mean striving for a Single-Page Application (SPA) and wanting the actions made to the page to feel like they are being performed locally. Unless the action or widget is built into ADF already, then you are going to be writing code in ADF to get this feel. And dealing with the ADF API is difficult and in the end you still have a UI that requires interaction with the server to render changes to the view.</p> <p>With a JavaScript framework, you've made the investment already. You have direct access to each key-click, hover, and focus action in the browser. In JavaScript, you have access to the DOM (or HTML) and can control hiding or expanding complex data and relationships, perform drag and drop, and adding animations directly. The user experience will feel like it's all being performed locally, because it is. In ADF, you can get the same functionality and layout, but your users will feel the changes coming from the server.</p> <p>The following table address specific areas between ADF and a JavaScript framework and how they compare.</p> <div class="table-wrap" style="margin: 10px 0px 0px; padding: 0px 0px 1px; overflow-x: auto; color: rgb(51, 51, 51); font-family: Arial, sans-serif; font-size: 13.63636302948px; line-height: 18.1818180084229px; background-color: rgb(255, 255, 255);"> <table class="confluenceTable tablesorter" style="border-collapse: collapse; margin: 0px; overflow-x: auto;"><thead><tr class="sortableHeader"><th class="confluenceTh sortableHeader" data-column="0" style="border: 1px solid rgb(221, 221, 221); padding: 7px 15px 7px 10px; vertical-align: top; cursor: pointer; background: 100% 50% no-repeat rgb(240, 240, 240);"> <div class="tablesorter-header-inner" style="margin: 0px; padding: 0px;">Feature</div> </th> <th class="confluenceTh sortableHeader" colspan="1" data-column="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 15px 7px 10px; vertical-align: top; cursor: pointer; background: 100% 50% no-repeat rgb(240, 240, 240);"> <div class="tablesorter-header-inner" style="margin: 0px; padding: 0px;">JavaScript/AngularJS</div> </th> <th class="confluenceTh sortableHeader" data-column="2" style="border: 1px solid rgb(221, 221, 221); padding: 7px 15px 7px 10px; vertical-align: top; cursor: pointer; background: 100% 50% no-repeat rgb(240, 240, 240);"> <div class="tablesorter-header-inner" style="margin: 0px; padding: 0px;">ADF</div> </th> <th class="confluenceTh sortableHeader" colspan="1" data-column="3" style="border: 1px solid rgb(221, 221, 221); padding: 7px 15px 7px 10px; vertical-align: top; cursor: pointer; background: 100% 50% no-repeat rgb(240, 240, 240);"> <div class="tablesorter-header-inner" style="margin: 0px; padding: 0px;">PROS/CONS</div> </th> </tr></thead><tbody><tr><td class="confluenceTd" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;">MVC</td> <td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">AngularJS is a MVC framework on the client side and uses rest services to interact with the server. Rendering the view is performed entirely in the client, from HTML templates transferred when the page is first loaded. The DOM is built in the client such that updates are not required across the network. This also frees up server side resources and minimizing I/O traffic.</p> <p>AngularJS requires a REST service for CRUD operations on the server. This may require implementing the model in JPA, Toplink or Hibernate.</p> </td> <td class="confluenceTd" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">ADF is an MVC framework that is implemented across client and server boundaries. The view is tightly coupled to the server and requires server CPU cycles to build the view. It also requires more I/O traffic to communicate view-based changes back and forth.</p> <p>ADF comes with advanced tools to make building the model much easier. You can introspect the database and with one click, create all the model components you need.</p> </td> <td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">Rendering a view in AngularJS is very fast. This is performed by JavaScript code in the browser; code that is cached after the initial fetch. This minimizes the number of server side fetches and minimizes server latency. After the first download, AngularJS will only make calls to the server during CRUD operations. It does not rely on the server for view-based operations. Additionally, AngularJS can hide server-side latency better than ADF. Although ADF does a satisfactory job rending the view and populating it with data later, Angular's ability to implement the feel you want is better.</p> </td> </tr><tr><td class="confluenceTd" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;">Validation</td> <td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">AngularJS uses events to capture changes between the model and view. This means that validation can be perform in the browser any time a key is depressed. It can implementing page-level validation and display error messages and disable functionality very readily from client side logic.</p> <p>Note that with AngularJS, you may have to write server side logic to handle the CRUD operations to update a database. In this case you will be writing server-side validation rules as well since you can't really enforce these rules from the client. It's easy for a hacker to corrupt your data otherwise. If Node.js is used then the JavaScript validation logic can be reused on the server.</p> </td> <td class="confluenceTd" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">ADF provides both client-side and server-side validation using, if you want, the same validation rules defined in the model. Processing key press events however will requires JavaScript code. With ADF the same validation rules are already implemented on the server, so you don't have to worry about implementing the same logic twice.</p> <p>ADF page level validation is tricky especially when dealing with validation across data in tables. This is because table and table iterators are dependent on validation state of individual fields in the table.</p> </td> <td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">Most common field validation is performed with little or no code in ADF. Page level validation on data in tables will require specialized Java code.</p> <p>AngularJS provides mechanism to intercept view-to-model changes for handling specialized validation scenarios. Since the investment is already made in JavaScript, complex validation scenarios during data entry, between fields, across records in tables, or across pages can be implemented using AngularJS in a straight forward way. In ADF you may need to rely on interactions with the server and Java code to handle some validation types. You can always do this in JavaScript as well, but since little investment has been made to implement code in JavaScript for ADF, these validation requirements can become problematic for the developer.</p> </td> </tr><tr><td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;">Productivity</td> <td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">Tweaking the UI for usability takes a lot of trial and error. With AngularJS you simply save and refresh your browser to see changes.</p> <p>There are also many open source JavaScript IDEs that check JavaScript code syntax, provide run-time break and trace-points, and have capabilities to inspect and change variables. Most browsers also have debug capabilities which make testing, troubleshooting and fixing problems very easy.</p> </td> <td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">ADF, when used for BPM UIs, requires a server to run and it takes time to compile and push changes to the server. Worse case is you have to re-deploy your changes. You can change the ADF configuration to run in JDeveloper or script something up to send changes to the server. Either way, tweaking the design takes more time to do in ADF.</p> </td> <td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">The high level of effort in UI development can come from making the UI usable and intuitive. Seemingly minor tweaks of the UI can often be harder in ADF since at some point it may requires custom server-side or client-side code. Figuring out how to do this in ADF can be hard to do since you have to work through data controls or working with JavaScript alongside default ADF functionality. Although we got up and runnning quickly with ADF this time may get offset when UX requirements require significant customization than initially expected. AngularJS provides the validation features in a more native fashion.</p> </td> </tr><tr><td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;">Testing</td> <td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">AngularJS uses Dependency Injection (DI) as an inherent part of the framework. Since it is used as part of object creation it allows one to mock up test scenarios and create meaningful unit testing. Tools like Node-unit will automatically run test code with each change and can be part of a CI strategy.</p> </td> <td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">ADF can support DI, but it is not an inherent part of the framework. Likewise JSF supports DI and ADF is built on JSF.</p> </td> <td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">AngularJS is better suited for creating testable code. Of course ADF strength is that you don't have write code and so there's fewer things to go wrong. But the reality is that things often do and troubleshooting code in ADF, even if there isn't any, means having to decipher frame-work level error messages. AngularJS has framework error messages too, but I haven't had to deal with them too much and it's usually apparent what is wrong. ADF can be more difficult to troubleshoot, since a lot more is tied to the ADF framework and associated error messages. The error message you get in AngularJS typically point directly to the line of code needing to be fixed.</p> </td> </tr><tr><td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;">Look and Feel</td> <td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">AngularJS works quite well with many open source styling frameworks like Bootstap Responsive CSS. Some companies are building websites are using Bootstrap CSS since they can get a modern look and feel and it can work on mobile devices as well. Check out expo.bootsrap.com (or newsweek.com) for examples.</p> <p>AngularJS also works with many open source UI widgets such as graphs, trees, file upload/download, drag and drop styles, etc.</p> </td> <td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">ADF uses skins and a comes with a skins editor to permit developers to change the standard look and feel. AVIO has used these skins to utilize Bootstrap CSS as well. This skins editor allows users to play around with the look and feel using a WYSIWYG editor. You can make quick overall changes to the application this way.</p> </td> <td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">ADF has a large number of widgets to choose from and they can be added to your web page through a simple drag and drop. ADF is well supported by Oracle and the Oracle community of users, including AVIO.</p> <pangularjs a="" add="" adf="" adf.="" and="" are="" be="" before="" but="" by="" can="" chose="" code="" designs="" enough="" feature="" figuring="" find="" from="" hand.="" have="" however="" if="" implement="" implemented="" in="" intricacies="" is="" it="" lot="" many="" may="" modify="" more="" new="" of="" on="" one="" open="" or="" oracle="" other="" out="" p="" palette="" people="" required="" same="" seen="" since="" some="" source="" spend="" supported="" t="" take="" the="" they="" this="" time="" to="" trying="" ui="" usually="" ve="" want="" way="" widget="" year="" you="" yourself=""></pangularjs></td> </tr><tr><td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;">Single Page Application (SPA)</td> <td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">AngularJS UIs can be an enabling technology to adopt modern UI look and feel since dynamically rendering the page is inherent to the way AngularJS creates a page. As content is manipulated by the user, AngularJS works with the DOM to change the view. New records or changes to existing ones are done in the browser while AJAX updates are sent to the server in the background. The user doesn't experience server latency since server interactions are done in the background and are not needed to maintain the state of the view.</p> </td> <td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">ADF and JSF, uses the server to render HTML through facelets or JSP pages. This technology was developed initially for page flows and can implement SPA designs as well. However the SPA changes requires interaction with the server and this delay makes the UI not feel modern.</p> </td> <td class="confluenceTd" colspan="1" style="border: 1px solid rgb(221, 221, 221); padding: 7px 10px; vertical-align: top;"> <p style="margin: 0px; padding: 0px;">Both AngularJS and ADF can implement a SPA. However the mechanics to implementing a SPA is more natural in a JavaScript framework like AngularJS. This is because AngularJS directly controls the view whereas in an ADF page, the page is indirectly controlled and modified on the server. The changes to the view with ADF requires interaction with server side iterators or changes to a widget state may require partial-page refresh synchronization with the server.</p> <p>AngularJS interacts with the DOM directly with controller logic in the client. The controller and view are clearly partitioned so your not mixing stuff in the view, HTML for example, with aspects of the controller. You do have control over adding new records to tables making fields read-only or writeable, hidden or not, directly through code in the browser. Since you are not interacting with the server these changes look instantaneous so that the page changes occur first and the server is updated later. It doesn't feel like the server is doing anything. From a user perspective it all feels local.</p> </td> </tr></tbody></table></div> <h3>Summary</h3> <p>UI designs and technologies of choice are very much a community-biased paradigm. In some cases, wizard-based UI pages makes sense in others SPA does. Likewise, choosing AngularJS or ADF can simply amount to what the community knows best.</p> <p>ADF and AngularJS are two very viable technologies when developing UIs used in a BPM application. ADF was developed in order to make creating UIs simple without getting into writing lots of specialized code. If your UI is simple, you usually don't have to write code at all. If you do, then you may spend a large amount of time writing the code.</p> <p>Using a JavaScript framework like AngularJS can be worth the investment it takes to write the code needed to make an application work with BPM. AVIO has seen this upfront investment pay off when the customers want a more modern look and feel or wants to create an SPA with features described in this blog. If you need further help deciding which technology is right for you, contact AVIO and let us help you make a good and informed decision.</p> </div> </div> </div> </div> </div> <div> <div>Tags</div> <div> <div><a href="/tags/angular" hreflang="en">Angular</a></div> <div><a href="/tags/ux" hreflang="en">UX</a></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-1018"></a> <div class="container blog-comments"> <div class="row"> <div class="col-sm-12"> <div class="pull-left author"> <div>prithiviraj</div> </div> <div class="comment-date"> <div>June 15, 2016</div> </div> </div> </div> <div class="row"> <div class="col-sm-12 comment-body"> <div><p>With AngularJS you simply save and refresh your browser to see changes.</p> <p>There are also many open source JavaScript IDEs that check JavaScript code syntax</p></div> </div> </div> </div> <a id="comment-1387"></a> <div class="container blog-comments"> <div class="row"> <div class="col-sm-12"> <div class="pull-left author"> <div>Long Duc Nguyen</div> </div> <div class="comment-date"> <div>March 8, 2017</div> </div> </div> </div> <div class="row"> <div class="col-sm-12 comment-body"> <div><p>Dear sir/madam,</p> <p>My name is Long Duc Nguyen. I am a Java developer . Currently, I am developing a system by Jdeveloper and oracle BPM, ADF</p> <p>I have searched many time on the internet about the UI options for the human tasks like your page are describing here</p> <p>I am very interested in this. Could you please share me some example or some instructions about use AngularJS or something like this to replace ADF ?</p> <p>Thank you in advanced</p></div> </div> </div> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=355&amp;2=comment_node_blog&amp;3=comment_node_blog" token="uu8bqzgKkjeoV1cPpaARgWdkLqMWjKI2VsEwJA-MnFI"></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/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> Tue, 23 Dec 2014 18:56:42 +0000 Mark Peterson 355 at http://www.avioconsulting.com http://www.avioconsulting.com/blog/ui-technology-options-human-tasks-bpm-applications#comments BPM 11g and Human Workflow Shadow Rows http://www.avioconsulting.com/blog/bpm-11g-and-human-workflow-shadow-rows <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/bpm-11g-and-human-workflow-shadow-rows" hreflang="und">BPM 11g and Human Workflow Shadow Rows</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>During the <a href="http://eventreg.oracle.com/profile/web/index.cfm?PKWebId=0x3602599f4" target="_blank">OFM Forum last week</a>, there were a few discussions around the relationship between the Human Workflow (WF_TASK*) tables in the SOA_INFRA schema and BPMN processes.  It is important to know how these are related because it can have a performance impact.  We have seen this performance issue several times when BPMN processes are used to model high volume system integrations without knowing all of the implications of using BPMN in this pattern.</p> <p>Most people assume that BPMN instances and their related data are stored in the CUBE_*, DLV_*, and AUDIT_* tables in the same way that BPEL instances are stored, with additional data in the BPM_* tables as well.  The group of tables that is not usually considered though is the WF* tables that are used for Human Workflow.  The WFTASK table is used by all BPMN processes in order to support features such as process level comments and attachments, whether those features are currently used in the process or not.</p> <p>For a standard human task that is created from a BPMN process, the following data is stored in the WFTASK table:</p> <ul><li>One row per human task that is created</li> <li>The COMPONENTTYPE = "Workflow"</li> <li>TASKDEFINITIONID = Human Task ID (partition/CompositeName!Version/TaskName)</li> <li>ACCESSKEY = NULL</li> </ul><p>For a given BPMN process the following additional rows are stored in the WFTASK table:</p> <p>One row per BPMN process instance with: </p> <ul><li>COMPONENTYPE = "BPMN"</li> <li>TASKID = Instance ID (For example: 850002)</li> <li>TASKDEFINITIONID = partition/CompositeName!Version/ProcessName</li> <li>ACTIVITYNAME = Process Name</li> <li>A predefined title, which is seen as the title in the process tracking tab of the workspace</li> </ul><p>An additional row for each thread created within a BPMN instance which contains a callback.  This would include the use of Inclusive gateways, Parallel gateways, Loop, and Multi Instance sub processes that contain human tasks, signals, message or receive events.  These rows will look the same as original BPMN instance row, but the TASKID will also include a thread with the instance id such as 850002-1-0.</p> <p>We will now look at an example process to see the implications of this on the number of rows in the WFTASK table.  Below is the process model we will execute which contains:</p> <ul><li>A message start event</li> <li>A parallel gateway with paths leading a message event and a human task</li> <li>A script activity</li> <li>A 2nd parallal gateway with 2 paths each leading to a human task</li> </ul><p><img alt="" src="/sites/default/files/page-images/u68/wftask_bpmn_1.png" style="width: 802px; height: 201px;" /></p> <p>In this scenario, we would most likely expect to see a single row in the COMPOSITE_INSTANCE table as well as a single row in the CUBE_INSTANCE table.  We would also expect 3 rows in the WFTASK table for the 3 Human Tasks that are executed as part of a our process.  Our assumptions would be correct for the COMPOSITE_INSTANCE and CUBE_INSTANCE tables, but as we will see not the WFTASK table.</p> <p>First, I have created an instance of this process using the message start event which created instance 850005.  As the audit trail image shows, it is now waiting for a mid process receive and a human task to be completed. </p> <p><img alt="" src="/sites/default/files/page-images/u68/wftask_bpmn_2.png" style="width: 800px; height: 243px;" /></p> <p>If we look at the WFTASK table at this point, we will see four rows all related to instance id 850003.</p> <p><img alt="" src="/sites/default/files/page-images/u68/wftask_bpmn_sql1.png" style="width: 798px; height: 80px;" /></p> <p><img alt="" src="/sites/default/files/page-images/u68/wftask_bpmn_sql2.png" style="width: 802px; height: 69px;" /></p> <p>The first row is for the human task, which is the expected row.  We then see three additional rows with TASKID 850005-2-0, 850005-1-0 and 850005.  These represent the process instance(850005) as well as the 2 copies within the split.  You will see that 850005-2-0 has an ACCESSKEY of CATCH_INTERMEDIATE_EVENT which is for the "Wait for Shipping Confirmation" message and 850005-1-0 has an ACCESSKEY of USER_TASK for the "Approve Order" human task.  Each of these is waiting for a callback which is why they also required a row in the WFTASK table.  You can see that all three of these have BPMN as the component type and BpmFlexFieldProcess as the component name as well.</p> <p>Now once the human task is completed and the message event is received we see the following results in the WFTASK table:</p> <p><img alt="" src="/sites/default/files/page-images/u68/wftask_bpmn_sql3.png" style="width: 800px; height: 136px;" /></p> <p><img alt="" src="/sites/default/files/page-images/u68/wftask_bpmn_sql4.png" style="width: 800px; height: 127px;" /></p> <p>We now see the parent BPMN row is still in an OPEN state, but the other three original rows are now in a null state because they have completed.  We also see four new rows created, two Workflow type rows and two BPMN type rows.  These represent the two human tasks as well as the two new threads of the BPMN instance created from the second split.</p> <p>As we can see, even in this simple case we have a total of eight rows in the WFTASK table when we only created three human tasks for users.  In this scenario we have almost tripled the number of rows created, but this was still a relatively simple scenario.  If there is an orchestration process in BPMN which processes a batch in either a loop or parallel and needed to invoke an asynchronous service within the processing of each time, the number of WFTASK rows could increase very quickly.</p> <p>Although there may be many more rows in WFTASK than you might expect, in many scenarios this will not affect performance with proper tuning.  For example, if the size of the WFTASK table begins to impact the performance of the BPM Workspace for end users you most likely need to look at indexing the flex field columns that are frequently used by their views.  </p> <p>However, in some scenarios this could produce significant additional overhead. In the example of the orchestration that is operating on a batch of items, it would make more sense to implement this processing in a BPEL process instead. With a BPEL process, it would not will not have the additional overhead of the BPMN process.</p> </div> </div> </div> </div> </div> <div> <div>Tags</div> <div> <div><a href="/tags/bpm" hreflang="en">BPM</a></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-685"></a> <div class="container blog-comments"> <div class="row"> <div class="col-sm-12"> <div class="pull-left author"></div> <div class="comment-date"> <div>July 10, 2015</div> </div> </div> </div> <div class="row"> <div class="col-sm-12 comment-body"> <div><p>Good article.Thank you.</p> </div> </div> </div> </div> <a id="comment-842"></a> <div class="container blog-comments"> <div class="row"> <div class="col-sm-12"> <div class="pull-left author"></div> <div class="comment-date"> <div>November 20, 2015</div> </div> </div> </div> <div class="row"> <div class="col-sm-12 comment-body"> <div><p>Line "If we look at the WFTASK table at this point, we will see four rows all related to instance id 850003." should be corrected with "850005". Typomistake there.</p> </div> </div> </div> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=292&amp;2=comment_node_blog&amp;3=comment_node_blog" token="-7RMgH5bd3d1h_jTUakhOel-5xDMk2iR7y-jYIJpdME"></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, 05 Mar 2014 17:29:28 +0000 Adam DesJardin 292 at http://www.avioconsulting.com http://www.avioconsulting.com/blog/bpm-11g-and-human-workflow-shadow-rows#comments