From 36b4f4bcf342c26cae27094f8a23afef1de96206 Mon Sep 17 00:00:00 2001 From: larshp Date: Tue, 4 Apr 2017 20:25:24 +0200 Subject: [PATCH 1/5] WAPA stub --- src/zabapgit_object_serializing.prog.abap | 1 + src/zabapgit_object_wapa.prog.abap | 73 +++++++++++++++++++++++ src/zabapgit_object_wapa.prog.xml | 22 +++++++ 3 files changed, 96 insertions(+) create mode 100644 src/zabapgit_object_wapa.prog.abap create mode 100644 src/zabapgit_object_wapa.prog.xml diff --git a/src/zabapgit_object_serializing.prog.abap b/src/zabapgit_object_serializing.prog.abap index f8153fd7d..c03e7ba86 100644 --- a/src/zabapgit_object_serializing.prog.abap +++ b/src/zabapgit_object_serializing.prog.abap @@ -50,6 +50,7 @@ INCLUDE zabapgit_object_type. INCLUDE zabapgit_object_vcls. INCLUDE zabapgit_object_view. INCLUDE zabapgit_object_w3xx. +INCLUDE zabapgit_object_wapa. INCLUDE zabapgit_object_wdya. INCLUDE zabapgit_object_wdyn. INCLUDE zabapgit_object_webi. diff --git a/src/zabapgit_object_wapa.prog.abap b/src/zabapgit_object_wapa.prog.abap new file mode 100644 index 000000000..a095fa12c --- /dev/null +++ b/src/zabapgit_object_wapa.prog.abap @@ -0,0 +1,73 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_OBJECT_WAPA +*&---------------------------------------------------------------------* + +*----------------------------------------------------------------------* +* CLASS lcl_object_wapa DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_wapa DEFINITION INHERITING FROM lcl_objects_super FINAL. + + PUBLIC SECTION. + INTERFACES lif_object. + ALIASES mo_files FOR lif_object~mo_files. + +ENDCLASS. "lcl_object_TRAN DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_object_wapa IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_wapa IMPLEMENTATION. + + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + + METHOD lif_object~changed_by. +* todo + rv_user = c_user_unknown. + ENDMETHOD. + + METHOD lif_object~get_metadata. + rs_metadata = get_metadata( ). + ENDMETHOD. "lif_object~get_metadata + + METHOD lif_object~exists. + +* todo +* rv_bool = boolc( sy-subrc = 0 ). + + ENDMETHOD. "lif_object~exists + + METHOD lif_object~jump. + +* todo + + ENDMETHOD. "jump + + METHOD lif_object~delete. + +* todo + + ENDMETHOD. "delete + + METHOD lif_object~deserialize. + +* todo + + ENDMETHOD. "deserialize + + METHOD lif_object~serialize. + +* todo + + ENDMETHOD. "serialize + + METHOD lif_object~compare_to_remote_version. + CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. + ENDMETHOD. + +ENDCLASS. "lcl_object_tran IMPLEMENTATION diff --git a/src/zabapgit_object_wapa.prog.xml b/src/zabapgit_object_wapa.prog.xml new file mode 100644 index 000000000..edd9ae545 --- /dev/null +++ b/src/zabapgit_object_wapa.prog.xml @@ -0,0 +1,22 @@ + + + + + + ZABAPGIT_OBJECT_WAPA + A + X + I + E + X + + + + R + Include ZABAPGIT_OBJECT_TRAN + 28 + + + + + From a338e86772169a9130f829b9b1772c570069880e Mon Sep 17 00:00:00 2001 From: larshp Date: Wed, 5 Apr 2017 19:05:45 +0200 Subject: [PATCH 2/5] WAPA serialization #12 --- src/zabapgit_object_wapa.prog.abap | 186 +++++++++++++++++++++++++++-- 1 file changed, 176 insertions(+), 10 deletions(-) diff --git a/src/zabapgit_object_wapa.prog.abap b/src/zabapgit_object_wapa.prog.abap index a095fa12c..dd4777376 100644 --- a/src/zabapgit_object_wapa.prog.abap +++ b/src/zabapgit_object_wapa.prog.abap @@ -13,6 +13,22 @@ CLASS lcl_object_wapa DEFINITION INHERITING FROM lcl_objects_super FINAL. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. + PRIVATE SECTION. + TYPES: BEGIN OF ty_page, + attributes TYPE o2pagattr, + END OF ty_page. + + TYPES: ty_pages_tt TYPE STANDARD TABLE OF ty_page WITH DEFAULT KEY. + + METHODS: + get_page_content + IMPORTING io_page TYPE REF TO cl_o2_api_pages + RETURNING VALUE(rv_content) TYPE xstring, + read_page + IMPORTING is_page TYPE o2pagattr + RETURNING VALUE(rs_page) TYPE ty_page + RAISING lcx_exception. + ENDCLASS. "lcl_object_TRAN DEFINITION *----------------------------------------------------------------------* @@ -27,8 +43,26 @@ CLASS lcl_object_wapa IMPLEMENTATION. ENDMETHOD. "lif_object~has_changed_since METHOD lif_object~changed_by. -* todo - rv_user = c_user_unknown. + + DATA: lv_name TYPE o2applname, + lt_pages TYPE STANDARD TABLE OF o2pagdir WITH DEFAULT KEY, + ls_latest LIKE LINE OF lt_pages. + + + lv_name = ms_item-obj_name. + + SELECT * FROM o2pagdir INTO TABLE lt_pages WHERE applname = lv_name. + IF sy-subrc <> 0. + rv_user = c_user_unknown. + ENDIF. + + SORT lt_pages BY changedon DESCENDING changetime DESCENDING. + + READ TABLE lt_pages INDEX 1 INTO ls_latest. + ASSERT sy-subrc = 0. + + rv_user = ls_latest-changedby. + ENDMETHOD. METHOD lif_object~get_metadata. @@ -37,35 +71,167 @@ CLASS lcl_object_wapa IMPLEMENTATION. METHOD lif_object~exists. -* todo -* rv_bool = boolc( sy-subrc = 0 ). + DATA: lv_name TYPE o2applname. + + + lv_name = ms_item-obj_name. + + cl_o2_api_application=>load( + EXPORTING + p_application_name = lv_name + EXCEPTIONS + object_not_existing = 1 + permission_failure = 2 + error_occured = 3 ). + rv_bool = boolc( sy-subrc = 0 ). ENDMETHOD. "lif_object~exists METHOD lif_object~jump. - -* todo - + lcx_exception=>raise( 'todo, jump, WAPA' ). ENDMETHOD. "jump METHOD lif_object~delete. -* todo +* todo, not supported yet + ASSERT 0 = 1. ENDMETHOD. "delete METHOD lif_object~deserialize. -* todo +* todo, not supported yet + ASSERT 0 = 1. ENDMETHOD. "deserialize METHOD lif_object~serialize. -* todo + DATA: lv_name TYPE o2applname, + ls_attributes TYPE o2applattr, + lt_navgraph TYPE o2applgrap_table, + lt_pages TYPE o2pagelist, + lt_pages_info TYPE ty_pages_tt, + lo_bsp TYPE REF TO cl_o2_api_application. + + FIELD-SYMBOLS: LIKE LINE OF lt_pages. + + + lv_name = ms_item-obj_name. + + cl_o2_api_application=>load( + EXPORTING + p_application_name = lv_name + IMPORTING + p_application = lo_bsp + EXCEPTIONS + object_not_existing = 1 + permission_failure = 2 + error_occured = 3 ). + IF sy-subrc <> 0. + RETURN. + ENDIF. + + lo_bsp->get_attributes( + EXPORTING + p_version = 'A' + IMPORTING + p_attributes = ls_attributes ). + + CLEAR: ls_attributes-author, + ls_attributes-createdon, + ls_attributes-changedby, + ls_attributes-changedon, + ls_attributes-devclass. + + io_xml->add( iv_name = 'ATTRIBUTES' + ig_data = ls_attributes ). + + lo_bsp->get_navgraph( + EXPORTING + p_version = 'A' + IMPORTING + p_navgraph = lt_navgraph ). + + io_xml->add( iv_name = 'NAVGRAPH' + ig_data = lt_navgraph ). + + cl_o2_api_pages=>get_all_pages( + EXPORTING + p_applname = lv_name + p_version = 'A' + IMPORTING + p_pages = lt_pages ). + + LOOP AT lt_pages ASSIGNING . + APPEND read_page( ) TO lt_pages_info. + ENDLOOP. + + io_xml->add( iv_name = 'PAGES' + ig_data = lt_pages_info ). ENDMETHOD. "serialize + METHOD read_page. + + DATA: lv_name TYPE o2applname, + ls_pagekey TYPE o2pagkey, + lv_content TYPE xstring, + lv_extra TYPE string, + lv_ext TYPE string, + lo_page TYPE REF TO cl_o2_api_pages. + + + lv_name = ms_item-obj_name. + + ls_pagekey-applname = lv_name. + ls_pagekey-pagekey = is_page-pagekey. + + cl_o2_api_pages=>load( + EXPORTING + p_pagekey = ls_pagekey + IMPORTING + p_page = lo_page ). +* todo, add moar page data into rs_page: +* event handlers +* page parameters +* type definitions + + lv_content = get_page_content( lo_page ). + SPLIT is_page-pagename AT '.' INTO lv_extra lv_ext. + REPLACE ALL OCCURRENCES OF '/' IN lv_extra WITH '_-'. + mo_files->add_raw( + iv_extra = lv_extra + iv_ext = lv_ext + iv_data = lv_content ). + + rs_page-attributes = is_page. + + CLEAR: rs_page-attributes-author, + rs_page-attributes-createdon, + rs_page-attributes-changedby, + rs_page-attributes-changedon, + rs_page-attributes-implclass, + rs_page-attributes-gendate, + rs_page-attributes-gentime. + + ENDMETHOD. + + METHOD get_page_content. + + DATA: lt_content TYPE o2pageline_table, + lv_string TYPE string. + + io_page->get_page( + IMPORTING + p_content = lt_content ). + + CONCATENATE LINES OF lt_content INTO lv_string SEPARATED BY gc_newline RESPECTING BLANKS. + + rv_content = lcl_convert=>string_to_xstring_utf8( lv_string ). + + ENDMETHOD. + METHOD lif_object~compare_to_remote_version. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. From 2b34ec534e42502853fb8f89ede2c46d5be057d5 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 5 Apr 2017 19:31:50 +0200 Subject: [PATCH 3/5] bugfix --- src/zabapgit_object_wapa.prog.abap | 1 + 1 file changed, 1 insertion(+) diff --git a/src/zabapgit_object_wapa.prog.abap b/src/zabapgit_object_wapa.prog.abap index dd4777376..85c2dc15f 100644 --- a/src/zabapgit_object_wapa.prog.abap +++ b/src/zabapgit_object_wapa.prog.abap @@ -54,6 +54,7 @@ CLASS lcl_object_wapa IMPLEMENTATION. SELECT * FROM o2pagdir INTO TABLE lt_pages WHERE applname = lv_name. IF sy-subrc <> 0. rv_user = c_user_unknown. + RETURN. ENDIF. SORT lt_pages BY changedon DESCENDING changetime DESCENDING. From f97266407ad72b10f03c02240a7a21e77120b79b Mon Sep 17 00:00:00 2001 From: larshp Date: Thu, 13 Apr 2017 09:12:19 +0200 Subject: [PATCH 4/5] serialization done --- src/zabapgit_object_wapa.prog.abap | 43 ++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/src/zabapgit_object_wapa.prog.abap b/src/zabapgit_object_wapa.prog.abap index 85c2dc15f..7beac9b5f 100644 --- a/src/zabapgit_object_wapa.prog.abap +++ b/src/zabapgit_object_wapa.prog.abap @@ -15,11 +15,16 @@ CLASS lcl_object_wapa DEFINITION INHERITING FROM lcl_objects_super FINAL. PRIVATE SECTION. TYPES: BEGIN OF ty_page, - attributes TYPE o2pagattr, + attributes TYPE o2pagattr, + event_handlers TYPE o2pagevh_tabletype, + parameters TYPE o2pagpar_tabletype, + types TYPE rswsourcet, END OF ty_page. TYPES: ty_pages_tt TYPE STANDARD TABLE OF ty_page WITH DEFAULT KEY. + CONSTANTS: c_active TYPE so2_version VALUE 'A'. + METHODS: get_page_content IMPORTING io_page TYPE REF TO cl_o2_api_pages @@ -135,7 +140,7 @@ CLASS lcl_object_wapa IMPLEMENTATION. lo_bsp->get_attributes( EXPORTING - p_version = 'A' + p_version = c_active IMPORTING p_attributes = ls_attributes ). @@ -150,7 +155,7 @@ CLASS lcl_object_wapa IMPLEMENTATION. lo_bsp->get_navgraph( EXPORTING - p_version = 'A' + p_version = c_active IMPORTING p_navgraph = lt_navgraph ). @@ -160,7 +165,7 @@ CLASS lcl_object_wapa IMPLEMENTATION. cl_o2_api_pages=>get_all_pages( EXPORTING p_applname = lv_name - p_version = 'A' + p_version = c_active IMPORTING p_pages = lt_pages ). @@ -193,10 +198,32 @@ CLASS lcl_object_wapa IMPLEMENTATION. p_pagekey = ls_pagekey IMPORTING p_page = lo_page ). -* todo, add moar page data into rs_page: -* event handlers -* page parameters -* type definitions + + lo_page->get_event_handlers( + IMPORTING + p_ev_handler = rs_page-event_handlers + EXCEPTIONS + page_deleted = 1 + invalid_call = 2 ). + ASSERT sy-subrc = 0. + + lo_page->get_parameters( + IMPORTING + p_parameters = rs_page-parameters + EXCEPTIONS + page_deleted = 1 + invalid_call = 2 + OTHERS = 3 ). + ASSERT sy-subrc = 0. + + lo_page->get_type_source( + IMPORTING + p_source = rs_page-types + EXCEPTIONS + page_deleted = 1 + invalid_call = 2 + OTHERS = 3 ). + ASSERT sy-subrc = 0. lv_content = get_page_content( lo_page ). SPLIT is_page-pagename AT '.' INTO lv_extra lv_ext. From 0c1a67c7977d2a9f9ecf5eabf251e8ab965c6da4 Mon Sep 17 00:00:00 2001 From: larshp Date: Thu, 13 Apr 2017 10:53:11 +0200 Subject: [PATCH 5/5] seems to work now --- src/zabapgit_object_sicf.prog.abap | 10 +- src/zabapgit_object_wapa.prog.abap | 165 +++++++++++++++++++++++++++-- 2 files changed, 164 insertions(+), 11 deletions(-) diff --git a/src/zabapgit_object_sicf.prog.abap b/src/zabapgit_object_sicf.prog.abap index c495a443c..7eb829388 100644 --- a/src/zabapgit_object_sicf.prog.abap +++ b/src/zabapgit_object_sicf.prog.abap @@ -168,7 +168,7 @@ CLASS lcl_object_sicf IMPLEMENTATION. no_authority = 4 OTHERS = 5 ). IF sy-subrc <> 0. - lcx_exception=>raise( 'error from get_info_from_serv' ). + lcx_exception=>raise( 'SICF - error from get_info_from_serv' ). ENDIF. ASSERT lines( lt_serv_info ) = 1. @@ -255,7 +255,7 @@ CLASS lcl_object_sicf IMPLEMENTATION. no_authority = 5 OTHERS = 6 ). IF sy-subrc <> 0. - lcx_exception=>raise( 'error from service_from_url' ). + lcx_exception=>raise( 'SICF - error from service_from_url' ). ENDIF. ENDMETHOD. "find_parent @@ -316,7 +316,7 @@ CLASS lcl_object_sicf IMPLEMENTATION. no_authority = 26 OTHERS = 27 ). IF sy-subrc <> 0. - lcx_exception=>raise( 'error from insert_node' ). + lcx_exception=>raise( |SICF - error from insert_node: { sy-subrc }| ). ENDIF. ENDMETHOD. "insert_sicf @@ -382,7 +382,7 @@ CLASS lcl_object_sicf IMPLEMENTATION. no_authority = 26 OTHERS = 27 ). IF sy-subrc <> 0. - lcx_exception=>raise( 'error from change_node' ). + lcx_exception=>raise( 'SICF - error from change_node' ). ENDIF. ENDMETHOD. "change_sicf @@ -413,7 +413,7 @@ CLASS lcl_object_sicf IMPLEMENTATION. no_authority = 11 OTHERS = 12 ). IF sy-subrc <> 0. - lcx_exception=>raise( 'error from delete_node' ). + lcx_exception=>raise( 'SICF - error from delete_node' ). ENDIF. ENDMETHOD. "delete diff --git a/src/zabapgit_object_wapa.prog.abap b/src/zabapgit_object_wapa.prog.abap index 7beac9b5f..87ff46d9d 100644 --- a/src/zabapgit_object_wapa.prog.abap +++ b/src/zabapgit_object_wapa.prog.abap @@ -29,6 +29,9 @@ CLASS lcl_object_wapa DEFINITION INHERITING FROM lcl_objects_super FINAL. get_page_content IMPORTING io_page TYPE REF TO cl_o2_api_pages RETURNING VALUE(rv_content) TYPE xstring, + to_page_content + IMPORTING iv_content TYPE xstring + RETURNING VALUE(rt_content) TYPE o2pageline_table, read_page IMPORTING is_page TYPE o2pagattr RETURNING VALUE(rs_page) TYPE ty_page @@ -99,15 +102,154 @@ CLASS lcl_object_wapa IMPLEMENTATION. METHOD lif_object~delete. -* todo, not supported yet - ASSERT 0 = 1. + DATA: lv_name TYPE o2applname, + lo_bsp TYPE REF TO cl_o2_api_application, + ls_pagekey TYPE o2pagkey, + lv_object TYPE seu_objkey, + lt_pages TYPE o2pagelist. + + FIELD-SYMBOLS: LIKE LINE OF lt_pages. + + + lv_name = ms_item-obj_name. + + cl_o2_api_application=>load( + EXPORTING + p_application_name = lv_name + IMPORTING + p_application = lo_bsp + EXCEPTIONS + object_not_existing = 1 + permission_failure = 2 + error_occured = 3 ). + ASSERT sy-subrc = 0. + + lo_bsp->set_changeable( + p_changeable = abap_true + p_complete_application = abap_true ). + + cl_o2_api_pages=>get_all_pages( + EXPORTING + p_applname = lv_name + p_version = c_active + IMPORTING + p_pages = lt_pages ). + + LOOP AT lt_pages ASSIGNING . + CLEAR ls_pagekey. + ls_pagekey-applname = lv_name. + ls_pagekey-pagekey = -pagekey. + + cl_o2_page=>delete_page_for_application( + EXPORTING + p_pagekey = ls_pagekey + EXCEPTIONS + object_not_existing = 1 + error_occured = 2 ). + ASSERT sy-subrc = 0. + ENDLOOP. + + lo_bsp->delete( ). + +* release lock + lv_object = lv_name. + cl_o2_api_application=>call_access_permission( + p_mode = 'FREE' + p_object = lv_object + p_complete_application = abap_true ). ENDMETHOD. "delete METHOD lif_object~deserialize. -* todo, not supported yet - ASSERT 0 = 1. + DATA: lo_bsp TYPE REF TO cl_o2_api_application, + lv_name TYPE o2applname, + ls_attributes TYPE o2applattr, + lt_nodes TYPE o2applnode_table, + lt_navgraph TYPE o2applgrap_table, + lv_objkey TYPE seu_objkey, + ls_item LIKE ms_item, + lv_extra TYPE string, + lv_content TYPE xstring, + lv_ext TYPE string, + lo_page TYPE REF TO cl_o2_api_pages, + lt_pages_info TYPE ty_pages_tt. + + FIELD-SYMBOLS: LIKE LINE OF lt_pages_info. + + + lv_name = ms_item-obj_name. + + io_xml->read( EXPORTING iv_name = 'ATTRIBUTES' + CHANGING cg_data = ls_attributes ). + io_xml->read( EXPORTING iv_name = 'NAVGRAPH' + CHANGING cg_data = lt_navgraph ). + io_xml->read( EXPORTING iv_name = 'PAGES' + CHANGING cg_data = lt_pages_info ). + + ls_attributes-devclass = iv_package. + +* todo: overwrite existing + cl_o2_api_application=>create_new( + EXPORTING + p_application_data = ls_attributes + p_nodes = lt_nodes + p_navgraph = lt_navgraph + IMPORTING + p_application = lo_bsp + EXCEPTIONS + object_already_existing = 1 + object_just_created = 2 + not_authorized = 3 + undefined_name = 4 + author_not_existing = 5 + action_cancelled = 6 + error_occured = 7 + invalid_parameter = 8 ). + IF sy-subrc <> 0. + lcx_exception=>raise( |WAPA - error from create_new: { sy-subrc }| ). + ENDIF. + + lo_bsp->save( ). + + lo_bsp->set_changeable( + p_changeable = abap_false + p_complete_application = abap_true ). + + ls_item-obj_type = 'WAPD'. + ls_item-obj_name = ms_item-obj_name. + lcl_objects_activation=>add_item( ls_item ). + + lv_objkey = ls_item-obj_name. +* todo, hmm, the WAPD is not added to the worklist during activation + cl_o2_api_application=>activate( lv_objkey ). + + LOOP AT lt_pages_info ASSIGNING . + cl_o2_api_pages=>create_new_page( + EXPORTING + p_pageattrs = -attributes + IMPORTING + p_page = lo_page ). + + SPLIT -attributes-pagename AT '.' INTO lv_extra lv_ext. + REPLACE ALL OCCURRENCES OF '_-' IN lv_extra WITH '/'. + lv_content = mo_files->read_raw( iv_extra = lv_extra + iv_ext = lv_ext ). + lo_page->set_page( to_page_content( lv_content ) ). + + lo_page->set_event_handlers( -event_handlers ). + lo_page->set_parameters( -parameters ). + lo_page->set_type_source( -types ). + + lo_page->save( p_with_all_texts = abap_true ). + + ls_item-obj_type = 'WAPP'. + ls_item-obj_name = cl_wb_object_type=>get_concatenated_key_from_id( + p_key_component1 = -attributes-applname + p_key_component2 = -attributes-pagekey + p_external_id = 'WG ' ). + lcl_objects_activation=>add_item( ls_item ). + ENDLOOP. ENDMETHOD. "deserialize @@ -127,9 +269,9 @@ CLASS lcl_object_wapa IMPLEMENTATION. cl_o2_api_application=>load( EXPORTING - p_application_name = lv_name + p_application_name = lv_name IMPORTING - p_application = lo_bsp + p_application = lo_bsp EXCEPTIONS object_not_existing = 1 permission_failure = 2 @@ -245,6 +387,17 @@ CLASS lcl_object_wapa IMPLEMENTATION. ENDMETHOD. + METHOD to_page_content. + + DATA: lv_string TYPE string. + + + lv_string = lcl_convert=>xstring_to_string_utf8( iv_content ). + + SPLIT lv_string AT gc_newline INTO TABLE rt_content. + + ENDMETHOD. + METHOD get_page_content. DATA: lt_content TYPE o2pageline_table,