Training Integration Broker PeopleTools 8.

51

Training Integration Broker

1.

OVERVIEW ........................................................................................................................... 4 1.1. 1.2. 1.3. 1.4. Environment ................................................................................................................ 4 Aim ............................................................................................................................... 4 Prerequisite Knowledge............................................................................................... 4 Project .......................................................................................................................... 4 Activate application server pub/sub processes........................................................... 5 Enable communication between application server and web server ......................... 9 Enable communication between web server and application server ......................... 9 Setup web service configuration ............................................................................... 14 Activate Integration Broker Domains ........................................................................ 15 Modify Internal Nodes ............................................................................................... 16 Component navigation .............................................................................................. 17 Generate Component Interface ................................................................................ 18 Component Interface Security................................................................................... 20 Generate CI Based Service ......................................................................................... 21 Provide CI Based Service............................................................................................ 26 Call CI Based Service via SoapUI ................................................................................ 28 Call PeopleSoft Service PeopleCode .......................................................................... 32 Mock Service.............................................................................................................. 38 Create Node ............................................................................................................... 41 Import WSDL.............................................................................................................. 43 PeopleCode ................................................................................................................ 49 Messages ................................................................................................................... 52 Service........................................................................................................................ 54 PeopleCode ................................................................................................................ 56 Routing and Handler .................................................................................................. 58 Deploy Service ........................................................................................................... 59 Service Operation Tester ........................................................................................... 61 Call from SoapUI ........................................................................................................ 63 PeopleCode call ......................................................................................................... 65
Page 2 of 84

2.

SETUP INTEGRATION BROKER............................................................................................. 5 2.1. 2.2. 2.3. 2.4. 2.5. 2.6.

3.

PROVIDE COMPONENT INTERFACE SERVICE .................................................................... 17 3.1. 3.2. 3.3. 3.4. 3.5. 3.6. 3.7.

4.

CALL EXTERNAL SERVICE ................................................................................................... 38 4.1. 4.2. 4.3. 4.4.

5.

CUSTOM PEOPLESOFT APPLICATION CLASS SERVICE ....................................................... 52 5.1. 5.2. 5.3. 5.4. 5.5. 5.6. 5.7. 5.8.

Training Integration Broker

6.

TRANSLATIONS .................................................................................................................. 67 6.1. 6.2. 6.3. 6.4. 6.5. 6.6. Setup Transform Message ......................................................................................... 67 Setup XSLT Application Engine .................................................................................. 68 Delete WSDL .............................................................................................................. 71 Add Transformation to Service .................................................................................. 72 Provide Service .......................................................................................................... 73 Call service using SoapUI ........................................................................................... 73 Activate Pub/Sub Servers .......................................................................................... 74 Activate Process Scheduler........................................................................................ 74 Create Application Engine ......................................................................................... 75 Application Engine Handler ....................................................................................... 76 Create Process ........................................................................................................... 78 Test Operation ........................................................................................................... 79

7.

APPLICATION ENGINE HANDLER ....................................................................................... 74 7.1. 7.2. 7.3. 7.4. 7.5. 7.6.

APPENDIX A PEOPLECODE CALL CI ........................................................................................... 81 APPENDIX B PEOPLECODE CALL EXTERNAL SERVICE ............................................................... 82 APPENDIX C PEOPLECODE CALL CUSTOM PS SERVICE ............................................................. 83 APPENDIX D APPLICATION CLASS CUSTOM PS SERVICE HANDLER.......................................... 84

Page 3 of 84

Training Integration Broker

1. OVERVIEW
1.1. Environment
This training • will give you an overview of the basics on Integration Broker. • is developed using a PeopleSoft HCM 9.1 with PeopleTools 8.51 environment.

1.2. Aim
Goal of this training is to provide an introduction to the Integration Broker and gaining basic knowledge and hands-on training on integration using web services. This training will also handle how to leverage from non-PeopleSoft tools like SoapUI and JDeveloper.

1.3. Prerequisite Knowledge
The trainees should have completed the following PeopleSoft trainings prior to this training. PeopleSoft training • PeopleTools 1 • PeopleTools 2 • PeopleCode SOA General Training • Web services & SOA • XML • XSLT • XSD • SOAP • WSDL

1.4. Project
Before you start copy from Project IBCOURSE_CUST using Application Designer and build the project! This projects contains sources that you will be using during this training.

Page 4 of 84

SETUP INTEGRATION BROKER 2. to be found in [PS_HOME]\appserv\psadmin Choose option 1) Application Server Choose option 1) Administer a domain Choose option 3) HCM (this name could be different in your environment) Page 5 of 84 . Note: For synchronous services these processes do not need to be running.Training Integration Broker 2. Start PSADMIN.1. Activate application server pub/sub processes First you need to active the Publish & Subscribe processes in the application server. These processes will enable asynchronous services to be processed.

Page 6 of 84 .Training Integration Broker Choose option 4) Configure this domain Type y to start configuring the application server.

Pub/Sub servers are now activated and will start up when the application server starts.Training Integration Broker Choose option 1 to activate the Pub/Sub Servers. Write down the number of this port. Page 7 of 84 . Note option 25) JSL Port is the Jolt port configured that the web server communicates with the application server. Choose option 13 to save the changes in the configuration of the application server. you will be needing it later on.

You can see the Pub/Sub processes are running.Training Integration Broker Choose option 1 to start the application server. Page 8 of 84 .

P Navigate via menu Main Menu > PeopleTools > Integration Broker > Configuration > Gateway.3. This is needed for outbound traffic. The next screen will show in a new window 2. The default local node (PSFT_HR) will now be shown as the first node in the list. Enable communication unication between web web server and application server During this step you will tell the Integration Gateway which application server(s) it should communicate with. Start PeopleSoft HCM by starting a browser session and login with user PS and password PS. Enable communication between application application server and web server During this step you will configure which Integration Gateway will be used by the application server. First we need to find the default local node of HCM. Click on the Ping Gateway button to see if the Integration Gateway is up and running. Page 9 of 84 . The connectors will be loaded as shown in the screen above. After that click on the Default Local Node header of the result grid. Navigate via menu Main Menu > PeopleTools > Integration Broker > Integration Setup > Nodes On the search page. click on the search button to query all the nodes.2.Training Integration Broker 2. The Integration Gateway URL is to be constructed as follows: http://[server:port]/PSIGW/PeopleSoftListeningConnector Substitute this URL with your server and port and tab click on Save. This is needed for inbound traffic.

Page 10 of 84 . Select Authentication Option: Password.Training Integration Broker Select node PSFT_HR.

Again for the sake of convenience during this training you will not do this. all processing of services will be aborted. If you were to use an active PeopleSoft user and if this user would be locked for whatever reason. Navigate via menu Main Menu -> PeopleTools -> Integration Broker -> Configuration -> Gateway Click on the link Gateway Setup Properties. Default User ID and Password are administrator/password.Training Integration Broker Provide an existing PeopleSoft user for Default User ID. The following screen will be shown. It is also a good custom to rename/copy the default local node to an unique node name for your environment. It is a good custom to assign a dedicated user for the Integration Broker. Page 11 of 84 . For the sake of convenience during this training you will use the user PS. Supply these values and click on OK.

The following screen will be shown. Click on Ping node for the node PSFT_HR. This file can be found in directory [PS_HOME]\webserv\peoplesoft\ \applications\peoplesoft\PSIGW.Training Integration Broker In the first section provide the default application server that the Integration Integration Gateway will use to handle messages. The Integration Gateway can now successfully communicate with the application server. Field App Server URL User ID Password Tools Release Value [appserv machine]:[JSL port appserver] PS PS 8. Click on the Return button and click on the link Advanced Properties Page.51. The integrationgateway.war\WEB-INF Page 12 of 84 .properties file will now be shown.04 In the second section provide the default local node and corresponding application server that the Integration Gateway will use.

Page 13 of 84 .html In this file scroll down to secureFileKeystorePasswd=password Using the password encrypting section encrypt the password and change this in the file.html /PSIGW/errorLog.html http://<yourserver>:<port>/PSIGW/msgLog.war These file can also be found online using the following URL’s File Error Log Message Log URL http://<yourserver>:<port>/PSIGW/errorLog. The error log en message log og can be found in directory [PS_HOME]\webserv\peoplesoft peoplesoft\applications\peoplesoft\PSIGW.log. Scroll down in this file and set logging to value 5 ig.level=5 With this setting you will enable logging messages and errors in the Integration Broker.Training Integration Broker You can see that this file now contains the application servers that have been be configured in the PeopleSoft Node Configuration Page.

