Skip to main content

Data integration and composite business services, Part 2: Providing a single view of your customer through service integration

WebSphere Customer Center integration into an existing banking environment

Mary Taylor (marytaylor@us.ibm.com), Senior IT Architect, IBM
Author Photo: Mary Taylor
Mary Taylor is a senior IT architect. She works in the Strategic Technology Architecture and Incubation (STAI) team and is currently working on an SOA CBS pilot . Her interests include DB2 and DataStage.
Li (Tony) Wei (weili@cn.ibm.com), Software Engineer, IBM
Li (Tony) Wei's photo
Li Wei is a software engineer. He is working in the China Emerge Technology Institute (CETI) team.

Summary:  This article is the second in a series of articles that address data integration in the development of Composite Business Services (CBS). The ability for a company to provide a "single view of the customer" is critical for effective SOA transformations. WebSphere Customer Center (WCC) provides a central hub to integrate all customer data and acts as the single repository to all the channels and lines of business that need access and update to that data. Use a banking scenario described in the first article Building Composite Business Services, Part 1 and walk through how to integrate WCC into an existing environment and access the data in the WCC repository from the portlets.

View more content in this series

Date:  12 Jul 2007
Level:  Intermediate
Activity:  789 views

Scenario introduction

As part of their Customer Data Integration (CDI) initiative, Jivaro Bank (hereafter referred to as "Jivaro") has just purchased the WCC product to store their customer name and address information. Jivaro is going to continue to use their own legacy repository for their other banking data such as account and segment information. By consolidating their customer name and address data into WCC, Jivaro will be able to eliminate the multiple channel repositories that currently contain this data, and will be able to provide a common set of services to access that data from all areas within the company.

The integration of this CDI software is accomplished by executing a sequence of steps:

  1. Loading legacy data into the WCC repository
    • The first step involves moving the customer name and address data from the existing Jivaro data stores into the WCC repository. IBM provided Jivaro with High Volume Load (HVL) WebSphere DataStage jobs to assist with this effort. This topic was covered in the first article in this series.
  2. Creating a WCC portlet
    • The second step involves using the WCC Data Stewardship User Interface (UI) to replace the Jivaro customer profile portlet with a new portlet. The new portlet will provide access to the more complete set of customer profile attributes that the WCC repository provides.
  3. Extending WCC services
    • The third step involves extending the WCC-provided services to access the Jivaro-specific information that isn't addressed by the WCC services. Jivaro will create a new service to allow searching on a Jivaro-specific customerId field within the WCC repository.

This paper will describe steps 2 and 3: how the new customer profile portlet was created, and how the WCC services were extended to allow for searching on the Jivaro-specific customer Id.

Integration of WCC into the Jivaro environment

After the Jivaro data had been loaded into WCC, we focused on demonstrating two capabilities realized by the integration with WCC:

  1. The ability to loosely couple WCC to the back-end and front-end applications, by creating a Customer Profile portlet using the Data Stewardship Development Framework (DSDF), and then utilizing the WCC Service Response / Request Framework to access and update the data in that portlet.
  2. The ability to easily extend WCC to provide new functions to meet specific client requirements by using the WCC-provided Toolkit wizards.

To demonstrate the first capability, we created a WCC customer profile portlet to fulfill the create/update/delete/search functions. Because WCC had a scalable data model, we were able to use this new portlet to manage the customer profile data for all of the Jivaro-hosted banks, regardless of bank or channel.

We used the WCC Response/Request Framework to exchange messages between the portlet and the WCC Core System.

To demonstrate the second capability, we used the WCC Toolkit wizards to create a new search service that could search on a Jivaro CustomerId data element. This element had been a key field in the legacy Jivaro data store, but after the migration to WCC, that element ended up residing in a field that did not participate in the WCC-provided search services. A new search service had to be created to search on the Jivaro CustomerId in WCC.

1. Applying the DSDF in the WCC Customer Profile Portlet


Figure 1. WCC Customer Profile Portlet
WCC Customer Profile Portlet

To create the WCC Customer Profile Portlet within the Jivaro environment, we had to understand the frameworks provided. Our approach is documented by the following four activities:

  1. Gain an understanding of the DSDF
  2. Prepare the development environment for the WCC Customer Profile Portlet
  3. Build a JSF page and work with the Service Data Object (SDO) objects
  4. Work with the WCC Service Request/Response Framework

These four steps are explained in more detail below.

I. Understand the Data Stewardship Development Framework


