Custom Interface Java Bean Service to return "Hello World" using Oracle E-Business Suite Integrated SOA Gateway

We recently upgraded our Oracle E-Business Suite and along with it was the Integrated SOA Gateway. At work, we usually have requirements for systems integration in which we uses flat files. However, since we already have the Integrated SOA Gateway, we decided to give it a try.

The Integrated SOA Gateway supported a few custom interface types. In this post, I will be working on the Java Bean Service. To test this, I’m going to build a very simple custom interface that returns a string “Hello World”. Later on, I can probably try something more complex. But let's stick with this for now.

Before we proceed, let me give you a bit of information about our instance.

Oracle E-Business Suite Release 12.1.3
Java 1.6.0_21
JDBC Driver 11.2.0.1.0
Database Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
Operating System Linux 3.10.0-229.20.1.el7.x86_64

Without further ado, here's my Java code.

HelloWorld.java
package oracle.apps.per.sample.service;

/**
 * A sample class to demonstrate how Java API can use the ISG REST framework. This class provides
 * methods to return string Hello World
 * @rep:scope public
 * @rep:product PER
 * @rep:displayname Hello World
 * @rep:category BUSINESS_ENTITY HR_USER_HOOK
 * @rep:category IREP_CLASS_SUBTYPE JAVA_BEAN_SERVICES
 */
public class HelloWorld {

    public HelloWorld() {
    }
    
    /**
     * 
     * This method returns a list of direct reports of the requesting user.
     *
     * @return Hello World string
     * @rep:scope public
     * @rep:displayname Get Hello World
     * @rep:httpverb get
     */
    public String getHelloWorld() {
        return "Hello World";
    }
        
}

Take note of the annotations on class level and method level as some of these are required. More information on annotations here.

Next is we need to transfer this java file to the appropriate folder in the server. In my case, I will transfer this to $JAVA_TOP/oracle/apps/per/sample/service.



Now we need to connect to the server via ssh. Set JAVA_HOME to $IAS_ORACLE_HOME/appsutil/jdk if not already set. Lastly, make sure you have the appropriate permissions to execute the following commands:

Compile the java file using the javac command.
javac $JAVA_TOP/oracle/apps/per/sample/service/HelloWorld.java


Generate the iLDT file using the irep_parser.pl script.

[las@server ~]$ $IAS_ORACLE_HOME/perl/bin/perl $FND_TOP/bin/irep_parser.pl -g -v -username=sysadmin per:patch/115/java:HelloWorld.java:12.1=$JAVA_TOP/oracle/apps/per/sample/service/HelloWorld.java
If successful, you should see something similar to the screen shot below.


You should also notice that an Integration Repository loader file (ildt) was created as shown above. This file will contain the metadata for the Java Bean Service object.

IMPORTANT NOTE: For succeeding changes, you need to increment the version when running the irep_parser.pl script. In the example above, I used version 12.1. If I need to make changes to the Java code, I will again need to generated the iLDT file but in doing so, I need to use version 12.2 or 12.1.1 for the changes to take effect.

Moving on, here's the content of the iLDT file for reference.

HelloWorld_java.ildt

# $Header: HelloWorld_java.ildt 12.1 2018/12/04 13:54:23 sysadmin  $

# dbdrv: sql fnd patch/115/sql afdlfsub.sql none none none sqlplus \
# dbdrv:  &phase=dat+10 checkfile:~PROD:~PATH:~FILE &un_apps &pw_apps per \
# dbdrv:  patch/115/java HelloWorld_java.ildt 12.1 FND FNDDLFLD NORMAL \
# dbdrv:  ARU2ILDT 50
LANGUAGE = "US"
LDRCONFIG = "wfirep.lct 120.7"

# Generated by the IRep Parser, 12.0.0

# -- Begin Entity Definitions --