Setup web service configuration During this step you will setup the namespaces and target location. These will be used in the XSD’s and WSDL’s as target namespace. Navigate via menu Main Menu > PeopleTools > Integration Broker > Configuration > Service Configuration Enter desired service and schema namespaces. The field target location refers to the endpoint that services will get. The syntax for this is: http://<server>:<port>/PSIGW/PeopleSoftServiceListeningConnector/[<defaultlocalnode>] http://<server>:<port>/PSIGW/PeopleSoftServiceListeningConnector/[<defaultlocalnode>] Appending the default local node to the target location is not mandatory.4. Change the field Service System Status to Development. You can keep them default as displayed. Page 14 of 84 . PeopleTools will use this information when setting up XSD’s and WSDL’s. This will enable you to make changes to services without having ing to create new versions every time.Training Integration Broker 2. Although this is highly recommended if you have multiple environments running on the same PIA PIA/Integration Gateway.

Page 15 of 84 .5. Activate Integration Broker Domains The Pub/Sub processes we have to be activated activ in the Integration Broker. The following screen will be shown: Click on the button Purge Domain Status. Navigate via Main Menu > PeopleTools > Integration Integration Broker > Configuration > Quick Configuration Click on the link Domain Status.Training Integration Broker 2.

During the following chapters you will not be using asynchronous services. Do the same for the WSDL_NODE node. You can choose to deactivate the Pub/Sub services in the configuration of the application server for performance reasons! 2. Modify Internal Nodes The Integration Broker uses some internal nodes that need modification. Navigate via menu Main Menu > PeopleTools > Integration Broker > Integration Setup > Nodes Search node ANONYMOUS Enter an existing PeopleSoft user in the Default User ID field.6. The Integration Broker is able to process asynchronous services.Training Integration Broker Now check checkbox All Domains Active and click on the button Update and click on the button Refresh. Page 16 of 84 .

Select Marital Status as Divorced and set As of to 01/01/2011 and click on the Save button. The easiest way to provide a service from PeopleSoft. Component navigation You will provide the component PERSONAL_DATA as a web service. is providing a service based on a component interface. Navigate via Main Menu > Workforce Administration > Personal Information > Biographical > Modify a Person Search EMPLID KU0001 Click on the plus icon to add a new row. Before creating a component interface it is wise to open the component and enter a couple of transactions to understand the behaviour of the component. 3. PROVIDE COMPONENT INTERFACE SERVICE The Integration Broker is now set up to provide and invoke services. All business logic and validations on the component will be triggered through the web service and all functional and technical warnings and errors will be passed back to the web service. Page 17 of 84 . navigate through the pages and enter or modify data. Let’s enter a Divorce on 01-01-2011 Enter 01/01/2011 as Effective Date.Training Integration Broker 3.1. The generated web service will in fact invoke the component interface as if you were to open the PeopleSoft component online.

2. Component name is PERSONAL_DATA. Generate Component Interface You will now generate a service for this component and invoke this service with the same sort of transactions as you did manually. Choose New Definition -> Component Interface from the menu. Open Application Designer and log in with user/password PS/PS. Page 18 of 84 . Using CTRL+J you can find the component name for the component you are on. You will have to create a component interface for this component first.Training Integration Broker 3.

Page 19 of 84 . A component interface will be generated for the component PERSONAL_DATA. You have now generated a component interface for a component. you will need to provide access to this component interface. Save the component interface with a name like CI_PERSONAL_DATA_IBCOURSE.Training Integration Broker Search for component PERSONAL_DATA and click on Select. Before you generate a web service based on this component interface.

Component Interface Security Navigate via Main Menu > PeopleTools > Security > Permissions & Roles > Permission Lists and open permission list IBCOURSE. Click on Save to save the changes. Navigate via Main Menu > PeopleTools > Security > Permissions & Roles > Roles and create a new role with name IBCOURSE. Select tab Component Interfaces and enter CI_PERSONAL_DATA_IBCOURSE. Page 20 of 84 .3. Click on the Full Access button to provide access to all the component interface method and click on the button OK.Training Integration Broker 3. You will now add the permission list to a new role. Click on the Edit link.

3.Training Integration Broker Go to tab Permission Lists and add the permission list IBCOURSE. save the role. Generate CI Based Service Navigate via Main Menu -> PeopleTools-> Integration Broker -> Web Services -> CI-Based Services Page 21 of 84 . Navigate via Main Menu > PeopleTools > Security > User Profiles > User Profiles and add role IBCOURSE to user PS.4.

Click on the button Perform Selected Actions. Select the Component Interface and click on Review CI Status. Page 22 of 84 . A service will now be generated with the name CI_CI_PERSONAL_DATA_IBCOU with 5 service operations corresponding to the component interface methods.Training Integration Broker Enter Component Interface Name CI_PERSONAL_DATA_IBCOURSE and click on Search. Click on the link Select All to select all the Component Interface methods and click on the button Display Selected Actions.

Training Integration Broker Take a look at the generated service. Page 23 of 84 . Navigate via Main Menu > PeopleTools > Integration Broker > Integration Setup > Services to service CI_CI_PERSONAL_DATA_IBCOU.

