Training Integration Broker

84
Train ning Integration Broker PeopleTools 8.51

description

IB for beginners

Transcript of Training Integration Broker

Page 1: Training Integration Broker

Training Integration Broker

Training Integration Broker

PeopleTools 8.51

Page 2: Training Integration Broker

Training Integration Broker

Page 2 of 84

1. OVERVIEW ........................................................................................................................... 4

1.1. Environment ................................................................................................................ 4

1.2. Aim ............................................................................................................................... 4

1.3. Prerequisite Knowledge............................................................................................... 4

1.4. Project .......................................................................................................................... 4

2. SETUP INTEGRATION BROKER............................................................................................. 5

2.1. Activate application server pub/sub processes........................................................... 5

2.2. Enable communication between application server and web server ......................... 9

2.3. Enable communication between web server and application server ......................... 9

2.4. Setup web service configuration ............................................................................... 14

2.5. Activate Integration Broker Domains ........................................................................ 15

2.6. Modify Internal Nodes ............................................................................................... 16

3. PROVIDE COMPONENT INTERFACE SERVICE .................................................................... 17

3.1. Component navigation .............................................................................................. 17

3.2. Generate Component Interface ................................................................................ 18

3.3. Component Interface Security................................................................................... 20

3.4. Generate CI Based Service ......................................................................................... 21

3.5. Provide CI Based Service ............................................................................................ 26

3.6. Call CI Based Service via SoapUI ................................................................................ 28

3.7. Call PeopleSoft Service PeopleCode .......................................................................... 32

4. CALL EXTERNAL SERVICE ................................................................................................... 38

4.1. Mock Service .............................................................................................................. 38

4.2. Create Node ............................................................................................................... 41

4.3. Import WSDL .............................................................................................................. 43

4.4. PeopleCode ................................................................................................................ 49

5. CUSTOM PEOPLESOFT APPLICATION CLASS SERVICE ....................................................... 52

5.1. Messages ................................................................................................................... 52

5.2. Service ........................................................................................................................ 54

5.3. PeopleCode ................................................................................................................ 56

5.4. Routing and Handler .................................................................................................. 58

5.5. Deploy Service ........................................................................................................... 59

5.6. Service Operation Tester ........................................................................................... 61

5.7. Call from SoapUI ........................................................................................................ 63

5.8. PeopleCode call ......................................................................................................... 65

Page 3: Training Integration Broker

Training Integration Broker

Page 3 of 84

6. TRANSLATIONS .................................................................................................................. 67

6.1. Setup Transform Message ......................................................................................... 67

6.2. Setup XSLT Application Engine .................................................................................. 68

6.3. Delete WSDL .............................................................................................................. 71

6.4. Add Transformation to Service .................................................................................. 72

6.5. Provide Service .......................................................................................................... 73

6.6. Call service using SoapUI ........................................................................................... 73

7. APPLICATION ENGINE HANDLER ....................................................................................... 74

7.1. Activate Pub/Sub Servers .......................................................................................... 74

7.2. Activate Process Scheduler ........................................................................................ 74

7.3. Create Application Engine ......................................................................................... 75

7.4. Application Engine Handler ....................................................................................... 76

7.5. Create Process ........................................................................................................... 78

7.6. Test Operation ........................................................................................................... 79

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 4: Training Integration Broker

Training Integration Broker

Page 4 of 84

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 5: Training Integration Broker

Training Integration Broker

Page 5 of 84

2. SETUP INTEGRATION BROKER

2.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. Note: For synchronous services these processes do not need to be running. Start PSADMIN, 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 6: Training Integration Broker

Training Integration Broker

Page 6 of 84

Choose option 4) Configure this domain

Type y to start configuring the application server.

Page 7: Training Integration Broker

Training Integration Broker

Page 7 of 84

Choose option 1 to activate the Pub/Sub Servers.

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

Page 8: Training Integration Broker

Training Integration Broker

Page 8 of 84

Choose option 1 to start the application server.

You can see the Pub/Sub processes are running.

Page 9: Training Integration Broker

2.2. Enable communication between applicat

During this step you will configure which Integration Gateway will be used by the application server. This is needed for outbound traffic. Start PeopleSoft HCM by starting a browser session and login with user PS and password PNavigate via menu Main Menu > PeopleTools > Integration Broker > Configuration > Gateway

The Integration Gateway URL is to be constructed http://[server:port]/PSIGW/PeopleSoftListeningConnectorSubstitute this URL with your server and port and tab click on Save. The connectors will be loaded as shown in the screen above. Click on the Ping Gateway button to see if the Integration Gateway is up and running. The next screen will show in a new window

2.3. Enable communication between we

During this step you will tell the Integration Gateway which application server(s) it should communicate with. This is needed for inbound traffic. First we need to find the default local node of HCM. 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. After that click on the Default Local Node header of the result grid. The default local node in the list.

Enable communication between application server and web server

will configure which Integration Gateway will be used by the application server. This is needed for outbound traffic.

Start PeopleSoft HCM by starting a browser session and login with user PS and password PMain Menu > PeopleTools > Integration Broker > Configuration > Gateway

is to be constructed as follows: http://[server:port]/PSIGW/PeopleSoftListeningConnector

with your server and port and tab click on Save. The connectors will be loaded as

Click on the Ping Gateway button to see if the Integration Gateway is up and running.

The next screen will show in a new window

unication between web server and application server

will tell the Integration Gateway which application server(s) it should communicate with. This is needed for inbound traffic.

First we need to find the default local node of HCM. Main Menu > PeopleTools > Integration Broker > Integration Setup >

On the search page, click on the search button to query all the nodes. After that click on the Default Local Node header of the result grid. The default local node (PSFT_HR) will now be shown

Training Integration Broker

Page 9 of 84

ion server and web server

will configure which Integration Gateway will be used by the application server.

Start PeopleSoft HCM by starting a browser session and login with user PS and password PS. Main Menu > PeopleTools > Integration Broker > Configuration > Gateway.

with your server and port and tab click on Save. The connectors will be loaded as

Click on the Ping Gateway button to see if the Integration Gateway is up and running.

b server and application server

will tell the Integration Gateway which application server(s) it should communicate

Main Menu > PeopleTools > Integration Broker > Integration Setup >

On the search page, click on the search button to query all the nodes. After that click on the Default (PSFT_HR) will now be shown as the first

Page 10: Training Integration Broker

Training Integration Broker

Page 10 of 84

Select node PSFT_HR.

Select Authentication Option: Password.

Page 11: Training Integration Broker

Training Integration Broker

Page 11 of 84

Provide an existing PeopleSoft user for Default User ID. It is a good custom to assign a dedicated user for the Integration Broker. If you were to use an active PeopleSoft user and if this user would be locked for whatever reason, all processing of services will be aborted. For the sake of convenience during this training you will use the user PS. It is also a good custom to rename/copy the default local node to an unique node name for your environment. Again for the sake of convenience during this training you will not do this. Navigate via menu Main Menu -> PeopleTools -> Integration Broker -> Configuration -> Gateway

Click on the link Gateway Setup Properties. The following screen will be shown.

Default User ID and Password are administrator/password. Supply these values and click on OK.

Page 12: Training Integration Broker

In the first section provide the default application server that the Integmessages.

Field

App Server URL

User ID

Password

Tools Release

In the second section provide the default local node and corresponding application server Integration Gateway will use. Click on Ping node for the node PSFT_HR. The following screen will be shown.

The Integration Gateway can now successfully communicate with the application server. Click on the Return button and click on the link file will now be shown. This file can [PS_HOME]\webserv\peoplesoft\

