Skip navigation.

Andrejus Baranovski

Syndicate content
Blog about Oracle technology
Updated: 16 hours 16 min ago

Dashboard Implementation with ADF 12c Alta UI

Sat, 2015-10-10 06:03
Alta UI in ADF 12c provides great options for dashboard implementation. You can use so called 'info tiles' as blocks displaying summary information. These blocks are clickable and based on active tile, content can be rendered. It looks not only modern, but also user friendly.

I have implemented sample application - with Alta UI dashboard, based on code examples from Oracle WorkBetter application. You could download and run my sample, it renders two vertically aligned info tiles with summarised information:

Click on second info tile, main content will be changed:

Info tile block is implemented as ADF declarative component with a set of properties to make it generic and reusable:

Each info tile is defined as declarative component in the dashboard:

Declarative component requires to set several properties. Property 'selected' returns true/false if current tile should be rendered as selected. Each tile should be assigned with unique index, client listener method based on this index identifies selected tile:

Tile content is surrounded with panel group layout component. By default this component doesn't provide click support. However, click support can be implemented with client listener method (I will not go here into client listener implementation details, because this code is well documented in Oracle WorkBetter sample application referenced above):

Client listener invokes server listener method to pass user click request to the server:

Server listener method updates selected tile index and generates partial target refresh. This is how tile selection works:

Content area is rendered with ADF Faces deck component. This component allows to invoke transition between different UI blocks, based on currently selected tile:

DisplayedChild property identifies UI block to display. This property value is calculated from selected tile index:

First UI block contains ID = infd0. This corresponds to index of first tile:

Oracle Mobile Cloud Service - External SOAP Service Connector

Wed, 2015-09-30 13:14
These days everything is about MCS/MAF. I'm also looking into this new area, but I'm trying to mix traditional ADF topics and new things. Who knows may be MCS/MAF is a new big thing and its good time to learn it. I was testing how it works to define my own custom SOAP connector to calculate currency conversion rate.

MCS developer portal allows to create and use new connector. Special wizard helps to complete this task, just click on large CONNECTORS icon:

There is new option available to create new SOAP/REST connector:

Wizard reminds me JDEV interface, steps are similar as to generate SOAP connection in JDEV. You need to provide SOAP WSDL URL, name and description:

If create action is successful, General step is displayed with SOAP connector general details:

Port step provides information required when you would like to call SOAP service through the connector in custom code:

There is no security and in the last step I can test it. I'm checking for conversion rate from EUR to USD in the payload. Mobile backend should be specified to test connector SOAP call. I would understand Mobile backend something like Application Module in ADF BC, it is required to group business logic and expose interface:

SOAP service is invoked and I can see the response:

Connector is tested through mobile backend. Later in the diagnostics section we could see invocation statistics:

Next step would be to include connector call into custom API.

Smart Combo Box LOV Based on Description Attribute

Tue, 2015-09-29 11:35
I had a question from blog reader for my previous post about smart Combo Box LOV - Smart Combo Box LOV with Filter. Reader was asking if it is possible to define Combo Box LOV on description rather than ID attribute. ADF BC out of the box allows to define LOV on readonly description attribute. I had a post about it - Defining the LOV on a Reference Attribute in Oracle ADF 11g. Today I will test and describe how the same can be applied for Combo Box LOV in ADF 12c.

If you want to define Combo Box LOV on description attribute, first thing to do is to create Association between main EO and EO from where description attribute should come:

Based on association we can define left outer join and bring description attribute to the main VO:

Description attribute is readonly, since it comes from join:

Combo Box LOV should be defined directly for this readonly description attribute. We should return description and key - both attributes. ADF BC would display description on UI, but it would return key attribute in the background:

Combo Box is set to filter initial list based on criteria, same as in previous blog mentioned above:

UI implementation contains LOV Combo Box mapped with JobTitle attribute:

This is how it looks on UI. LOV Combo Box displays description attribute and in the background it updates JobId. Same works in both table and form UI:

Combo Box LOV displays multiple attributes and rows are filtered based on initial View Criteria:

Download sample application -

Master-Detail Pattern Implementation in ADF 12c Alta UI

Fri, 2015-09-25 09:14
ADF 12c and Alta UI change the way how we used to implement UI in ADF. Let's take a look into Master-Detail. Before Alta UI usual implementation for Master-Detail would be based on vertical layout with master on the top and details below. Alta UI provides different patterns like left-right, bottom-top for Master-Detail implementation - Oracle Alta UI Patterns. I would recommend to watch a demo from Shay Shmeltzer, he explains how to build left-right Master-Detail - Developing Your First Oracle Alta UI page with Oracle ADF Faces. In my post I'm taking a step further and explaining how to manage Master-Detail relationship between different regions.

Here you can watch a demo of sample application developed for today post:

Country list on the left acts as a menu. User can select any country and this will force regions displayed in the central area to refresh and show information based on selected country. I'm keeping regions in synch without Contextual Events, using simple solution described in this post - Simple (Effective) Refresh Approach for ADF Regions.

Selection changes in Menu region trigger list filtering in Employees Directory tab:

Detail data displayed in Profile tab is also filtered. In the top block is displayed additional information for Master record. Employees from selected country are displayed in the form with navigation controls. Overview block displays information about all employees from selected country:

If country selection is changed, detail data is refreshed to stay in synch:

Administration tab contains table with pagination support, also filtered based on Master record change in countries:

Countries menu block is implemented in separate region. Selection listener is overwritten to process menu item selection:

Listener updates session scope variable with a key of selected country. Region refresh approach is implemented based on the method described in the post mention above:

Content region is implemented by TF with a router. Here we check if Country ID TF input variable is not empty and execute detail records filtering:

Country ID is defined as TF input parameter:

Session scope variable updated by Countries menu listener is set as a input value for region parameter. Each time when session scope variable is changed (new country is selected), region with such input parameter will be refreshed:

Region will be refreshed, only if Refresh property will be set to ifNeeded:

It might be enough to reload only one region. If another region contains PPR supported components (tables, forms) - data can be reloaded automatically with ChangeEventPolicy = ppr set for iterator:

Download sample application -

Use Case of Auto Re-Execute Functionality in ADF BC

Thu, 2015-09-17 05:44
There are use cases, when data in DB is changed by background processes and we would like to display to the user latest data available. Very common implementation for this use case is to re-execute ADF iterator and VO each time when Task Flow or UI screen is accessed. Obviously this works, but performance would suffer - usually there is no need to re-fetch data each time, it must be re-fetched only when changes are detected in DB. ADF BC provides out of the box such functionality - it can detect changes in DB and re-execute VO through Database Change Notification. Make sure to grant CHANGE NOTIFICATION system privilege to the data source user.

Auto refresh functionality for ADF BC VO is working when DB pooling is disabled in AM tuning. This would mean you should use Auto refresh carefully and plan dedicated AM's.

I'm going to describe the use case and how you could benefit from VO auto refresh. Here is the example of typical ADF Task Flow with initial Method Call to re-execute VO and fetch fresh data from DB. In the next step UI fragment is rendered, where recent data is displayed:

This is how it works on UI. Departments TF is accessed by pressing Departments button in Employees table screen. This will trigger Execute action call in Departments TF and force VO to reload:

List of Departments will display recently fetched data from DB:

Each time when Departments TF is opened, VO executes SQL query and re-fetches data. This can be observed from the log:

While this works fine, it is not great from performance perspective. We should improve it by using VO auto refresh functionality. Change default activity in TF to UI fragment, we don't need to invoke VO re-execute:

Select AutoRefresh=true property in the VO settings, this will enable DB listener event for this VO and will force re-execution only when it is required:

We are ready to test it. Change Department Name column value:

Navigate to Departments from Employees table:

New data will be displayed automatically in Departments list, even without invoke initial Execute operation. If you would open the same TF, when there were no changes in DB, it will load data from cache, without re-executing VO and re-fetching the same data rows:

Download sample application -

ADF BC Inline View Criteria for Hierarchical Search

