*----------------------------------------------------------------------*
* 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 IMPLEMENTATIONMETHOD 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 classesMETHOD if_adt_rest_content_handler~deserialize.
"dummy
ENDMETHOD. "if_adt_rest_content_handler~deserializeMETHOD 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_typeMETHOD 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~serializeMETHOD 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 classABAPMETHOD get_application_title.
result = ZCL_SAPLINK_ADT_res_app=>co_application_title.
ENDMETHOD. "get_application_titleMETHOD 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 classMETHOD if_adt_rest_content_handler~deserialize.
data = request_entity->get_string_data( ).
ENDMETHOD. "if_adt_rest_content_handler~deserializeMETHOD 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_typeMETHOD 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 IMPLEMENTATIONMETHOD 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. "getMETHOD 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. "POSTSADT_REST_RFC_APPLICATIONBADI_ADT_REST_RFC_APPLICATIONZSAPLINK_ADTZCL_SAPLINK_ADT_RES_APPX1STATIC_URI_PATH11STATIC_URI_PATHSCP000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00.0/sap/bc/adt/saplink*CL_ADT_REST_URI_FILTER_CHECK0011STATIC_URI_PATHSCP000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00.0/sap/bc/adt/saplink*CL_ADT_REST_URI_FILTER_CHECK00SAPlink ADT005056B62D001ED1ADADD7D984570189SADT_REST_RFC_APPLICATIONBADI_ADT_DISCOVERY_PROVIDERZSAPLINK_ADT_DISCOVERYZCL_SAPLINK_ADT_RES_APPXSAPlink ADT Discovery service005056B62D001ED1AED748BC9E6AE189