My assumptions regarding posts on Siebel SSA customizations can be found at the end of this post.
I’ll use a hypothetical requirement to extend the ‘ContactInboxItemVO’. A row in this VO is an item in the inbox visible to an SSA delegated administrator, about a contact’s registration request that the former has to approve or reject. For example, the extension required is an ‘action by’ date to be displayed to the administrator beyond which the item will be automatically rejected by a Siebel batch job.
Let's Go: Inspecting the SSA Model project in JDeveloper I have the following information (see picture below)
1) My VO is oracle.apps.ss.base.model.um.ContactInboxItemsVO
2) From the structure window, I can see the custom implementation class oracle.apps.ss.base.model.um.ContactInboxItemVOImpl.java.
3) This class has an overridden method ‘executeQueryForCollection’ which gets executed every time the ‘executeQuery’ method of the VO is called (e.g. when the related ADF page loads).
4) The method ‘executeQueryForCollection’ refers to the user data object used by this VO: oracle.apps.ss.base.model.um.ContactInboxItemsUserData
(To quickly load this class in editor, right-click the class name and select ‘Go to Declaration’ from the context menu)
Most VOs in SSA will use a user data object to cache the web service response and to support pagination of records (next set <–> previous set) on the UI. Comments in ‘ContactInboxItemsUserData.java’ may help understand its usage better. Note though, that not all classes may have enough comments and use of methods would vary slightly depending on the specific VO.
5) The import statements in this class indicates the web service client proxy and type classes used by my VO.
import oracle.apps.ss.base.model.um.proxies.approval.types.com.siebel.xml.uinboxcontactitem.data.ListOfUinboxcontactitemData; import oracle.apps.ss.base.model.um.proxies.approval.types.com.siebel.xml.uinboxcontactitem.data.UinboxItemTaskData; import oracle.apps.ss.base.model.um.proxies.approval.types.com.siebel.xml.uinboxcontactitem.query.ContactQuery; import oracle.apps.ss.base.model.um.proxies.approval.types.com.siebel.xml.uinboxcontactitem.query.ListOfContactQuery; import oracle.apps.ss.base.model.um.proxies.approval.types.com.siebel.xml.uinboxcontactitem.query.ListOfUinboxcontactitemQuery; import oracle.apps.ss.base.model.um.proxies.approval.types.com.siebel.xml.uinboxcontactitem.query.QueryType; import oracle.apps.ss.base.model.um.proxies.approval.types.com.siebel.xml.uinboxcontactitem.query.UinboxItemTaskQuery;
Generated Types package: oracle.apps.ss.base.model.um.proxies.approval.types.<..> - The type objects used in the WS request response messages reside here.
We need to further locate the proxy client class (use to invoke the web service) and the Siebel web service itself.
6) The method ‘getNextResultSet’ of the user data class in step (d) further uses the ‘SiebelInboxManager’ class to call the web service and retrieve the response.
//invoke the web-service
//ListOfUinboxitemcontactData inboxItemsDataList;
ListOfUinboxcontactitemData inboxItemsDataList;
logger.info("Calling SiebelInboxManager.queryContactApprovalItems");
try {
inboxItemsDataList = SiebelInboxManager.queryContactApprovalItems(inboxItemsQueryList);
} catch (ValidationException ve) {
//setInboxItems(null); //No items were retrieved
logger.severe("ERROR: Error in calling web-service. Exception:" + ve.toString());
throw ve; //The exception is already wrapped.
}
logger.info("Web service call completed");
This class hides the actual client proxy class behind its method ‘queryContactApprovalItems’ (To see the code in this method, right-click the method name and select ‘Go to Declaration’ from the context menu). You’ll see that most other user data classes choose to call the client directly.7) A look at the method ‘SiebelInboxManager.queryContactApprovalItems’ below shows the web service being invoked using the client proxy class: oracle.apps.ss.base.model.um.proxies.approval.UInbox_spcContact_spcItemClient.
logger.info("Invoking web-service. Port:'Uinbox Contact Inbox Items' Operation: UInboxContactItemQueryPage");
UInbox_spcContact_spcItemClient myPort = new UInbox_spcContact_spcItemClient();
logger.info(" Created proxy client");
//Reset end-point
myPort.setEndpoint(ServerUtil.getEndPointURL());
The package of proxy client classes is: oracle.apps.ss.base.mode.um.proxies.approval
While regenerating the web service proxies (required after a change to the web service), you will be asked to provide the Proxy Client package name and the Generated Types package name (step 5 above). Although by convention, the types path would be Proxy Client path + ".types", I would suggest this is verified before regenerating the proxy.
Name of the Siebel web service
In almost all cases, the name of the client gives away the name of the Siebel web service being used. Here it’s ‘UInbox Contact Item’. To get this name, ignore the suffix ‘Client’ and translate each ‘_spc’ into a space.
Almost all VOs invoke a Siebel web service in this fashion and ultimately results in a call to the ‘QueryPage’ method of the base class of the BS ‘EAI UI Data Service’.

No comments:
Post a Comment