In the first section provide the default application server that the Integration Gateway will use to handle

Value

[appserv machine]:[JSL port appserver]

PS

PS

8.51.04

In the second section provide the default local node and corresponding application server

for the node PSFT_HR. The following screen will be shown.

The Integration Gateway can now successfully communicate with the application server. Click on the button and click on the link Advanced Properties Page. The integrationgateway.properties

can be found in directory

\applications\peoplesoft\PSIGW.war\WEB-INF

Training Integration Broker

Page 12 of 84

ration Gateway will use to handle

[appserv machine]:[JSL port appserver]

In the second section provide the default local node and corresponding application server that the

The Integration Gateway can now successfully communicate with the application server. Click on the integrationgateway.properties

Page 13: Training Integration Broker

You can see that this file now contains the application servers that have bePeopleSoft Node Configuration Page. Scroll down in this file and set logging ig.log.level=5 With this setting you will enable logging messages and errors in en message log can be found in directory [PS_HOME]\webserv\peoplesoft These file can also be found online using the following

File

Error Log

Message Log

In this file scroll down to secureFileKeystorePasswd=password

Using the password encrypting section encrypt the password and change this in the file.

contains the application servers that have been configured in the PeopleSoft Node Configuration Page.

and set logging to value 5

will enable logging messages and errors in the Integration Broker. The errorog can be found in directory

peoplesoft\applications\peoplesoft\PSIGW.war

These file can also be found online using the following URL’s

URL

http://<yourserver>:<port>/PSIGW/errorLog.html

http://<yourserver>:<port>/PSIGW/msgLog.html

secureFileKeystorePasswd=password

Using the password encrypting section encrypt the password and change this in the file.

Training Integration Broker

Page 13 of 84

configured in the

Broker. The error log

/PSIGW/errorLog.html

http://<yourserver>:<port>/PSIGW/msgLog.html

Using the password encrypting section encrypt the password and change this in the file.

Page 14: Training Integration Broker

2.4. Setup web service configuration

During this step you will setup the namespaces and target location. PeopleTools will use this information when setting up XSD’s and WSDL’s. Navigate via menu Main Menu > PeopleTools > Integration Broker > Configuration > Service Configuration

Enter desired service and schema namespaces. These will be used in the XSD’s and WSDL’s as target namespace. You can keep them default as displayed. The field target location refers to the endpoint that services will get. The syntax for this is: http://<server>:<port>/PSIGW/PeopleSoftServiceListenin Appending the default local node to the target location is not mandatory. Although this is highly recommended if you have multiple environments running on the same PIA PIA/Integration Gateway. Change the field Service System Statusservices without having to create new versions

configuration

will setup the namespaces and target location. PeopleTools will use this information when setting up XSD’s and WSDL’s.

Main Menu > PeopleTools > Integration Broker > Configuration > Service

Enter desired service and schema namespaces. These will be used in the XSD’s and WSDL’s as keep them default as displayed.

The field target location refers to the endpoint that services will get. The syntax for this is: http://<server>:<port>/PSIGW/PeopleSoftServiceListeningConnector/[<defaultlocalnode>]

Appending the default local node to the target location is not mandatory. Although this is highly recommended if you have multiple environments running on the same PIA PIA/Integration Gateway.

Service System Status to Development. This will enable you to make changes to ing to create new versions every time.

Training Integration Broker

Page 14 of 84

will setup the namespaces and target location. PeopleTools will use this

Main Menu > PeopleTools > Integration Broker > Configuration > Service

Enter desired service and schema namespaces. These will be used in the XSD’s and WSDL’s as

The field target location refers to the endpoint that services will get. The syntax for this is: gConnector/[<defaultlocalnode>]

Appending the default local node to the target location is not mandatory. Although this is highly recommended if you have multiple environments running on the same PIA PIA/Integration Gateway.

to make changes to

Page 15: Training Integration Broker

2.5. Activate Integration Broker Domains

The Pub/Sub processes we have to be activ Navigate via Main Menu > PeopleTools > Integra

Click on the link Domain Status. The

Click on the button Purge Domain Status

Activate Integration Broker Domains

The Pub/Sub processes we have to be activated in the Integration Broker.

Main Menu > PeopleTools > Integration Broker > Configuration > Quick Configuration

Click on the link Domain Status. The following screen will be shown:

Purge Domain Status.

Training Integration Broker

Page 15 of 84

tion Broker > Configuration > Quick Configuration

Page 16: Training Integration Broker

Training Integration Broker

Page 16 of 84

Now check checkbox All Domains Active and click on the button Update and click on the button Refresh.

The Integration Broker is able to process asynchronous services. During the following chapters you will not be using asynchronous services. You can choose to deactivate the Pub/Sub services in the configuration of the application server for performance reasons!

2.6. 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. Do the same for the WSDL_NODE node.

Page 17: Training Integration Broker

Training Integration Broker

Page 17 of 84

3. PROVIDE COMPONENT INTERFACE SERVICE

The Integration Broker is now set up to provide and invoke services. The easiest way to provide a service from PeopleSoft, is providing a service based on a component interface. The generated web service will in fact invoke the component interface as if you were to open the PeopleSoft component online, navigate through the pages and enter or modify data. 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.

3.1. Component navigation

You will provide the component PERSONAL_DATA as a web service. 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. 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. Let’s enter a Divorce on 01-01-2011

Enter 01/01/2011 as Effective Date. Select Marital Status as Divorced and set As of to 01/01/2011 and click on the Save button.

Page 18: Training Integration Broker

Training Integration Broker

Page 18 of 84

3.2. 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. You will have to create a component interface for this component first. Using CTRL+J you can find the component name for the component you are on.

Component name is PERSONAL_DATA. Open Application Designer and log in with user/password PS/PS. Choose New Definition -> Component Interface from the menu.

Page 19: Training Integration Broker

Training Integration Broker

Page 19 of 84

Search for component PERSONAL_DATA and click on Select.

A component interface will be generated for the component PERSONAL_DATA. Save the component interface with a name like CI_PERSONAL_DATA_IBCOURSE.

You have now generated a component interface for a component. Before you generate a web service based on this component interface, you will need to provide access to this component interface.

Page 20: Training Integration Broker

Training Integration Broker

Page 20 of 84

3.3. Component Interface Security

Navigate via Main Menu > PeopleTools > Security > Permissions & Roles > Permission Lists and open permission list IBCOURSE. Select tab Component Interfaces and enter CI_PERSONAL_DATA_IBCOURSE.

Click on the Edit link.

Click on the Full Access button to provide access to all the component interface method and click on the button OK. Click on Save to save the changes. You will now add the permission list to a new role. Navigate via Main Menu > PeopleTools > Security > Permissions & Roles > Roles and create a new role with name IBCOURSE.

Page 21: Training Integration Broker

Training Integration Broker

Page 21 of 84

Go to tab Permission Lists and add the permission list IBCOURSE, save the role.

Navigate via Main Menu > PeopleTools > Security > User Profiles > User Profiles and add role IBCOURSE to user PS.

3.4. Generate CI Based Service

Navigate via Main Menu -> PeopleTools-> Integration Broker -> Web Services -> CI-Based Services

Page 22: Training Integration Broker

Training Integration Broker

Page 22 of 84

Enter Component Interface Name CI_PERSONAL_DATA_IBCOURSE and click on Search. Select the Component Interface and click on Review CI Status.

Click on the link Select All to select all the Component Interface methods and click on the button Display Selected Actions.