Figure 2. Data Stewardship Development Framework (DSDF)
Data Stewardship Development Framework (DSDF)

The Data Stewardship UI is built on top of the transactional-based WCC and utilizes XML requests and responses to communicate with the WCC Core system. Applications communicate with WCC through RMI and exchange XML messages that comply to the service schema. Currently WCC has two types of services - Customer Services and Administrative Services. Each service has its own service schema defined. The Administrative Services focus on system administration. Customer Services are used to implement business logic. In our scenario, we focused on the Customer Services, such as "addPerson", "searchPerson" and so on.

DSDF is delivered as a J2EE Web application in the CustomerDataStewardshipUI.zip of the WCC installation package. All of the application assets for deployment are packaged as an .EAR file. The .EAR file contains JSP files, images, cascading stylesheets, Java™ script files, Java classes, JAR libraries, a properties file and deployment descriptors.

II. Prepare the development environment for the WCC Customer Profile Portlet

For developing the portlet and applying the DSDF to this portlet, we elected to use Rational Application Developer (RAD) as the development platform. The IBM XSD-SDO RAD plug-in for RAD6.0.0 is necessary for the development. (Please see the Resources section of this article.)

We created a JSR portal project and imported the CustomerDataStewardshipUI.zip file which contains all of the source code for the DataStewardship UI.

We then set the values in the Datastewardship.properties file. This properties file contains the back end server information and security implementation. These values need to be set as follows:


Listing 1. DataStewardship.properties file
                
 DWLServiceControllerJNDI=com/dwl/base/requestHandler/beans/DWLServiceController
 java.naming.provider.url=corbaloc:iiop:wccserver:2809
 UserGroupImpl=com.dwl.datastewardship.registry.WASUserGroupImpl
 com.ibm.websphere.naming.jndicache.cacheobject=none
      

III. Build the JSF page and work with SDO objects

The WCC Customer Profile Portlet UI is implemented using JSF pages with the visual components binding to root Java Beans for value and action. By using a JSF implementation, developers are isolated from the details of the HTTP Servlet API, and they can focus on the page layout. WCC provides a Web project "CustomerDataStewardshipWeb" which is used to administer the WCC data within a Web UI. You can reference this project and its associated utility classes to build your WCC Web application.

WCC SDO objects are generated from service schema and are used by the Root Java Bean to transform data between objects and XML. All of the service schema is located in the "Schemas" project within WCC. You also can define your own SDO objects to support your specific requirements.

We created several JSF pages for fulfilling the customer profile create /update /search /delete functions. By analyzing the fields required by Jivaro's Customer Profile management business service, we mapped the fields which should be shown in the Portlet to the WCC SDO object fields. The SDO object and user actions are wrapped in a Root Java Bean. The Root Java Bean provides model data for each screen and implements user actions. BaseTCRMService.java, which is included in the "CustomerDataStewardshipWeb" project, is the parent of all Root Java Beans. It provides access to different scopes of JSF data. By extending BaseTCRMServiceRoot classes, we can create the add/delete/search/update methods, which invoke WCC services.


Listing 2. A sample schema for Person Business Object
                
Person Schema:
<!-- TCRMPerson Business Object -->
<!ELEMENT TCRMPersonBObj (ObjectReferenceId?, PartyId?, NewPartyIdReference?, 
                          DisplayName?, PreferredLanguageType?, 
                          PreferredLanguageValue?, ComputerAccessType?, 
                          ComputerAccessValue?, PartyType?, CreatedDate?, 
                          InactivatedDate?, LastStatementDate?, ReferredByPartyID?, 
                          StatementFrequencyType?, StatementFrequencyValue?, 
                          ClientStatusType?, ClientStatusValue?, 
                          AlertIndicator?, SolicitationIndicator?, 
                          ConfidentialIndicator?, ClientPotentialType?, 
                          ClientPotentialValue?, ClientImportanceType?, 
                          ClientImportanceValue?, MandatorySearchDone?, 
                          DoNotDeleteIndicator?,LastUsedDate?, LastVerifiedDate?, 
                          SourceIdentifierType?, SourceIdentifierValue?,
                          PartyLastUpdateDate?, PartyLastUpdateUser?, 
                          PartyLastUpdateTxId?, PersonPartyId?, BirthDate?, 
                          BirthPlaceType?, BirthPlaceValue?, GenderType?, 
                          UserIndicator?, AgeVerifiedWithType?, 
                          AgeVerifiedWithValue?, HighestEducationType?, 
                          HighestEducationValue?, CitizenshipType?, 
                          CitizenshipValue?, NumberOfChildren?, 
                          MaritalStatusType?, MaritalStatusValue?, 
                          DeceasedDate?, DisabledStartDate?, DisabledEndDate?, 
                          PartyActiveIndicator?, PersonLastUpdateDate?, 
                          PersonLastUpdateUser?, PersonLastUpdateTxId?, 
                          TCRMExtension?, PrimaryKeyBObj?, TCRMPartyAddressBObj*, 
                          TCRMPartyContactMethodBObj*, 
                          TCRMFinancialProfileBObj?, TCRMInactivatedPartyBObj?, 
                          TCRMPartyIdentificationBObj*, 
                          TCRMPartyRelationshipBObj*, TCRMSuspectBObj*,
                          TCRMAlertBObj*, TCRMAdminContEquivBObj*, 
                          TCRMPartyLobRelationshipBObj*, TCRMPersonNameBObj*,
                          TCRMPartyPrivPrefBObj*,TCRMPartyValueBObj*, 
                          DWLAccessDateValueBObj*)>

