Hello All
I hope you all know that we have 4 type of viewObjects in ADF, Here we'll discuss about a simple programmatic viewObject
- Entity Object Based
- SQL Query Based
- Static List Based
- Programmatic ViewObject
Here in this post I am using an ArrayList (POJO based) to populate viewObject records so for that I'll override some methods of ViewObject Impl class
executeQueryForCollection-This method is start of viewObject execution , here we can initialize values (for query and EO based viewObjects it is called whenever query needs to be executed)
hasNextForCollection-This method executes hasNext on viewObject rowset and returns true if there are more rows to create and if it's an end then it returns false
createRowFromResultSet-This method populates each row of fetched data , actually creates a new row and populate data for each attribute of that row
So this is basic theory behind programmatic viewObject implementation, now we'll see how to create a simple programmatic viewObject
- Create a Fusion Web Application , Right click on Model project and select viewObject from new window
- ViewObject creation wizard appears , Set viewObject name and it's type to programmatic in first step
- In Step 2 define attributes for this viewObject, Here I am defining 3 attributes (Name and Type)
- Set updatable always for attributes and define atleast one keyAttribute in step 3
- Check the box to create ViewObject Impl and RowImpl classes in step 4
- In Step 5 Add this viewObject to an Application Module, Provide Application Module name
publicclassCharacterListBean{
//Constrcutor to add new record in POJO class
publicCharacterListBean(String id, String sName, String cName){
this.Id= id;
this.seasonName= sName;
this.characterName= cName;
}
//Variables for each viewObject attribute and it's accessors
private String Id;
private String seasonName;
private String characterName;
publicvoidsetId(String Id){
this.Id= Id;
}
public String getId(){
return Id;
}
publicvoidsetSeasonName(String seasonName){
this.seasonName= seasonName;
}
public String getSeasonName(){
return seasonName;
}
publicvoidsetCharacterName(String characterName){
this.characterName= characterName;
}
public String getCharacterName(){
return characterName;
}
}
Now override methods in View Object Impl class , There are proper comments in code so you can understand that
importjava.sql.ResultSet;
importjava.util.ArrayList;
importoracle.jbo.Row;
importoracle.jbo.server.ViewObjectImpl;
importoracle.jbo.server.ViewRowImpl;
importoracle.jbo.server.ViewRowSetImpl;
importprogrammaticvodemo.model.bean.CharacterListBean;
// ---------------------------------------------------------------------
// --- File generated by Oracle ADF Business Components Design Time.
// --- Sat Jul 30 11:55:06 IST 2016
// --- Custom code may be added to this class.
// --- Warning: Do not modify method signatures of generated methods.
// ---------------------------------------------------------------------
publicclassProgTestVOImplextends ViewObjectImpl {
/**
* This is the default constructor (do not remove).
*/
publicProgTestVOImpl(){
}
//Array List to store Season-Character Information as using POJO class CharacterListBean
private ArrayList<CharacterListBean> characterList =new ArrayList<CharacterListBean>();
/**Initialize values here, Used POJO based class to add records in List
* executeQueryForCollection - overridden for custom java data source support.
*/
@Override
protectedvoidexecuteQueryForCollection(Object qc, Object[] params,int noUserParams){
//Initialize Records here
characterList.add(new CharacterListBean("SC1","Game of Thrones","Tywin lanister"));
characterList.add(new CharacterListBean("SC2","Game of Thrones","Tyrion lanister"));
characterList.add(new CharacterListBean("SC3","Game of Thrones","Jon Snow"));
characterList.add(new CharacterListBean("SC4","Arrow","Oliver Queen"));
characterList.add(new CharacterListBean("SC5","Arrow","Sara Lance"));
characterList.add(new CharacterListBean("SC6","The Flash","Barry Allen"));
characterList.add(new CharacterListBean("SC7","The Flash","Harrison Wells"));
characterList.add(new CharacterListBean("SC8","The Flash","Cisco Ramon"));
//Set Initial fetch index to 0
setFetchIndex(qc,0);
super.executeQueryForCollection(qc, params, noUserParams);
}
/**
* hasNextForCollection - overridden for custom java data source support.
*/
@Override
protectedbooleanhasNextForCollection(Object qc){
// Check that there is other records to fetch from ArrayList
returngetFetchIndex(qc)< characterList.size();
}
/**In this method new row is created and values are assigned to each attribute of that row
* createRowFromResultSet - overridden for custom java data source support.
*/
@Override
protected ViewRowImpl createRowFromResultSet(Object qc, ResultSet resultSet){
// Get the current fetch index
int curIndex = getFetchIndex(qc);
// Create a new row
ProgTestVORowImpl characterRow =(ProgTestVORowImpl) createNewRowForCollection(qc);
//Here set attribute values in new row using RowImpl class
characterRow.setId(characterList.get(curIndex).getId());
characterRow.setSeasonName(characterList.get(curIndex).getSeasonName());
characterRow.setCharacterName(characterList.get(curIndex).getCharacterName());
// Change the fetch index as one record is increased in result set
setFetchIndex(qc, curIndex +1);
// Return the newly created row
return characterRow;
}
/**
* getQueryHitCount - overridden for custom java data source support.
*/
@Override
publiclonggetQueryHitCount(ViewRowSetImpl viewRowSet){
long value =super.getQueryHitCount(viewRowSet);
return value;
}
/**
* getCappedQueryHitCount - overridden for custom java data source support.
*/
@Override
publiclonggetCappedQueryHitCount(ViewRowSetImpl viewRowSet, Row[] masterRows,long oldCap,long cap){
long value =super.getCappedQueryHitCount(viewRowSet, masterRows, oldCap, cap);
return value;
}
/**
* Method to set the new fetch index
* @param rowset
* @param index
*/
privatevoidsetFetchIndex(Object rowset,int index){
if(index == characterList.size()){
setFetchCompleteForCollection(rowset,true);
}
setUserDataForCollection(rowset,new Integer(index));
}
/**
* Method to get the current fetch index
* @param rowset
* @return
*
*/
privateintgetFetchIndex(Object rowset){
int value =((Integer) getUserDataForCollection(rowset)).intValue();
return value;
}
}
All done :) Now time to check programmatic viewObject so for that Run Application Module
Cheers :) Happy Learning