Click on the button Perform Selected Actions. A service will now be generated with the name CI_CI_PERSONAL_DATA_IBCOU with 5 service operations corresponding to the component interface methods.

Page 23: Training Integration Broker

Training Integration Broker

Page 23 of 84

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

Page 24: Training Integration Broker

Training Integration Broker

Page 24 of 84

You have a service with 5 operations. The 5 operations invoke the 5 CI methods

CI Method Operation Description

Create _C Create new level0, Search record Add new

Find _F Search Record Find Existing

Get _G Get level0

UpdataData _UD Change existing data

Update _UP Add new rows (level 1,2,3,4, etc)

Click on the operation that ends with _G.

Page 25: Training Integration Broker

Training Integration Broker

Page 25 of 84

You have to provide access to this service operation. Click on the link Service Operation Security.

Add Permission List IBCOURSE and provide Full Access. Save the changes.

Check the checkboxes Regenerate Any-to-Local and Generate Local-to-Local. Save the operation. Click on the Handlers tab and check if the handler is set to Active.

Page 26: Training Integration Broker

Training Integration Broker

Page 26 of 84

Click on the Routings tab and check if the generated routings are active.

The service operation is now ready to be provided,

3.5. 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.

Page 27: Training Integration Broker

Select all operations and click on the button

Click on the link View WSDL to see the generated WSDL. The web service is now deployed and accessible.

Copy the WSDL URL and paste it in a new browser window.

Select all operations and click on the button Next. The next screen will be shown.

to see the generated WSDL. Click on Next and Finish

is now deployed and accessible.

and paste it in a new browser window. Have a closer look at the WSDL!

Training Integration Broker

Page 27 of 84

The next screen will be shown.

Finish.

Have a closer look at the WSDL!

Page 28: Training Integration Broker

Training Integration Broker

Page 28 of 84

3.6. Call CI Based Service via SoapUI

You will now invoke the deployed web service via SoapUI. This is a freeware tool for testing web services.

Start SoapUI and choose File - New SoapUI Project

Enter the WSDL URL you copied in the previous paragraph and enter this at Initial WSDL/WADL and click on OK. SoapUI will read the WSDL and create request messages for each operation.

Open operation ending with _G by expanding it and double click on Request 1. 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.

Page 29: Training Integration Broker

Training Integration Broker

Page 29 of 84

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.

Request Response <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/ envelope/" xmlns:m47="http://xmlns.oracle.com/Enterprise/To ols/schemas/M475651.V1"> <soapenv:Header/> <soapenv:Body> <m47:Get__CompIntfc__CI_PERSONAL_DATA_IBCO URSE> <m47:EMPLID>KU0001</m47:EMPLID> </m47:Get__CompIntfc__CI_PERSONAL_DATA_IBC OURSE> </soapenv:Body> </soapenv:Envelope>

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/ envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/ encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance"> <soapenv:Body> <m47:Get__CompIntfc__CI_PERSONAL_DATA_IBCO URSEResponse xmlns:m47="http://xmlns.oracle.com/Enterprise/To ols/schemas/M1021932.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-01- 01</m47:MAR_STATUS_DT> <m47:SEX_0>M</m47:SEX_0> <m47:HIGHEST_EDUC_LVL_0>A</m47:HIGHEST_ED 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-01- 01</m47:MAR_STATUS_DT> <m47:SEX_0>M</m47:SEX_0> <m47:HIGHEST_EDUC_LVL_0>A</m47:HIGHEST_ED 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_IBCO URSEResponse> </soapenv:Body> </soapenv:Envelope>

Congratulations, you have successfully called a web service and retrieved data from PeopleSoft.

Page 30: Training Integration Broker

Training Integration Broker

Page 30 of 84

Now you can try to change the Marital Status back to Married again by adding a new row with a new Effective Date. Double click on the operation ending with _UP

Double click on Request 1 and SoapUI will generate a request message. Change the request message to the one below and click on the green icon. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:m80="http://xmlns.oracle.com/Enterprise/Tools/schemas/M803237.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.xmlsoap.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. (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, you only provided access to the service operation _G and not for the operation _UP. Now add access to all the operations for this service. Log in PeopleSoft. Navigate via Main Menu > PeopleTools > Security > Permissions & Roles > Permission Lists and open permission list IBCOURSE. Click on tab web services.

Page 31: Training Integration Broker

Training Integration Broker

Page 31 of 84

Click on the Edit link behind the service CI_CI_PERSONAL_DATA_IBCOU.

As you can see you only provided access to operation _G. Click on Full Access (All) to provide access to all the operations and click on the button OK and finally Save. Now go back to SoapUI and invoke the request again.

Response <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance"> <soapenv:Body> <m80:Update__CompIntfc__CI_PERSONAL_DATA_IBCOURSEResponse xmlns:m80="http://xmlns.oracle.com/Enterprise/Tools/schemas/M473088.V1"> <m80:notification>1</m80:notification> <m80:detail/> </m80:Update__CompIntfc__CI_PERSONAL_DATA_IBCOURSEResponse> </soapenv:Body> </soapenv:Envelope>

Page 32: Training Integration Broker

Training Integration Broker

Page 32 of 84

Check online if Marital Status has been changed.

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.

3.7. Call PeopleSoft Service PeopleCode

In this paragraph you will write PeopleCode to invoke to Component Interface service. First have a closer look at het service. Navigate via Main Menu > PeopleTools > Integration Broker > Integration Setup> Services and open service CI_CI_PERSONAL_DATA_IBCOU.

Click on operation link CI_CI_PERSONAL_DTA_IBCOU_G.V1.

In the messages section click on the link View Message for the Request messages.

Page 33: Training Integration Broker

Training Integration Broker

Page 33 of 84

You can see this message is a Nonrowset-based message type. If this where a Rowset-based message type you could write PeopleCode using the Record API. In this case you have to create the request message using the XMLDoc API. To see an example of the request that you have to construct in PeopleCode, 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. In this screen you can see the structure of the request message that you have to construct <?xml version="1.0"?> <soapenv:Envelope xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing/" xmlns:xsd="http://www.w3.org/2001/XMLSchema/" xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance/"> <soapenv:Header xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <wsse:Security soap:mustUnderstand="1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.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.xmlsoap.org/soap/envelope/"> <Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSE xmlns="http://xmlns.oracle.com/Enterprise/Tools/schemas/M475651.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 34: Training Integration Broker

Training Integration Broker

Page 34 of 84

Integration Broker will automatically generate the Soap parts upon sending the request. You only have to construct the soap-body using PeopleCode. That leaves you with the following message: <?xml version="1.0"?> <Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSE> <EMPLID>KU0001</EMPLID> </Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSE>

Open Application Designer and project IBCOURSE_CUST. This project contains a custom page that you will use to invoke and test the web services. Open PeopleCode editor for record IBCOURSE_WS_DER field REQEUST_BTN event FieldChange. /* Create request message container from operation */ &ReqMsg = CreateMessage(Operation.CI_CI_PERSONAL_DATA_IBCOU_G, %IntBroker_Request); /* Create XMLDOC request */ &XMLDoc = CreateXmlDoc(); &rootNode = &XMLDoc.CreateDocumentElement("Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSE"); &childNode = &rootNode.AddElement("EMPLID"); &textNode = &childNode.AddText("KU0001"); /* Set XMLDOC request to message */ &ReqMsg.SetXmlDoc(&XMLDoc); /* Copy constructed request to screen */ &strxml = &XMLDoc.GenFormattedXmlString(); IBCOURSE_WS_DER.IB_SOAPREQ = &strxml;