DEFINE IREP_OBJECT
  KEY   OBJECT_NAME              VARCHAR2(430)
  KEY   DEST_TABLE               VARCHAR2(1)
  CTX   OWNER                    VARCHAR2(4000)
  BASE  API_NAME                 VARCHAR2(400)
  BASE  OBJ_TYPE                 VARCHAR2(30)
  BASE  SERVICEABLE              VARCHAR2(1)
  BASE  CLASS_RESOURCE_PATH      VARCHAR2(240)
  BASE  PRODUCT                  VARCHAR2(8)
  BASE  IMP_NAME                 VARCHAR2(400)
  BASE  COMPATABILITY            VARCHAR2(1)
  BASE  SCOPE                    VARCHAR2(30)
  BASE  LIFECYCLE                VARCHAR2(30)
  BASE  SOURCE_FILE_PRODUCT      VARCHAR2(8)
  BASE  SOURCE_FILE_PATH         VARCHAR2(100)
  BASE  SOURCE_FILE_NAME         VARCHAR2(36)
  BASE  SOURCE_FILE_VERSION      VARCHAR2(150)
  BASE  DESCRIPTION              VARCHAR2(32000)
  BASE  STANDARD                 VARCHAR2(30)
  BASE  STANDARD_VERSION         VARCHAR2(30)
  BASE  STANDARD_SPEC            VARCHAR2(240)
  TRANS DISPNAME                 VARCHAR2(240)
  TRANS SHORTDISC                VARCHAR2(2000)
  BASE  TIMESTAMP                VARCHAR2(11)
  BASE  OI_FLAG                  VARCHAR2(1)
  BASE  MAPCODE                  VARCHAR2(255)
  BASE  PARSER_VERSION           VARCHAR2(80)
  BASE  SDO_DEF_CLASS            VARCHAR2(400)
  BASE  SDO_CLASS_NAME           VARCHAR2(400)
  BASE  SDO_IS_FILTER            VARCHAR2(1)
  BASE  SDO_FILTER_REQUIRED      VARCHAR2(1)
  BASE  SDO_IS_EXPRESSION        VARCHAR2(1)
  BASE  SB_INTERFACE_CLASS       VARCHAR2(400)
  BASE  CRAWL_CRAWLABLE          VARCHAR2(1)
  BASE  CRAWL_VISIBILITY_LEVEL   VARCHAR2(8)
  BASE  CRAWL_SEARCH_PLUGIN      VARCHAR2(4000)
  BASE  CRAWL_UI_FUNCTION        VARCHAR2(240)
  BASE  CRAWL_CHANGE_EVENT_NAME  VARCHAR2(4000)
  BASE  CRAWL_CHANGE_NTF         VARCHAR2(1)
  BASE  CRAWL_DRIVING_TABLE      VARCHAR2(30)
  BASE  CRAWL_OBJ_ATTR_0         VARCHAR2(2000)
  BASE  CRAWL_OBJ_ATTR_1         VARCHAR2(2000)
  BASE  CRAWL_OBJ_ATTR_2         VARCHAR2(2000)
  BASE  CRAWL_OBJ_ATTR_3         VARCHAR2(2000)
  BASE  CRAWL_OBJ_ATTR_4         VARCHAR2(2000)
  BASE  CRAWL_OBJ_ATTR_5         VARCHAR2(2000)
  BASE  CRAWL_OBJ_ATTR_6         VARCHAR2(2000)
  BASE  CRAWL_OBJ_ATTR_7         VARCHAR2(2000)
  BASE  CRAWL_OBJ_ATTR_8         VARCHAR2(2000)
  BASE  CRAWL_OBJ_ATTR_9         VARCHAR2(2000)

  DEFINE PARENTS
    KEY   PARENT_NAME            VARCHAR2(430)
  END PARENTS

  DEFINE OBJECT_CATEGORY
    KEY   TYPE                   VARCHAR2(30)
    KEY   CODE                   VARCHAR2(30)
    BASE  SEQUENCE               VARCHAR2(50)
  END OBJECT_CATEGORY

  DEFINE OBJECT_FLEXFIELD
    KEY   APPL_SHORT_CODE        VARCHAR2(50)
    KEY   FLEX_TYPE              VARCHAR2(20)
    KEY   FLEX_CODE              VARCHAR2(400)
    BASE  CONTEXT                VARCHAR2(4000)
    BASE  SEGMENT                VARCHAR2(4000)
    BASE  COMPLEX_TYPE           VARCHAR2(4000)
  END OBJECT_FLEXFIELD

  DEFINE OBJ_CHILD_ANNOTATIONS
    KEY   CHILD_FLAG             VARCHAR2(1)
    KEY   VALUE                  VARCHAR2(500)
  END OBJ_CHILD_ANNOTATIONS

  DEFINE TYPE_MEMBERS
    KEY   SEQUENCE               VARCHAR2(50)
    KEY   INNERTYPE_SEQUENCE     VARCHAR2(50)
    BASE  MEMBER_NAME            VARCHAR2(240)
    BASE  TYPE                   VARCHAR2(430)
    BASE  PRECISION              VARCHAR2(50)
    BASE  SIZE                   VARCHAR2(50)
    BASE  SCALE                  VARCHAR2(50)
    BASE  NULL_ALLOWED           VARCHAR2(1)
    BASE  DESCRIPTION            VARCHAR2(4000)
    BASE  ATTR_SET               VARCHAR2(240)
    BASE  PRIMARY_KEY            VARCHAR2(1)
    BASE  TRANSLATABLE           VARCHAR2(1)
    BASE  COMPOSITE              VARCHAR2(1)
    BASE  DOMAIN_NAME            VARCHAR2(240)
    BASE  MEMBER_TYPE_NAME       VARCHAR2(240)
    BASE  SEARCH_CRITERIA_TYPE   VARCHAR2(30)
    BASE  ATTACHMENT             VARCHAR2(1)
    BASE  MIME_TYPE              VARCHAR2(120)
    BASE  DOMAIN_IMPLEMENTATION  VARCHAR2(400)
    BASE  IS_SORTABLE            VARCHAR2(1)
    BASE  CRAWL_IS_DATE_BASED    VARCHAR2(1)
    BASE  CRAWL_MEMBER_VIS_LVL   VARCHAR2(8)
    BASE  CRAWL_IS_DISPLAYED     VARCHAR2(1)
    BASE  CRAWL_UI_FPARAM_NAME   VARCHAR2(240)
    BASE  CRAWL_INDEXED          VARCHAR2(1)
    BASE  CRAWL_STORED           VARCHAR2(1)
    BASE  CRAWL_IS_SECURE        VARCHAR2(1)
    BASE  CRAWL_IS_TITLE         VARCHAR2(1)
    BASE  CRAWL_WEIGHT           VARCHAR2(50)
    BASE  CRAWL_MBR_ATTR_0       VARCHAR2(2000)
    BASE  CRAWL_MBR_ATTR_1       VARCHAR2(2000)
    BASE  CRAWL_MBR_ATTR_2       VARCHAR2(2000)
    BASE  CRAWL_MBR_ATTR_3       VARCHAR2(2000)
    BASE  CRAWL_MBR_ATTR_4       VARCHAR2(2000)
    BASE  CRAWL_MBR_ATTR_5       VARCHAR2(2000)
    BASE  CRAWL_MBR_ATTR_6       VARCHAR2(2000)
    BASE  CRAWL_MBR_ATTR_7       VARCHAR2(2000)
    BASE  CRAWL_MBR_ATTR_8       VARCHAR2(2000)
    BASE  CRAWL_MBR_ATTR_9       VARCHAR2(2000)
  END TYPE_MEMBERS

  DEFINE USES_TABLE
    KEY   TABLE_NAME             VARCHAR2(30)
    BASE  UT_SEQ                 VARCHAR2(50)
    BASE  UT_DIRECTION           VARCHAR2(1)
  END USES_TABLE

  DEFINE USES_MAP
    KEY   MAP_NAME               VARCHAR2(30)
    BASE  UM_SEQ                 VARCHAR2(50)
  END USES_MAP

  DEFINE CLASS_DATASOURCES
    KEY   DATASOURCE_NAME        VARCHAR2(120)
    BASE  DEF_CLASS              VARCHAR2(400)
    BASE  QUERYABLE              VARCHAR2(1)
    BASE  UPDATEABLE             VARCHAR2(1)
    BASE  INSERTABLE             VARCHAR2(1)
    BASE  MERGEABLE              VARCHAR2(1)
    BASE  DELETEABLE             VARCHAR2(1)
    BASE  PROCESS_QNAME          VARCHAR2(120)
    BASE  QUERY_QNAME            VARCHAR2(120)
  END CLASS_DATASOURCES

  DEFINE OBJ_KEY_SET
    KEY   KEY_SET_NAME           VARCHAR2(120)
    KEY   KEY_SET_SEQUENCE       VARCHAR2(50)
    BASE  KEY1_MBR_NAME          VARCHAR2(240)
    BASE  KEY2_MBR_NAME          VARCHAR2(240)
    BASE  KEY3_MBR_NAME          VARCHAR2(240)
    BASE  KEY4_MBR_NAME          VARCHAR2(240)
    BASE  KEY5_MBR_NAME          VARCHAR2(240)
    BASE  ALT1_MBR_NAME          VARCHAR2(240)
    BASE  ALT2_MBR_NAME          VARCHAR2(240)
    BASE  ALT3_MBR_NAME          VARCHAR2(240)
    BASE  ALT4_MBR_NAME          VARCHAR2(240)
    BASE  ALT5_MBR_NAME          VARCHAR2(240)
  END OBJ_KEY_SET

  DEFINE IREP_RECORD
    KEY   COMPLEX_TYPE_NAME      VARCHAR2(480)
    BASE  RECORD_NAME            VARCHAR2(80)
    BASE  SCOPE                  VARCHAR2(30)
    BASE  TYPE                   VARCHAR2(20)
    BASE  LIFECYCLE              VARCHAR2(30)
    BASE  DESCRIPTION            VARCHAR2(32000)
    TRANS USER_RECORD_NAME       VARCHAR2(80)
    TRANS SHORT_DESCRIPTION      VARCHAR2(240)

    DEFINE FIELDS
      KEY   SEQUENCE             VARCHAR2(50)
      KEY   INNERTYPE_SEQUENCE   VARCHAR2(50)
      BASE  NAME                 VARCHAR2(240)
      BASE  DIRECTION            VARCHAR2(1)
      BASE  OPTIONAL             VARCHAR2(1)
      BASE  TYPE                 VARCHAR2(430)
      BASE  PRECISION            VARCHAR2(50)
      BASE  SIZE                 VARCHAR2(50)
      BASE  SCALE                VARCHAR2(50)
      BASE  NULL_ALLOWED         VARCHAR2(1)
      BASE  DESCRIPTION          VARCHAR2(4000)
      BASE  DEFAULT_VALUE        VARCHAR2(255)
      BASE  DISPLAYED            VARCHAR2(1)
      BASE  ATTRIBUTE_SET        VARCHAR2(240)
      BASE  KEY_PARAM            VARCHAR2(1)
    END FIELDS

  END IREP_RECORD

  DEFINE IREP_METHOD
    KEY   FUNCTION_NAME          VARCHAR2(480)
    BASE  METHOD_NAME            VARCHAR2(80)
    KEY   OVERLOAD_SEQ           VARCHAR2(50)
    BASE  SCOPE                  VARCHAR2(30)
    BASE  INPUT_XSD_FILE         VARCHAR2(400)
    BASE  INPUT_ROOT_ELEMENT     VARCHAR2(400)
    BASE  OUTPUT_XSD_FILE        VARCHAR2(400)
    BASE  OUTPUT_ROOT_ELEMENT    VARCHAR2(400)
    BASE  STATIC                 VARCHAR2(1)
    BASE  EXCEPTIONLIST          VARCHAR2(4000)
    BASE  HTTP_VERB              VARCHAR2(50)
    BASE  METHOD_RESOURCE_PATH   VARCHAR2(240)
    BASE  LIFECYCLE              VARCHAR2(30)
    BASE  DESCRIPTION            VARCHAR2(32000)
    BASE  COMPATABILITY          VARCHAR2(1)
    BASE  SYNCHRO                VARCHAR2(1)
    BASE  DIRECTION              VARCHAR2(1)
    BASE  CTX_DEPENDENCE         VARCHAR2(8)
    TRANS USER_FN_NAME           VARCHAR2(80)
    TRANS SHORT_DESCRIPTION      VARCHAR2(240)
    BASE  PRIMARY_FLAG           VARCHAR2(1)
    BASE  INDIRECT_OP_FLAG       VARCHAR2(1)

    DEFINE METHOD_CATEGORY
      KEY   TYPE                 VARCHAR2(30)
      KEY   CODE                 VARCHAR2(30)
      BASE  SEQUENCE             VARCHAR2(50)
    END METHOD_CATEGORY

    DEFINE METHOD_FLEXFIELD
      KEY   APPL_SHORT_CODE      VARCHAR2(50)
      KEY   FLEX_TYPE            VARCHAR2(20)
      KEY   FLEX_CODE            VARCHAR2(400)
      BASE  CONTEXT              VARCHAR2(4000)
      BASE  SEGMENT              VARCHAR2(4000)
      BASE  COMPLEX_TYPE         VARCHAR2(4000)
    END METHOD_FLEXFIELD

    DEFINE METHOD_CHILD_ANNOTATIONS
      KEY   CHILD_FLAG           VARCHAR2(1)
      KEY   VALUE                VARCHAR2(500)
    END METHOD_CHILD_ANNOTATIONS

    DEFINE PARAMS
      KEY   SEQUENCE             VARCHAR2(50)
      KEY   INNERTYPE_SEQUENCE   VARCHAR2(50)
      BASE  NAME                 VARCHAR2(240)
      BASE  DIRECTION            VARCHAR2(1)
      BASE  OPTIONAL             VARCHAR2(1)
      BASE  TYPE                 VARCHAR2(430)
      BASE  PRECISION            VARCHAR2(50)
      BASE  SIZE                 VARCHAR2(50)
      BASE  SCALE                VARCHAR2(50)
      BASE  NULL_ALLOWED         VARCHAR2(1)
      BASE  DESCRIPTION          VARCHAR2(4000)
      BASE  DEFAULT_VALUE        VARCHAR2(255)
      BASE  DISPLAYED            VARCHAR2(1)
      BASE  ATTRIBUTE_SET        VARCHAR2(240)
      BASE  KEY_PARAM            VARCHAR2(1)
    END PARAMS

  END IREP_METHOD

