*----------------------------------------------------------------------* * CLASS ZCL_SAPLINK_ADT_plugin_res DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ZCL_SAPLINK_ADT_plugin_res DEFINITION PUBLIC INHERITING FROM cl_adt_rest_resource FINAL CREATE PUBLIC . PUBLIC SECTION. TYPES: BEGIN OF t_objecttable, objtype TYPE string, text TYPE string, transporttype TYPE string, vituri TYPE string, END OF t_objecttable. CONSTANTS co_class_name TYPE seoclsname VALUE 'ZCL_SAPLINK_ADT_PLUGIN_RES'. "#EC NOTEXT METHODS get REDEFINITION . PROTECTED SECTION. private section. types: BEGIN OF t_saplink_objecttable, classname TYPE string, object TYPE ko100-object, text TYPE ko100-text, END OF t_saplink_objecttable . *"* use this source file for the definition and implementation of *"* local helper classes, interface definitions and type *"* declarations *"* use this source file for any type of declarations (class *"* definitions, interfaces or type declarations) you need for *"* components in the private section *"* use this source file for any macro definitions you need *"* in the implementation part of the class *"* use this source file for your ABAP unit test classes CLASS ltcl_get_plugins DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. METHODS: get_all_success FOR TESTING RAISING cx_static_check. ENDCLASS. "ltcl_get_plugins DEFINITION *----------------------------------------------------------------------* * CLASS ltcl_get_plugins IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_get_plugins IMPLEMENTATION. METHOD get_all_success. DATA: resource TYPE REF TO ZCL_SAPLINK_ADT_plugin_res, request_stub TYPE REF TO cl_adt_rest_request_stub, response_spy TYPE REF TO cl_adt_rest_response_spy, result TYPE STANDARD TABLE OF ZCL_SAPLINK_ADT_plugin_res=>t_objecttable. CREATE OBJECT resource. CREATE OBJECT request_stub. CREATE OBJECT response_spy. resource->get( EXPORTING request = request_stub response = response_spy ). response_spy->get_body_data( IMPORTING data = result ). cl_abap_unit_assert=>assert_not_initial( act = result ). ENDMETHOD. "get_all_success ENDCLASS. "ltcl_get_plugins IMPLEMENTATION METHOD get. DATA: lo_content_handler TYPE REF TO if_adt_rest_content_handler, plugins TYPE STANDARD TABLE OF t_saplink_objecttable, lt_objects TYPE STANDARD TABLE OF t_objecttable, ls_t100key TYPE scx_t100key. DATA: lo_objtype TYPE REF TO cl_wb_object_type, ls_objtype TYPE wbobjtype. FIELD-SYMBOLS: <plugin> LIKE LINE OF plugins, <object> like LINE OF lt_objects. "*--- get installed SAPlink plugins ---* zsaplink=>getplugins( CHANGING objecttable = plugins ). IF plugins IS INITIAL. ls_t100key-msgid = 'ZSAPLINKADT'. ls_t100key-msgno = '004'. "No SAPlink plugins installed RAISE EXCEPTION TYPE cx_adt_res_not_found EXPORTING textid = ls_t100key. ENDIF. LOOP AT plugins ASSIGNING <plugin>. APPEND INITIAL LINE TO lt_objects ASSIGNING <object>. "*--- convert object type to global object type ---* cl_wb_object_type=>create_from_exttype( EXPORTING p_external_id = <plugin>-object RECEIVING p_wb_object_type = lo_objtype EXCEPTIONS objecttype_not_existing = 1 ). IF sy-subrc = 0. ls_objtype = lo_objtype->get_main_global_type( ). IF ls_objtype-objtype_tr IS INITIAL. "not a supported WB type ls_objtype-objtype_tr = <plugin>-object. ENDIF. ELSE. "no global type available: use the object type only ls_objtype-objtype_tr = <plugin>-object. CLEAR ls_objtype-subtype_wb. ENDIF. <object>-objtype = |{ ls_objtype-objtype_tr }/{ ls_objtype-subtype_wb }|. <object>-text = |{ <plugin>-text }|. <object>-transporttype = |{ ls_objtype-objtype_tr }|. " Build VIT URI <object>-vituri = cl_adt_uri_builder_vit=>create_uri( object_type = |{ ls_objtype-objtype_tr }{ ls_objtype-subtype_wb }| object_name = '$org.saplink.objname$' ). ENDLOOP. CREATE OBJECT lo_content_handler TYPE ZCL_SAPLINK_ADT_plug_chndl. response->set_body_data( content_handler = lo_content_handler data = lt_objects ). ENDMETHOD. "get *----------------------------------------------------------------------* * CLASS ZCL_SAPLINK_ADT_plug_chndl DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ZCL_SAPLINK_ADT_plug_chndl DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES if_adt_rest_content_handler . PROTECTED SECTION. PRIVATE SECTION. METHODS: convertixmldoctostring IMPORTING ixmldocument TYPE REF TO if_ixml_document RETURNING value(xmlstring) TYPE string. *"* use this source file for the definition and implementation of *"* local helper classes, interface definitions and type *"* declarations *"* use this source file for any type of declarations (class *"* definitions, interfaces or type declarations) you need for *"* components in the private section *"* use this source file for any macro definitions you need *"* in the implementation part of the class *"* use this source file for your ABAP unit test classes METHOD if_adt_rest_content_handler~deserialize. "dummy ENDMETHOD. "if_adt_rest_content_handler~deserialize METHOD if_adt_rest_content_handler~get_supported_content_type. result = if_rest_media_type=>gc_appl_xml. ENDMETHOD. "if_adt_rest_content_handler~get_supported_content_type METHOD if_adt_rest_content_handler~serialize. DATA: lt_objects TYPE STANDARD TABLE OF ZCL_SAPLINK_ADT_plugin_res=>t_objecttable. DATA: xmldoc TYPE REF TO if_ixml_document. DATA: ixml TYPE REF TO if_ixml. DATA: rootnode TYPE REF TO if_ixml_element. DATA: objectnode TYPE REF TO if_ixml_element. DATA: rc TYPE i. DATA: body TYPE string. DATA: vituri TYPE string. FIELD-SYMBOLS: <ls_object> TYPE ZCL_SAPLINK_ADT_plugin_res=>t_objecttable. ixml = cl_ixml=>create( ). xmldoc = ixml->create_document( ). rootnode = xmldoc->create_element( 'plugins' ). lt_objects = data. LOOP AT lt_objects ASSIGNING <ls_object>. objectnode = xmldoc->create_element( 'plugin' ). rc = objectnode->set_attribute( name = 'objtype' value = |{ <ls_object>-objtype }| ). rc = objectnode->set_attribute( name = 'text' value = |{ <ls_object>-text }| ). rc = objectnode->set_attribute( name = 'transporttype' value = |{ <ls_object>-transporttype }| ). rc = objectnode->set_attribute( name = 'vituri' value = |{ <ls_object>-vituri }| ). rc = rootnode->append_child( objectnode ). ENDLOOP. rc = xmldoc->append_child( rootnode ). "*--- create http body and content type ---* body = convertixmldoctostring( xmldoc ). body = zake=>set_break_to_cr_lf( body ). response_entity->set_string_data( body ). response_entity->set_content_type( me->if_adt_rest_content_handler~get_supported_content_type( ) ). ENDMETHOD. "if_adt_rest_content_handler~serialize METHOD convertixmldoctostring. ***************************************************** * modified copy of zsaplink=>convertixmldoctostring * needed for utf-8 encoding ***************************************************** DATA _ixml TYPE REF TO if_ixml. DATA _streamfactory TYPE REF TO if_ixml_stream_factory. DATA _outputstream TYPE REF TO if_ixml_ostream. DATA _renderer TYPE REF TO if_ixml_renderer. DATA _tempstring TYPE string. DATA _tempstringx TYPE xstring. DATA _rc TYPE sysubrc. _ixml = cl_ixml=>create( ). _streamfactory = _ixml->create_stream_factory( ). "*--- set encoding only works with xstring ---* _outputstream = _streamfactory->create_ostream_xstring( _tempstringx ). DATA: encoding TYPE REF TO if_ixml_encoding. encoding = _ixml->create_encoding( byte_order = if_ixml_encoding=>co_none character_set = 'utf-8' ). _outputstream->set_encoding( encoding = encoding ). _renderer = _ixml->create_renderer( document = ixmldocument ostream = _outputstream ). _renderer->set_normalizing( ). _rc = _renderer->render( ). "*--- XString to String ---* CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING' EXPORTING im_xstring = _tempstringx im_encoding = 'UTF-8' IMPORTING ex_string = _tempstring. SHIFT _tempstring LEFT DELETING LEADING space. xmlstring = _tempstring. ENDMETHOD. "convertixmldoctostring *----------------------------------------------------------------------* * CLASS ZCL_SAPLINK_ADT_RES_APP DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* * interfaces IF_ADT_REST_RFC_APPLICATION . CLASS ZCL_SAPLINK_ADT_res_app DEFINITION PUBLIC INHERITING FROM cl_adt_disc_res_app_base FINAL CREATE PUBLIC . PUBLIC SECTION. TYPE-POOLS abap . PROTECTED SECTION. CONSTANTS co_application_title TYPE string VALUE 'SAPlink'. "#EC NOTEXT METHODS get_application_title REDEFINITION . METHODS register_resources REDEFINITION . PRIVATE SECTION. *"* use this source file for the definition and implementation of *"* local helper classes, interface definitions and type *"* declarations *"* use this source file for any type of declarations (class *"* definitions, interfaces or type declarations) you need for *"* components in the private section *"* use this source file for any macro definitions you need *"* in the implementation part of the class ABAP METHOD get_application_title. result = ZCL_SAPLINK_ADT_res_app=>co_application_title. ENDMETHOD. "get_application_title METHOD register_resources. registry->register_discoverable_resource( EXPORTING url = '/saplink/import' handler_class = ZCL_SAPLINK_ADT_slnk_res=>co_class_name description = 'Import Slinkee to SAP System' category_scheme = 'http://www.saplink.org/saplink' category_term = 'import_slinkee' ). registry->register_discoverable_resource( EXPORTING url = '/saplink/slinkee' handler_class = ZCL_SAPLINK_ADT_slnk_res=>co_class_name description = 'Export Slinkee from SAP System' category_scheme = 'http://www.saplink.org/saplink' category_term = 'export_slinkee' ). registry->register_resource( template = '/saplink/slinkee/{obj_type}/{obj_name}' handler_class = ZCL_SAPLINK_ADT_slnk_res=>co_class_name ). registry->register_discoverable_resource( EXPORTING url = '/saplink/plugins' handler_class = ZCL_SAPLINK_ADT_plugin_res=>co_class_name description = 'Get available SAPlink plugins' category_scheme = 'http://www.saplink.org/saplink' category_term = 'plugins' ). ENDMETHOD. "register_resources *----------------------------------------------------------------------* * CLASS ZCL_SAPLINK_ADT_SLNK_CHNDL DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ZCL_SAPLINK_ADT_slnk_chndl DEFINITION PUBLIC CREATE PUBLIC . PUBLIC SECTION. INTERFACES if_adt_rest_content_handler . PROTECTED SECTION. PRIVATE SECTION. *"* use this source file for the definition and implementation of *"* local helper classes, interface definitions and type *"* declarations *"* use this source file for any type of declarations (class *"* definitions, interfaces or type declarations) you need for *"* components in the private section *"* use this source file for any macro definitions you need *"* in the implementation part of the class METHOD if_adt_rest_content_handler~deserialize. data = request_entity->get_string_data( ). ENDMETHOD. "if_adt_rest_content_handler~deserialize METHOD if_adt_rest_content_handler~get_supported_content_type. result = if_rest_media_type=>gc_appl_xml. ENDMETHOD. "if_adt_rest_content_handler~get_supported_content_type METHOD if_adt_rest_content_handler~serialize. DATA: lo_zake TYPE REF TO zake, lo_cx TYPE REF TO zcx_saplink. DATA: ls_tadir TYPE tadir, lv_object TYPE string, lv_obj_name TYPE string, lv_slinkee_xml TYPE string. ls_tadir = data. lv_object = ls_tadir-object. lv_obj_name = ls_tadir-obj_name. TRY. CREATE OBJECT lo_zake " Gregor Wolf, 2012-07-10 " As ZAKE is no abstract class we can directly instanciate " TYPE zcl_zake_svn EXPORTING i_svnpath = 'http://test.com' " Only needed to get no execption i_localpath = ''. lo_zake->get_slinkee( EXPORTING i_objecttype = lv_object i_objectname = lv_obj_name IMPORTING e_slinkee_xml = lv_slinkee_xml ). response_entity->set_string_data( lv_slinkee_xml ). response_entity->set_content_type( me->if_adt_rest_content_handler~get_supported_content_type( ) ). CATCH zcx_saplink INTO lo_cx. " SAPlink exception class RAISE EXCEPTION TYPE cx_adt_rest_data_invalid EXPORTING textid = cx_adt_rest=>create_textid_from_exc_text( lo_cx ) previous = lo_cx. ENDTRY. ENDMETHOD. "if_adt_rest_content_handler~serialize *----------------------------------------------------------------------* * CLASS ZCL_SAPLINK_ADT_SLNK_RES DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ZCL_SAPLINK_ADT_slnk_res DEFINITION PUBLIC INHERITING FROM cl_adt_rest_resource FINAL CREATE PUBLIC . PUBLIC SECTION. CONSTANTS co_class_name TYPE seoclsname VALUE 'ZCL_SAPLINK_ADT_SLNK_RES'. "#EC NOTEXT CONSTANTS co_ua_obj_type TYPE string VALUE 'obj_type'. "#EC NOTEXT CONSTANTS co_ua_obj_name TYPE string VALUE 'obj_name'. "#EC NOTEXT METHODS get REDEFINITION . METHODS post REDEFINITION . PROTECTED SECTION. PRIVATE SECTION. *"* use this source file for the definition and implementation of *"* local helper classes, interface definitions and type *"* declarations *"* use this source file for any type of declarations (class *"* definitions, interfaces or type declarations) you need for *"* components in the private section *"* use this source file for any macro definitions you need *"* in the implementation part of the class *"* use this source file for your ABAP unit test classes CLASS ltcl_saplink_adt_res DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. DATA: resource TYPE REF TO cl_adt_rest_resource, request_stub TYPE REF TO cl_adt_rest_request_stub, response_spy TYPE REF TO cl_adt_rest_response_spy. METHODS: setup, test_get_slinkee FOR TESTING RAISING cx_static_check, test_post_slinkee FOR TESTING RAISING cx_static_check, test_post_slinkee_ow FOR TESTING RAISING cx_static_check, test_post_slinkee_nodata FOR TESTING RAISING cx_static_check, test_post_slinkee_noplugin FOR TESTING RAISING cx_static_check. ENDCLASS. "ltcl_saplink_adt_res DEFINITION *----------------------------------------------------------------------* * CLASS ltcl_ IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS ltcl_saplink_adt_res IMPLEMENTATION. METHOD setup. CREATE OBJECT request_stub. CREATE OBJECT response_spy. CREATE OBJECT me->resource TYPE ZCL_SAPLINK_ADT_slnk_res. ENDMETHOD. "setup METHOD test_get_slinkee. DATA: act_content_handler TYPE REF TO if_adt_rest_content_handler, ls_tadir TYPE tadir. * prepare the request's URI attributes request_stub->set_uri_attribute( name = ZCL_SAPLINK_ADT_slnk_res=>co_ua_obj_type value = 'prog' ). request_stub->set_uri_attribute( name = ZCL_SAPLINK_ADT_slnk_res=>co_ua_obj_name value = 'zsaplink' ). * call the resource controller method resource->get( request = request_stub response = response_spy ). response_spy->get_body_data( IMPORTING data = ls_tadir ). * check response body contains data cl_abap_unit_assert=>assert_not_initial( act = ls_tadir msg = 'Slinkee not created' ). * check content handler act_content_handler = response_spy->get_content_handler( ). cl_abap_unit_assert=>assert_bound( msg = 'No content handler set in response' act = act_content_handler ). ENDMETHOD. "test_get_slinkee METHOD test_post_slinkee. * DATA: act_content_handler TYPE REF TO if_adt_rest_content_handler, * ls_tadir TYPE tadir. * ** prepare the request's URI attributes * request_stub->set_uri_attribute( * name = ZCL_SAPLINK_ADT_slnk_res=>co_ua_obj_type * value = 'prog' ). * * request_stub->set_uri_attribute( * name = ZCL_SAPLINK_ADT_slnk_res=>co_ua_obj_name * value = 'zsaplink_installer' ). * ** prepare the request's header fields * request_stub->set_header_field( * name = 'X-SAPlink-Package' * value = '$SAPLINK' ). * * request_stub->set_header_field( * name = 'X-SAPlink-Overwrite' * value = abap_false ). * * request_stub->set_header_field( * name = 'X-SAPlink-Transport' * value = '' ). * ** prepare the request's body data * DATA: lo_zake TYPE REF TO zake, * lo_cx TYPE REF TO zcx_saplink, * lo_ex TYPE REF TO cx_adt_res_already_exists. * * DATA: lv_slinkee_xml TYPE string, * lv_status TYPE i, * lv_msg TYPE string. * * TRY. * * CREATE OBJECT lo_zake * EXPORTING * i_svnpath = 'http://test.com' " Only needed to get no execption * i_localpath = ''. * * lo_zake->get_slinkee( EXPORTING i_objecttype = 'PROG' * i_objectname = 'ZSAPLINK_INSTALLER' * IMPORTING e_slinkee_xml = lv_slinkee_xml ). * * CATCH zcx_saplink INTO lo_cx. " SAPlink exception class * RAISE EXCEPTION TYPE cx_adt_rest_data_invalid * EXPORTING * textid = cx_adt_rest=>create_textid_from_exc_text( lo_cx ) * previous = lo_cx. * ENDTRY. * * request_stub->set_body_data( * data = lv_slinkee_xml ). * * resource->post( request = request_stub response = response_spy ). * * lv_status = response_spy->get_status( ). * * cl_abap_unit_assert=>assert_equals( * exp = 201 * act = lv_status ). ENDMETHOD. "test_post_slinkee METHOD test_post_slinkee_ow. DATA: act_content_handler TYPE REF TO if_adt_rest_content_handler, ls_tadir TYPE tadir. * prepare the request's URI attributes request_stub->set_uri_attribute( name = ZCL_SAPLINK_ADT_slnk_res=>co_ua_obj_type value = 'prog' ). request_stub->set_uri_attribute( name = ZCL_SAPLINK_ADT_slnk_res=>co_ua_obj_name value = 'zsaplink_installer' ). * prepare the request's header fields * request_stub->set_header_field( * name = 'X-SAPlink-Package' * value = '$SAPLINK' ). * * request_stub->set_header_field( * name = 'X-SAPlink-Overwrite' * value = abap_false ). * * request_stub->set_header_field( * name = 'X-SAPlink-Transport' * value = '' ). * prepare the request's body data DATA: lo_zake TYPE REF TO zake, lo_cx TYPE REF TO zcx_saplink, lo_ex TYPE REF TO cx_adt_res_already_exists. DATA: lv_slinkee_xml TYPE string, lv_status TYPE i, lv_msg TYPE string. TRY. CREATE OBJECT lo_zake EXPORTING i_svnpath = 'http://test.com' " Only needed to get no execption i_localpath = ''. lo_zake->get_slinkee( EXPORTING i_objecttype = 'PROG' i_objectname = 'ZSAPLINK_INSTALLER' IMPORTING e_slinkee_xml = lv_slinkee_xml ). CATCH zcx_saplink INTO lo_cx. " SAPlink exception class RAISE EXCEPTION TYPE cx_adt_rest_data_invalid EXPORTING textid = cx_adt_rest=>create_textid_from_exc_text( lo_cx ) previous = lo_cx. ENDTRY. request_stub->set_body_data( data = lv_slinkee_xml ). TRY. resource->post( request = request_stub response = response_spy ). * lv_status = response_spy->get_status( ). * * cl_abap_unit_assert=>assert_equals( * exp = 201 * act = lv_status ). CATCH cx_adt_res_already_exists INTO lo_ex. MESSAGE ID 'ZSAPLINKADT' TYPE 'E' NUMBER 003 INTO lv_msg WITH 'ZSAPLINK_INSTALLER'. cl_abap_unit_assert=>assert_equals( exp = lo_ex->get_text( ) act = lv_msg ). ENDTRY. ENDMETHOD. "test_post_slinkee METHOD test_post_slinkee_nodata. DATA: act_content_handler TYPE REF TO if_adt_rest_content_handler, ls_tadir TYPE tadir. * prepare the request's URI attributes request_stub->set_uri_attribute( name = ZCL_SAPLINK_ADT_slnk_res=>co_ua_obj_type value = 'prog' ). request_stub->set_uri_attribute( name = ZCL_SAPLINK_ADT_slnk_res=>co_ua_obj_name value = 'zsaplink_installer' ). * prepare the request's header fields * request_stub->set_header_field( * name = 'X-SAPlink-Package' * value = '$SAPLINK' ). * * request_stub->set_header_field( * name = 'X-SAPlink-Overwrite' * value = abap_false ). * * request_stub->set_header_field( * name = 'X-SAPlink-Transport' * value = '' ). * prepare the request's body data DATA: lo_ex TYPE REF TO cx_adt_rest_data_invalid. DATA: lv_status TYPE i, lv_msg TYPE string. TRY. resource->post( request = request_stub response = response_spy ). CATCH cx_adt_rest_data_invalid INTO lo_ex. MESSAGE ID 'ZSAPLINKADT' TYPE 'E' NUMBER 001 INTO lv_msg. cl_abap_unit_assert=>assert_equals( exp = lo_ex->get_text( ) act = lv_msg ). ENDTRY. ENDMETHOD. "test_post_slinkee METHOD test_post_slinkee_noplugin. DATA: act_content_handler TYPE REF TO if_adt_rest_content_handler, ls_tadir TYPE tadir. * prepare the request's URI attributes request_stub->set_uri_attribute( name = ZCL_SAPLINK_ADT_slnk_res=>co_ua_obj_type value = 'dummy' ). request_stub->set_uri_attribute( name = ZCL_SAPLINK_ADT_slnk_res=>co_ua_obj_name value = 'zsaplink_installer' ). * prepare the request's header fields * request_stub->set_header_field( * name = 'X-SAPlink-Package' * value = '$SAPLINK' ). * * request_stub->set_header_field( * name = 'X-SAPlink-Overwrite' * value = abap_false ). * * request_stub->set_header_field( * name = 'X-SAPlink-Transport' * value = '' ). * prepare the request's body data DATA: lo_zake TYPE REF TO zake, lo_cx TYPE REF TO zcx_saplink, lo_rootnode TYPE REF TO if_ixml_element, lo_ixmldocument TYPE REF TO if_ixml_document, lo_ex TYPE REF TO cx_adt_rest_data_invalid. DATA: lv_slinkee_xml TYPE string, lv_status TYPE i, lv_msg TYPE string. TRY. CREATE OBJECT lo_zake EXPORTING i_svnpath = 'http://test.com' " Only needed to get no execption i_localpath = ''. lo_zake->get_slinkee( EXPORTING i_objecttype = 'PROG' i_objectname = 'ZSAPLINK_INSTALLER' IMPORTING e_slinkee_xml = lv_slinkee_xml ). lo_ixmldocument = zsaplink=>convertstringtoixmldoc( lv_slinkee_xml ). lo_rootnode ?= lo_ixmldocument->get_root_element( ). lo_rootnode->set_name( 'DUMM' ). lv_slinkee_xml = zsaplink=>convertixmldoctostring( lo_ixmldocument ). lv_slinkee_xml = zake=>set_break_to_cr_lf( lv_slinkee_xml ). CATCH zcx_saplink INTO lo_cx. " SAPlink exception class RAISE EXCEPTION TYPE cx_adt_rest_data_invalid EXPORTING textid = cx_adt_rest=>create_textid_from_exc_text( lo_cx ) previous = lo_cx. ENDTRY. request_stub->set_body_data( data = lv_slinkee_xml ). TRY. resource->post( request = request_stub response = response_spy ). CATCH cx_adt_rest_data_invalid INTO lo_ex. MESSAGE ID 'ZSAPLINKADT' TYPE 'E' NUMBER 002 INTO lv_msg WITH 'DUMM'. cl_abap_unit_assert=>assert_equals( exp = lo_ex->get_text( ) act = lv_msg ). ENDTRY. ENDMETHOD. "test_post_slinkee ENDCLASS. "ltcl_saplink_adt_res IMPLEMENTATION METHOD get. DATA: lo_content_handler TYPE REF TO if_adt_rest_content_handler. DATA: lv_object TYPE trobjtype, lv_obj_name TYPE sobj_name, ls_tadir TYPE tadir. * Step 1. Get URI Arguments request->get_uri_attribute( EXPORTING name = ZCL_SAPLINK_ADT_slnk_res=>co_ua_obj_type mandatory = abap_true IMPORTING value = lv_object ). TRANSLATE lv_object TO UPPER CASE. request->get_uri_attribute( EXPORTING name = ZCL_SAPLINK_ADT_slnk_res=>co_ua_obj_name mandatory = abap_true IMPORTING value = lv_obj_name ). TRANSLATE lv_obj_name TO UPPER CASE. * Step 2. Check if resource exists " Currently in TADIR SELECT SINGLE * FROM tadir INTO ls_tadir WHERE object = lv_object AND obj_name = lv_obj_name. IF sy-subrc = 4. RAISE EXCEPTION TYPE cx_adt_res_not_found. ELSE. * Step 3. Get content handler and create response CREATE OBJECT lo_content_handler TYPE ZCL_SAPLINK_ADT_slnk_chndl. response->set_body_data( content_handler = lo_content_handler data = ls_tadir ). ENDIF. ENDMETHOD. "get METHOD post. DATA: rest_request TYPE REF TO if_rest_request, lv_package TYPE string, lv_devclass TYPE devclass, lv_overwrite TYPE string, lv_transport TYPE string. DATA: lo_content_handler TYPE REF TO if_adt_rest_content_handler, lv_xml TYPE string, lo_root TYPE REF TO if_ixml_element, ixmldocument TYPE REF TO if_ixml_document, ls_t100key TYPE scx_t100key. DATA: _objtype TYPE string, _objname TYPE string, _pluginexists TYPE flag, _objectexists TYPE flag. "*--- not possible to get the HTTP header via ADT request yet(?) ---* rest_request ?= request->get_inner_rest_request( ). lv_package = rest_request->if_rest_message~get_header_field( 'X-SAPlink-Package' ). lv_overwrite = rest_request->if_rest_message~get_header_field( 'X-SAPlink-Overwrite' ). lv_transport = rest_request->if_rest_message~get_header_field( 'X-SAPlink-Transport' ). TRANSLATE lv_transport TO UPPER CASE. TRANSLATE lv_package TO UPPER CASE. lv_devclass = lv_package. "convert type "*--- get content (the slinkee) ---* CREATE OBJECT lo_content_handler TYPE ZCL_SAPLINK_ADT_slnk_chndl. request->get_body_data( EXPORTING content_handler = lo_content_handler IMPORTING data = lv_xml ). "*--- check body ---* IF lv_xml IS INITIAL. ls_t100key-msgid = 'ZSAPLINKADT'. ls_t100key-msgno = '001'. "No data (empty body) RAISE EXCEPTION TYPE cx_adt_rest_data_invalid EXPORTING textid = ls_t100key. ENDIF. "*--- check slinkee ---* ixmldocument = zsaplink=>convertstringtoixmldoc( lv_xml ). lo_root = ixmldocument->get_root_element( ). IF lo_root IS INITIAL. "valid XML data? RAISE EXCEPTION TYPE cx_adt_rest_data_invalid. ENDIF. zsaplink=>checkobject( EXPORTING i_ixmldocument = ixmldocument " IF_IXML_DOCUMENT IMPORTING e_objtype = _objtype e_objname = _objname e_pluginexists = _pluginexists " General Flag e_objectexists = _objectexists " General Flag ). IF _pluginexists <> abap_true. ls_t100key-msgid = 'ZSAPLINKADT'. ls_t100key-msgno = '002'. "Plugin not installed ls_t100key-attr1 = 'MSGV1'. RAISE EXCEPTION TYPE cx_adt_rest_data_invalid EXPORTING textid = ls_t100key msgv1 = |{ _objtype }|. ENDIF. IF _objectexists = abap_true AND lv_overwrite <> abap_true. ls_t100key-msgid = 'ZSAPLINKADT'. ls_t100key-msgno = '003'. "Object already installed ls_t100key-attr1 = 'MSGV1'. RAISE EXCEPTION TYPE cx_adt_res_already_exists EXPORTING textid = ls_t100key msgv1 = |{ _objname }|. ENDIF. "*--- Instanciate ZAKE to install the Slinkee ---* DATA: zake TYPE REF TO zake, ex TYPE REF TO zcx_saplink, lv_tasknr TYPE e070-trkorr. TRY. CREATE OBJECT zake " Gregor Wolf, 2012-07-10 " As ZAKE is no abstract class we can directly instanciate " TYPE zcl_zake_svn EXPORTING i_svnpath = 'http://test.com' " Only needed to get no execption i_localpath = ''. "*--- workaround until ZAKE is able ---* "*--- to import the transport request ---* IF lv_transport IS NOT INITIAL. lv_tasknr = lv_transport. EXPORT tasknr FROM lv_tasknr TO MEMORY ID 'EUT'. ENDIF. zake->install( EXPORTING i_xml_document = ixmldocument " IF_IXML_DOCUMENT i_devclass = lv_devclass " Package IMPORTING e_objecttype = _objtype e_objectname = _objname ). "*--- created -> return the location header field ---* DATA wb_object TYPE REF TO cl_wb_object. DATA objref TYPE REF TO cl_adt_object_reference. DATA rest_response TYPE REF TO if_rest_response. wb_object = cl_wb_object=>create_from_transport_key( p_object = |{ _objtype }| p_obj_name = |{ _objname }| ). objref = cl_adt_uri_mapper=>get_instance( )->if_adt_uri_mapper~map_wb_object_to_objref( wb_object ). rest_response = response->get_inner_rest_response( ). rest_response->set_header_field( EXPORTING iv_name = 'Location' iv_value = objref->ref_data-uri ). response->set_status( status = 201 ). "created CATCH zcx_saplink INTO ex. ls_t100key-msgid = 'ZSAPLINKADT'. ls_t100key-msgno = '000'. "&1 ls_t100key-attr1 = 'MSGV1'. RAISE EXCEPTION TYPE cx_adt_res_save_failure EXPORTING textid = ls_t100key msgv1 = |{ ex->get_text( ) }|. CATCH cx_sy_send_dynpro_no_receiver. "happens e.g. if Package doesn't exist ls_t100key-msgid = 'ZSAPLINKADT'. ls_t100key-msgno = '000'. "&1 ls_t100key-attr1 = 'MSGV1'. RAISE EXCEPTION TYPE cx_adt_res_save_failure EXPORTING textid = ls_t100key msgv1 = 'Dynpro send in background'. ENDTRY. ENDMETHOD. "POST SADT_REST_RFC_APPLICATION BADI_ADT_REST_RFC_APPLICATION ZSAPLINK_ADT ZCL_SAPLINK_ADT_RES_APP X 1 STATIC_URI_PATH 1 1 STATIC_URI_PATH S CP 0 0 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0.0 0.0 /sap/bc/adt/saplink* CL_ADT_REST_URI_FILTER_CHECK 0 0 1 1 STATIC_URI_PATH S CP 0 0 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0.0 0.0 /sap/bc/adt/saplink* CL_ADT_REST_URI_FILTER_CHECK 0 0 SAPlink ADT 005056B62D001ED1ADADD7D984570189 SADT_REST_RFC_APPLICATION BADI_ADT_DISCOVERY_PROVIDER ZSAPLINK_ADT_DISCOVERY ZCL_SAPLINK_ADT_RES_APP X SAPlink ADT Discovery service 005056B62D001ED1AED748BC9E6AE189