Copy above code and save the event. Log in to PeopleSoft and Navigate via Main menu > IBCourse > IBCOURSE Call WS and click on the button Call Service.

You can see what your code constructed. Take a closer look at the code. /* Create request message container from operation */ 1 | &ReqMsg = CreateMessage(Operation.CI_CI_PERSONAL_DATA_IBCOU_G, %IntBroker_Request);

1.

First you created a message object based on the request message of operation CI_CI_DATA_IBCOU_G

Page 35: Training Integration Broker

Training Integration Broker

Page 35 of 84

/* Create XMLDOC request */ 2 | &XMLDoc = CreateXmlDoc(); 3 | &rootNode = &XMLDoc.CreateDocumentElement("Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSE"); 4 | &childNode = &rootNode.AddElement("EMPLID"); 5 | &textNode = &childNode.AddText("KU0001");

2.

Create an empty xml object 3. Set root element to Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSE 4. Add child element EMPLID under root element 5. Assign element EMPLID the value KU0001

/* Set XMLDOC request to message */ 6 | &ReqMsg.SetXmlDoc(&XMLDoc);

7.

Copy constructed xml to request message /* Copy constructed request to screen */ 7 | &strxml = &XMLDoc.GenFormattedXmlString(); 8 | IBCOURSE_WS_DER.IB_SOAPREQ = &strxml;

7.

Format the constructed xml to a readable xml format 8. Print formatted xml to screen

Now you will extend to code with actually sending the request message and receiving the response message. Copy below code and add this to the existing FieldChange event. /* Send & receive message */ &ResMsg = %IntBroker.SyncRequest(&ReqMsg); /* Copy response to screen */ &xml = &ResMsg.GetXmlDoc(); &strxml = &xml.GenFormattedXmlString(); IBCOURSE_WS_DER.IB_SOAPRESP = &strxml;

This code will send a synchronous request message through the Integration Broker and receive the response. After this the message body will be extracted and formatted on the screen. Navigate again to your test page and click on the button Call Service. You can see that you now have a response.

The next step is to try to extract specific elements from the response message. First extract the name of the employee and all rows of the marital status that you added in the previous chapters. If you strip the response message from all information that you do not need, then the response looks

like this:

Page 36: Training Integration Broker

Training Integration Broker

Page 36 of 84

<?xml version="1.0"?> <Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSEResponse xmlns="http://xmlns.oracle.com/Enterprise/Tools/schemas/M1021932.V1"> <NAME>Lewis,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. You will extract these elements. Append below code to the existing FieldChange. /* read response */ &aPersonalData = &xml.GetElementsByTagName("Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSEResponse"); If &aPersonalData.len <> 0 Then /* Get Name */ &aName = &aPersonalData [1].GetElementsByTagName("NAME"); If &aName.len <> 0 Then &strName = &aName [1].NodeValue; MessageBox(0, "", 0, 0, "Name: " | &strName); End-If; /* Get Marital Status */ &aPERS_DATA_EFFDT = &aPersonalData[1].GetElementsByTagName("PERS_DATA_EFFDT"); For &i = 1 To &aPERS_DATA_EFFDT.len &strEffDT = ""; &strMaritalStatus = ""; &aEffDT = &aPERS_DATA_EFFDT [&i].GetElementsByTagName("EFFDT_1"); If &aEffDT.len <> 0 Then &strEffDT = &aEffDT [1].NodeValue; End-If; &aMaritalStatus = &aPERS_DATA_EFFDT[&i].GetElementsByTagName("MAR_STATUS"); If &aMaritalStatus.len <> 0 Then &strMaritalStatus = &aMaritalStatus [1].NodeValue; End-If; MessageBox(0, "", 0, 0, "EffDT: " | &strEffDT | " / Marital Status: " | &strMaritalStatus); End-For; End-If;

Page 37: Training Integration Broker

Training Integration Broker

Page 37 of 84

Let’s examine the code. 1 | &aPersonalData = &xml.GetElementsByTagName("Get__CompIntfc__CI_PERSONAL_DATA_IBCOURSEResponse");

1.

With method GetElementsByTagName you retrieve the root element from the response message . The return value of this method is an array of nodes. This array of nodes contains all elements of the response message

2 | If &aPersonalData.len <> 0 Then 3 | &aName = &aPersonalData [1].GetElementsByTagName("NAME"); 4 | If &aName.len <> 0 Then 5 | &strName = &aName [1].NodeValue; 6 | MessageBox(0, "", 0, 0, "Name: " | &strName); 7 | End-If;

2.

Check whether the array of nodes on the root is not empty 3. Retrieve element NAME under root element by &aPersonalData[1] 4. Check whether the array of nodes for NAME is not empty 5. Retrieve value for element NAME 6. Print value of Name to Messagebox

8 | &aPERS_DATA_EFFDT = &aPersonalData[1].GetElementsByTagName("PERS_DATA_EFFDT"); 9 | For &i = 1 To &aPERS_DATA_EFFDT.len 10 | &strEffDT = ""; 11 | &strMaritalStatus = ""; 12 | &aEffDT = &aPERS_DATA_EFFDT [&i].GetElementsByTagName("EFFDT_1"); 13 | If &aEffDT.len <> 0 Then 14 | &strEffDT = &aEffDT [1].NodeValue; 15 | End-If; 16 | &aMaritalStatus = &aPERS_DATA_EFFDT[&i].GetElementsByTagName("MAR_STATUS"); 17 | If &aMaritalStatus.len <> 0 Then 18 | &strMaritalStatus = &aMaritalStatus [1].NodeValue; 19 | End-If; 20 | MessageBox(0, "", 0, 0, "EffDT: " | &strEffDT | " / Marital Status: " | &strMaritalStatus);

8.

Retrieve element PERS_DATA_EFFDT under root element by &aPersonalData [1] 9. Loop through array van nodes (there are 3 indexes) 12. Retrieve node EFFDT_1 under element PERS_DATA_EFFDT by

&aPERS_DATA_EFFDT [&i] 13. Check whether the array of nodes on EFFDT_1 is not empty 14. Retrieve value for node EFFDT_1 16. Retrieve node MAR_STATUS under element PERS_DATA_EFFDT by

&aPERS_DATA_EFFDT [&i] 17. Check whether the array of nodes on MAR_STATUS is not empty 18. Retrieve value for node MAR_STATUS 20. Print value of Name to Messagebox

Navigate again to your test page and click on the button Call Service. You will see that the response message is now processed.

Page 38: Training Integration Broker

Training Integration Broker

Page 38 of 84

4. 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. 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. SoapUI has an option to expose the WSDL of the service of the external system as a Mock Service. This Mock Service has the ability to host the WSDL as a service and respond to calls. You will be using the GetPersonExt.wsdl as an example to create the Mock Service.

4.1. Mock Service

Start SoapUI and choose via File - New SoapUI Project and enter GetPersonExt.wsdl and click on the button OK.

SoapUI will read the WSDL. With the right mouse button click on the porttype GetPersonPortType

Page 39: Training Integration Broker

Training Integration Broker

Page 39 of 84

Select Generate Mock Service in the popup menu.

Leave all options default and click on OK.

Leave the name of the Mock Service default and click on OK.

A Mock Service is now created. Double click on the operation GetPerson on the right.

Page 40: Training Integration Broker

Training Integration Broker

Page 40 of 84

Double click on Response 1.

A default Response message will be created. Change the question marks to your own name and userid.

Click on the icon SOAP on the left top corner to create a default request message and set the endpoint of the Mock Service.

Click on OK. The next screen will be shown.