END IREP_OBJECT

# -- End Entity Definitions --

BEGIN IREP_OBJECT "JAVA:oracle.apps.per.sample.service.HelloWorld" "C"
  OWNER = "sysadmin"
  API_NAME = "oracle.apps.per.sample.service.HelloWorld"
  OBJ_TYPE = "JAVA"
  PRODUCT = "PER"
  SCOPE = "PUBLIC"
  SOURCE_FILE_PRODUCT = "per"
  SOURCE_FILE_PATH = "patch/115/java"
  SOURCE_FILE_NAME = "HelloWorld.java"
  SOURCE_FILE_VERSION = "12.1"
  DESCRIPTION = "A sample class to demonstrate how Java API can use the ISG REST framework. This class provides\n\
 methods to return string Hello World"
  DISPNAME = "Hello World"
  SHORTDISC = "A sample class to demonstrate how Java API can use the ISG REST framework."
  TIMESTAMP = "2018/12/04"
  OI_FLAG = "N"
  PARSER_VERSION = "12.0.0"
  SDO_IS_FILTER = "N"
  SDO_FILTER_REQUIRED = "N"
  SDO_IS_EXPRESSION = "N"
  CRAWL_CRAWLABLE = "N"
  CRAWL_CHANGE_NTF = "N"

  BEGIN OBJECT_CATEGORY "BUSINESS_ENTITY" "HR_USER_HOOK"
  END OBJECT_CATEGORY

  BEGIN OBJECT_CATEGORY "IREP_CLASS_SUBTYPE" "JAVA_BEAN_SERVICES"
  END OBJECT_CATEGORY

  BEGIN IREP_METHOD "JAVA:oracle.apps.per.sample.service.HelloWorld:getHelloWorld" "1"
    METHOD_NAME = "getHelloWorld"
    SCOPE = "PUBLIC"
    HTTP_VERB = "GET"
    DESCRIPTION = "This method returns a list of direct reports of the requesting user."
    USER_FN_NAME = "Get Hello World"
    SHORT_DESCRIPTION = "This method returns a list of direct reports of the requesting user."
    PRIMARY_FLAG = "N"
    INDIRECT_OP_FLAG = "N"

    BEGIN METHOD_CATEGORY "BUSINESS_ENTITY" "HR_USER_HOOK"
    END METHOD_CATEGORY

    BEGIN METHOD_CATEGORY "IREP_CLASS_SUBTYPE" "JAVA_BEAN_SERVICES"
    END METHOD_CATEGORY

    BEGIN PARAMS "0" "0"
      NAME = "RETURN"
      DIRECTION = "O"
      OPTIONAL = "N"
      TYPE = "java.lang.String"
      NULL_ALLOWED = "N"
      DESCRIPTION = "Hello World string"
      DISPLAYED = "Y"
    END PARAMS

  END IREP_METHOD