Page 24 of 84 .2.3. The 5 operations invoke the 5 CI methods CI Method Create Find Get UpdataData Update Operation _C _F _G _UD _UP Description Create new level0. etc) Click on the operation that ends with _G.4. Search record Add new Search Record Find Existing Get level0 Change existing data Add new rows (level 1.Training Integration Broker You have a service with 5 operations.

Save the operation. Click on the Handlers tab and check if the handler is set to Active. Add Permission List IBCOURSE and provide Full Access. Page 25 of 84 . Save the changes. Click on the link Service Operation Security.Training Integration Broker You have to provide access to this service operation. Check the checkboxes Regenerate Any-to-Local and Generate Local-to-Local.

Training Integration Broker Click on the Routings tab and check if the generated routings are active.5. Page 26 of 84 . 3. Provide CI Based Service Go back to the service definition screen and click on the link Provide Web Service. The next screen will be shown. The service operation is now ready to be provided.

Click on Next and Finish.Training Integration Broker Select all operations and click on the button Next. The web service is now deployed and accessible. The next screen will be shown. Have a closer look at the WSDL! Page 27 of 84 . Copy the WSDL URL and paste it in a new browser window. Click on the link View WSDL to see the generated WSDL.

Open operation ending with _G by expanding it and double click on Request 1.New SoapUI Project Enter the WSDL URL you copied in the previous paragraph and enter this at Initial WSDL/WADL and click on OK. This is a freeware tool for testing web services.Training Integration Broker 3.6. Page 28 of 84 . SoapUI will read the WSDL and create request messages for each operation. SoapUI generates the request message based on the WSDL and XSD’s and has taken the endpoint from the WSDL where the request will be send to. Start SoapUI and choose File . Call CI Based Service via SoapUI You will now invoke the deployed web service via SoapUI.

or g/soap/ envelope/" xmlns:soapenc="http://schemas.or g/soap/ envelope/" xmlns:m47="http://xmlns.V1"> <m47:EMPLID_0>KU0001</m47:EMPLID_0> <m47:PERS_DATA_EFFDT> <m47:EFFDT_1>2011-01-01</m47:EFFDT_1> <m47:MAR_STATUS>D</m47:MAR_STATUS> <m47:MAR_STATUS_DT>2011-0101</m47:MAR_STATUS_DT> <m47:SEX_0>M</m47:SEX_0> <m47:HIGHEST_EDUC_LVL_0>A</m47:HIGHEST_E D UC_LVL_0> <m47:FT_STUDENT>N</m47:FT_STUDENT> <m47:LANG_CD_0/> <m47:ALTER_EMPLID/> </m47:PERS_DATA_EFFDT> <m47:PERS_DATA_EFFDT> <m47:EFFDT_1>1980-01-01</m47:EFFDT_1> <m47:MAR_STATUS>M</m47:MAR_STATUS> <m47:MAR_STATUS_DT>1980-0101</m47:MAR_STATUS_DT> <m47:SEX_0>M</m47:SEX_0> <m47:HIGHEST_EDUC_LVL_0>A</m47:HIGHEST_E D UC_LVL_0> <m47:FT_STUDENT>N</m47:FT_STUDENT> <m47:LANG_CD_0/> <m47:ALTER_EMPLID/> </m47:PERS_DATA_EFFDT> </m47:Get__CompIntfc__CI_PERSONAL_DATA_I BCO URSEResponse> </soapenv:Body> </soapenv:Envelope> Congratulations.oracle.w3.xmlsoap. you have successfully called a web service and retrieved data from PeopleSoft. Request <soapenv:Envelope xmlns:soapenv="http://schemas.V1"> <soapenv:Header/> <soapenv:Body> <m47:Get__CompIntfc__CI_PERSONAL_DATA_IB CO URSE> <m47:EMPLID>KU0001</m47:EMPLID> </m47:Get__CompIntfc__CI_PERSONAL_DATA_I BC OURSE> </soapenv:Body> </soapenv:Envelope> Response <soapenv:Envelope xmlns:soapenv="http://schemas.w3.xmlsoap.oracle.xmlsoap.com/Enter prise/To ols/schemas/M475651. Page 29 of 84 .Training Integration Broker Change ? in the request window for EMPLID to value KU0001 and click on the green start icon on the left top corner of the request screen.or g/soap/ encoding/" xmlns:xsd="http://www.org/2001/XMLSch ema" xmlns:xsi="http://www.org/2001/XMLSch emainstance"> <soapenv:Body> <m47:Get__CompIntfc__CI_PERSONAL_DATA_IB CO URSEResponse xmlns:m47="http://xmlns.com/Enter prise/To ols/schemas/M1021932.

org/soap/envelope/" xmlns:m80="http://xmlns. <soapenv:Envelope xmlns:soapenv="http://schemas. Click on tab web services. Page 30 of 84 .oracle.org/soap/envelope/"> <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode>SOAP-ENV:Server</faultcode> <faultstring>null</faultstring> <detail> <IBResponse type="error"> <DefaultTitle>Integration Broker Response</DefaultTitle> <StatusCode>20</StatusCode> <MessageID>536</MessageID> <DefaultMessage>User PS not authorized to invoke Service Operation CI_CI_PERSONAL_DATA_IBCOU_UP.xmlsoap. Change the request message to the one below and click on the green icon. Now add access to all the operations for this service.xmlsoap. (158.536)</DefaultMessage> <MessageParameters> <Parameter>PS</Parameter> <Parameter>CI_CI_PERSONAL_DATA_IBCOU_UP</Parameter> </MessageParameters> </IBResponse> </detail> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Remember. Double click on the operation ending with _UP Double click on Request 1 and SoapUI will generate a request message. you only provided access to the service operation _G and not for the operation _UP. Navigate via Main Menu > PeopleTools > Security > Permissions & Roles > Permission Lists and open permission list IBCOURSE.Training Integration Broker Now you can try to change the Marital Status back to Married again by adding a new row with a new Effective Date.com/Enterprise/Tools/schemas/M803237. Log in PeopleSoft.V1"> <soapenv:Header/> <soapenv:Body> <m80:Update__CompIntfc__CI_PERSONAL_DATA_IBCOURSE> <m80:EMPLID>KU0001</m80:EMPLID> <m80:PERS_DATA_EFFDT> <m80:EFFDT_1>2011-01-02</m80:EFFDT_1> <m80:MAR_STATUS>M</m80:MAR_STATUS> <m80:MAR_STATUS_DT>2011-01-02</m80:MAR_STATUS_DT> </m80:PERS_DATA_EFFDT> </m80:Update__CompIntfc__CI_PERSONAL_DATA_IBCOURSE> </soapenv:Body> </soapenv:Envelope> You will get following Error response: Response <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.

w3. Response <soapenv:Envelope xmlns:soapenv="http://schemas.Training Integration Broker Click on the Edit link behind the service CI_CI_PERSONAL_DATA_IBCOU.V1"> <m80:notification>1</m80:notification> <m80:detail/> </m80:Update__CompIntfc__CI_PERSONAL_DATA_IBCOURSEResponse> </soapenv:Body> </soapenv:Envelope> Page 31 of 84 . Click on Full Access (All) to provide access to all the operations and click on the button OK and finally Save.oracle.org/soap/encoding/" xmlns:xsd="http://www.xmlsoap.org/2001/XMLSchema" xmlns:xsi="http://www.org/soap/envelope/" xmlns:soapenc="http://schemas. As you can see you only provided access to operation _G.com/Enterprise/Tools/schemas/M473088.xmlsoap.org/2001/XMLSchemainstance"> <soapenv:Body> <m80:Update__CompIntfc__CI_PERSONAL_DATA_IBCOURSEResponse xmlns:m80="http://xmlns.w3. Now go back to SoapUI and invoke the request again.

You can see that there are 3 rows for the section Biographical History and that the row you just added through the web service is the most current. In the messages section click on the link View Message for the Request messages. Click on operation link CI_CI_PERSONAL_DTA_IBCOU_G. 3. Page 32 of 84 .V1.7. First have a closer look at het service. Call PeopleSoft Service PeopleCode In this paragraph you will write PeopleCode to invoke to Component Interface service. Navigate via Main Menu > PeopleTools > Integration Broker > Integration Setup> Services and open service CI_CI_PERSONAL_DATA_IBCOU.Training Integration Broker Check online if Marital Status has been changed.

xmlsoap. In this screen you can see the structure of the request message that you have to construct <?xml version="1.org/wss/2004/01/oasis-200401-wss-wssecuritysecext-1.Training Integration Broker You can see this message is a Nonrowset-based message type.oasis-open.oracle.org/ws/2003/03/addressing/" xmlns:xsd="http://www.org/soap/envelope/" xmlns:wsa="http://schemas.xmlsoap.com/Enterprise/Tools/schemas/M475651.xmlsoap.V1"> <EMPLID>XYZ</EMPLID> </Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSE> </soapenv:Body> </soapenv:Envelope> The request consists of several parts • Soap-Envelope • Soap-Header • Soap-Body • XML content Page 33 of 84 .org/2001/XMLSchema/" xmlns:xsi="http://www.xsd"> <wsse:UsernameToken> <wsse:Username>PTDMO</wsse:Username> <wsse:Password>PTDMO</wsse:Password> </wsse:UsernameToken> </wsse:Security> </soapenv:Header> <soapenv:Body xmlns:soapenv="http://schemas.0"?> <soapenv:Envelope xmlns:soapenc="http://schemas.xmlsoap.w3.org/wsdl/soap/" xmlns:wsse="http://docs. If this where a Rowset-based message type you could write PeopleCode using the Record API. Navigate via Main Menu > PeopleTools > Integration Broker > Service Utilities > Generate SOAP Template and choose service CI_CI_PERSONAL_DATA_IBCOU. Choose operation CI_CI_PERSONAL_DATA_IBCOU_G.org/soap/encoding/" xmlns:soapenv="http://schemas.org/soap/envelope/"> <Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSE xmlns="http://xmlns. To see an example of the request that you have to construct in PeopleCode.w3.xmlsoap.org/2001/XMLSchemainstance/"> <soapenv:Header xmlns:soapenv="http://schemas.0.xmlsoap.org/soap/envelope/"> <wsse:Security soap:mustUnderstand="1" xmlns:soap="http://schemas. In this case you have to create the request message using the XMLDoc API.

Take a closer look at the code.CreateDocumentElement("Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSE"). This project contains a custom page that you will use to invoke and test the web services.CI_CI_PERSONAL_DATA_IBCOU_G. 1. Copy above code and save the event.SetXmlDoc(&XMLDoc). /* Create XMLDOC request */ &XMLDoc = CreateXmlDoc(). /* Copy constructed request to screen */ &strxml = &XMLDoc. Log in to PeopleSoft and Navigate via Main menu > IBCourse > IBCOURSE Call WS and click on the button Call Service.IB_SOAPREQ = &strxml.AddElement("EMPLID"). You only have to construct the soap-body using PeopleCode.GenFormattedXmlString(). First you created a message object based on the request message of operation CI_CI_DATA_IBCOU_G Page 34 of 84 . IBCOURSE_WS_DER. &childNode = &rootNode. /* Create request message container from operation */ &ReqMsg = CreateMessage(Operation. &rootNode = &XMLDoc.Training Integration Broker Integration Broker will automatically generate the Soap parts upon sending the request. %IntBroker_Request). %IntBroker_Request). You can see what your code constructed. /* Set XMLDOC request to message */ &ReqMsg.0"?> <Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSE> <EMPLID>KU0001</EMPLID> </Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSE> Open Application Designer and project IBCOURSE_CUST.CI_CI_PERSONAL_DATA_IBCOU_G. Open PeopleCode editor for record IBCOURSE_WS_DER field REQEUST_BTN event FieldChange.AddText("KU0001"). That leaves you with the following message: <?xml version="1. /* Create request message container from operation */ 1 | &ReqMsg = CreateMessage(Operation. &textNode = &childNode.

If you strip the response message from all information that you do not need. Create an empty xml object Set root element to Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSE Add child element EMPLID under root element Assign element EMPLID the value KU0001 /* Set XMLDOC request to message */ 6 | &ReqMsg. Format the constructed xml to a readable xml format Print formatted xml to screen Now you will extend to code with actually sending the request message and receiving the response message.IB_SOAPREQ = &strxml. Copy below code and add this to the existing FieldChange event. You can see that you now have a response. 3 | &rootNode = &XMLDoc. 2.AddElement("EMPLID"). 5.IB_SOAPRESP = &strxml. After this the message body will be extracted and formatted on the screen. 7.SyncRequest(&ReqMsg). IBCOURSE_WS_DER. 8 | IBCOURSE_WS_DER. The next step is to try to extract specific elements from the response message. 3.GetXmlDoc().GenFormattedXmlString(). then the response looks like this: Page 35 of 84 .Training Integration Broker /* Create XMLDOC request */ 2 | &XMLDoc = CreateXmlDoc().CreateDocumentElement("Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSE"). First extract the name of the employee and all rows of the marital status that you added in the previous chapters.GenFormattedXmlString(). &strxml = &xml. 5 | &textNode = &childNode. Copy constructed xml to request message /* Copy constructed request to screen */ 7 | &strxml = &XMLDoc.AddText("KU0001"). 8. /* Send & receive message */ &ResMsg = %IntBroker. This code will send a synchronous request message through the Integration Broker and receive the response. 4 | &childNode = &rootNode. 7.SetXmlDoc(&XMLDoc). Navigate again to your test page and click on the button Call Service. 4. /* Copy response to screen */ &xml = &ResMsg.

len <> 0 Then &strMaritalStatus = &aMaritalStatus [1].NodeValue. MessageBox(0.GetElementsByTagName("EFFDT_1").com/Enterprise/Tools/schemas/M1021932. 0. If &aMaritalStatus. 0. For &i = 1 To &aPERS_DATA_EFFDT. End-If.oracle. &aEffDT = &aPERS_DATA_EFFDT [&i].len <> 0 Then &strEffDT = &aEffDT [1]. 0. End-For.Douglas</NAME> <PERS_DATA_EFFDT> <EFFDT_1>2011-01-02</EFFDT_1> <MAR_STATUS>M</MAR_STATUS> <MAR_STATUS_DT>2011-01-02</MAR_STATUS_DT> <SEX_0>M</SEX_0> <HIGHEST_EDUC_LVL_0>A</HIGHEST_EDUC_LVL_0> <FT_STUDENT>N</FT_STUDENT> <LANG_CD_0/> <ALTER_EMPLID/> </PERS_DATA_EFFDT> <PERS_DATA_EFFDT> <EFFDT_1>2011-01-01</EFFDT_1> <MAR_STATUS>D</MAR_STATUS> <MAR_STATUS_DT>2011-01-01</MAR_STATUS_DT> <SEX_0>M</SEX_0> <HIGHEST_EDUC_LVL_0>A</HIGHEST_EDUC_LVL_0> <FT_STUDENT>N</FT_STUDENT> <LANG_CD_0/> <ALTER_EMPLID/> </PERS_DATA_EFFDT> <PERS_DATA_EFFDT> <EFFDT_1>1980-01-01</EFFDT_1> <MAR_STATUS>M</MAR_STATUS> <MAR_STATUS_DT>1980-01-01</MAR_STATUS_DT> <SEX_0>M</SEX_0> <HIGHEST_EDUC_LVL_0>A</HIGHEST_EDUC_LVL_0> <FT_STUDENT>N</FT_STUDENT> <LANG_CD_0/> <ALTER_EMPLID/> </PERS_DATA_EFFDT> </Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSEResponse> You can see that there is 1 element NAME under the root node and that there is a repeating element PERS_DATA_EFFDT 3 times with the elements EFFDT_1 and MAR_STATUS. "EffDT: " | &strEffDT | " / Marital Status: " | &strMaritalStatus).GetElementsByTagName("PERS_DATA_EFFDT").V1"> <NAME>Lewis.NodeValue. You will extract these elements. Page 36 of 84 .len <> 0 Then &strName = &aName [1]. MessageBox(0.0"?> <Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSEResponse xmlns="http://xmlns. /* read response */ &aPersonalData = &xml. &aMaritalStatus = &aPERS_DATA_EFFDT[&i].len &strEffDT = "".GetElementsByTagName("NAME"). Append below code to the existing FieldChange. End-If. "".NodeValue. If &aEffDT. "".GetElementsByTagName("MAR_STATUS"). /* Get Marital Status */ &aPERS_DATA_EFFDT = &aPersonalData[1].Training Integration Broker <?xml version="1. 0. End-If. If &aName. &strMaritalStatus = "". If &aPersonalData.len <> 0 Then /* Get Name */ &aName = &aPersonalData [1].GetElementsByTagName("Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSEResponse"). "Name: " | &strName). End-If.