Page 41: Training Integration Broker

Training Integration Broker

Page 41 of 84

In the screen above you can see the that the default request and the endpoint of the Mock Service is setup. You will now “run” the Mock Service. Go to the Mock Service screen.

Click on the green run icon. The Mock Service is now active.

Click left in the screen on Request 1 and the request screen will show. Now click on the green run icon to invoke the Mock Service and you will see it return a response. 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. After that you will write PeopleCode to call the service.

4.2. Create Node

By default all outbound routings in PeopleSoft will use the WSDL_NODE node. You will create a new node that you will use for your routing. Navigate via Main Menu > PeopleTools > Integration Broker > Integration Setup > Nodes and choose tab Add New Value.

Page 42: Training Integration Broker

Training Integration Broker

Page 42 of 84

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.

Page 43: Training Integration Broker

Training Integration Broker

Page 43 of 84

4.3. Import WSDL

Navigate via Main Menu > PeopleTools > Integration Broker > Web Services > Consume Web Service.

Select File and click on the button Load from File. Select GetPersonExt.wsdl and click on the button Next.

Select the service and click on Next on the second step.

Page 44: Training Integration Broker

Training Integration Broker

Page 44 of 84

Select the service operation and click on Next on the third step.

Leave the message names default and click on Next.

Page 45: Training Integration Broker

Training Integration Broker

Page 45 of 84

Select Use Existing Node and choose node IBCOURSE_EXT_NODE. Click on Finish.

The service definition of the external service is now imported in PeopleSoft. Click on View Consumed Service to have a closer look at the generated service definition.

Click on the link GETPERSON.V1 to see the service operation.

Page 46: Training Integration Broker

Training Integration Broker

Page 46 of 84

Click on the link Service Operation Security.

Add permission list IBCOURSE.

Click on tab Routings and select the routings link.

Page 47: Training Integration Broker

Training Integration Broker

Page 47 of 84

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 48: Training Integration Broker

Training Integration Broker

Page 48 of 84

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 49: Training Integration Broker

Training Integration Broker

Page 49 of 84

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 50: Training Integration Broker

Training Integration Broker

Page 50 of 84

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 51: Training Integration Broker

Training Integration Broker

Page 51 of 84

You can see that the request is being constructed and send. The Mock Service returned the response you have set. Let’s have a closer look at the code. 1 | &Sdoc = CreateSOAPDoc(); 2 | &Sdoc.AddEnvelope(0); 3 | &EnvNode = &Sdoc.EnvelopeNode; 4 | &AddEnvelopeAttribute = &EnvNode.AddAttribute("xmlns:get","http://ibcourse.com/getPerson.wsdl/"); 5 | &Sdoc.AddHeader(); 6 | &Sdoc.AddBody(); 7 | &Sdoc.AddMethod("get:PersonID", 1); 8 | &MethodNode = &Sdoc.MethodNode; 9 | &textNode = &MethodNode.AddText("12345");

1.

Create a Soap wrapper 2. Add soap-Envelope to the wrapper 3. Get a reference to the envelope node 4. Add custom namespace to envelope 5. Add soap-Header 6. Add soap-body 7. Add root node to soap-body 8. Get a reference to the root node 9. Set vale to root node

You have now constructed a soap message. You will now copy the soap message to the request message. /* copy SOAP message to input message of service */ 10 | &msg = CreateMessage(Operation.GETPERSON, %IntBroker_Request); 11 | &msg.SetXmlDoc(&Sdoc.XmlDoc); 12 | &strxml = &Sdoc.XmlDoc.GenFormattedXmlString(); 13 | IBCOURSE_WS_DER.IB_SOAPREQ = &strxml;

10.

Create request message for Operation GETPERSON 11. Copy soap message to request message 12. Format XML 13. Print formatted XML to screen

You now have a filled request message. You will now send the request through the Integration Broker and read the response message. /* Send & receive message */ 14 | &msg = %IntBroker.SyncRequest(&msg); 15 | &Doc = &msg.GetDocument( True); 16 | &strxml = &Doc.GenXmlString( False); 17 | &XMLDoc = CreateXmlDoc(&strxml); 18 | &strxml = &XMLDoc.GenFormattedXmlString(); 19 | IBCOURSE_WS_DER.IB_SOAPRESP = &strxml; 20 | &Compound = &Doc.DocumentElement; 21 | &Primitive = &Compound.GetPropertyByName("FirstName"); 22 | MessageBox(0, "", 0, 0, & Primitive.Value);

14.

Send request message and receive the response message 15. Copy Document from response 16. Copy XML from Document 17. Create a XMLDOC from XML 18. Format XML 19. Print formatted XML to screen 20. Read root node from response 21. Get node Firstname 22. Print value Firstname to screen

Page 52: Training Integration Broker

Training Integration Broker

Page 52 of 84

5. CUSTOM PEOPLESOFT APPLICATION CLASS SERVICE

During assignment 2 you had exposed a Component Interface as a service. Most of the time you want to control what happens instead of using the full business logic of the component. For this you are going to create a service with an Application Class Handler. You will create a synchronous service that will return Job Data for a specific Employee.

5.1. Messages

First you need to create a request and response message. 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. Click on Add.

Click on the link Add Record to Root.

Page 53: Training Integration Broker

Training Integration Broker

Page 53 of 84

Choose record IBCOURSE_WS_REQ and click on the button OK.

You can see the message is based on the record IBCOURSE_WS_REQ. Save the message. Now create a response message in the same manor but with the name IBCOURSE_WS_RES with record IBCOURSE_WS_RES.

Page 54: Training Integration Broker

Training Integration Broker

Page 54 of 84

5.2. Service

Navigate via Main Menu > PeopleTools > Integration Broker > Integration Setup > Service and choose Add New Value.

Create a Service with name IBCOURSE_CUST_WS and click on the button Add.

Add a description for the service. After that you will create an Operation for this service. In the section Service Operation create a new operation with name IBCOURSE_SYNC_WS with operation Type Synchronous and click on the button Add.

Page 55: Training Integration Broker

Training Integration Broker

Page 55 of 84

Add a description for the Operation. Check the checkboxes Generate Any-to-Local and Generate Local-to-Local. Select IBCOURSE_WS_REQ.V1 as request message. Select IBCOURSE_WS_RES.V1 as response message. Save the operation.

The Service Operation Security link is now visible. Select this and add Permission List IBCOURSE.

Page 56: Training Integration Broker

Training Integration Broker

Page 56 of 84

5.3. PeopleCode

You have now created a service and an operation. You can now create the service operation handler code. Open Application Designer and choose New Application Package. Save the Application Package as IBCOURSE_WS_PCK.

Right click on the package and select Insert App Class.

Give the Application Class the name IBCOURSE_SYNC_WS. Double click on the Application Class and the Class Editor will be opened. Copy the code below in the Editor and save the code: Import PS_PT:Integration:IRequestHandler; Class IBCOURSE_SYNC_WS implements PS_PT:Integration:IRequestHandler method OnRequest(&MSG As Message) Returns Message; method OnError(&MSG As Message) Returns string; End-Class; Method OnRequest /+ &MSG as Message +/ /+ Returns Message +/ /+ Extends/implements PS_PT:Integration:IRequestHandler.OnRequest +/ Local Rowset &RSReq, &RSRes; Local Message &Response;

Page 57: Training Integration Broker

Training Integration Broker

Page 57 of 84