Tue, 2015-09-15 03:19
ADF BC View Criteria allows to implement Inline View Criteria to execute hierarchal search. This is especially useful, when you have Master-Detail relationship and want to filter Master records, based on attribute value from Detail. Keep in mind, Inline View Criteria for hierarchical search would not work, if VO is based on custom SQL query. It works only with declarative VO's.

This is how View Criteria with detail search option looks like. If there is View Link available, you can select depend VO from the list of attributes. JDeveloper automatically sets Inline View Criteria option and you can select any attribute from detail VO. All criteria attributes will be rendered in the single search block on UI:

Inline View Criteria is created based on View Link:

Make sure not to use custom SQL based VO, Inline View Criteria would work only with declarative or not custom SQL based VO:

Search filters Master results (departments), based on Detail filtering (employees). I'm searching for employees with salary greater or equal to 12000. This query returns only those departments, where employees with such salary are available:

If I search with lower salary, more departments are present in the result:

Download sample application -

ADF Alta UI 12c Responsive Layout Template

Tue, 2015-09-08 13:36
Alta UI in ADF 12c with combination of Tablet First template provides support for responsive UI. Often you would like to implement extra functionality for responsive layout, not available out of the box. I'm going to describe in this post, with very practical example, how this can be achieved. I will implement desktop and tablet view support with adjusted menu structure and header.

Tablet First template is shipped with ADF 12c and provides different facets (UI blocks) where developer could implement menu, content, header and footer. We could use CSS media query to dynamically react to the screen changes and adjust facets accordingly. In order to use CSS media query in the template, we need to have access to the Tablet First template code. This is easily achievable by creating custom UI template, based on out of the box Tablet First template. In the template creation wizard select Copy Existing Template option, this will copy template source code and you could adjust it:

This allows to save time and implement CSS media query in the template. If screen size is less than 950px, we are going to render narrow layout and vice versa:

Header area is going to be rendered for larger screens only, to save screen space on smaller ones. Wide style is assigned for the header block, this means with narrow CSS style it will stay hidden:

Wide CSS style is assigned to the core structure of the template - menu block, end and central block are displayed here:

Narrow CSS style is set to render UI structure suitable for tablet screen. Menu width is fixed to 30px, limiting size available for the menu:

Let's take a look at page based on the template. We are using different facets, but same regions are being reused in different UI blocks. Menu block for wide and narrow UI is using same region. This allows to reuse business logic, no matter on what screen UI is being rendered:

Same applies for central content block, same regions are being reused for wide and narrow UI.

ADF UI with narrow layout designed for tablet:

User clicks on menu icon and panel drawer loads menu list:

Wide layout renders menu on the left and it also displays header block:

Not only a list, but also editable form can be displayed pretty nicely with narrow layout:

Download sample application -

ADF 12c Dynamic Forms with ADF BC UI Categories

Tue, 2015-09-01 04:54
ADF 12c offers completely new way to implement UI forms. We can implement dynamic forms, based on static ADF BC components. Such approach could simplify form maintenance - when there will be changes in DB, developer would need to adjust only ADF BC EO/VO structure, without changing anything on UI. Bindings layers could determine data structure dynamically and dictate how to render UI blocks. ADF BC VO provides special metadata option to define how form UI should be rendered - UI Categories. Through categories we could group attributes and this would help to render dynamic UI with separate blocks and proper order.

Using UI Categories is straightforward, add category group and move attributes under the category. Label and tooltip can be defined, this will be a title for UI block:

ADF 12c is using general collection binding for dynamic UI, it doesn't depend on specific attribute binding:

Collection binding is generic, without a list of accessible attributes, it just points to the VO. This means we can change list of attributes registered in the VO at any time:

This is how looks dynamic form generated in ADF 12c. I have customised it a bit, but major part is generated automatically by JDeveloper 12c. There is global iterator over UI Categories, rendered UI blocks. Inner iterator renders UI Category attributes. Each attribute is rendered through ADF 12c dynamic component, this means there is no dependency related to attribute UI implementation (input text, LOV, choice list, etc.) - UI implementation is controlled from attribute UI hints in ADF BC:

It is easier to understand how dynamic form is organised from UI structure view:

This is the result - dynamic form is rendered with two blocks, based on defined UI Categories:

I have customised dynamic form rendering with metadata usage. Buttons are rendered only in the first block, identified by PersonalData:

Block identified by JobData is rendered with maximum 4 rows:

I hope this post will give you some new ideas about robust ADF UI implementation. Download sample application -

Red Samurai ADF Performance Audit Tool v 4.0 - Web Client Request Monitoring and Complete Query Analysis

Thu, 2015-08-27 03:12
I'm excited to announce, we have released a new version of our RSA audit tool. This is a major update after previous version released in February 2015 - Red Samurai ADF Performance Audit Tool v 3.4 - ADF Task Flow Statistics with Oracle DMS Servlet Integration.

It is already 3 years, since initial version - Red Samurai Performance Audit Tool - Runtime Diagnosis for ADF Applications. We are using it for many of our customers to monitor ADF performance in both test and production environments. Many new features were added during these years, more features to come.

RSA Audit v4.0 New Features

1. RSA Audit v4.0 dashboard is supporting ADF 12c and Alta UI look

2. Web Client Request Time monitoring. Supported with ADF 11g and 12c. Generic method tracks request time for all ADF UI components. Logged data can be analysed through ADF UI dashboard or directly in the DB. Request time represents complete time from user action in the browser, until request is completed. This includes real user experience - browser processing time, network time, server side time and ADF BC/DB processing times. Runs in VERBOSE logging mode

3. Detail information about ADF fragment, button or other ADF UI component involved into request is being logged together with request processing time and is accessible from audit dashboard. This helps to identify slow actions spanning from Web Client to DB

4. Information about each request is grouped, this allows to compare differences between multiple requests and identify bottlenecks in the application performance

5. Duplicate Queries. Allows to track all executed VO’s, very helpful to identify redundant VO’s executions. Groups VO executions per ECID, this helps to identify VO’s re-executed multiple times during the same request. Runs in MEDIUM logging mode

6. VO’s executed from the same ECID are automatically highlighted - this simplifies redundant queries analysis

7. Number of duplicate executions of VO’s per ECID is calculated and presented in the table and sunburst chart

8. We calculate top VO’s per AM. This helps to set priorities for SQL tuning and understand heavy used VO’s

9. Sunburst chart displays visual representation of duplicate and top VO’s per AM

Smart Combo Box LOV with Filter

Mon, 2015-08-17 17:47
Combo box LOV with filtering is simple, but effective feature not used often. You should rethink LOV design and apply combo box LOV with filtering where possible. Advantage of such LOV implementation is pretty clear - fast list items access, based on filter criteria. This will reduce number of times required to open LOV popup and improve performance of UI.

LOV VO should implement View Criteria, returning top items to be included into choice list. My example retrieves all jobs with minimum salary greater or equal than 10000. Users will see list items based on this criteria first:

I would recommend to use List UI Hints section of the LOV VO to define LOV UI definition. This will save time when assigning LOV for the attributes, do it once and reuse. I have specified Combo box LOV with filtering based on View Criteria - to include jobs with minimum salary greater than 10000 into initial choice list:

Time is saved when assigning LOV for the attribute - UI Hints are automatically set, based on LOV UI Hints definition:

This is how it looks on UI. Top records are displayed in the choice list, based on applied filter criteria.  All list items can be accessed through More... option:

This is how LOV popup looks by default in ADF 12c. Height is stretched automatically to occupy all possible display height, width is not stretched. Such layout is not good, users don't like it:

LOV popup can be made stretchable with little help of ADF UI CSS. We should use -tr-stretch-search-dialog CSS property to enable LOV popup stretching in ADF 12c (CSS sample is provided with example):

Another important thing to remember about LOV's in ADF 12c - List Range Size property. By default it is being set to -1. This is OK for simple choice lists, where you would like to show all data at once. But not suitable for LOV or combo with LOV, where we don't want to fetch all LOV items at first load:

I would set it to 10, this will populate only visible set of LOV records:

Take a look, how LOV popup window will look after improvements applied - it is stretchable by the user and only initial set of list item records is fetched:

Make sure to use combo LOV with initial filter criteria, to optimise LOV behaviour. Download sample application -

Tabs Layout Support in Alta UI Tablet First Template

Thu, 2015-08-06 07:02
Tablet First Template in ADF 12c is ideal for both tablet and desktop. Combined with Alta UI layout, it offers light and responsive UI experience to the end users. I'm going to describe in this post, how to use ADF Faces Tabs with Alta UI in Table First template. I will show ADF regions are friendly with Web like UI design, without internal scrollbars in the page.

Page can be created referencing Tablet First template with JDeveloper wizard, same as we would use it to create page based on UI Shell template:

Table First template provides multiple facets, Central facet is supposed to contain main content. I'm going to include two ADF Faces UI tab components into central facet. Both tabs will render ADF regions:

Unfortunately it doesn't work properly. Tabs are rendered in the centre of the page:

Luckily there is a fix. We should apply special CSS style class, provided with Oracle WorkBetter Alta UI application - ContentContainerWorkaround. This class must be set for ADF Faces UI panel tabbed component:

After CSS style class fix is applied, tabs are rendered correctly:

I have implemented second tab - Employees Table to test how large ADF UI table renders in Tablet First Template. Table is set with page scroll policy:

ADF region renders table without internal scrollbar, it looks Web style alike:

There are more rows, than can fit into screen. User can scroll down entire page to see the remaining rows. This is especially good for tablet screens, ADF provides really good UI experience:

Download sample application -

Oracle Mobile Cloud Service First Hands-On Experience

Fri, 2015-07-31 12:50
Thanks to SOA Community and Jurgen Kress, I had a chance to play with Oracle MCS (Mobile Cloud Service). This new Oracle product is promoted with full force by Oracle PM team, there is dedicated Youtube channel with videos to watch and learn - Oracle Mobile Platform. Mobile Cloud Service offers mobile enterprise repository to organize and support your mobile development. Mobile backend services, security, connectors, storage and etc. can be defined and managed in MCS. Web Services published in MCS can be monitored to track performance and errors. All this should simplify mobile solutions implementation.

This was my first encounter with MCS and I would like to describe the test I did. MCS UI is implemented with Oracle internal JS framework following Alta UI standard. There are options to monitor and administer MCS instance. I'm more interested in development options:

I will not go through all available options, but only focus on Mobile Backend. Basically we can define a group, where we could include various reusable business logic artefacts (API's). Mainly this will be different Web Service calls. The same Web Service calls can be reused by mobile application developer.

In Mobile Backend section we can edit existing groups or create a new one:

You should think about Mobile Backend as about a group of reusable code artefacts (API's). There is an option to create new API or reuse existing one. I decided to reuse existing API for Incidents registration:

This API implements REST Web Service call to register new incident, also it allows to query information about previously reported incidents. This can be tested directly in MCS environment, we could define sample payload data and simulate Web Service call to register new incident:

Web Service call is successful, we can observe this from the log - new incident is registered and ID is assigned. Same Web Service will be reused from mobile application. With MCS we could monitor Web Service usage, number of invocations, errors, etc. - this makes it easier to manage entire infrastructure for mobile solutions:

To make sure new incident was successfully registered, I could run another REST call for the same Web Service - to get incident information about ID:

Result shows incident data, this means incident was located successfully:

Incidents registration service is registered in API's group, we could edit and test this Web Service online in MCS:

Red Samurai mobile backend service is live - invocation statistics and processing time metrics are aggregated by MCS:

Using Shared AM to Cache and Display Table Data

Wed, 2015-07-29 23:12
This post is based on Steve Muench sample Nr. 156. In my personal opinion, ADF samples implemented by Steve Muench still remain one of the best source of examples and solutions for various ADF use cases. Sample Nr. 156 describes how to use Shared AM to display cached data in UI table. Typically Shared AM's are used to implement cached LOV's (session or application scope). But it could go beyond LOV, based on the use case we could display cached data in the table or form. I have tested this approach with 12c and it works fine.

Download sample application - AM is defined with application scope cache level - this means cached data will be available for multiple users:

In order to display cached data on UI and pass it through ADF bindings layer, we need to use Shared AM configuration in bindings:

You should create new Data Control reference entry manually in DataBindings.cpx file. JDeveloper doesn't provide an option to select Shared AM configuration. Simply change configuration property to Shared (HrModuleShared as per my example):

Make sure to use correct Data Control entry for iterator in the Page Definition. Cached table iterator binding should point to shared Data Control configuration:

This is how it looks like on UI - readonly table data is fetched once and cached in application scope cache. Other users will be reusing cached data, without re-fetching it from DB:

Jobs VO is set with AutoRefresh = true property. This turns on DB change notification listener mechanism and keeps VO data in synch, when changes happen in DB. This helps to auto refresh cached VO (read more about it Auto Refresh for ADF BC Cached LOV):

Here is the test. Let's change Job Title attribute value in DB:

Click on any row from Jobs table, or use any buttons (make a new request). Cached VO will be re-executed and new data will be fetched from DB, including latest changes:

You should see in the log, DB change notification was received and VO was re-executed, VO data was re-fetched:

Oracle Process Cloud Application Player

Tue, 2015-07-21 10:12
With Oracle Process Cloud you can forget these days when you was waiting long to deploy BPM process and test Human Task UI. No need to wait anymore, in Oracle Process Cloud you could use Application Player feature, this allows to run the process and test Human Task UI almost instantly.

To demonstrate Application Player functionality, I have implemented basic process of Data Entry for the Claim Handling:

This process is using Web Form in the Start activity to capture data, human activity Claim Expense Review allows to review entered data, before submitting it:

This is how Web Form UI design looks like:

When you build Web Form and arrange UI components, business type is constructed automatically, no need to define anything separately. Business type can be used in the process, without changing it:

Data object variable is assigned to the process activity element through Association dialog in Process Cloud, this is where you can map input/output with business type:

Once process is ready to be tested, all you need to do is to invoke Application Player. Click on Test Application button in the top right corner:

In the Test Application window you should select Play option:

To show how it works, I have recorded a video - see yourself how helpful is Application Player:

Auto Refresh for ADF BC Cached LOV

Thu, 2015-07-16 08:19
You can configure auto refresh for ADF BC cached LOV and this works out of the box, no special coding is needed. My previous post describes how ADF BC session cached LOV behaves - ADF BC Session Cached LOV - Understanding Expire Time. Auto refresh can be configured for both application and session caching. One important thing - auto refresh doesn't work when ADF BC is configured with disconnected mode (ADF BC Tuning with Do Connection Pooling and TXN Disconnect Level). I would guess this is related to DB notification listener, it can't notify about DB changes, when DB connection is being taken from AM.

Make sure to remember to configure AM without disconnected mode. Auto refresh works for both application and session caching levels:

As a reminder - in order to use shared LOV functionality, you must select VO instance for LOV from shared AM configuration. See how it looks in the LOV definition wizard:

Auto refresh functionality is enabled with a single property - AutoRefresh = true. This can be set through VO general properties or directly in the VO source code:

Make sure Disconnect Application Module Upon Release option is not set:

I have overriden VO method processChangeNotification for logging purposes, this method is invoked automatically for VO's set with AutoRefresh = true. No need to code anything here, I'm just logging method invocation:

Let's do a test. First of all, check entries of Job list:

Go to DB and update one of the entries. For example, change Stock Clerk title and commit changes:

Come back to UI and press any button. This will trigger new request and Jobs list shared VO will be notified about DB change to refresh:

Check the list again, you should see changed entry for Stock Clerk:

In the log we can observe a call for change notification, it triggers shared LOV query re-execution and data re-fetch:

See recorded demonstration video, where I show refresh behaviour live:

Download sample application -

ADF BC Session Cached LOV - Understanding Expire Time

Sat, 2015-07-11 10:11
ADF BC offers LOV caching feature. There are two caching levels - application and session. With application level enabled, it makes LOV rows available for all users. On contrary for session level LOVs, data is cached for single session only. In this post I will focus on session level LOV's and I'm going to explain when cached data expires and is re-fetched.

You can configure caching level for LOV's in Model.jpx file, open AppModules section and select appropriate caching level for AM. I will be using Session level. Key point to understand - session level caching for LOV is nothing to do with Web user session lifetime. Session here is AM session, and cache remains in memory only until AM session remains assigned to the current user session:

LOV with caching feature is defined a bit differently, List Data Source must be selected from shared AM, other steps are the same:

My sample application implements two different VO's, based on Employees data. Both VO's are using the same cached LOV in session level for Jobs. This helps to make a test and check if cached LOV data expires. When cache is not expired, LOV data cached during first VO initialisation, should be present on the second LOV access. Above is example of Jobs LOV definition for Employees VO and below another example of Jobs LOV definition for Employees By Departments VO:

LOV VO is created with implementation class, where I override createRowFromResultSet method. It helps to track if LOV data was expired and rows were re-fetched:

As I have mentioned earlier, there are two VO's, both using the same cached LOV. On UI I have two different fragments, each located in TF. Call between two TF's is implemented, I'm using two different TF's to simulate Isolated TF behaviour. Isolated TF creates new instance of AM and this clears the cache of LOV on AM session level:

Let's understand how it works. First fragment is loaded, LOV data is fetched and cache is populated:

We can observe in the log, all rows fetched for LOV:

Open second fragment, LOV data is not re-fetched, it will be taken from the cache:

There are no rows fetched reported in the log:

Session cache works correctly for LOV. Now if user invoked Rollback, AM is reset and this indicates end of cache on AM session level, rows will be re-fetched. Try to press Cancel button:

There will be entries in the log, showing information about fetched rows - cache was cleared on Rollback:

Let's do another test with second TF set with Isolated option. When TF is set to be Isolated, it will force new AM instance creation, each time with TF is loaded. Meaning - there will be always new AM session and LOV cache will never be reused. TF is set to be Isolated:

Try to open TF and check LOV:

Differently than before, LOV data will be fetched - new AM instance was created on Isolated TF access and this requires to refill LOV data list:

Download sample application -

Oracle Process Cloud Service - SOAP Web Service Integration

Tue, 2015-07-07 09:03
Oracle Process Cloud ( allows to invoke SOAP services, along with REST services. You can define a library of SOAP services in Oracle Process Cloud application and use them within the process. This helps to integrate with business logic running on premise.

I have implemented regular SOAP service in ADF BC, just to test how it works to invoke it from Process Cloud:

SOAP service method accepts employee ID and checks the status. ADF BC application is deployed on standalone WLS. Make sure to select correct deployment profile, when deploying ADF BC with SOAP on standalone server, otherwise SOAP service reference will be missing in deployed application. You should use ADF BC service deployment profile:

Once SOAP service is deployed, you can access WSDL file through Enterprise Manager. Oracle Process Cloud currently doesn't support direct SOAP references, instead you must provide WSDL file copy for Web Service registration:

Download WSDL file from URL (here is the sample WSDL, I was using for my test - HrModuleService.wsdl). This is how it looks like, it contains SOAP service description:

Here you can see Oracle Process Cloud interface. It looks quite user friendly and functional, this is what I like about it. On the left side, there is menu with different objects - Processes, Web Forms, Web Services, etc.:

To add new SOAP service reference is fairly easy, provide a name and upload WSDL file:

Once service is registered, we can go to the process diagram and select Service component from the palette:

Drag and drop it on the diagram, Implementation section will be opened, where you should specify SOAP service reference to be invoked:

Select Service Call from the list, this allows to invoke SOAP Web Service:

Once option for Service Call will be selected, you will be able to select Web Service reference. I have defined only one service, it is listed in the popup - select it:

Operation field is listing all available methods from the service, select one of the operations to be invoked:

Data associations are available to define correct mapping for the input/output values for the SOAP Web Service call, this can be done through Process Cloud composer window:

If you are interested in Human Task UI implementation in Oracle Process Cloud, read my previous post about REST service integration: Oracle Process Cloud Service - Consuming ADF BC REST Service in Web Form.

Oracle Process Cloud Service - Consuming ADF BC REST Service in Web Form

Sat, 2015-07-04 08:57
With the introduction of Oracle Process Cloud Service ( there is an option to run your business process in the cloud. You can implement very similar things as it is possible with BPM 12c in JDeveloper, but only in the cloud. There is no option to implement human task UI with ADF, it must be done with Web Forms (light UI forms implementation framework). This is disadvantage, as it will require to externalise complex business logic and access data collections through REST calls, instead of processing it locally in ADF extension. However, this is how it is implemented currently in the BPM cloud version.

This is how it looks - Web Form editor in Process Cloud Service:

You have an option to select specific types from component palette. There are such types as money, email, phone, text. Components are provided with built in validation, checks for valid email address, etc. User who implements a form, needs to drag and drop components one by one (generally it works OK, but sometimes may get stuck and page refresh will be required). Properties section is available to enter details for the selected component.

Cool part about it - we can define business logic rules. For example, to show/hide customer field based on trip type, etc. One of the rules below, shows how REST service can be called inline and REST response is applied for drop-down field. This is pretty simple to fetch data from external REST service and use it for the Web Form component. Just invoke REST service and assign collection to the component supporting array of data:

If REST call requires to pass parameters through URL, this is also possible, see example below - list of cities, based on the selected country in the Web Form:

Web Form works pretty well in Preview mode, it even calls REST services and shows real data. Validation messages for built-in checks are displayed pretty nicely. Here I'm selecting a country from the list populated by REST service:

Based on the selection in the Country drop-down, filtered list for Cities becomes available (another REST call):

Good news - most of the Oracle Process Cloud interface itself is implemented with ADF. Here you can see a section listing all Web Forms available for the current process:

I have implemented REST service for Countries and Cities lists in ADF BC. There are two custom methods in AM implementation, to fetch the data and transform it to the list format:

REST resources are defined through annotations and are configured to produce JSON data, this will allow Oracle Process Cloud to parse such data automatically:

If you are going to check how REST service is implemented in ADF BC, you can run a query in Postman to retrieve a list of all countries from HR schema:

Another query to retrieve a list of cities, by country:

Download sample application, with ADF BC REST service -

Intercepting Table Filter Query and Manipulating VO SQL Statement

Wed, 2015-06-24 13:30
I’m going to describe one non declarative use case. Imagine, if there is a table with filter functionality, you may want to intercept filter items and apply the same for another VO. This another VO should be based on the same DB table, so it could apply criteria items against the table.

Sample application -, implements a fragment with table component and a chart. Table component can be filtered, criteria is intercepted and applied for the chart, this one is rendered from different VO with GROUP BY query. Chart stays in synch and displays data according to the criteria filtered in the table:

In the log, I’m printing out intercepted criteria from the table filter:

Chart is rendered from the SQL query below:

Table filter criteria is being intercepted by overridden method buildViewCriteriaClauses. Criteria clause is constructed here, we just need select FilterViewCriteria, the one originating from table filter. We could apply this criteria straight ahead to the VO responsible to bring chart data. However, this would not work - ADF BC would wrap original chart SQL query with SELECT * FROM (…) QRSLT WHERE (table filter criteria). This would not work, because table filter criteria is not present in the original chart SQL statement. To make it work, I’m updating original SQL query for chart data, by updating WHERE clause part:

In the last step, we need to pass bind variable values - the ones user is searching for in table filter. This can be done from another overridden method - bindParametersForCollection. We have access to the applied bind variables in this method. Again, you should check for FilterViewCriteria and extract applied bind variables values. Chart VO will be updated with bind variable definitions created on the fly and assigned with values to search for:

I hope this trick will save some of your time, if you are going to implement something similar - to intercept table filter query and apply it to the another VO, based on same DB table.