13. 0.Training Integration Broker Let’s examine the code. 0.NodeValue. 20 | MessageBox(0. You will see that the response message is now processed. 19 | End-If. 9. | MessageBox(0. | If &aName. 4. 20. 2. "". "EffDT: " | &strEffDT | " / Marital Status: " | &strMaritalStatus). | End-If. 8.NodeValue.len <> 0 Then 18 | &strMaritalStatus = &aMaritalStatus [1].len <> 0 Then | &aName = &aPersonalData [1]. Check whether the array of nodes on the root is not empty Retrieve element NAME under root element by &aPersonalData[1] Check whether the array of nodes for NAME is not empty Retrieve value for element NAME Print value of Name to Messagebox 8 | &aPERS_DATA_EFFDT = &aPersonalData[1]. 15 | End-If. 3. Page 37 of 84 . The return value of this method is an array of nodes. "Name: " | &strName). 1 | &aPersonalData = &xml. 14.GetElementsByTagName("Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSEResponse"). This array of nodes contains all elements of the response message 2 3 4 5 6 7 | If &aPersonalData. 12. 16.NodeValue. "". 17 | If &aMaritalStatus.len <> 0 Then | &strName = &aName [1]. 11 | &strMaritalStatus = "". 6. 17. 18.len <> 0 Then 14 | &strEffDT = &aEffDT [1]. 5. 12 | &aEffDT = &aPERS_DATA_EFFDT [&i].GetElementsByTagName("PERS_DATA_EFFDT"). 16 | &aMaritalStatus = &aPERS_DATA_EFFDT[&i]. 0. 9 | For &i = 1 To &aPERS_DATA_EFFDT.GetElementsByTagName("MAR_STATUS").len 10 | &strEffDT = "". 0. Retrieve element PERS_DATA_EFFDT under root element by &aPersonalData [1] Loop through array van nodes (there are 3 indexes) Retrieve node EFFDT_1 under element PERS_DATA_EFFDT by &aPERS_DATA_EFFDT [&i] Check whether the array of nodes on EFFDT_1 is not empty Retrieve value for node EFFDT_1 Retrieve node MAR_STATUS under element PERS_DATA_EFFDT by &aPERS_DATA_EFFDT [&i] Check whether the array of nodes on MAR_STATUS is not empty Retrieve value for node MAR_STATUS Print value of Name to Messagebox Navigate again to your test page and click on the button Call Service. 13 | If &aEffDT. With method GetElementsByTagName you retrieve the root element from the response message .GetElementsByTagName("NAME"). 1.GetElementsByTagName("EFFDT_1").

SoapUI has an option to expose the WSDL of the service of the external system as a Mock Service. Mock Service Start SoapUI and choose via File .1. To develop a proper call in PeopleSoft and to be able to test your code you can create a “stub” that will simulate the external system.New SoapUI Project and enter GetPersonExt. SoapUI will read the WSDL. This Mock Service has the ability to host the WSDL as a service and respond to calls. With the right mouse button click on the porttype GetPersonPortType Page 38 of 84 .wsdl as an example to create the Mock Service.wsdl and click on the button OK. CALL EXTERNAL SERVICE It often happens that you have to call an external service from PeopleSoft and that the development environment is not connected to the external system. You will be using the GetPersonExt.Training Integration Broker 4. 4.

Leave all options default and click on OK. A Mock Service is now created. Double click on the operation GetPerson on the right. Page 39 of 84 . Leave the name of the Mock Service default and click on OK.Training Integration Broker Select Generate Mock Service in the popup menu.

Click on OK.Training Integration Broker Double click on Response 1. Page 40 of 84 . Click on the icon SOAP on the left top corner to create a default request message and set the endpoint of the Mock Service. A default Response message will be created. The next screen will be shown. Change the question marks to your own name and userid.

Create Node By default all outbound routings in PeopleSoft will use the WSDL_NODE node. Navigate via Main Menu > PeopleTools > Integration Broker > Integration Setup > Nodes and choose tab Add New Value. Click left in the screen on Request 1 and the request screen will show. Page 41 of 84 . Go to the Mock Service screen. You will now “run” the Mock Service. You will now import the WSDL of the external system in PeopleSoft and modify the endpoint of the external system to the endpoint of the Mock service. The Mock Service is now active. After that you will write PeopleCode to call the service. 4. Now click on the green run icon to invoke the Mock Service and you will see it return a response. Click on the green run icon.Training Integration Broker In the screen above you can see the that the default request and the endpoint of the Mock Service is setup.2. You will create a new node that you will use for your routing.

Page 42 of 84 .Training Integration Broker Create a new node called IBCOURSE_EXT_NODE. Change the values a shown in above screenshot and Save. You will use this node in the following steps.

Select File and click on the button Load from File. Select the service and click on Next on the second step. Select GetPersonExt. Import WSDL Navigate via Main Menu > PeopleTools > Integration Broker > Web Services > Consume Web Service.wsdl and click on the button Next.3.Training Integration Broker 4. Page 43 of 84 .