When the JSF bean gets the fields from the UI, the root bean will wrap the fields to an SDO object. Then the user action method will invoke the SDO and XML parse utility classes to generate the XML request message which strictly complies with the Request schema. After the XML request is sent to the WCC Customer Application by RMI, and the WCC transaction completes, the response XML message will be returned.


Listing 3. SDO object and user actions in Root Bean
                
public class CustomerProfileRoot extends BaseTCRMServiceRoot {
      	
        private TCRMPersonBObjType personBObj;
        private TCRMPersonNameBObjType personNameBObj;
        private TCRMPersonSearchBObjType personSearchBObj;
        private TCRMPersonSearchResultBObjType personSearchResultBObj;
        private TCRMPartyAddressBObjType partyAddressBObj;
        private TCRMAddressBObjType addressBObj;
        private TCRMOrganizationBObjType groupBObj;
        private TCRMOrganizationNameBObjType groupNameBObj;	
        private TCRMPartyIdentificationBObjType identiferBObj;
        private TCRMAdminContEquivBObjType adminKeyBObj;

        public void addPerson()  throws DataStewardshipException {
                        DocumentRoot responseDocRoot = 
                                invokeTCRMCodeTableTx(generateRequestId(),"addPerson",
                                                "TCRMPersonBObj", 
                                                (EDataObjectImpl)personBObj);
        }

        public void updatePerson()  throws DataStewardshipException {
                        DocumentRoot responseDocRoot = 
                                invokeTCRMCodeTableTx(generateRequestId(),"updatePerson",
                                                "TCRMPersonBObj", 
                                                (EDataObjectImpl)personBObj);
        }
public TCRMPersonBObjType getPerson(String partyId)
                        throws DataStewardshipException {
                LinkedHashMap methodParams = new LinkedHashMap();
methodParams.put("PartyId", partyId);
methodParams.put("InquiryLevel","4");
TCRMPersonBObjType onePerson = null;
DocumentRoot responseDocRoot=invokeTCRMInquiry(generateRequestId(),
            "getPerson", methodParams);
              List allPersonBObj = TCRMServices.getTCRMResultBObjs(responseDocRoot,
                                "TCRMPersonBObj");
                onePerson = (TCRMPersonBObjType) allPersonBObj.get(0);
                      .......                
            }
      
