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"
rows="#{bindings.DepartmentsEOView1.rangeSize}"
emptyText="#{bindings.DepartmentsEOView1.viewable ? 'No data to display.' : 'Access Denied.'}"
fetchSize="#{bindings.DepartmentsEOView1.rangeSize}"
rowBandingInterval="0"
filterModel="#{bindings.DepartmentsEOView1Query.queryDescriptor}"
queryListener="#{bindings.DepartmentsEOView1Query.processQuery}"
filterVisible="true" varStatus="vs"
selectedRowKeys="#{bindings.DepartmentsEOView1.collectionModel.selectedRow}"
selectionListener="#{bindings.DepartmentsEOView1.collectionModel.makeCurrent}"
rowSelection="single" id="t1" styleClass="AFStretchWidth"
binding="#{pageFlowScope.view3Bean.richTab}">
Step 2 : Go to page definition file and add a controller class
<?xml version="1.0" encoding="UTF-8" ?>
<pageDefinition xmlns="http://xmlns.oracle.com/adfm/uimodel"
ControllerClass="ui.bean.PageFragementController"
version="11.1.1.64.93" 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");
}
}
else{
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);
}
}
regionContext.getRegionBinding().refresh(refreshFlag);
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);
}
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"
rows="#{bindings.DepartmentsEOView1.rangeSize}"
emptyText="#{bindings.DepartmentsEOView1.viewable ? 'No data to display.' : 'Access Denied.'}"
fetchSize="#{bindings.DepartmentsEOView1.rangeSize}"
rowBandingInterval="0"
filterModel="#{bindings.DepartmentsEOView1Query.queryDescriptor}"
queryListener="#{bindings.DepartmentsEOView1Query.processQuery}"
filterVisible="true" varStatus="vs"
selectedRowKeys="#{bindings.DepartmentsEOView1.collectionModel.selectedRow}"
selectionListener="#{bindings.DepartmentsEOView1.collectionModel.makeCurrent}"
rowSelection="single" id="t1" styleClass="AFStretchWidth"
binding="#{pageFlowScope.view3Bean.richTab}">
Step 2 : Go to page definition file and add a controller class
<?xml version="1.0" encoding="UTF-8" ?>
<pageDefinition xmlns="http://xmlns.oracle.com/adfm/uimodel"
ControllerClass="ui.bean.PageFragementController"
version="11.1.1.64.93" 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");
}
}
else{
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);
}
}
regionContext.getRegionBinding().refresh(refreshFlag);
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);
}