Training Integration Broker Select the service operation and click on Next on the third step. Leave the message names default and click on Next. Page 44 of 84 .

Click on Finish. Page 45 of 84 .V1 to see the service operation.Training Integration Broker Select Use Existing Node and choose node IBCOURSE_EXT_NODE. Click on the link GETPERSON. Click on View Consumed Service to have a closer look at the generated service definition. The service definition of the external service is now imported in PeopleSoft.

Training Integration Broker Click on the link Service Operation Security. Add permission list IBCOURSE. Click on tab Routings and select the routings link. Page 46 of 84 .

Training Integration Broker

Change the Log Detail to Header and Detail. This will enable logging of the messages and errors. Click on de tab Connector Properties.

Change property SOAPUpContent to N. If this property is set to Y, Integration Broker will generate a Soap-Envelope, Soap-Header and a Soap-Body wrapper for the XML message that you will send. In this case you want to create a Soap wrapper using PeopleCode and set the target namespace yourself.

Page 47 of 84

Training Integration Broker

Change the property URL to the endpoint of the Mock Service like this example: http://[domain]:8088/mockGetPersonPortType Note: You will call the endpoint of the Mock Service for test purposes only (on your development environment). On a production environment you will have to set the endpoint back to the endpoint provided in the WSDL of the external service. Save the changes. Before you start writing, let’s have a closer look at the generated messages. This will tell you which PeopleCode API’s you should use and how the XML message should be constructed. Go back to the Service Operation and go to section Message Information.

Click on the link View Message behind the Request Message.

The request message is a Nonrowset-based message. You will have to use the XMLDOC class.

Page 48 of 84

Training Integration Broker

Click on the link View Message behind the Response Message

You can see that the Response Message is of type Document. This is a new type introduced in PeopleTools 8.51. You will have to use the PeopleCode class Document for this type.

4.4. PeopleCode
Open Application Designer and the PeopleCode editor for record IBCOURSE_WS_DER field REQUEST_BTN event FieldChange. Add following line above the existing PeopleCode:
If IBCOURSE_WS_DER.IBCOURSE_CALL_TYPE = "C" Then

And following line under the existing PeopleCode:
End-if;

You will reuse this FieldChange to call the different types of call using the dropdown value of the field IBCOURSE_WS_DER.IBCOURSE_CALL_TYPE.

Page 49 of 84

Training Integration Broker

Copy below code under the existing PeopleCode.
If IBCOURSE_WS_DER.IBCOURSE_CALL_TYPE = "E" Then /* construct SOAP message */ &Sdoc = CreateSOAPDoc(); &Sdoc.AddEnvelope(0); &EnvNode = &Sdoc.EnvelopeNode; &AddEnvelopeAttribute = &EnvNode.AddAttribute("xmlns:get","http://ibcourse.com/getPerson.wsdl/"); &Sdoc.AddHeader(); &Sdoc.AddBody(); &Sdoc.AddMethod("get:PersonID", 1); &MethodNode = &Sdoc.MethodNode; &textNode = &MethodNode.AddText("12345"); /* copy SOAP message to input message of service */ &msg = CreateMessage(Operation.GETPERSON, %IntBroker_Request); &msg.SetXmlDoc(&Sdoc.XmlDoc); &strxml = &Sdoc.XmlDoc.GenFormattedXmlString(); IBCOURSE_WS_DER.IB_SOAPREQ = &strxml; /* Send & receive message */ &msg = %IntBroker.SyncRequest(&msg); &Doc = &msg.GetDocument( True); &strxml = &Doc.GenXmlString( False); &XMLDoc = CreateXmlDoc(&strxml); &strxml = &XMLDoc.GenFormattedXmlString(); IBCOURSE_WS_DER.IB_SOAPRESP = &strxml; &Compound = &Doc.DocumentElement; &Primative = &Compound.GetPropertyByName("FirstName"); MessageBox(0, "", 0, 0, &Primative.Value); &Primative = &Compound.GetPropertyByName("LastName"); MessageBox(0, "", 0, 0, &Primative.Value); &Primative = &Compound.GetPropertyByName("Userid"); MessageBox(0, "", 0, 0, &Primative.Value); End-If;

Login to PeopleSoft and Navigate to the IBCourse test page. Select External for Call WS Type and click on the button Call Service.

Page 50 of 84