Local string &Emplid; &MSG.ExecuteEdits(); If &MSG.IsEditError Then Exit (1); End-If; /* Read Request */ &RSReq = &MSG.GetRowset(); &Emplid = &RSReq(1).GetRecord(1).EMPLID.Value; /* Get Response */ &Response = CreateMessage(Operation.IBCOURSE_SYNC_WS, %IntBroker_Response); /* Get Rowset for response */ &RSRes = CreateRowset(Record.JOB); &RSRes.Fill("where EMPLID =:1", &Emplid); /* Copy like named fields and records to Response */ &Response.CopyRowset(&RSRes, Record.JOB, Record.IBCOURSE_WS_RES); Return &Response; End-Method; Method OnError /+ &MSG as Message +/ /+ Returns String +/ /+ Extends/implements PS_PT:Integration:IRequestHandler.OnError +/ Local integer &msgNumber, &msgSetNumber; Local string &errText; &msgNumber = &MSG.IBException.MessageNumber; &msgSetNumber = &MSG.IBException.MessageSetNumber; &errText = &MSG.IBException.ToString( False); &errText = &errText | " " | &msgNumber | " " | &msgSetNumber; Return &errText; End-Method;

Let’s have a closer look at the code. Import PS_PT:Integration:IRequestHandler; Class IBCOURSE_SYNC_WS implements PS_PT:Integration:IRequestHandler method OnRequest(&MSG As Message) Returns Message; method OnError(&MSG As Message) Returns string; End-Class;

It starts off with importing the base class PS_PT:Integration:IRequestHandler. All synchronous service handlers will have to extend this class. Then you create your own class with the mandatory two methods OnRequest and OnError. The OnRequest method will handle the incoming message and return a response message. The OnError method will be called if the processing of the OnRequest encounters any errors and a Fault message will be returned. Method OnRequest /+ &MSG as Message +/ /+ Returns Message +/ /+ Extends/implements PS_PT:Integration:IRequestHandler.OnRequest +/ Local Rowset &RSReq, &RSRes;

Page 58: Training Integration Broker

Training Integration Broker

Page 58 of 84

Local Message &Response; Local string &Emplid; &MSG.ExecuteEdits(); If &MSG.IsEditError Then Exit (1); End-If; […] Return &Response; End-Method;

Because your service operation has a request message of type Rowset-based, you can make full use of the PeopleSoft Rowset/Record classes and methods. First you will validate the request message using ExecuteEdits. With this method you can validate all PeopleSoft system edits, like Required Fields, XLAT values or Prompts. You do not have to explicitly code these validations. If the ExecuteEdits faults, then the OnError method of this class is triggered with Error(1). The processing stops and the default response is constructed. /* Read Request */ &RSReq = &MSG.GetRowset(); &Emplid = &RSReq(1).GetRecord(1).EMPLID.Value; /* Get Response */ &Response = CreateMessage(Operation.IBCOURSE_SYNC_WS, %IntBroker_Response); /* Get Rowset for response */ &RSRes = CreateRowset(Record.JOB); &RSRes.Fill("where EMPLID =:1", &Emplid); /* Copy like named fields and records to Response */ &Response.CopyRowset(&RSRes, Record.JOB, Record.IBCOURSE_WS_RES);

With MSG.GetRowset you can read the rowset from the message in a Rowset object. Now you can read the rowset just as you would when reading the component buffer. After this you can create the Response message object based on the Response message of the operation. Finally you can create a rowset that you will use for the response message.

5.4. Routing and Handler

Open Operation IBCOURSE_SYNC_WS and click on the tab Handlers.

Give the handler a name like CustomHandler. Select Type On Request. Select Implementation Application Class. Click on link Details.

Page 59: Training Integration Broker

Training Integration Broker

Page 59 of 84

Add Handler details as shown in the screen above and click on OK. In the Handler screen click on Save to save the changes. Now click on the link Return to Service. You can now deploy the Service.

5.5. Deploy Service

Page 60: Training Integration Broker

Training Integration Broker

Page 60 of 84

Click on the link Provide Web Service to start the Deploy wizard.

Select the Service Operation and click on Next.

Click on Next in the View WSDL screen.

Click on Finish.

Page 61: Training Integration Broker

The result screen will show the generated WSDL later on and import it in SoapUI to test the service from outside of PeopleSoft. But first the service from PeopleSoft.

5.6. Service Operation Tester

Navigate via Main Menu > PeopleTools > Integration Broker > Service Utilities > Service Operation Tester.

Choose Operation IBCOURSE_SYNC_WS

The result screen will show the generated WSDL URL of the deployed service. You

to test the service from outside of PeopleSoft. But first

Service Operation Tester

Main Menu > PeopleTools > Integration Broker > Service Utilities > Service Operation

IBCOURSE_SYNC_WS.

Training Integration Broker

Page 61 of 84

You will use this WSDL to test the service from outside of PeopleSoft. But first you want to test

Main Menu > PeopleTools > Integration Broker > Service Utilities > Service Operation

Page 62: Training Integration Broker

Training Integration Broker

Page 62 of 84

Click in above screen on the link EMPLID.

Add KU0001 as value and click on OK. On the next screen click on Invoke Operation and you can see the response is being returned.

Page 63: Training Integration Broker

Training Integration Broker

Page 63 of 84

5.7. Call from SoapUI

Now let’s try to call the service from outside of PeopleSoft. Open SoapUI and choose File - New Project.

Supply the WSDL and click on OK. http://<yourserver>:<port>/PSIGW/PeopleSoftServiceListeningConnector/PSFT_HR/IBCO URSE_CUST_WS.1.wsdl

Page 64: Training Integration Broker

Double click onReqeuest 1

You can see that the default request is constructed based on the definition in the WSDL. Modify the request to a simplified request like shown on the next page and click on the green button. <soapenv:Envelope xmlns:soapenv="http://sxmlns:ibc="http://xmlns.oracle.com/Enterprise/Tools/schemas/IBCOURSE_WS_REQ.V1"> <soapenv:Header/> <soapenv:Body> <ibc:IBCOURSE_WS_REQ> <ibc:MsgData> <ibc:Transaction> <ibc:IBCOURSE_WS_REQ cl <ibc:EMPLID IsChanged="N">KU0001</ibc:EMPLID> </ibc:IBCOURSE_WS_REQ> </ibc:Transaction> </ibc:MsgData> </ibc:IBCOURSE_WS_REQ> </soapenv:Body> </soapenv:Envelope>

default request is constructed based on the definition in the WSDL. Modify the request to a simplified request like shown on the next page and click on the green

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ibc="http://xmlns.oracle.com/Enterprise/Tools/schemas/IBCOURSE_WS_REQ.V1">

<ibc:IBCOURSE_WS_REQ class="R"> <ibc:EMPLID IsChanged="N">KU0001</ibc:EMPLID>

</ibc:IBCOURSE_WS_REQ>

Training Integration Broker

Page 64 of 84

default request is constructed based on the definition in the WSDL. Modify the request to a simplified request like shown on the next page and click on the green Run

chemas.xmlsoap.org/soap/envelope/" xmlns:ibc="http://xmlns.oracle.com/Enterprise/Tools/schemas/IBCOURSE_WS_REQ.V1">

Page 65: Training Integration Broker

The service is now also successfully invoked from outside of PeopleSoft. Now let’s write some PeopleCode to call this service from

5.8. PeopleCode call