                public void deletedPerson(String partyId)  throws 
                                                           DataStewardshipException {
                DocumentRoot docRoot = ((DocumentRoot) XMLTransformServiceFactory.INSTANCE
                        .create(CustomerPackage.eINSTANCE.getNsURI()));
                TCRMPartyBObjType oneParty = docRoot.createTcrmPartyBObj();
                                oneParty.setPartyId(partyId);
                        DocumentRoot responseDocRoot2 =  
                        invokeTCRMCodeTableTx(generateRequestId(),"deleteParty",
                                                "TCRMPartyBObj", 
                                                (EDataObjectImpl)oneParty);
        }

IV. Work with the WCC Service Request/Response Framework

The WCC Service Request/Response Framework uses an XML-based transaction interface. It comes with a request and a response schema, defined as DTD as well as XSD. All input XML must conform to the request schema, while WCC will always respond with an XML conforming to the response schema. The schemas define the structure of the business objects, which are passed in or returned from WCC transactions. Based on this framework, the client (Portal, Web Application) and the WCC business component communicate using XML messages. In the WCC Customer Profile Portlet, we use a set utility class which is provided by DSDF to generate and parse the WCC XML messages.


Listing 4. WCC request message
                
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE TCRMService SYSTEM "myTCRM.dtd"> 
<TCRMService> 
 <RequestControl> 
  <requestID>12345678</requestID> 
  <DWLControl> 
   <requesterName>DWL University</requesterName> 
   <requesterLanguage>100</requesterLanguage> 
  </DWLControl> 
 </RequestControl> 
 <TCRMTx> 
  <TCRMTxType>searchPerson</TCRMTxType> 
  <TCRMTxObject>TCRMPersonSearchBObj</TCRMTxObject> 
  <TCRMObject> 
   <TCRMPersonSearchBObj> 
    <GivenNameOne/> 
    <LastName>Gajic</LastName> 
    <DateOfBirth/> 
    <CityName/> 
    <ProvStateType/> 
    <ZipPostalCode/> 
   </TCRMPersonSearchBObj> 
  </TCRMObject> 
 </TCRMTx> 
</TCRMService>

In Listing 4 above, the WCC request message is used to search all customers whose last name is "Gajic".

<RequestControl> contains business service header information. <TCRMTx> identifies and describes a business service to be invoked. In this example, the business service to be invoked is searchPerson identified by <TCRMTxType>. This service uses the TCRMPersonSearchBObj business object, which is identified by <TCRMTxObject>. Customer data necessary for a business service to run properly is wrapped using the <TCRMObject> element.

The utility classes provided by WCC wrap the complexity of RMI communication to WCC and the specific parameters for each type of service. We cached the EJB remote home handler at the JSF Application Scope to avoid time consuming JNDI look ups at each invocation.

We used TCRMServiceUtil.java, which is a WCC Utility class that provides access to core WCC Services, by invoking a static method [invokeCustomer(String request)].


Listing 5. RMI WCC Core Controller Session Bean
                
invokeCustomer(String request)
.....
String response = invokeBackend(request, customerContext);
.....
controllerHome = getControllerHome();

DWLServiceController controller = null;

controller = controllerHome.create();

response = (String) controller.processRequest(context, request);
.....

CodeTableUtil.java is a WCC Utility class that provides access to all WCC code tables. In Jivaro we invoked these lookup methods for the country, marital status, class type, identify type, and title type code fields.


Listing 6. Getting code info from WCC
                
allCountryTypeCodes = TCRMServices.getAllCodeTypes(getLangId(),
                    getUserId(), CD_COUNTRY_TP);
....
    //retrieve from Customer
    String request = createRequest(langId, userId, codeTableName);
    String response = TCRMServices.invokeCustomer(request);
    codeTypes = loadCodeTypes(response, codeTableName);


The code snippet below is an example of the Jivaro code used for invoking WCC service actions.


Listing 7. Transform SDO Business Object
                
DocumentRoot responseDocRoot = invokeTCRMInquiry(generateRequestId(),"getPerson", 
                               methodParams);

com.dwl.customer.DocumentRoot response = (com.dwl.customer.DocumentRoot) 
                 XMLTransformServiceFactory.INSTANCE.load(xmlResponse);

List allPersonBObj = TCRMServices.getTCRMResultBObjs(responseDocRoot, "TCRMPersonBObj");

ResponseObjectType responseObj = docRoot.getTcrmService()
                .getTxResponse().getResponseObject();
 

Extending WCC services

WCC can be modified to meet business requirements for new functionality, and to expand the scope of existing functionality by using additions and extensions. The Jivaro client application needed to query customer profile information based on the Jivaro customerId, which is stored in WCC as 'customerId'. Below let's see how to develop an extension behavior to meet the customer profile query requirements.

The following steps were executed when extending the WCC-provided services:

  1. Understand the WCC Extension Framework
  2. Prepare the development environment for the WCC extension
  3. Investigate business requirements to create new services
  4. Implement the code in the Extension Framework
  5. Deploy the WCC extension
  6. Test the new WCC service

Figure 3. WCC Extension Framework
WCC Extension Framework

I. Understand the WCC Extension Framework

Extensions are customized code that provide additional functionality by extending data elements or extending the behavior of existing transactions. This expanded functionality is executed on top of the default WCC code.

II. Prepare the development environment for the WCC extension

The WCC Toolkit wizards are used to create the WCC extensions and additions. This toolkit should be installed into RAD. You can get this toolkit from the WCC install package.

To create an extension, the Extension Framework needs to be set up. Follow the steps below to create the Extension Framework:

  • Import the WCC Customer Application (Customer.ear) to the workspace.
  • Create a new EJB project in the WCC Customer Application
  • Use the Customer Toolkit to create a new addition and a new query on the new EJB project
  • The toolkit will generate a guide (TO DO list) for setting up the extension
  • After processing the guide, the Extension Framework is ready.

III. Investigate the business requirements to create new services

In Jivaro, every customer has an identifier (customerId) in the customer information table. We needed to preserve thisId in the WCC data store and enable it for search capability. We stored this data element in the "ADMIN_CLIENT_ID" field of the WCC table "CONTEQUIV". Although WCC already provides a service for querying the CONTEQUIV table, none of the provided services access the table using the "ADMIN_CLIENT_ID" field. We needed to extend the WCC services by creating a new query object to query the CONTEQUIV table using the "ADMIN_CLIENT_ID" field.

For fulfilling this new function, we followed these steps in the Extension Framework:

  • We used the WCC Toolkit to create the "XBankAccountService" extension project.
  • We created a new query object to extend the "AdminContEquivBObjQuery" query object.
  • In the new query object, we added a new SQL query to query the CONTEQUIV table using the "ADMIN_CLIENT_ID" field.
  • We created a "component" object which extends "TCRMCommonComponent" to invoke the query object and return the result to the WCC controller.
  • We added a new method in the "Finder" object of the WCC "Controller" which is used to wrap the parameter and result for communication between the WCC core system and the RMI client.

IV. Implement the code in the Extension Framework

Our WCC extension project "XBankAccountSerivce" overview:


Figure 4. XBankAccountService overview
WCC Extension Framework

"XTCRMAdminContEquivBObjQuery" extends "AdminContEquivBObjQuery" and we created a new SQL query in this object. Our customer Id query is a new SQL query, so we revised the SQL clause and added a new query class which is invoked by the "Component" class.


Listing 8. The new query class for component
                
public class XTCRMAdminContEquivBObjQuery extends AdminContEquivBObjQuery {

    // this is a static map to store the query logical name to SQL mappings
    private static Map sqls = new HashMap()&

    //TODO: Implement the relevant constant values for the extension and comment out or 
    //      remove those that are unnecessary for the implementation.
    private static final String XPARTY_ADMIN_SYS_KEY_BY_ID_QUERY_SQL = "SELECT" + 
        "CONTEQUIV.CONT_EQUIV_ID, CONTEQUIVID27, CONTEQUIV.CONT_ID CONTEQUIV_CONT_ID," +
        "CONTEQUIV.ADMIN_SYS_TP_CD ADMINSYSTPCD27, CONTEQUIV.ADMIN_CLIENT_ID " +
        "ADMINCLIENTID27, CONTEQUIV.DESCRIPTION DESCRIPTION27, " +
        "CONTEQUIV.LAST_UPDATE_DT LASTUPDATEDT27, CONTEQUIV.LAST_UPDATE_USER " +
        "LASTUPDATEUSER27, CONTEQUIV.LAST_UPDATE_TX_ID LASTUPDATETXID27 FROM CONTEQUIV " +
        "WHERE CONTEQUIV.ADMIN_CLIENT_ID = ?";
    