MethodNode. &textNode = &MethodNode. Send request message and receive the response message Copy Document from response Copy XML from Document Create a XMLDOC from XML Format XML Print formatted XML to screen Read root node from response Get node Firstname Print value Firstname to screen Page 51 of 84 . 11.GenXmlString( False). 12. 8. 19. Let’s have a closer look at the code. 1). 4. 1. 17. | &Doc = &msg.Training Integration Broker You can see that the request is being constructed and send. &AddEnvelopeAttribute = &EnvNode. | &Primitive = &Compound. | &strxml = &Sdoc. 15. 10. /* 10 11 12 13 copy SOAP message to input message of service */ | &msg = CreateMessage(Operation. | &msg. 5. "". 3. & Primitive.GenFormattedXmlString(). 21."http://ibcourse.Value). Create request message for Operation GETPERSON Copy soap message to request message Format XML Print formatted XML to screen You now have a filled request message. 7.XmlDoc).SetXmlDoc(&Sdoc.DocumentElement.wsdl/"). The Mock Service returned the response you have set. | MessageBox(0.SyncRequest(&msg). &Sdoc.com/getPerson. 18.AddEnvelope(0). | &strxml = &XMLDoc. You will now send the request through the Integration Broker and read the response message. /* 14 15 16 17 18 19 20 21 22 Send & receive message */ | &msg = %IntBroker. 9. 6. 0.GetPropertyByName("FirstName"). | IBCOURSE_WS_DER. %IntBroker_Request). 13. &Sdoc. | &XMLDoc = CreateXmlDoc(&strxml).AddText("12345").GenFormattedXmlString(). | IBCOURSE_WS_DER. 22. 2.AddHeader(). 0. 1 2 3 4 5 6 7 8 9 | | | | | | | | | &Sdoc = CreateSOAPDoc(). &Sdoc.XmlDoc. &EnvNode = &Sdoc. You will now copy the soap message to the request message. &MethodNode = &Sdoc.EnvelopeNode.AddBody(). 14. &Sdoc.GetDocument( True). | &Compound = &Doc.IB_SOAPREQ = &strxml.IB_SOAPRESP = &strxml.AddAttribute("xmlns:get". 20.GETPERSON. Create a Soap wrapper Add soap-Envelope to the wrapper Get a reference to the envelope node Add custom namespace to envelope Add soap-Header Add soap-body Add root node to soap-body Get a reference to the root node Set vale to root node You have now constructed a soap message. | &strxml = &Doc.AddMethod("get:PersonID". 16.

1. Click on Add. Messages First you need to create a request and response message. For this you are going to create a service with an Application Class Handler. Most of the time you want to control what happens instead of using the full business logic of the component. 5. CUSTOM PEOPLESOFT APPLICATION CLASS SERVICE During assignment 2 you had exposed a Component Interface as a service. You will create a synchronous service that will return Job Data for a specific Employee. Click on the link Add Record to Root.Training Integration Broker 5. Navigate via Main Menu > PeopleTools > Integration Broker > Integration Setup > Messages and choose Add New Value. Choose Rowset for Type and give the message the name IBCOURSE_WS_REQ with Version V1. Page 52 of 84 .

Now create a response message in the same manor but with the name IBCOURSE_WS_RES with record IBCOURSE_WS_RES. Page 53 of 84 . Save the message.Training Integration Broker Choose record IBCOURSE_WS_REQ and click on the button OK. You can see the message is based on the record IBCOURSE_WS_REQ.

After that you will create an Operation for this service. Page 54 of 84 . Create a Service with name IBCOURSE_CUST_WS and click on the button Add. In the section Service Operation create a new operation with name IBCOURSE_SYNC_WS with operation Type Synchronous and click on the button Add.Training Integration Broker 5.2. Service Navigate via Main Menu > PeopleTools > Integration Broker > Integration Setup > Service and choose Add New Value. Add a description for the service.

Training Integration Broker Add a description for the Operation. Page 55 of 84 . Check the checkboxes Generate Any-to-Local and Generate Local-to-Local. Select IBCOURSE_WS_REQ. The Service Operation Security link is now visible. Save the operation.V1 as request message.V1 as response message. Select IBCOURSE_WS_RES. Select this and add Permission List IBCOURSE.

Local Message &Response.Training Integration Broker 5. Copy the code below in the Editor and save the code: Import PS_PT:Integration:IRequestHandler. Right click on the package and select Insert App Class. You can now create the service operation handler code. Double click on the Application Class and the Class Editor will be opened. Give the Application Class the name IBCOURSE_SYNC_WS. Class IBCOURSE_SYNC_WS implements PS_PT:Integration:IRequestHandler method OnRequest(&MSG As Message) Returns Message. Save the Application Package as IBCOURSE_WS_PCK. Method OnRequest /+ &MSG as Message +/ /+ Returns Message +/ /+ Extends/implements PS_PT:Integration:IRequestHandler. method OnError(&MSG As Message) Returns string. PeopleCode You have now created a service and an operation. End-Class.3.OnRequest +/ Local Rowset &RSReq. Page 56 of 84 . Open Application Designer and choose New Application Package. &RSRes.

MessageNumber. Record. method OnError(&MSG As Message) Returns string. &errText = &MSG. &RSRes. Then you create your own class with the mandatory two methods OnRequest and OnError.ToString( False). If &MSG. End-If. &errText = &errText | " " | &msgNumber | " " | &msgSetNumber.OnRequest +/ Local Rowset &RSReq. /* Read Request */ &RSReq = &MSG.IBException.IBCOURSE_SYNC_WS. Record. %IntBroker_Response). &Emplid = &RSReq(1). Return &errText. The OnRequest method will handle the incoming message and return a response message. Class IBCOURSE_SYNC_WS implements PS_PT:Integration:IRequestHandler method OnRequest(&MSG As Message) Returns Message. /* Get Response */ &Response = CreateMessage(Operation. End-Method. End-Class.MessageSetNumber. Return &Response. &msgNumber = &MSG. Method OnRequest /+ &MSG as Message +/ /+ Returns Message +/ /+ Extends/implements PS_PT:Integration:IRequestHandler.IBCOURSE_WS_RES). Method OnError /+ &MSG as Message +/ /+ Returns String +/ /+ Extends/implements PS_PT:Integration:IRequestHandler. &RSRes.JOB. &msgSetNumber.EMPLID.GetRecord(1).CopyRowset(&RSRes. All synchronous service handlers will have to extend this class.IsEditError Then Exit (1). Page 57 of 84 .JOB). Local string &errText. &msgSetNumber = &MSG. End-Method. It starts off with importing the base class PS_PT:Integration:IRequestHandler.IBException. Import PS_PT:Integration:IRequestHandler.ExecuteEdits().OnError +/ Local integer &msgNumber. The OnError method will be called if the processing of the OnRequest encounters any errors and a Fault message will be returned. &MSG. /* Copy like named fields and records to Response */ &Response.GetRowset().Training Integration Broker Local string &Emplid. Let’s have a closer look at the code. &Emplid).IBException.Value. /* Get Rowset for response */ &RSRes = CreateRowset(Record.Fill("where EMPLID =:1".

Record.GetRecord(1). Click on link Details. Now you can read the rowset just as you would when reading the component buffer. […] Return &Response. Page 58 of 84 .EMPLID.4. If the ExecuteEdits faults. /* Get Response */ &Response = CreateMessage(Operation. Give the handler a name like CustomHandler. Select Type On Request. you can make full use of the PeopleSoft Rowset/Record classes and methods.JOB).Training Integration Broker Local Message &Response. You do not have to explicitly code these validations. then the OnError method of this class is triggered with Error(1).Value.IBCOURSE_SYNC_WS.GetRowset you can read the rowset from the message in a Rowset object. Select Implementation Application Class. &Emplid).ExecuteEdits(). After this you can create the Response message object based on the Response message of the operation. With MSG. %IntBroker_Response). /* Read Request */ &RSReq = &MSG. Local string &Emplid. Routing and Handler Open Operation IBCOURSE_SYNC_WS and click on the tab Handlers. First you will validate the request message using ExecuteEdits.Fill("where EMPLID =:1". Record.IsEditError Then Exit (1). XLAT values or Prompts.CopyRowset(&RSRes.JOB. End-Method. End-If. /* Copy like named fields and records to Response */ &Response. &Emplid = &RSReq(1). &RSRes. &MSG. like Required Fields. Because your service operation has a request message of type Rowset-based. Finally you can create a rowset that you will use for the response message. /* Get Rowset for response */ &RSRes = CreateRowset(Record.IBCOURSE_WS_RES). 5.GetRowset(). If &MSG. The processing stops and the default response is constructed. With this method you can validate all PeopleSoft system edits.

5. In the Handler screen click on Save to save the changes.Training Integration Broker Add Handler details as shown in the screen above and click on OK.5. Now click on the link Return to Service. Deploy Service Page 59 of 84 . You can now deploy the Service.

Click on Next in the View WSDL screen. Click on Finish.Training Integration Broker Click on the link Provide Web Service to start the Deploy wizard. Page 60 of 84 . Select the Service Operation and click on Next.

Page 61 of 84 .6. You will use this WSDL later on and import it in SoapUI to test the service from outside of PeopleSoft. Service Operation Tester Navigate via Main Menu > PeopleTools > Integration Broker > Service Utilities > Service Operation Tester. 5. Choose Operation IBCOURSE_SYNC_WS.Training Integration Broker The result screen will show the generated WSDL URL of the deployed service. But first you want to test the service from PeopleSoft.

Training Integration Broker Click in above screen on the link EMPLID. Page 62 of 84 . On the next screen click on Invoke Operation and you can see the response is being returned. Add KU0001 as value and click on OK.

Supply the WSDL and click on OK.1.7.wsdl Page 63 of 84 . Open SoapUI and choose File . http://<yourserver>:<port>/PSIGW/PeopleSoftServiceListeningConnector/PSFT_HR/IBCO URSE_CUST_WS. Call from SoapUI Now let’s try to call the service from outside of PeopleSoft.New Project.Training Integration Broker 5.

xmlsoap. <soapenv:Envelope xmlns:soapenv="http://schemas.oracle.xmlsoap.V1"> <soapenv:Header/> <soapenv:Body> <ibc:IBCOURSE_WS_REQ> <ibc:MsgData> <ibc:Transaction> <ibc:IBCOURSE_WS_REQ class="R"> cl <ibc:EMPLID IsChanged="N">KU0001</ibc:EMPLID> </ibc:IBCOURSE_WS_REQ> </ibc:Transaction> </ibc:MsgData> </ibc:IBCOURSE_WS_REQ> </soapenv:Body> </soapenv:Envelope> Page 64 of 84 .org/soap/envelope/" xmlns:soapenv="http://schemas. Modify the request to a simplified request like shown on the next page and click on the green Run button.org/soap/envelope/" xmlns:ibc="http://xmlns.com/Enterprise/Tools/schemas/IBCOURSE_WS_REQ.Training Integration Broker Double click onReqeuest 1 You can see that the default request is constructed based on the definition in the WSDL.

/*Copy the rows from the rowset to the message object */ &msgReq. strxml).GenXMLString(). &strxml = &msgRes.GenXMLString(). &strxml rxml = &XMLDoc. %IntBroker_Request). Open PeopleCode editor for record IBCOURSE_WS_DER field REQEUST_BTN event FieldChange. IBCOURSE_WS_DER.CopyRowset(&RS). Local Rowset &RS. &RS(1). &msgReq = CreateMessage(Operation.IB_SOAPREQ = &strxml. End-If.IBCOURSE_WS_REQ. 5.SyncRequest(&msgReq).8. IBCOURSE_WS_DER. If IBCOURSE_WS_DER.IB_SOAPRESP = &strxml. PeopleCode call Open Application Designer. /* Send & receive message */ &msgRes = %IntBroker.EMPL &RS(1).GenFormattedXmlString().IBCOURSE_CALL_TYPE = "P" Then Local Message &msgReq. &XMLDoc = CreateXmlDoc(&strxml). &RS = CreateRowset(Record.IBCOURSE_SYNC_WS.IBCOURSE_WS_REQ. &strxml = &XMLDoc. &strxml = &msgReq. &XMLDoc = CreateXmlDoc(&strxml).Value = "KU0001".EMPLID.IBCOURSE_WS_REQ). Copy below code beneath the existing PeopleCode. &msgRes. Page 65 of 84 . Now let’s write some PeopleCode to call this service from PeopleSoft.GenFormattedXmlString().Training Integration Broker The service is now also successfully invoked from outside of PeopleSoft.

Training Integration Broker You can notice right away the coding rowset based services is a lot simpler than nonrowset. Log in to PeopleSoft and navigate to the IBCourse test page. Page 66 of 84 .based services. Select Custom PeopleSoft WS and click on Call Service You can see the request and response.

The downside of using Rowset-based messages is that the messages have a lot of unnecessary overhead for non-PeopleSoft systems. Navigate via Main Menu > PeopleTools > Integration Broker > Integration Setup > Messages and choose Add a New Value. you can make use of translations.V1" xmlns="http://xmlns.oracle.org/2001/XMLSchema"> <xs:element name="Person"> <xs:complexType> <xs:sequence> <xs:element name="EmployeeID" type="xs:string"/> <xs:element name="StartDate" type="xs:string"/> <xs:element name="FunctionCode" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> You will now create a message based on this XSD. The use of Rowset-based messages enables you to use PeopleCode objects like Records and Rowsets. Page 67 of 84 . Setup Transform Message You will start with creating an XSD. Click on the tab Schema. Make a new message like shown in above screenshot and click on Add. prompts or XLAT values without writing additional code. In this assignment you will transform the response message using XSLT to a more simplified format. Translations can be used to transform XML layout and XML values. 6.oracle. TRANSLATIONS In the previous assignment you have created a service with Rowset-based messages.w3. Instead of recreating the service.V1" xmlns:xs="http://www. <?xml version="1.0"?> <xs:schema targetNamespace="http://xmlns.com/Enterprise/Tools/schemas/IBCOURSE_TRANSFORM_RES.com/Enterprise/Tools/schemas/IBCOURSE_TRANSFOR M_RES.Training Integration Broker 6.1. Also you can simply use record validations like required fields.

You will now create an XLST Application Engine. 6.Training Integration Broker Click on the button Add Schema. Enter the XSD and click on Save. Page 68 of 84 . Setup XSLT Application Engine Open Application Designer and choose File .Application Engine. Go to tab Advanced.2.New . Add the values as shown above and click on OK.

JDeveloper will start and the XSL Mapper will be shown.Training Integration Broker Right click on Step01 and choose Insert Action. Page 69 of 84 . Double click on the action XSLT. Select Action type XSLT and set Graphical Mapper to Yes and save the Application Engine.

GENERATED BY ORACLE XSL MAPPER 10.0645) AT [MON JAN 17 20:20:24 GMT 2011].oracle.1. The XSLT will automatically be saved in the Application Engine Action.V1. --> ?> <xsl:stylesheet exclude-result-prefixes="xsl xs ns0 xref xp20 bpws ora ehdr orcl ids hwf" version="1.org/ws/2003/03/business-process/ Page 70 of 84 .xsd"/> <rootElement name="IBCOURSE_WS_RES" namespace=""/> </source> </mapSources> <mapTargets> <target type="XSD"> <schema location="http://<yourserver>:<port>/PSIGW/PeopleSoftServiceListeningConnector/PSFT _HR/IBCOURSE_TRANSFORM_RES.xmlsoap.V1. V1"/> </target> </mapTargets> <!-. Click on the source tab in JDeveloper XSL and have a closer looks at the XSL that has been created.3. Create the mapping by dragging and dropping the fields from left to right. DO NOT MODIFY. Save the XSL in JDeveloper. -> <mapSources> <source type="XSD"> <schema location="http://<yourserver>:<port>/PSIGW/PeopleSoftServiceListeningConnector/PSFT _HR/IBCOURSE_WS_RES. You can now map the fields.Training Integration Broker On the left you will see the PeopleSoft Rowset-based message and on the right the new Nonrowsetbased message.xsd"/> <rootElement name="Person" namespace="http://xmlns.0"?> <?oracle-xsl-mapper <!-.com/Enterprise/Tools/schemas/IBCOURSE_TRANSFORM_RES.4.0" xmlns:bpws=http://schemas. <?xml version="1.0(build 080718..SPECIFICATION OF MAP SOURCES AND TARGETS.

xpath.tip.xref. Navigate via Main Menu > PeopleTools > Integration Broker > Service Utilities > Service Administration.com/XSL/Transform/java/oracle. Page 71 of 84 .services.org/1999/XSL/Transform"> <xsl:template match="/"> <ns0:Person> <EmployeeID> <xsl:value-of select="/IBCOURSE_WS_RES/MsgData/Transaction/IBCOURSE_WS_RES/EMPLID"/> </EmployeeID> <StartDate> <xsl:value-of select="/IBCOURSE_WS_RES/MsgData/Transaction/IBCOURSE_WS_RES/EFFDT"/> </StartDate> <FunctionCode> <xsl:value-of select="/IBCOURSE_WS_RES/MsgData/Transaction/IBCOURSE_WS_RES/JOBCODE"/> </FunctionCode> </ns0:Person> </xsl:template> </xsl:stylesheet> 6.Xpath20" xmlns:xref="http://www. Delete WSDL To modify the routing you need to delete the WSDL first.tip. V1" xmlns:ora="http://schemas.tip.com/xpath/extension" xmlns:orcl="http://www. ESBHeaderFunctions" xmlns:hwf="http://xmlns.tip.oracle.com/bpel/services/IdentityService/xpath" xmlns:ns0="http://xmlns.com/XSL/Transform/java/oracle.functio ns.oracle.oracle.pc.oracle.headers.ExtFunc" xmlns:xp20="http://www.com/XSL/Transform/java/oracle.oracle.functio ns.oracle.w3.pc.oracle.services.org/2001/XMLSchema" xmlns:xsl="http://www.oracle.com/XSL/Transform/java/oracle.server.XRefXPat hFunctions" xmlns:xs="http://www.Training Integration Broker xmlns:ehdr="http://www.com/Enterprise/Tools/schemas/IBCOURSE_TRANSFORM_RES.esb.w3.3.com/bpel/workflow/xpath" xmlns:ids="http://xmlns.

4. Add Transformation to Service You will now add the Transform Application Engine to the service.Training Integration Broker 6. Add Transform to field Program 1 and Save the Routing. Select operation IBCOURSE_SYNC_WS and go to the Routing tab. Page 72 of 84 . Navigate via Main Menu > PeopleTools > Integration Broker > Integration Setup > Services and open service IBCOURSE_CUST_WS. Select routing Any-to-PSFT_HR.

Page 73 of 84 . since the response message definition has been changed.5.6. Invoke the request and you will see that the response is now returned in the translated simplified response. without having to change your service handler logic. Call service using SoapUI Open SoapUI and open project IBCOURSE_CUST_WS. 6.Training Integration Broker 6. Click on the link Provide Web Service and walk through h all the steps of the Wizard. Provide Service You will have to deploy the service again. Navigate via Main Menu > PeopleTools > Integration Broker > Integration Setup > Services and save service IBCOURSE_CUST_WS.

After activating the Pub/Sub Servers. 7. Initiating an Application Engine via the Integration Broker has a few advantages: • No scheduling. APPLICATION ENGINE HANDLER From PeopleTools 8. If the process scheduler is not running yet. less maintenance • Initiation by the requester • No more FTP files (security wise) • Single point of entry of data. Start psadmin and activate the Pub/Sub servers.1. Activate Process Scheduler The Application Engine will be processes by the Process Scheduler. the Integration Broker • Application Engines can become part of business processes 7. Activate Pub/Sub Servers In this step you will create an Application Engine and a Handler.2. start the application server. For this the Pub/Sub processes and the Process Scheduler need to be running. Using this handler it is possible to initiate Application Engines via the Integration Broker.50 and beyond it is possible to create an Application Engine Handler for operations. Page 74 of 84 . The Application Engine initiated via the Integration Broker will be processed by the Process Scheduler. start it now.Training Integration Broker 7.

0. 0.GetRowset(). 0. 0. "". Select File . 0. You will now assign this Application Engine as a Handler to the service IBCOURSE_CUST_WS. "".OPRID). "". Create Application Engine Open Application Designer. Click on the properties button. %IntBroker_SUB). 0. MessageBox(0.Application Engine. IBCOURSE_AET.EMPLID. IBCOURSE_AET. /* Get Transaction ID from Integration Gateway which invoked this AE */ &StrTransaction = %IntBroker.GetMessage(&StrTransaction.3.Value. /* do processing */ Save the Application Engine. Right click on Step 01 and choose Insert Action Select PeopleCode as type.New . Local Message &MSG. Double click on the PeopleCode Action to open the PeopleCode Editor.Training Integration Broker 7. Save the Application Engine as IBCOURSE_AEH. MessageBox(0.OPRID. /* Get message from Integration Gateway belonging to Transaction ID */ &MSG = %IntBroker.RUN_CNTL_ID).RUN_CNTL_ID). &Emplid = &RS(1). Page 75 of 84 . Copy the PeopleCode below: Local Rowset &RS.GetIBTransactionIDforAE(IBCOURSE_AET.IBCOURSE_WS_REQ. &Emplid). MessageBox(0. &RS = &MSG. Go to tab State Records and select state record IBCOURSE_AET and finally click on Add. IBCOURSE_AET.

Check the checkboxes Generate Any-To-Local and Generate Local-To-Local. Application Engine Handler Open PeopleSoft and navigate to Service IBCOURSE_CUST_WS. Page 76 of 84 . In the Service Operations section add a new operation like shown in screen above and click on Add. In the Message Information add the request message and queue as shown above.Training Integration Broker 7. Provide access to the operation.4.

Click on Provide Web Service. Enter the Application Engine as the Program Name and click on OK.Training Integration Broker Go to tab Handlers Enter the handler like shown above and click on link Details. Go back to the Service screen. Page 77 of 84 .

Page 78 of 84 . Create Process When invoking the service the Application Engine will be run through the Process Scheduler. 7. Click on tab Process Definition Options and select Process Group TLSALL. For this you need to create a process definition first.5. Save the process. Navigate via Main Menu > PeopleTools > Process Scheduler > Processes and click on tab Add New Value.Training Integration Broker Select both operations and walk through the Deploy Wizard.

Training Integration Broker 7. Navigate via Main Menu > PeopleTools > Integration Broker > Service Operation Monitor > Monitoring > Asynchronous Services. Navigate via Main Menu > PeopleTools > Integration Broker > Service Utilities > Service Operation Tester. Test Operation You will now test the service operation. Select Service Operation IBCOURSE_ASYNC_AE. Page 79 of 84 .6. Enter value KU0001 for field Emplid and click on Invoke Operation.

Application Engine Server Copyright (c) 1988-2011 Oracle and/or its affiliates.0) KU0001 (0. Click on link Details and click on link View Log/Trace in the next page. Navigate via Main Menu > PeopleTools > Process Scheduler > Process Monitor.51.19 2011-01-19 PS (0.01. All Rights Reserved PSAESRV started service request at 10.01.04 . You can see the status of the Handler is Done.Training Integration Broker Click on the link Details. Open the stdout file and you can see that Emplid KU0001 is retrieved from the message.0) Application Engine program IBCOURSE_AEH ended normally PSAESRV completed service request at 10. Let’s check if the Application Engine really was initiated.20 2011-01-19 Page 80 of 84 .0) ~GEN~71494795 (0. PeopleTools 8.

"". &strMaritalStatus = "".GetElementsByTagName("Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSEResponse"). End-For. For &i = 1 To &aPERS_DATA_EFFDT. &textNode = &childNode. &aMaritalStatus = &aPERS_DATA_EFFDT [&i].len <> 0 Then &strMaritalStatus = &aMaritalStatus [1].len <> 0 Then &strName = &aName [1].AddElement("EMPLID").len &strEffDT = "".0'?> <Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSE/>"). End-If. &XMLDoc = CreateXmlDoc(). End-If.CI_CI_PERSONAL_DATA_IBCOU_G. End-If. /* Read response */ &aPersonalData = &xml.IB_SOAPREQ = &strxml. "". MessageBox(0. /* Copy response to screen */ &xml = &ResMsg. &rootNode = &XMLDoc.CreateDocumentElement("Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSE").len <> 0 Then /* Get Name */ &aName = &aPersonalData [1]. &strxml = &xml. /* Copy constructed request to screen */ &strxml = &XMLDoc. &aEffDT = &aPERS_DATA_EFFDT [&i].GetElementsByTagName("EFFDT_1").SyncRequest(&ReqMsg). If &aName.len <> 0 Then &strEffDT = &aEffDT [1]. "EffDT: " | &strEffDT | " / Marital Status: " | &strMaritalStatus). /* Set XMLDOC request to message */ &ReqMsg. End-If.IBCOURSE_CALL_TYPE = "C" Then /* Create request message container from operation */ &ReqMsg = CreateMessage(Operation.GetElementsByTagName("MAR_STATUS").Training Integration Broker APPENDIX A PEOPLECODE CALL CI If IBCOURSE_WS_DER. If &aMaritalStatus.GetElementsByTagName("NAME"). "Name: " | &strName). /* Send & receive message */ &ResMsg = %IntBroker. End-If. &childNode = &rootNode.GetElementsByTagName("PERS_DATA_EFFDT"). MessageBox(0.GenFormattedXmlString(). If &aPersonalData. IBCOURSE_WS_DER. 0. 0.GetXmlDoc(). %IntBroker_Request).AddText("KU0001"). 0.GenFormattedXmlString(). Page 81 of 84 . /* Get Marital Status */ &aPERS_DATA_EFFDT = &aPersonalData[1].NodeValue.SetXmlDoc(&XMLDoc). /* Create XMLDOC request */ rem &inXMLDoc = CreateXmlDoc("<?xml version='1. If &aEffDT. 0.NodeValue.IB_SOAPRESP = &strxml.NodeValue. IBCOURSE_WS_DER.

GETPERSON. /* Send & receive message */ &msg = %IntBroker.GetPropertyByName("FirstName"). 1).EnvelopeNode.XmlDoc).GenXmlString(False).Value).AddHeader(). &msg. /* copy SOAP message to input message of service */ &msg = CreateMessage(Operation.0.AddAttribute("xmlns:get".IB_SOAPRESP = &strxml."".0.AddEnvelope(0). MessageBox(0.XmlDoc. &Compound = &Doc. &textNode = &MethodNode.Training Integration Broker APPENDIX B PEOPLECODE CALL EXTERNAL SERVICE If IBCOURSE_WS_DER.SyncRequest(&msg).com/getPerson.IB_SOAPREQ = &strxml."".AddBody().&Primitive. &Sdoc. &Primitive = &Compound.0.DocumentElement.&Primitive."http://ibcourse.Value).AddText("12345").AddMethod("get:PersonID". End-If."".IBCOURSE_CALL_TYPE = "E" Then /* construct SOAP message */ &Sdoc = CreateSOAPDoc(). %IntBroker_Request). &strxml = &Doc.wsdl/"). &XMLDoc = CreateXmlDoc(&strxml). &strxml = &XMLDoc.GetDocument(True). MessageBox(0.Value). &Sdoc. IBCOURSE_WS_DER. Page 82 of 84 .0.0. &Sdoc.GetPropertyByName("Userid").0. &Doc = &msg.GenFormattedXmlString(). &Sdoc. IBCOURSE_WS_DER. &MethodNode = &Sdoc.GetPropertyByName("LastName"). &strxml = &Sdoc. &EnvNode = &Sdoc.SetXmlDoc(&Sdoc.GenFormattedXmlString(). &Primitive = &Compound. MessageBox(0. &AddEnvelopeAttribute = &EnvNode.MethodNode. &Primitive = &Compound.&Primitive.

SyncRequest(&msgReq). /* Send & receive message */ &msgRes = %IntBroker. IBCOURSE_WS_DER.Value = "KU0001". IBCOURSE_WS_DER. &strxml = &msgRes.IB_SOAPREQ = &strxml. &RS(1). &msgRes.IBCOURSE_WS_REQ. Page 83 of 84 .IBCOURSE_SYNC_WS. &XMLDoc = CreateXmlDoc(&strxml). &msgReq = CreateMessage(Operation.CopyRowset(&RS).GenXMLString(). &strxml = &XMLDoc. /* Copy the rows from the rowset to the message object */ &msgReq. &strxml = &XMLDoc. End-If.Training Integration Broker APPENDIX C PEOPLECODE CALL CUSTOM PS SERVICE If IBCOURSE_WS_DER.IBCOURSE_WS_REQ).IB_SOAPRESP = &strxml. &XMLDoc = CreateXmlDoc(&strxml). Local Rowset &RS. &strxml = &msgReq.GenFormattedXmlString().GenFormattedXmlString(). &RS = CreateRowset(Record. %IntBroker_Request).GenXMLString().IBCOURSE_CALL_TYPE = "P" Then Local Message &msgReq.EMPLID.

IBException. %IntBroker_Response).Fill("where EMPLID =:1".JOB.EMPLID. Local string &errText. &RSRes. class IBCOURSE_SYNC_WS implements PS_PT:Integration:IRequestHandler method OnRequest(&MSG As Message) Returns Message.Training Integration Broker APPENDIX D APPLICATION CLASS CUSTOM PS SERVICE HANDLER import PS_PT:Integration:IRequestHandler.GetRecord(1). &msgSetNumber. Local Message &Response. &msgSetNumber = &MSG. /* Get Response */ &Response = CreateMessage(Operation. Local string &Emplid.IBException. Record.IsEditError Then Exit (1).OnError +/ Local integer &msgNumber.MessageSetNumber.GetRowset(). &errText = &errText | " " | &msgNumber | " " | &msgSetNumber. method OnRequest /+ &MSG as Message +/ /+ Returns Message +/ /+ Extends/implements PS_PT:Integration:IRequestHandler. method OnError(&MSG As Message) Returns string. &RSRes. end-method. Record.JOB).IBException. method OnError /+ &MSG as Message +/ /+ Returns String +/ /+ Extends/implements PS_PT:Integration:IRequestHandler.CopyRowset(&RSRes.MessageNumber. If &MSG. &msgNumber = &MSG.OnRequest +/ Local Rowset &RSReq.IBCOURSE_WS_RES). end-method.IBCOURSE_SYNC_WS. &errText = &MSG.ExecuteEdits(). &MSG. &Emplid = &RSReq(1). /* Get Rowset for response */ &RSRes = CreateRowset(Record. Return &Response. end-class.Value.ToString( False). Return &errText. /* Read Request */ &RSReq = &MSG. End-If. &Emplid). /* Copy likenamed fields and records to Response */ &Response. Page 84 of 84 .

Master your semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

Master your semester with Scribd & The New York Times

Cancel anytime.