Open Application Designer. Open PeopleCode editor for record Copy below code beneath the existing PeopleCode. If IBCOURSE_WS_DER.IBCOURSE_CALL_TYPE = "P" Then Local Message &msgReq, &msgRes; Local Rowset &RS; &RS = CreateRowset(Record.IBCOURSE_WS_REQ); &RS(1).IBCOURSE_WS_REQ.EMPL &msgReq = CreateMessage(Operation.IBCOURSE_SYNC_WS, %IntBroker_Request); /*Copy the rows from the rowset to the message object */ &msgReq.CopyRowset(&RS); &strxml = &msgReq.GenXMLString(); &XMLDoc = CreateXmlDoc(&strxml); &strxml = &XMLDoc.GenFormattedXmlString(); IBCOURSE_WS_DER.IB_SOAPREQ = &strxml; /* Send & receive message */ &msgRes = %IntBroker.SyncRequest(&msgReq); &strxml = &msgRes.GenXMLString(); &XMLDoc = CreateXmlDoc(&strxml); &strxml = &XMLDoc.GenFormattedXmlString(); IBCOURSE_WS_DER.IB_SOAPRESP = &strxml; End-If;

The service is now also successfully invoked from outside of PeopleSoft. Now let’s write some PeopleCode to call this service from PeopleSoft.

Open PeopleCode editor for record IBCOURSE_WS_DER field REQEUST_BTN existing PeopleCode.

If IBCOURSE_WS_DER.IBCOURSE_CALL_TYPE = "P" Then

Local Message &msgReq, &msgRes;

&RS = CreateRowset(Record.IBCOURSE_WS_REQ); &RS(1).IBCOURSE_WS_REQ.EMPLID.Value = "KU0001";

&msgReq = CreateMessage(Operation.IBCOURSE_SYNC_WS, %IntBroker_Request);

/*Copy the rows from the rowset to the message object */ &msgReq.CopyRowset(&RS);

&strxml = &msgReq.GenXMLString(); strxml);

&strxml = &XMLDoc.GenFormattedXmlString(); IBCOURSE_WS_DER.IB_SOAPREQ = &strxml;

/* Send & receive message */ &msgRes = %IntBroker.SyncRequest(&msgReq);

&strxml = &msgRes.GenXMLString(); &XMLDoc = CreateXmlDoc(&strxml);

rxml = &XMLDoc.GenFormattedXmlString(); IBCOURSE_WS_DER.IB_SOAPRESP = &strxml;

Training Integration Broker

Page 65 of 84

The service is now also successfully invoked from outside of PeopleSoft. Now let’s write some

event FieldChange.

&msgReq = CreateMessage(Operation.IBCOURSE_SYNC_WS, %IntBroker_Request);

Page 66: Training Integration Broker

Training Integration Broker

Page 66 of 84

You can notice right away the coding rowset based services is a lot simpler than nonrowset- based services. Log in to PeopleSoft and navigate to the IBCourse test page. Select Custom PeopleSoft WS and click on Call Service

You can see the request and response.

Page 67: Training Integration Broker

Training Integration Broker

Page 67 of 84

6. TRANSLATIONS

In the previous assignment you have created a service with Rowset-based messages. The use of Rowset-based messages enables you to use PeopleCode objects like Records and Rowsets. Also you can simply use record validations like required fields, prompts or XLAT values without writing additional code. The downside of using Rowset-based messages is that the messages have a lot of unnecessary overhead for non-PeopleSoft systems. Instead of recreating the service, you can make use of translations. Translations can be used to transform XML layout and XML values. In this assignment you will transform the response message using XSLT to a more simplified format.

6.1. Setup Transform Message

You will start with creating an XSD. <?xml version="1.0"?> <xs:schema targetNamespace="http://xmlns.oracle.com/Enterprise/Tools/schemas/IBCOURSE_TRANSFORM_RES.V1" xmlns="http://xmlns.oracle.com/Enterprise/Tools/schemas/IBCOURSE_TRANSFORM_RES.V1" xmlns:xs="http://www.w3.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. Navigate via Main Menu > PeopleTools > Integration Broker > Integration Setup > Messages and choose Add a New Value.

Make a new message like shown in above screenshot and click on Add. Click on the tab Schema.

Page 68: Training Integration Broker

Training Integration Broker

Page 68 of 84

Click on the button Add Schema.

Enter the XSD and click on Save. You will now create an XLST Application Engine.

6.2. Setup XSLT Application Engine

Open Application Designer and choose File - New - Application Engine. Go to tab Advanced.

Add the values as shown above and click on OK.

Page 69: Training Integration Broker

Training Integration Broker

Page 69 of 84

Right click on Step01 and choose Insert Action.

Select Action type XSLT and set Graphical Mapper to Yes and save the Application Engine.

Double click on the action XSLT. JDeveloper will start and the XSL Mapper will be shown.

Page 70: Training Integration Broker

Training Integration Broker

Page 70 of 84

On the left you will see the PeopleSoft Rowset-based message and on the right the new Nonrowset- based message. You can now map the fields. Create the mapping by dragging and dropping the fields from left to right..

Save the XSL in JDeveloper. The XSLT will automatically be saved in the Application Engine Action. Click on the source tab in JDeveloper XSL and have a closer looks at the XSL that has been created. <?xml version="1.0"?> <?oracle-xsl-mapper <!-- SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY. --> <mapSources> <source type="XSD"> <schema location="http://<yourserver>:<port>/PSIGW/PeopleSoftServiceListeningConnector/PSFT_HR/IBCOURSE_WS_RES.V1.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.V1.xsd"/> <rootElement name="Person" namespace="http://xmlns.oracle.com/Enterprise/Tools/schemas/IBCOURSE_TRANSFORM_RES.V1"/> </target> </mapTargets> <!-- GENERATED BY ORACLE XSL MAPPER 10.1.3.4.0(build 080718.0645) AT [MON JAN 17 20:20:24 GMT 2011]. --> ?> <xsl:stylesheet exclude-result-prefixes="xsl xs ns0 xref xp20 bpws ora ehdr orcl ids hwf" version="1.0" xmlns:bpws=http://schemas.xmlsoap.org/ws/2003/03/business-process/

Page 71: Training Integration Broker

Training Integration Broker

Page 71 of 84

xmlns:ehdr="http://www.oracle.com/XSL/Transform/java/oracle.tip.esb.server.headers.ESBHeaderFunctions" xmlns:hwf="http://xmlns.oracle.com/bpel/workflow/xpath" xmlns:ids="http://xmlns.oracle.com/bpel/services/IdentityService/xpath" xmlns:ns0="http://xmlns.oracle.com/Enterprise/Tools/schemas/IBCOURSE_TRANSFORM_RES.V1" xmlns:ora="http://schemas.oracle.com/xpath/extension" xmlns:orcl="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc" xmlns:xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20" xmlns:xref="http://www.oracle.com/XSL/Transform/java/oracle.tip.xref.xpath.XRefXPathFunctions" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.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.3. Delete WSDL

To modify the routing you need to delete the WSDL first. Navigate via Main Menu > PeopleTools > Integration Broker > Service Utilities > Service Administration.

Page 72: Training Integration Broker

Training Integration Broker

Page 72 of 84

6.4. Add Transformation to Service

You will now add the Transform Application Engine to the service. Navigate via Main Menu > PeopleTools > Integration Broker > Integration Setup > Services and open service IBCOURSE_CUST_WS. Select operation IBCOURSE_SYNC_WS and go to the Routing tab.

Select routing Any-to-PSFT_HR.

Add Transform to field Program 1 and Save the Routing.

Page 73: Training Integration Broker

6.5. Provide Service

You will have to deploy the service again, since the response message definition has been changed. Navigate via Main Menu > PeopleTools > Integration Broker > Integration Setup > Servicesservice IBCOURSE_CUST_WS. Click on the link Provide Web Service

