Monday, February 27, 2017

Intercept ADF Table filters through region controllers

Use case : Intercepting ADF table filters through query listener is a regular approach. In this post i will show you how to do it through region controllers..

Step 1: Drag and drop departments table on to the page with filter mode available.Create binding for the table to a managed bean

<af:table value="#{bindings.DepartmentsEOView1.collectionModel}" var="row"
              emptyText="#{bindings.DepartmentsEOView1.viewable ? 'No data to display.' : 'Access Denied.'}"
              filterVisible="true" varStatus="vs"
              rowSelection="single" id="t1" styleClass="AFStretchWidth"

Step 2 : Go to page definition file and add a controller class

<?xml version="1.0" encoding="UTF-8" ?>
<pageDefinition xmlns=""
                version="" id="view3PageDef" Package="uic">

PageFragementController is a java class that should implement RegionController . 

Step 3 : PageFragementController  implementation

public class PageFragementController implements RegionController {
    // This method will be called during page load everytime
    public boolean refreshRegion(RegionContext regionContext) {
        int refreshFlag = regionContext.getRefreshFlag();         
        FacesContext fctx = FacesContext.getCurrentInstance();
        Map requestMap = fctx.getExternalContext().getRequestMap();         
        Map pageFlowScopeMap = ADFContext.getCurrent().getPageFlowScope();
   // Call the method only during life cycle render model
        if (pageFlowScopeMap != null) {
            if (regionContext.getRefreshFlag() == 2) {

//we have already created a binding for the table to a managed bean which is in pageFlowScope .Access the bean from pageflowscope               

                view3Bean testBan =   (view3Bean)pageFlowScopeMap.get("view3Bean");                

                RichTable rtable = testBan.getRichTab();
                FilterableQueryDescriptor filters = FilterableQueryDescriptor)rtable.getFilterModel();
                Map<String, Object> map = filters.getFilterCriteria();

              if (map != null) {

                String str  = null;
                    for (String key : map.keySet()) {
                        if (map.get(key) != null) {
                            str = (String)map.get(key);

//Intercept the user filtered column and add the required value. Here user would search for any department ,but i would always want to make it search for Executive only.If the user does empty search then it will work in ordinary way

               if(str!=null && !str.equals("")){
                            if( key.equals("DepartmentName")){
                                map.put(key, "Executive");
                            map.put(key, "");

//create query Event object with the intercepted filter values. filters is the object which we intercepted through its filter map values.we modified the filters object

 QueryEvent queryEvent =  new QueryEvent(testBan.getRichTab(), filters);

//Invoke the search operation with the below code

invokeMethod("#{bindings.DepartmentsEOView1Query.processQuery}",  QueryEvent.class, queryEvent);




        return false;

   public static Object invokeMethod(String expr, Class paramType,
                                      Object param) {
        return invokeMethod(expr, new Class[] { paramType },
                            new Object[] { param });

    public static Object invokeMethod(String expr, Class[] paramTypes,

                                      Object[] params) {
        FacesContext fc = FacesContext.getCurrentInstance();
        ELContext elc = fc.getELContext();
        ExpressionFactory ef = fc.getApplication().getExpressionFactory();
        MethodExpression me =
            ef.createMethodExpression(elc, expr, Object.class, paramTypes);
        return me.invoke(elc, params);