    static{
    	
        sqls.put(PARTY_ADMIN_SYS_KEY_BY_ID_QUERY, XPARTY_ADMIN_SYS_KEY_BY_ID_QUERY_SQL);
        
       
    }

The "Controller" is the entry point for a transaction. In the controller package we added the new method, getPersonByBankCustomerId, in the "Finder" class.


Listing 9. Add method in Finder class
                
/**
 * Controller class that response to handle inquiring request(s).
 */
public class XBankAccountFinder extends TCRMCommonComponent 
                                implements IXBankAccountFinder {
              public TCRMResponse getPersonByBankAccountId(String aXBankAccountBNIdPK, 
                      DWLControl aDWLControl) throws Exception {
              ....
}
              public TCRMResponse getPersonByBankCustomerId(String bankCustomerId, 
                         DWLControl aDWLControl) throws Exception {
}

The methods in the "Finder" class delegate the query logic to the related business component. We then completed the customer query logic in this method. Commonly the logic is divided to three parts: pre-Execute, component execute, post-Execute: "pre-Execute" prepares the parameter; "component execute" invokes the business component functions; "post-Execute" returns the result.


Listing 10. The method code in the Finder class
                
//******************POPULATING TCRMPREPOSTOBJECT **************************
            //set the action category (whether its add or update or view)
            theTCRMPrePostObject.setActionCategoryString
                                 (TCRMControlKeys.VIEW_ACTION_CATEGORY);

            //set the current TransactionName
            theTCRMPrePostObject.setCurrentTCRMCoreTransactionName
                (XBankAccountBNTransactionName.GET_PERSON_BY_BANKCUSTOMER_ID_COMPONENT);

            //set the Control
            theTCRMPrePostObject.setDWLControl(aDWLControl);

            //set the level (controller or component)
            theTCRMPrePostObject.setProcessLevel(TCRMControlKeys.CONTROLLER_LEVEL);

            //set validation to true
            theTCRMPrePostObject.setValidationFlag(false);

            //set status
            theTCRMPrePostObject.setStatus(status);

            //set Inquiry Parameters
            theTCRMPrePostObject.setInquiryParams(new String[] { bankCustomerId });

            //invoke preExecute Method
            preExecute(theTCRMPrePostObject);

            XBankAccountComponent aXBankAccountComponent = new XBankAccountComponent();
            TCRMPersonBObj personBObj = aXBankAccountComponent.getPersonByBankCustomerId
                                        (bankCustomerId, aDWLControl);

            if (personBObj == null) {

                DWLError error = errHandler.getErrorMessage
                         (XBankAccountBNComponentID.XBANKACCOUNTBN_COMPONENT,
                          TCRMErrorCode.READ_RECORD_ERROR,
                          XBankAccountBNErrorReasonCode.XBANKACCOUNTBN_RECORD_NOT_FOUND,
                          aDWLControl, new String[0]);
                status.addError(error);
                status.setStatus(DWLStatus.FATAL);
            } else {

      //**********************INVOKE POSTEXECUTE******************************
                theTCRMPrePostObject.setCurrentObject(personBObj);
                postExecute(theTCRMPrePostObject);
                status.setStatus(DWLStatus.SUCCESS);
                response.setData(theTCRMPrePostObject.getCurrentObject());
            }

            response.setStatus(status);

The Business component calls the WCC query object which contains the SQL query that is executed against the WCC database.


Listing 11. The method code in the Component class
                
/**
 * Business component for handling XBankAccount related transactions and
 * inquires.
 */
public class XBankAccountComponent extends TCRMCommonComponent {

            BObjQuery bObjQuery = null;
            
            bObjQuery = getBObjQueryFactory().createAdminContEquivBObjQuery
                        (XTCRMAdminContEquivBObjQuery.PARTY_ADMIN_SYS_KEY_BY_ID_QUERY,
                        theControl);
            bObjQuery.setParameter(0, new Long(bankCustomerId));

            adminContEquivBObj = (TCRMAdminContEquivBObj) bObjQuery.getSingleResult();
             
            String partId = adminContEquivBObj.getPartyId();

            bObjQuery = getBObjQueryFactory().createPersonBObjQuery
                        (PersonBObjQuery.PERSON_QUERY,theControl);
            bObjQuery.setParameter(0, new Long(partId));
            
            personBObj = (TCRMPersonBObj) bObjQuery.getSingleResult();
            
            //set returned object
            theTCRMPrePostObject.setCurrentObject(personBObj);

            //invoke postExecute
            postExecute(theTCRMPrePostObject);
}

V. Deploy the WCC extension

After the extension code has been completed, there are four steps that need to be executed to deploy the extension on WAS:

  • Insert the metadata generated by the Customer Toolkit into the WCC database. The Customer Toolkit generates an SQL script during creation of the extension. This script must be run (using a database command) against the WCC repository to store the meta data that enables the extension to be recognized by the WCC core system.
  • Append the extension class name into the properties file.
  • Export the Customer Application to an EAR file.
  • Deploy the EAR file on WAS.

Listing 12. A snippet of metadata
                
-- Add transaction types for XBankAccountBN
----------------------------------------------
INSERT INTO DB2ADMIN.CDBUSINESSTXTP (BUSINESS_TX_TP_CD, NAME, DESCRIPTION, EXPIRY_DT, ...
INSERT INTO DB2ADMIN.CDBUSINESSTXTP (BUSINESS_TX_TP_CD, NAME, DESCRIPTION, EXPIRY_DT, ...
----------------------------------------------
-- Add request and response objects for XBankAccountBN
----------------------------------------------
INSERT INTO BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, ...
values (900105, 9009, null, null, 'I', 2, 'aXBankAccountBNIdPK', 1, 'cusadmin', ...

INSERT INTO BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, ...
values (900106, 9009, null, null, 'I', 5, 'aDWLControl', 2, 'cusadmin', ... 

INSERT INTO BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, ...
values (900107, 9009, 'TCRM', 'XBankAccountBNBObj', 'O', null, null, null, ...

INSERT INTO BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, ...
values (900108, 9011, null, null, 'I', 2, 'bankCustomerId', 1, 'cusadmin', ...

INSERT INTO BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, ...
values (900109, 9011, null, null, 'I', 5, 'aDWLControl', 2, 'cusadmin', ...

INSERT INTO BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, ...
values (900110, 9011, 'TCRM', 'XBankAccountBNBObj', 'O', null, null, null, 'cusadmin'...  

VI. Test the new WCC service

WCC provides a Web page to test the WCC service. The interface is a Web application built using JSPs. It can be used to submit an XML request to the WCC core services.

To use the test service, install "WSAdpterSampleClient.war" which is provided in the WCC install package on the WCC server. Navigate to the following URL to open the test client: http://<Host>:<Port>/<Context root>/sample/WsServiceControllerAdapterProxy/TestClient.jsp. In this client JSP page you can submit XML request messages and receive XML response messages.

The XML request below is for our new query service. The query service name "getPersonByBankCustomerId" is entered for the <InquiryType> field, and the Customer Id parameter is input for the <tcrmParam name="bankCustomerId">. The request is submitted (see List 13 below).


Listing 13. New service request message
                
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE TCRMService SYSTEM "myTCRM.dtd">
<TCRMService>
<RequestControl>
<requestID>10026112</requestID>
<DWLControl>
<requesterName>DWL Univeristy</requesterName>
<requesterLanguage>100</requesterLanguage>
</DWLControl>
</RequestControl>
<TCRMInquiry>
<InquiryType>getPersonByBankCustomerId</InquiryType>
<InquiryParam>
<tcrmParam name="bankCustomerId">200201</tcrmParam>
</InquiryParam>
</TCRMInquiry>
</TCRMService>           

After submitting the request message, we get back the response XML message of customer detail (See List 14 below).


Listing 14. New service response message
                
<?xml version="1.0"?> <!DOCTYPE TCRMService SYSTEM "tCRMResponse.dtd"> <TCRMService>
<ResponseControl> <ResultCode>SUCCESS</ResultCode> <ServiceTime>94</ServiceTime>
<DWLControl> <requesterLanguage>100</requesterLanguage><requesterName>DWL Univeristy
</requesterName> <requestID>10026112</requestID> </DWLControl></ResponseControl> 
<TxResponse> <RequestType>getPersonByBankCustomerId</RequestType> <TxResult> <ResultCode>
SUCCESS</ResultCode> </TxResult> <ResponseObject> <TCRMPersonBObj><ClientImportanceType>4
</ClientImportanceType> <ClientPotentialType>1</ClientPotentialType><ClientStatusType>1
</ClientStatusType> <ComputerAccessType>6</ComputerAccessType><CreatedDate>
2002-04-17 11:32:00.0</CreatedDate> <DisplayName>Mr. James Bond</DisplayName>
<PartyActiveIndicator>Y</PartyActiveIndicator> <PartyId>1</PartyId><PartyLastUpdateDate>
2007-02-01 16:32:09.0</PartyLastUpdateDate> <PartyLastUpdateTxId>0</PartyLastUpdateTxId> 
<PartyLastUpdateUser>DataStage</PartyLastUpdateUser> <PartyType>P</PartyType> 
<PreferredLanguageType>100</PreferredLanguageType> <StatementFrequencyType>2
</StatementFrequencyType> <DoNotDeleteIndicator>Y</DoNotDeleteIndicator> 
<AgeVerifiedWithType>3</AgeVerifiedWithType> <BirthDate>1974-05-27 00:00:00.0</BirthDate> 
<GenderType>m</GenderType> <HighestEducationType>3</HighestEducationType> 
<MaritalStatusType>2</MaritalStatusType> <NumberOfChildren>0</NumberOfChildren> 
<PersonLastUpdateDate>2007-02-01 16:32:58.0</PersonLastUpdateDate> <PersonLastUpdateTxId>
0</PersonLastUpdateTxId> <PersonLastUpdateUser>DataStage</PersonLastUpdateUser> 
<PersonPartyId>1</PersonPartyId> <DWLStatus> <Status>gt;0</Status> </DWLStatus> 
</TCRMPersonBObj> </ResponseObject> </TxResponse> </TCRMService>
			

Conclusions

CDI, or the "360 degree view of the customer", are terms that refer to the ability to provide a complete view of the customer across brand, channel and company. WCC provides a solution to this challenge by providing a repository that is capable of storing that data along with a framework for accessing and extending that data. The Data Stewardship User Interface provides the models and classes required to easily create a portlet to present the data and SDO definitions that enable the portlets to exchange data with the WCC core system. The Toolkit wizard enables the extension of and addition to WCC-provided tables and services. In summary, WCC enables CDI through its SOA architecture and easy-to-use UIs, tools, and wizards. As a result of Jivaro's integration with WCC, Jivaro has a consolidated, multi-channel customer repository that is accessible through a common set of services provided by WCC.



Downloads

DescriptionNameSizeDownload method
Demo 1WCCPart3DataStage.wmv13MBHTTP
Demo 2Seminole_WCC_integration_v7.wmv19MBHTTP

Information about download methods


Resources

Learn

  • Read "Building Composition Business Services, Part 1" (developerWorks, Jun 2007), the first article in a series of articles that describe how to create composite business services. Each article documents how to use a CBS-enabling technology in the context of a Software-as-a-Service hosted banking environment.

  • Learn more about the XSD-SDO RAD plug-in.

  • Visit the WebSphere Customer Center: Find product information and downloads. Specifically, find a guide for DataStage WCC load jobs: "IBM IIS High Volume Load (HVL) Solution Installation Instructions For IBM WebSphere Customer Center" (WCCHVLSolutionInstallInstructions.pdf), as well as a data dictionary for WCC: (DWLCustomerDataDictionary.pdf), available when you download the product.

  • Visit the Information Integration page on developerWorks to read articles and tutorials on the IBM Information Server and connect to other resources to expand your information integration skills.

  • Browse the technology bookstore for books on these and other technical topics.

  • developerWorks Information Management zone: Learn more about DB2. Find technical documentation, how-to articles, education, downloads, product information, and more.

  • Stay current with developerWorks technical events and webcasts.

Get products and technologies

  • Build your next development project with IBM trial software, available for download directly from developerWorks.

Discuss

About the authors

Author Photo: Mary Taylor

Mary Taylor is a senior IT architect. She works in the Strategic Technology Architecture and Incubation (STAI) team and is currently working on an SOA CBS pilot . Her interests include DB2 and DataStage.

Li (Tony) Wei's photo

Li Wei is a software engineer. He is working in the China Emerge Technology Institute (CETI) team.

Comments (Undergoing maintenance)



Trademarks  |  My developerWorks terms and conditions

Help: Update or add to My dW interests

What's this?

This little timesaver lets you update your My developerWorks profile with just one click! The general subject of this content (AIX and UNIX, Information Management, Lotus, Rational, Tivoli, WebSphere, Java, Linux, Open source, SOA and Web services, Web development, or XML) will be added to the interests section of your profile, if it's not there already. You only need to be logged in to My developerWorks.

And what's the point of adding your interests to your profile? That's how you find other users with the same interests as yours, and see what they're reading and contributing to the community. Your interests also help us recommend relevant developerWorks content to you.

View your My developerWorks profile

Return from help

Help: Remove from My dW interests

What's this?

Removing this interest does not alter your profile, but rather removes this piece of content from a list of all content for which you've indicated interest. In a future enhancement to My developerWorks, you'll be able to see a record of that content.

View your My developerWorks profile

Return from help

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=1
Zone=Information Management, WebSphere, SOA and Web services
ArticleID=240017
ArticleTitle=Data integration and composite business services, Part 2: Providing a single view of your customer through service integration
publish-date=07122007
author1-email=marytaylor@us.ibm.com
author1-email-cc=flanders@us.ibm.com
author2-email=weili@cn.ibm.com
author2-email-cc=

My developerWorks community

Tags

Help
Use the search field to find all types of content in My developerWorks with that tag.

Use the slider bar to see more or fewer tags.

Popular tags shows the top tags for this particular content zone (for example, Java technology, Linux, WebSphere).

My tags shows your tags for this particular content zone (for example, Java technology, Linux, WebSphere).

Use the search field to find all types of content in My developerWorks with that tag. Popular tags shows the top tags for this particular content zone (for example, Java technology, Linux, WebSphere). My tags shows your tags for this particular content zone (for example, Java technology, Linux, WebSphere).

Special offers