6.6. Call service using SoapUI

Open SoapUI and open project IBCOURSE_CUST_WS Invoke the request and you will see that the response is now returned in the translated simplified response, without having to change

will have to deploy the service again, since the response message definition has been changed. Main Menu > PeopleTools > Integration Broker > Integration Setup > Services

.

Service and walk through all the steps of the Wizard.

Call service using SoapUI

IBCOURSE_CUST_WS.

Invoke the request and you will see that the response is now returned in the translated simplified change your service handler logic.

Training Integration Broker

Page 73 of 84

will have to deploy the service again, since the response message definition has been changed. Main Menu > PeopleTools > Integration Broker > Integration Setup > Services and save

h all the steps of the Wizard.

Invoke the request and you will see that the response is now returned in the translated simplified

Page 74: Training Integration Broker

Training Integration Broker

Page 74 of 84

7. APPLICATION ENGINE HANDLER

From PeopleTools 8.50 and beyond it is possible to create an Application Engine Handler for operations. Using this handler it is possible to initiate Application Engines via the Integration Broker. The Application Engine initiated via the Integration Broker will be processed by the Process Scheduler. Initiating an Application Engine via the Integration Broker has a few advantages:

• No scheduling, less maintenance

• Initiation by the requester

• No more FTP files (security wise)

• Single point of entry of data, the Integration Broker

• Application Engines can become part of business processes

7.1. Activate Pub/Sub Servers

In this step you will create an Application Engine and a Handler. For this the Pub/Sub processes and the Process Scheduler need to be running. Start psadmin and activate the Pub/Sub servers.

After activating the Pub/Sub Servers, start the application server.

7.2. Activate Process Scheduler

The Application Engine will be processes by the Process Scheduler. If the process scheduler is not running yet, start it now.

Page 75: Training Integration Broker

Training Integration Broker

Page 75 of 84

7.3. Create Application Engine

Open Application Designer. Select File - New - Application Engine. Click on the properties button. Go to tab State Records and select state record IBCOURSE_AET and finally click on Add.

Right click on Step 01 and choose Insert Action Select PeopleCode as type.

Save the Application Engine as IBCOURSE_AEH. Double click on the PeopleCode Action to open the PeopleCode Editor. Copy the PeopleCode below: Local Rowset &RS; Local Message &MSG; MessageBox(0, "", 0, 0, IBCOURSE_AET.OPRID); MessageBox(0, "", 0, 0, IBCOURSE_AET.RUN_CNTL_ID); /* Get Transaction ID from Integration Gateway which invoked this AE */ &StrTransaction = %IntBroker.GetIBTransactionIDforAE(IBCOURSE_AET.OPRID, IBCOURSE_AET.RUN_CNTL_ID); /* Get message from Integration Gateway belonging to Transaction ID */ &MSG = %IntBroker.GetMessage(&StrTransaction, %IntBroker_SUB); &RS = &MSG.GetRowset(); &Emplid = &RS(1).IBCOURSE_WS_REQ.EMPLID.Value; MessageBox(0, "", 0, 0, &Emplid); /* do processing */

Save the Application Engine. You will now assign this Application Engine as a Handler to the service IBCOURSE_CUST_WS.

Page 76: Training Integration Broker

Training Integration Broker

Page 76 of 84

7.4. Application Engine Handler

Open PeopleSoft and navigate to Service IBCOURSE_CUST_WS.

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. Check the checkboxes Generate Any-To-Local and Generate Local-To-Local. Provide access to the operation.

Page 77: Training Integration Broker

Training Integration Broker

Page 77 of 84

Go to tab Handlers

Enter the handler like shown above and click on link Details.

Enter the Application Engine as the Program Name and click on OK. Go back to the Service screen.

Click on Provide Web Service.

Page 78: Training Integration Broker

Training Integration Broker

Page 78 of 84

Select both operations and walk through the Deploy Wizard.

7.5. Create Process

When invoking the service the Application Engine will be run through the Process Scheduler. For this you need to create a process definition first. Navigate via Main Menu > PeopleTools > Process Scheduler > Processes and click on tab Add New Value. Click on tab Process Definition Options and select Process Group TLSALL.

Save the process.

Page 79: Training Integration Broker

Training Integration Broker

Page 79 of 84

7.6. Test Operation

You will now test the service operation. Navigate via Main Menu > PeopleTools > Integration Broker > Service Utilities > Service Operation Tester.

Select Service Operation IBCOURSE_ASYNC_AE.

Enter value KU0001 for field Emplid and click on Invoke Operation. Navigate via Main Menu > PeopleTools > Integration Broker > Service Operation Monitor > Monitoring > Asynchronous Services.

Page 80: Training Integration Broker

Training Integration Broker

Page 80 of 84

Click on the link Details.

You can see the status of the Handler is Done. Let’s check if the Application Engine really was initiated. Navigate via Main Menu > PeopleTools > Process Scheduler > Process Monitor.

Click on link Details and click on link View Log/Trace in the next page. Open the stdout file and you can see that Emplid KU0001 is retrieved from the message. PeopleTools 8.51.04 - Application Engine Server Copyright (c) 1988-2011 Oracle and/or its affiliates. All Rights Reserved PSAESRV started service request at 10.01.19 2011-01-19 PS (0,0) ~GEN~71494795 (0,0) KU0001 (0,0) Application Engine program IBCOURSE_AEH ended normally PSAESRV completed service request at 10.01.20 2011-01-19

Page 81: Training Integration Broker

Training Integration Broker

Page 81 of 84

APPENDIX A PEOPLECODE CALL CI

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

Page 82: Training Integration Broker

Training Integration Broker

Page 82 of 84

APPENDIX B PEOPLECODE CALL EXTERNAL SERVICE

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; &Primitive = &Compound.GetPropertyByName("FirstName"); MessageBox(0,"",0,0,&Primitive.Value); &Primitive = &Compound.GetPropertyByName("LastName"); MessageBox(0,"",0,0,&Primitive.Value); &Primitive = &Compound.GetPropertyByName("Userid"); MessageBox(0,"",0,0,&Primitive.Value); End-If;

Page 83: Training Integration Broker

Training Integration Broker

Page 83 of 84

APPENDIX C PEOPLECODE CALL CUSTOM PS SERVICE

If IBCOURSE_WS_DER.IBCOURSE_CALL_TYPE = "P" Then Local Message &msgReq, &msgRes; Local Rowset &RS; &RS = CreateRowset(Record.IBCOURSE_WS_REQ); &RS(1).IBCOURSE_WS_REQ.EMPLID.Value = "KU0001"; &msgReq = CreateMessage(Operation.IBCOURSE_SYNC_WS, %IntBroker_Request); /* Copy the rows from the rowset to the message object */ &msgReq.CopyRowset(&RS); &strxml = &msgReq.GenXMLString(); &XMLDoc = CreateXmlDoc(&strxml); &strxml = &XMLDoc.GenFormattedXmlString(); IBCOURSE_WS_DER.IB_SOAPREQ = &strxml; /* Send & receive message */ &msgRes = %IntBroker.SyncRequest(&msgReq); &strxml = &msgRes.GenXMLString(); &XMLDoc = CreateXmlDoc(&strxml); &strxml = &XMLDoc.GenFormattedXmlString(); IBCOURSE_WS_DER.IB_SOAPRESP = &strxml; End-If;

Page 84: Training Integration Broker

Training Integration Broker

Page 84 of 84

APPENDIX D APPLICATION CLASS CUSTOM PS SERVICE

HANDLER

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