Pages

Sunday, June 24, 2012

Select/Deselect All check box in a table

Select All/Deselect All check box in a table is a common requirement. This can be implemented in multiple ways. In this blog, I will explain the steps, I used for one of my project.

Follow these steps:

-  Add a transient attribute(say SelectDept) of type Boolean in the view object. Don't forget to set the updatable property to Always. 

Drag and drop the view object from the data control as an ADF Table

- Convert the SelectDept column to SelectBooleanCheckBox. Add command links to select/deselect check box in the header facet of this column.

- Call managed bean methods on click of the command link. After all these modifications the column code should look like:


- The bean methods onSelectAll, onDeselectAll in turn calls the method selectAllDept, deSelectAllDept respectively in AMImpl.java. It basically iterate through the RowSetIterator of DepartmentsView and set the value of SelectDept attribute, depending on the method being called.


UI Page:

Instead of command links (Select All/Deselect All), you can have a select boolean check box as well. On selecting it, all the check box are checked and un-selecting it will un-check all the check box in the table.

This code is also available in sample work space. Uncomment the select boolean check box in the column header facet and put the partial triggers of this boolean check box on the table.


Sample Workspace:
Download the sample workspace from HERE.

Saturday, June 23, 2012

SelectManyCheckBox component in a table

This post is very similar to my earlier post on Implementation of SelectManyCheckBox component. The use case/functionality remains same. But it defers only in the usage of SelectManyCheckBox component. In earlier post, I used it in a form layout. In this blog, I will explain how to use SelectManyCheckBox/SelectManyChoice component inside a table column for persisting/displaying the selected values for an EMP record  as shown:



Steps are:
1. Create a Fusion Web Application.
2. Create all the required Business Components (EO, VO,VLink AM) for the above data model.
3. Create a view link between EmpVO and EmpRolesVO, which will be used to display the SelectManyCheckBox as selected for an EMP record/row.

The above 3 steps are similar to the steps in earlier post.

4. Create two transient attributes SelectedRoles, StoredRoles in EmpVO. StoredRoles is used to fetch the selected roles from db for an EMP record. Where as SelectedRoles is populated when roles are selected for an EMP record from the UI.  

5. Override the getter method of StoredRoles attribute in EmpVORowImpl as shown below:


6. Drag and drop EmpVO as ADF table on the page.

7. Create another column in the table and then drag a SelectManyCheckBox UI component in it and bind the value property of it to a managed bean, which evaluates the Roles to be displayed as selected for an EMP row as shown:


Here the expression #{row} will give handle of each row being stamped in the table. Using this row, we can get StoredRoles attribute which is calculated in the getter method (EmpVORowImpl) for each EMP row using the ViewLinkAccessor as explained in Step#5 above. StoredRoles is then returned as a List of RolesId (Number).

8. A valueChangeListener method is called on selecting/un-selecting the SelectManyCheckBox component.


Here, getSelectedRow method returns the selected row in table. Using this we can populate the SelectedRoles attribute with the value returned from the SelectManyCheckBox component. Then the selected row keys is saved in a pageFlowScope variable which will be used to commit the data.

9. On clicking of the Commit button, all the data is saved in the database as shown:


I tried getting all the selected row keys using the getSelectedRowKeys() method on table with RowSelection=multiple. But it was returning only the last selected row key. Therefore I have to use the pageFlowScope approach.

Sample Workspace:
Download the sample workspace from HERE.

Sunday, June 17, 2012

Format: Date and Number fields in table

To format a date field on UI, use <af:convertDateTime>.
For example, if a date has to be displayed in 12-Jan-2012 format, use convertDateTime as below:


Output:


Similarly to format a number field on UI, use <af:convertNumber>.
For example, if the salary of an employee has to be displayed in 12,000 format, use convertNumber as below:


Output:

Thursday, June 14, 2012

ADF Coding Standards & Check points

For any ADF Java code, Model and UI layer, here are few points to make code better from writing from performance and standard point of view, that comes from our coding practice and experience.

There is a set of checkpoints we should check before source controlling any changes.This ensures making code better, robust, standards compatible and more performant.

JSFF/JSPX code - Check points
  • Make sure, you have used Resource Bundle where ever its required.
  • For Bounded taskflows, make sure to use activation as conditional/deferred (Not Immediate) and use active condition EL expression.
  • Id of the component, length should be <= 7.
  • Make sure, you have removed unwanted PageDef Bindings.
  • If af:popup is used, make sure to set the contentDelivery to "LazyUncached".
  • If using af:contextInfo, make sure the af:dialog has modal="false".
  • If using af:contextInfo, make sure the af:showPopupBehavior has triggerType="contextInfo".
  • If using af:popup from af:commandLink, make the partialSubmit to true for af:commandLink.
  • If using af:popup. make childCreation property to "deferred" so that only when the Popup is launched the WebBean hierarchy would get created in server memory.
  • Run JAudit for the file you make changes, from Menu->Run->JAudit file.
  • Right click->Reformat before checkin.
  • If using JavaScript, can you think to avoid that.
  • jsff/jspx files must reside under /page package.
  • Taskflows must reside under /flow package.
  • Menu model xml files must reside under /menu package.
  • In Case of deriving the Url parameters, preferably use the following syntax to derive declaratively #{facesContext.externalContext.requestParameterMap['Empno']}
    (Empno is url parameter)

Any Java Code - Check points
  • Managed Bean class name should end with "Bean".
  • Don't use SOP statements.
  • New methods introduced, make sure they are modular so that they can be JUnitized.
  • New Method should always return a value so that they can be JUnitized.
  • Add Logger statements to the new methods.
  • Make sure you have thrown sufficiently Exceptions.
  • Run JAudit for the file you make changes, from Menu->Run->JAudit file.
  • Make sure to define the Variables with a name starting with small letter.
  • Do not use underscore (_) in Variable and Method names.
  • Make sure to check for Null condition for all operation that could throw NullPointerException. Ex: CollectionModel, Row, ViewObject, ApplicationModule, String objects etc.
  • Right click->Reformat before check in.

Application Module(AM) - Check Points
  • Make sure to Use JNDI datasource instead of JDBC URL in the AM configuration(i.e bc4j.xcfg)
  • Number of occurrences of createRootApplicationModule() or *AMImpl.getInstance() should be same as releaseRootApplicationModule(). 

Entity Object - Check Points
  • Can you convert the code you have just written into Groovy?
  • Run JAudit for the file you make changes, from Menu->Run->JAudit file.

View Object - Check Points
  • Get SQL explain plan every time you touches a VO.
  • For new Attributes added, make sure you use proper UI hints.
  • If creating a New VO, make sure its is based on an EO (Exceptions to be considered).
  • If createViewObject calls are present, then make sure, you remove those dynamic ViewObjects.
  • If setting rangeSize() to -1, restore the rangeSize after you work on that.
  • Don't set ListRangeSize == '-1' unless the ViewAttribute using the LOV has CONTROLTYPE 'choice' or 'radio' or 'default'
  • FetchSize should be <= 25 or same as number of rows to be displayed in UI.
  • Avoid use of vo.getRowCount()
  • View Criteria shouldn't have "null checking" checkbox checked.
  • LOVs shouldn't have "query automatically" checked.
  • SQL based VOs,should have query optimizer hint set to "FIRST_ROWS(10)".
  • Always test the application with ampooling= false when our bc4j transaction involves any transient VO's.

Most of the above points were shared with me by one of my superior(Amulya Mishra) when I was a novice ADF developer. So, thought this check list will be helpful for other novice developers, like it helped me :)

Interesting blogs about Jdev Roadmap