END IREP_OBJECT

Next, we’ll be uploading this file to the Integration Repository using the following command:

FNDLOAD apps/<apps_password> 0 Y UPLOAD $FND_TOP/patch/115/import/wfirep.lct HelloWorld_java.ildt
If successful, you will see something like this:



Let’s check the log file to make sure there were no errors during the upload.



Now let’s check the service in the Repository.

Login to your Oracle E-Business Suite instance as SYSADMIN.



Switch to Integrated SOA Gateway responsibility.



Select Integration Repository



Click Search



Search for “Hello World” in the Interface Name and click Go



Click the Name of the Interface



You should now see the details of the Interface object.



To enable the REST Web Service, click on the REST Web Service tab. Enter an alias for this. Then click Deploy. The alias will be used as part of the URL later on when invoking the service. Once deployed, you can get more information on the service by clicking on the WADL.



Let’s move on to the Grants tab and grant the service to some users. Check the Get Hello World and click Create Grant.



Enter the necessary information then click Create Grant. In my case, I chose Special User for Grantee Type and SYSADMIN for Grantee Name.



At this point, we need to restart the following:

opmn
oafm

You can refer to this link for details on how to start and stop Oracle scripts.

To invoke the web service, I'm going to use Postman as my REST client. Below are the details for the request:
  • Method: GET
  • Url: http://:/webservices/rest/hw/getHelloWorld/?ctx_responsibility=SYSTEM_ADMINISTRATOR&ctx_respapplication=SYSADMIN&ctx_securitygroup=STANDARD&ctx_nlslanguage=AMERICAN
    where:
    • ctx_responsibility. FND Responsibility Key
    • ctx_respapplication. FND Application Short Name
    • ctx_securitygroup. Security Group
    • ctx_nlslanguage. NLS Language
    More information on these here.
  • Authorization: Basic <encoded username:password>
  • Content-Type: application/json

See sample response below:
{
    "OutputParameters": {
        "ControlBean": [
            {
                "fields": "",
                "filter": "",
                "limit": "",
                "offset": "",
                "sort": ""
            }
        ],
        "value": [
            "Hello World"
        ]
    }
}

See screen shot below for sample



And that's it. Enjoy.

References:

No comments:

Post a Comment