diff --git a/changelog.txt b/changelog.txt index 6cabba47f..bbec9de61 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,19 @@ Legend + : added - : removed +2017-02-25 v1.27.0 +------------------ ++ Two factor authentication with github.com + +2017-01-22 v1.26.0 +------------------ ++ XML ignore initial fields ++ Newline added to end of all ABAP code + +2017-01-22 v1.25.2 +------------------ ++ Possibility to set max number of objects in list + 2016-12-01 v1.24.0 ------------------ + abap syntax highlighting diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap index 5adf0bddf..0e9a562ba 100644 --- a/src/zabapgit.prog.abap +++ b/src/zabapgit.prog.abap @@ -3,7 +3,7 @@ REPORT zabapgit LINE-SIZE 100. * See http://www.abapgit.org CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.24.9'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.27.0'. "#EC NOTEXT ******************************************************************************** * The MIT License (MIT) @@ -53,6 +53,7 @@ INCLUDE zabapgit_stage. INCLUDE zabapgit_git_helpers. INCLUDE zabapgit_repo. INCLUDE zabapgit_stage_logic. +INCLUDE zabapgit_2fa. INCLUDE zabapgit_http. INCLUDE zabapgit_git. INCLUDE zabapgit_objects. @@ -102,4 +103,4 @@ AT SELECTION-SCREEN ON EXIT-COMMAND. AT SELECTION-SCREEN. IF sy-dynnr = lcl_password_dialog=>dynnr. lcl_password_dialog=>on_screen_event( sscrfields-ucomm ). - ENDIF. \ No newline at end of file + ENDIF. diff --git a/src/zabapgit.prog.xml b/src/zabapgit.prog.xml index aed90ce00..b47a5359e 100644 --- a/src/zabapgit.prog.xml +++ b/src/zabapgit.prog.xml @@ -5,32 +5,10 @@ ZABAPGIT A - - X S - - - - 1 - - - - 0000-00-00 - - 0000-00-00 - - - - - X - - 0000-00-00 - - 0000-00-00 - D$S X @@ -38,10 +16,8 @@ R - abapGit 7 - diff --git a/src/zabapgit.tran.xml b/src/zabapgit.tran.xml index dee3f4873..6e5c39b16 100644 --- a/src/zabapgit.tran.xml +++ b/src/zabapgit.tran.xml @@ -6,20 +6,13 @@ ZABAPGIT ZABAPGIT 1000 - gA== - ZABAPGIT 1 X X - - - - - E diff --git a/src/zabapgit_2fa.prog.abap b/src/zabapgit_2fa.prog.abap new file mode 100644 index 000000000..5a2883313 --- /dev/null +++ b/src/zabapgit_2fa.prog.abap @@ -0,0 +1,792 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_2FA +*&---------------------------------------------------------------------* + +"! Exception base class for two factor authentication related errors +CLASS lcx_2fa_error DEFINITION INHERITING FROM cx_static_check. + PUBLIC SECTION. + METHODS: + constructor IMPORTING is_textid LIKE textid OPTIONAL + ix_previous LIKE previous OPTIONAL + iv_error_text TYPE csequence OPTIONAL, + get_text REDEFINITION. + DATA: + mv_text TYPE string READ-ONLY. + PROTECTED SECTION. + METHODS: + get_default_text RETURNING VALUE(rv_text) TYPE string. +ENDCLASS. + +CLASS lcx_2fa_error IMPLEMENTATION. + METHOD constructor. + super->constructor( textid = is_textid previous = ix_previous ). + mv_text = iv_error_text. + ENDMETHOD. + + METHOD get_text. + IF mv_text IS NOT INITIAL. + result = mv_text. + ELSEIF get_default_text( ) IS NOT INITIAL. + result = get_default_text( ). + ELSE. + result = super->get_text( ). + ENDIF. + ENDMETHOD. + + METHOD get_default_text. + rv_text = 'Error in two factor authentication.' ##NO_TEXT. + ENDMETHOD. +ENDCLASS. + +CLASS lcx_2fa_auth_failed DEFINITION INHERITING FROM lcx_2fa_error FINAL. + PROTECTED SECTION. + METHODS: + get_default_text REDEFINITION. +ENDCLASS. + +CLASS lcx_2fa_auth_failed IMPLEMENTATION. + METHOD get_default_text. + rv_text = 'Authentication failed using 2FA.' ##NO_TEXT. + ENDMETHOD. +ENDCLASS. + +CLASS lcx_2fa_token_gen_failed DEFINITION INHERITING FROM lcx_2fa_error FINAL. + PROTECTED SECTION. + METHODS: + get_default_text REDEFINITION. +ENDCLASS. + +CLASS lcx_2fa_token_gen_failed IMPLEMENTATION. + METHOD get_default_text. + rv_text = 'Two factor access token generation failed.' ##NO_TEXT. + ENDMETHOD. +ENDCLASS. + +CLASS lcx_2fa_unsupported DEFINITION INHERITING FROM lcx_2fa_error FINAL. + PROTECTED SECTION. + METHODS: + get_default_text REDEFINITION. +ENDCLASS. + +CLASS lcx_2fa_unsupported IMPLEMENTATION. + METHOD get_default_text. + rv_text = 'The service is not supported for two factor authentication.' ##NO_TEXT. + ENDMETHOD. +ENDCLASS. + +CLASS lcx_2fa_token_del_failed DEFINITION INHERITING FROM lcx_2fa_error FINAL. + PROTECTED SECTION. + METHODS: + get_default_text REDEFINITION. +ENDCLASS. + +CLASS lcx_2fa_token_del_failed IMPLEMENTATION. + METHOD get_default_text. + rv_text = 'Deleting previous access tokens failed.' ##NO_TEXT. + ENDMETHOD. +ENDCLASS. + +CLASS lcx_2fa_communication_error DEFINITION INHERITING FROM lcx_2fa_error FINAL. + PROTECTED SECTION. + METHODS: + get_default_text REDEFINITION. +ENDCLASS. + +CLASS lcx_2fa_communication_error IMPLEMENTATION. + METHOD get_default_text. + rv_text = 'Communication error.' ##NO_TEXT. + ENDMETHOD. +ENDCLASS. + +CLASS lcx_2fa_illegal_state DEFINITION INHERITING FROM lcx_2fa_error FINAL. + PROTECTED SECTION. + METHODS: + get_default_text REDEFINITION. +ENDCLASS. + +CLASS lcx_2fa_illegal_state IMPLEMENTATION. + METHOD get_default_text. + rv_text = 'Illegal state.' ##NO_TEXT. + ENDMETHOD. +ENDCLASS. + +"! Defines a two factor authentication authenticator +"!

+"! Authenticators support one or multiple services and are able to generate access tokens using the +"! service's API using the users username, password and two factor authentication token +"! (app/sms/tokengenerator). With these access tokens the user can be authenticated to the service's +"! implementation of the git http api, just like the "normal" password would. +"!

+"!

+"! LCL_2FA_AUTHENTICATOR_REGISTRY can be used to find a suitable implementation for a given +"! repository. +"!

+"!

+"! Using the begin and end methods an internal session can be started and +"! completed in which internal state necessary for multiple methods will be cached. This can be +"! used to avoid having multiple http sessions between authenticate and +"! delete_access_tokens. +"!

+INTERFACE lif_2fa_authenticator. + METHODS: + "! Generate an access token + "! @parameter iv_url | Repository url + "! @parameter iv_username | Username + "! @parameter iv_password | Password + "! @parameter iv_2fa_token | Two factor token + "! @parameter rv_access_token | Generated access token + "! @raising lcx_2fa_auth_failed | Authentication failed + "! @raising lcx_2fa_token_gen_failed | Token generation failed + authenticate IMPORTING iv_url TYPE string + iv_username TYPE string + iv_password TYPE string + iv_2fa_token TYPE string + RETURNING VALUE(rv_access_token) TYPE string + RAISING lcx_2fa_auth_failed + lcx_2fa_token_gen_failed + lcx_2fa_communication_error, + "! Check if this authenticator instance supports the give repository url + "! @parameter iv_url | Repository url + "! @parameter rv_supported | Is supported + supports_url IMPORTING iv_url TYPE string + RETURNING VALUE(rv_supported) TYPE abap_bool, + "! Get a unique identifier for the service that hosts the repository + "! @parameter iv_url | Repository url + "! @parameter rv_id | Service id + "! @raising lcx_2fa_unsupported | Url is not supported + get_service_id_from_url IMPORTING iv_url TYPE string + RETURNING VALUE(rv_id) TYPE string + RAISING lcx_2fa_unsupported, + "! Check if two factor authentication is required + "! @parameter iv_url | Repository url + "! @parameter iv_username | Username + "! @parameter iv_password | Password + "! @parameter rv_required | 2FA is required + is_2fa_required IMPORTING iv_url TYPE string + iv_username TYPE string + iv_password TYPE string + RETURNING VALUE(rv_required) TYPE abap_bool + RAISING lcx_2fa_communication_error, + "! Delete all previously created access tokens for abapGit + "! @parameter iv_url | Repository url + "! @parameter iv_username | Username + "! @parameter iv_password | Password + "! @parameter iv_2fa_token | Two factor token + "! @raising lcx_2fa_token_del_failed | Token deletion failed + "! @raising lcx_2fa_auth_failed | Authentication failed + delete_access_tokens IMPORTING iv_url TYPE string + iv_username TYPE string + iv_password TYPE string + iv_2fa_token TYPE string + RAISING lcx_2fa_token_del_failed + lcx_2fa_communication_error + lcx_2fa_auth_failed, + "! Begin an authenticator session that uses internal caching for authorizations + "! @raising lcx_2fa_illegal_state | Session already started + begin RAISING lcx_2fa_illegal_state, + "! End an authenticator session and clear internal caches + "! @raising lcx_2fa_illegal_state | Session not running + end RAISING lcx_2fa_illegal_state. +ENDINTERFACE. + +"! Default LIF_2FA-AUTHENTICATOR implememtation +CLASS lcl_2fa_authenticator_base DEFINITION + ABSTRACT + CREATE PUBLIC. + + PUBLIC SECTION. + INTERFACES: + lif_2fa_authenticator. + ALIASES: + authenticate FOR lif_2fa_authenticator~authenticate, + supports_url FOR lif_2fa_authenticator~supports_url, + get_service_id_from_url FOR lif_2fa_authenticator~get_service_id_from_url, + is_2fa_required FOR lif_2fa_authenticator~is_2fa_required, + delete_access_tokens FOR lif_2fa_authenticator~delete_access_tokens, + begin FOR lif_2fa_authenticator~begin, + end FOR lif_2fa_authenticator~end. + METHODS: + "! @parameter iv_supported_url_regex | Regular expression to check if a repository url is + "! supported, used for default implementation of + "! SUPPORTS_URL + constructor IMPORTING iv_supported_url_regex TYPE clike. + PROTECTED SECTION. + CLASS-METHODS: + "! Helper method to raise class based exception after traditional exception was raised + "!

+ "! sy-msg... must be set right before calling! + "!

+ raise_comm_error_from_sy RAISING lcx_2fa_communication_error. + METHODS: + "! @parameter rv_running | Internal session is currently active + is_session_running RETURNING VALUE(rv_running) TYPE abap_bool. + PRIVATE SECTION. + DATA: + mo_url_regex TYPE REF TO cl_abap_regex, + mv_session_running TYPE abap_bool. +ENDCLASS. + +CLASS lcl_2fa_authenticator_base IMPLEMENTATION. + METHOD constructor. + CREATE OBJECT mo_url_regex + EXPORTING + pattern = iv_supported_url_regex + ignore_case = abap_true. + ENDMETHOD. + + METHOD authenticate. + RAISE EXCEPTION TYPE lcx_2fa_auth_failed. " Needs to be overwritten in subclasses + ENDMETHOD. + + METHOD supports_url. + rv_supported = mo_url_regex->create_matcher( text = iv_url )->match( ). + ENDMETHOD. + + METHOD get_service_id_from_url. + rv_id = 'UNKNOWN SERVICE'. " Please overwrite in subclasses + ENDMETHOD. + + METHOD is_2fa_required. + rv_required = abap_false. + ENDMETHOD. + + METHOD delete_access_tokens. + RAISE EXCEPTION TYPE lcx_2fa_token_del_failed. " Needs to be overwritten in subclasses + ENDMETHOD. + + METHOD raise_comm_error_from_sy. + DATA: lv_error_msg TYPE string. + + MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno + WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 + INTO lv_error_msg. + RAISE EXCEPTION TYPE lcx_2fa_communication_error + EXPORTING + iv_error_text = |Communication error: { lv_error_msg }| ##NO_TEXT. + ENDMETHOD. + + METHOD begin. + IF mv_session_running = abap_true. + RAISE EXCEPTION TYPE lcx_2fa_illegal_state. + ENDIF. + + mv_session_running = abap_true. + ENDMETHOD. + + METHOD end. + IF mv_session_running = abap_false. + RAISE EXCEPTION TYPE lcx_2fa_illegal_state. + ENDIF. + + mv_session_running = abap_false. + ENDMETHOD. + + METHOD is_session_running. + rv_running = mv_session_running. + ENDMETHOD. +ENDCLASS. + +CLASS lcl_2fa_github_authenticator DEFINITION + INHERITING FROM lcl_2fa_authenticator_base + FINAL + CREATE PUBLIC. + + PUBLIC SECTION. + METHODS: + constructor, + get_service_id_from_url REDEFINITION, + authenticate REDEFINITION, + is_2fa_required REDEFINITION, + delete_access_tokens REDEFINITION, + end REDEFINITION. + PROTECTED SECTION. + PRIVATE SECTION. + CONSTANTS: + gc_github_api_url TYPE string VALUE `https://api.github.com/`, + gc_otp_header_name TYPE string VALUE `X-Github-OTP`, + gc_restendpoint_authorizations TYPE string VALUE `/authorizations`. + CLASS-METHODS: + set_new_token_request IMPORTING ii_request TYPE REF TO if_http_request, + get_token_from_response IMPORTING ii_response TYPE REF TO if_http_response + RETURNING VALUE(rv_token) TYPE string, + parse_repo_from_url IMPORTING iv_url TYPE string + RETURNING VALUE(rv_repo_name) TYPE string, + set_list_token_request IMPORTING ii_request TYPE REF TO if_http_request, + get_tobedel_tokens_from_resp IMPORTING ii_response TYPE REF TO if_http_response + RETURNING VALUE(rt_ids) TYPE stringtab, + set_del_token_request IMPORTING ii_request TYPE REF TO if_http_request + iv_token_id TYPE string. + METHODS: + get_authenticated_client IMPORTING iv_username TYPE string + iv_password TYPE string + iv_2fa_token TYPE string + RETURNING VALUE(ri_client) TYPE REF TO if_http_client + RAISING lcx_2fa_auth_failed + lcx_2fa_communication_error. + DATA: + mi_authenticated_session TYPE REF TO if_http_client. +ENDCLASS. + +CLASS lcl_2fa_github_authenticator IMPLEMENTATION. + METHOD constructor. + super->constructor( '^https?://(www\.)?github.com.*$' ). + ENDMETHOD. + + METHOD authenticate. + DATA: li_http_client TYPE REF TO if_http_client, + lv_http_code TYPE i, + lv_http_code_description TYPE string. + + " 1. Try to login to GitHub API + li_http_client = get_authenticated_client( iv_username = iv_username + iv_password = iv_password + iv_2fa_token = iv_2fa_token ). + + " 2. Create an access token which can be used instead of a password + " https://developer.github.com/v3/oauth_authorizations/#create-a-new-authorization + + set_new_token_request( ii_request = li_http_client->request ). + + li_http_client->send( EXCEPTIONS OTHERS = 1 ). + IF sy-subrc <> 0. + raise_comm_error_from_sy( ). + ENDIF. + + li_http_client->receive( EXCEPTIONS OTHERS = 1 ). + IF sy-subrc <> 0. + raise_comm_error_from_sy( ). + ENDIF. + + li_http_client->response->get_status( + IMPORTING + code = lv_http_code + reason = lv_http_code_description ). + IF lv_http_code <> 201. + RAISE EXCEPTION TYPE lcx_2fa_token_gen_failed + EXPORTING + iv_error_text = |Token generation failed: { lv_http_code } { lv_http_code_description }|. + ENDIF. + + rv_access_token = get_token_from_response( li_http_client->response ). + IF rv_access_token IS INITIAL. + RAISE EXCEPTION TYPE lcx_2fa_token_gen_failed + EXPORTING + iv_error_text = 'Token generation failed: parser error' ##NO_TEXT. + ENDIF. + + " GitHub might need some time until the new token is ready to use, give it a second + CALL FUNCTION 'RZL_SLEEP'. + ENDMETHOD. + + METHOD set_new_token_request. + DATA: lv_json_string TYPE string. + + lv_json_string = `{"scopes":["repo"],"note":"Generated by abapGit","fingerprint":"abapGit2FA"}`. + + ii_request->set_data( cl_abap_codepage=>convert_to( lv_json_string ) ). + ii_request->set_header_field( name = if_http_header_fields_sap=>request_uri + value = gc_restendpoint_authorizations ). + ii_request->set_method( if_http_request=>co_request_method_post ). + ENDMETHOD. + + METHOD set_list_token_request. + ii_request->set_header_field( name = if_http_header_fields_sap=>request_uri + value = gc_restendpoint_authorizations ). + ii_request->set_method( if_http_request=>co_request_method_get ). + ENDMETHOD. + + METHOD set_del_token_request. + DATA: lv_url TYPE string. + + lv_url = |{ gc_restendpoint_authorizations }/{ iv_token_id }|. + + ii_request->set_header_field( name = if_http_header_fields_sap=>request_uri + value = lv_url ). + " Other methods than POST and GET do not have constants unfortunately + " ii_request->set_method( if_http_request=>co_request_method_delete ). + ii_request->set_method( 'DELETE' ). + ENDMETHOD. + + METHOD get_token_from_response. + CONSTANTS: lc_search_regex TYPE string VALUE `.*"token":"([^"]*).*$`. + DATA: lv_response TYPE string, + lo_regex TYPE REF TO cl_abap_regex, + lo_matcher TYPE REF TO cl_abap_matcher. + + lv_response = cl_abap_codepage=>convert_from( ii_response->get_data( ) ). + + CREATE OBJECT lo_regex + EXPORTING + pattern = lc_search_regex. + + lo_matcher = lo_regex->create_matcher( text = lv_response ). + IF lo_matcher->match( ) = abap_true. + rv_token = lo_matcher->get_submatch( 1 ). + ENDIF. + ENDMETHOD. + + METHOD get_tobedel_tokens_from_resp. + CONSTANTS: lc_search_regex TYPE string + VALUE `\{"id": ?(\d+)[^\{]*"app":\{[^\{^\}]*\}[^\{]*"fingerprint": ?` & + `"abapGit2FA"[^\{]*\}`. + DATA: lv_response TYPE string, + lo_regex TYPE REF TO cl_abap_regex, + lo_matcher TYPE REF TO cl_abap_matcher. + + lv_response = cl_abap_codepage=>convert_from( ii_response->get_data( ) ). + + CREATE OBJECT lo_regex + EXPORTING + pattern = lc_search_regex. + + lo_matcher = lo_regex->create_matcher( text = lv_response ). + WHILE lo_matcher->find_next( ) = abap_true. + APPEND lo_matcher->get_submatch( 1 ) TO rt_ids. + ENDWHILE. + ENDMETHOD. + + METHOD parse_repo_from_url. + CONSTANTS: lc_search_regex TYPE string VALUE 'https?:\/\/(www\.)?github.com\/(.*)$'. + DATA: lo_regex TYPE REF TO cl_abap_regex, + lo_matcher TYPE REF TO cl_abap_matcher. + + CREATE OBJECT lo_regex + EXPORTING + pattern = lc_search_regex. + + lo_matcher = lo_regex->create_matcher( text = iv_url ). + IF lo_matcher->match( ) = abap_true. + rv_repo_name = lo_matcher->get_submatch( 1 ). + ELSE. + rv_repo_name = '???' ##NO_TEXT. + ENDIF. + ENDMETHOD. + + METHOD get_service_id_from_url. + rv_id = 'github'. + ENDMETHOD. + + METHOD is_2fa_required. + DATA: li_client TYPE REF TO if_http_client, + lv_header_value TYPE string, + lo_settings TYPE REF TO lcl_settings. + + lo_settings = lcl_app=>settings( )->read( ). + + cl_http_client=>create_by_url( + EXPORTING + url = gc_github_api_url + ssl_id = 'ANONYM' + proxy_host = lo_settings->get_proxy_url( ) + proxy_service = lo_settings->get_proxy_port( ) + IMPORTING + client = li_client + EXCEPTIONS + argument_not_found = 1 + plugin_not_active = 2 + internal_error = 3 + OTHERS = 4 ). + IF sy-subrc <> 0. + raise_comm_error_from_sy( ). + ENDIF. + + li_client->propertytype_logon_popup = if_http_client=>co_disabled. + + " The request needs to use something other than GET and it needs to be send to an endpoint + " to trigger a SMS. + li_client->request->set_header_field( name = if_http_header_fields_sap=>request_uri + value = gc_restendpoint_authorizations ). + li_client->request->set_method( if_http_request=>co_request_method_post ). + + " Try to authenticate, if 2FA is required there will be a specific response header + li_client->authenticate( username = iv_username password = iv_password ). + + li_client->send( EXCEPTIONS OTHERS = 1 ). + IF sy-subrc <> 0. + raise_comm_error_from_sy( ). + ENDIF. + + li_client->receive( EXCEPTIONS OTHERS = 1 ). + IF sy-subrc <> 0. + raise_comm_error_from_sy( ). + ENDIF. + + " The response will either be UNAUTHORIZED or MALFORMED which is both fine. + + IF li_client->response->get_header_field( gc_otp_header_name ) CP 'required*'. + rv_required = abap_true. + ENDIF. + ENDMETHOD. + + METHOD delete_access_tokens. + DATA: li_http_client TYPE REF TO if_http_client, + lv_http_code TYPE i, + lv_http_code_description TYPE string, + lt_tobedeleted_tokens TYPE stringtab. + FIELD-SYMBOLS: TYPE string. + + li_http_client = get_authenticated_client( iv_username = iv_username + iv_password = iv_password + iv_2fa_token = iv_2fa_token ). + + set_list_token_request( li_http_client->request ). + li_http_client->send( EXCEPTIONS OTHERS = 1 ). + IF sy-subrc <> 0. + raise_comm_error_from_sy( ). + ENDIF. + + li_http_client->receive( EXCEPTIONS OTHERS = 1 ). + IF sy-subrc <> 0. + raise_comm_error_from_sy( ). + ENDIF. + + li_http_client->response->get_status( + IMPORTING + code = lv_http_code + reason = lv_http_code_description ). + IF lv_http_code <> 200. + RAISE EXCEPTION TYPE lcx_2fa_token_del_failed + EXPORTING + iv_error_text = |Could not fetch current 2FA authorizations: | && + |{ lv_http_code } { lv_http_code_description }|. + ENDIF. + + lt_tobedeleted_tokens = get_tobedel_tokens_from_resp( li_http_client->response ). + LOOP AT lt_tobedeleted_tokens ASSIGNING WHERE table_line IS NOT INITIAL. + set_del_token_request( ii_request = li_http_client->request + iv_token_id = ). + li_http_client->send( EXCEPTIONS OTHERS = 1 ). + IF sy-subrc <> 0. + raise_comm_error_from_sy( ). + ENDIF. + + li_http_client->receive( EXCEPTIONS OTHERS = 1 ). + IF sy-subrc <> 0. + raise_comm_error_from_sy( ). + ENDIF. + + li_http_client->response->get_status( + IMPORTING + code = lv_http_code + reason = lv_http_code_description ). + IF lv_http_code <> 204. + RAISE EXCEPTION TYPE lcx_2fa_token_del_failed + EXPORTING + iv_error_text = |Could not delete token '{ }': | && + |{ lv_http_code } { lv_http_code_description }|. + ENDIF. + ENDLOOP. + ENDMETHOD. + + METHOD get_authenticated_client. + DATA: lv_http_code TYPE i, + lv_http_code_description TYPE string, + lo_settings TYPE REF TO lcl_settings. + + " If there is a cached client return it instead + IF is_session_running( ) = abap_true AND mi_authenticated_session IS BOUND. + ri_client = mi_authenticated_session. + RETURN. + ENDIF. + + " Try to login to GitHub API with username, password and 2fa token + + lo_settings = lcl_app=>settings( )->read( ). + + cl_http_client=>create_by_url( + EXPORTING + url = gc_github_api_url + ssl_id = 'ANONYM' + proxy_host = lo_settings->get_proxy_url( ) + proxy_service = lo_settings->get_proxy_port( ) + IMPORTING + client = ri_client + EXCEPTIONS + argument_not_found = 1 + plugin_not_active = 2 + internal_error = 3 + OTHERS = 4 ). + IF sy-subrc <> 0. + raise_comm_error_from_sy( ). + ENDIF. + + " https://developer.github.com/v3/auth/#working-with-two-factor-authentication + ri_client->propertytype_accept_cookie = if_http_client=>co_enabled. + ri_client->request->set_header_field( name = gc_otp_header_name value = iv_2fa_token ). + ri_client->authenticate( username = iv_username password = iv_password ). + ri_client->propertytype_logon_popup = if_http_client=>co_disabled. + + ri_client->send( EXCEPTIONS OTHERS = 1 ). + IF sy-subrc <> 0. + raise_comm_error_from_sy( ). + ENDIF. + + ri_client->receive( EXCEPTIONS OTHERS = 1 ). + IF sy-subrc <> 0. + raise_comm_error_from_sy( ). + ENDIF. + + " Check if authentication has succeeded + ri_client->response->get_status( + IMPORTING + code = lv_http_code + reason = lv_http_code_description ). + IF lv_http_code <> 200. + RAISE EXCEPTION TYPE lcx_2fa_auth_failed + EXPORTING + iv_error_text = |Authentication failed: { lv_http_code_description }|. + ENDIF. + + " Cache the authenticated http session / client to avoid unnecessary additional authentication + IF is_session_running( ) = abap_true. + mi_authenticated_session = ri_client. + ENDIF. + ENDMETHOD. + + METHOD end. + super->end( ). + FREE mi_authenticated_session. + ENDMETHOD. +ENDCLASS. + +"! Static registry class to find LIF_2FA_AUTHENTICATOR instances +CLASS lcl_2fa_authenticator_registry DEFINITION + FINAL + CREATE PRIVATE. + + PUBLIC SECTION. + CLASS-METHODS: + class_constructor, + "! Retrieve an authenticator instance by url + "! @parameter iv_url | Url of the repository / service + "! @parameter ro_authenticator | Found authenticator instance + "! @raising lcx_2fa_unsupported | No authenticator found that supports the service + get_authenticator_for_url IMPORTING iv_url TYPE string + RETURNING VALUE(ro_authenticator) TYPE REF TO lif_2fa_authenticator + RAISING lcx_2fa_unsupported, + "! Check if there is a two factor authenticator available for the url + "! @parameter iv_url | Url of the repository / service + "! @parameter rv_supported | 2FA is supported + is_url_supported IMPORTING iv_url TYPE string + RETURNING VALUE(rv_supported) TYPE abap_bool, + "! Offer to use two factor authentication if supported and required + "!

+ "! This uses GUI functionality to display a popup to request the user to enter a two factor + "! token. Also an dummy authentication request might be used to find out if two factor + "! authentication is required for the account. + "!

+ "! @parameter iv_url | Url of the repository / service + "! @parameter cv_username | Username + "! @parameter cv_password | Password, will be replaced by an access token if two factor + "! authentication succeeds + "! @raising lcx_exception | Error in two factor authentication + use_2fa_if_required IMPORTING iv_url TYPE string + CHANGING cv_username TYPE string + cv_password TYPE string + RAISING lcx_exception. + CLASS-DATA: + "! All authenticators managed by the registry + gt_registered_authenticators TYPE HASHED TABLE OF REF TO lif_2fa_authenticator + WITH UNIQUE KEY table_line READ-ONLY. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + +CLASS lcl_2fa_authenticator_registry IMPLEMENTATION. + METHOD class_constructor. + DEFINE register. + CREATE OBJECT li_authenticator TYPE &1. + INSERT li_authenticator INTO TABLE gt_registered_authenticators. + END-OF-DEFINITION. + + DATA: li_authenticator TYPE REF TO lif_2fa_authenticator. + + " If there are new authenticators these need to be added here manually. + " I do not think there is an equivalent to SEO_INTERFACE_IMPLEM_GET_ALL for local classes + " without invoking the compiler directly. + register: lcl_2fa_github_authenticator. + ENDMETHOD. + + METHOD get_authenticator_for_url. + FIELD-SYMBOLS: LIKE LINE OF gt_registered_authenticators. + + LOOP AT gt_registered_authenticators ASSIGNING . + IF ->supports_url( iv_url ) = abap_true. + ro_authenticator = . + RETURN. + ENDIF. + ENDLOOP. + + RAISE EXCEPTION TYPE lcx_2fa_unsupported. + ENDMETHOD. + + METHOD is_url_supported. + TRY. + get_authenticator_for_url( iv_url ). + rv_supported = abap_true. + CATCH lcx_2fa_unsupported ##NO_HANDLER. + ENDTRY. + ENDMETHOD. + + METHOD use_2fa_if_required. + DATA: li_authenticator TYPE REF TO lif_2fa_authenticator, + lv_2fa_token TYPE string, + lv_use_2fa TYPE abap_bool, + lv_access_token TYPE string, + lx_ex TYPE REF TO cx_root. + + IF is_url_supported( iv_url ) = abap_false. + RETURN. + ENDIF. + + TRY. + li_authenticator = get_authenticator_for_url( iv_url ). + li_authenticator->begin( ). + + " Is two factor authentication required for this account? + IF li_authenticator->is_2fa_required( iv_url = iv_url + iv_username = cv_username + iv_password = cv_password ) = abap_true. + + " Get a 2FA token (app/sms) + CALL FUNCTION 'POPUP_GET_STRING' + EXPORTING + label = 'Two factor auth. token' + IMPORTING + value = lv_2fa_token + okay = lv_use_2fa. + IF lv_use_2fa = abap_false. + lcx_exception=>raise( 'Authentication cancelled' ). + ENDIF. + + " Delete an old access token if it exists + li_authenticator->delete_access_tokens( iv_url = iv_url + iv_username = cv_username + iv_password = cv_password + iv_2fa_token = lv_2fa_token ). + + " Get a new access token + lv_access_token = li_authenticator->authenticate( iv_url = iv_url + iv_username = cv_username + iv_password = cv_password + iv_2fa_token = lv_2fa_token ). + + " Use the access token instead of the password + cv_password = lv_access_token. + ENDIF. + + li_authenticator->end( ). + + CATCH lcx_2fa_error INTO lx_ex. + TRY. + li_authenticator->end( ). + CATCH lcx_2fa_illegal_state ##NO_HANDLER. + ENDTRY. + + RAISE EXCEPTION TYPE lcx_exception + EXPORTING + iv_text = |2FA error: { lx_ex->get_text( ) }| + ix_previous = lx_ex. + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/src/zabapgit_2fa.prog.xml b/src/zabapgit_2fa.prog.xml new file mode 100644 index 000000000..048b86095 --- /dev/null +++ b/src/zabapgit_2fa.prog.xml @@ -0,0 +1,25 @@ + + + + + + ZABAPGIT_2FA + A + X + S + D$ + I + X + D$S + X + + + + R + ZABAPGIT_2FA + 12 + + + + + diff --git a/src/zabapgit_app.prog.abap b/src/zabapgit_app.prog.abap index 26f17a1b2..f6ea82515 100644 --- a/src/zabapgit_app.prog.abap +++ b/src/zabapgit_app.prog.abap @@ -42,4 +42,4 @@ CLASS lcl_app DEFINITION FINAL. go_repo_srv TYPE REF TO lcl_repo_srv, go_settings TYPE REF TO lcl_persistence_settings. -ENDCLASS. "lcl_app \ No newline at end of file +ENDCLASS. "lcl_app diff --git a/src/zabapgit_app.prog.xml b/src/zabapgit_app.prog.xml index bdb2a00f4..406a57fbc 100644 --- a/src/zabapgit_app.prog.xml +++ b/src/zabapgit_app.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_APP A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_APP 20 - diff --git a/src/zabapgit_app_impl.prog.abap b/src/zabapgit_app_impl.prog.abap index 9af5079b0..f41691290 100644 --- a/src/zabapgit_app_impl.prog.abap +++ b/src/zabapgit_app_impl.prog.abap @@ -67,4 +67,4 @@ CLASS lcl_app IMPLEMENTATION. ro_settings = go_settings. ENDMETHOD. -ENDCLASS. "lcl_app \ No newline at end of file +ENDCLASS. "lcl_app diff --git a/src/zabapgit_app_impl.prog.xml b/src/zabapgit_app_impl.prog.xml index a0840230e..ee0d07361 100644 --- a/src/zabapgit_app_impl.prog.xml +++ b/src/zabapgit_app_impl.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_APP_IMPL A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_APP_IMPL 25 - diff --git a/src/zabapgit_background.prog.abap b/src/zabapgit_background.prog.abap index b183c992d..1b3368c04 100644 --- a/src/zabapgit_background.prog.abap +++ b/src/zabapgit_background.prog.abap @@ -97,6 +97,9 @@ CLASS lcl_background IMPLEMENTATION. APPEND lv_str TO lt_objects. ENDLOOP. + SORT lt_objects AS TEXT. + DELETE ADJACENT DUPLICATES FROM lt_objects. + IF lines( lt_objects ) = 1. rv_comment = |BG: { lv_str }|. ELSE. @@ -166,6 +169,8 @@ CLASS lcl_background IMPLEMENTATION. METHOD run. + CONSTANTS: c_enq_type TYPE c LENGTH 12 VALUE 'BACKGROUND'. + DATA: lo_per TYPE REF TO lcl_persistence_background, lo_repo TYPE REF TO lcl_repo_online, lt_list TYPE lcl_persistence_background=>tt_background, @@ -174,6 +179,20 @@ CLASS lcl_background IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF lt_list. + CALL FUNCTION 'ENQUEUE_EZABAPGIT' + EXPORTING + mode_zabapgit = 'E' + type = c_enq_type + _scope = '3' + EXCEPTIONS + foreign_lock = 1 + system_failure = 2 + OTHERS = 3. + IF sy-subrc <> 0. + WRITE: / 'Another intance of the program is already running'. + RETURN. + ENDIF. + CREATE OBJECT lo_per. lt_list = lo_per->list( ). @@ -204,6 +223,10 @@ CLASS lcl_background IMPLEMENTATION. WRITE: / 'Nothing configured' ##NO_TEXT. ENDIF. + CALL FUNCTION 'DEQUEUE_EZABAPGIT' + EXPORTING + type = c_enq_type. + ENDMETHOD. -ENDCLASS. \ No newline at end of file +ENDCLASS. diff --git a/src/zabapgit_background.prog.xml b/src/zabapgit_background.prog.xml index 0ac646b8b..c3c16b84d 100644 --- a/src/zabapgit_background.prog.xml +++ b/src/zabapgit_background.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_BACKGROUND A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_BACKGROUND 27 - diff --git a/src/zabapgit_css_common.w3mi.data.css b/src/zabapgit_css_common.w3mi.data.css index 924b1d664..2528aa62f 100644 --- a/src/zabapgit_css_common.w3mi.data.css +++ b/src/zabapgit_css_common.w3mi.data.css @@ -33,15 +33,24 @@ form input:focus, textarea:focus { border: 1px solid #8cadd9; } -/* MODIFIERS */ +/* COLOR PALETTE */ .grey { color: lightgrey !important; } -.emphasis { font-weight: bold !important; } +.darkgrey { color: #808080 !important; } .attention { color: red !important; } +.error { color: #d41919 !important; } +.warning { color: #e4ae0d !important; } +.blue { color: #5e8dc9 !important; } +.red { color: red !important; } + +/* MODIFIERS */ +.emphasis { font-weight: bold !important; } .crossout { text-decoration: line-through !important; } .right { text-align:right; } .paddings { padding: 0.5em 0.5em; } .pad-sides { padding: 0 0.3em; } .pad4px { padding: 4px; } +.w100 { width: 100%; } +.w40 { width: 40%; } /* STRUCTURE DIVS, HEADER & FOOTER */ td.headpad { padding-top: 11px; } @@ -98,15 +107,41 @@ span.page_title { padding-left: 0.4em; } +/* ERROR LOG */ + +div.log { + padding: 6px; + margin: 4px; + background-color: #fee6e6; + border: 1px #fdcece solid; + border-radius: 4px; +} + +div.log > span { display:block; } +div.log .octicon { padding-right: 6px; } + /* MENU */ div.menu { display: inline; } div.menu .menu_end { border-right: 0px !important; } div.menu a { padding-left: 0.5em; padding-right: 0.5em; - border-right: 1px solid lightgrey; font-size: 12pt; } + +div.menu > a { + border-right: 1px solid lightgrey; +} +div.menu > div.dropdown > a { + border-right: 1px solid lightgrey; +} +div.menu > a:last-child { + border-right: 0px !important; +} +div.menu > div.dropdown:last-child > a { + border-right: 0px !important; +} + div.menu_vertical { display: inline; } div.menu_vertical a { display: block; @@ -172,6 +207,7 @@ div.menu_vertical a { .dropdown_content td { text-align: left; padding: 2px; } .dropdown_content td a { padding: 0em 0.2em; } .dropdown_content td.icon { padding: 0 3px 0 6px; } +.dropdown_content td.text { width: 100%; } .dropdown_content a:hover { background-color: #f1f1f1 } .dropdown:hover .dropbtn { color: #79a0d2; } @@ -248,11 +284,12 @@ div.repo { div.repo_container { position: relative; } -.repo_tab { +table.repo_tab { border: 1px solid #DDD; border-radius: 3px; background: #fff; margin-top: 0.5em; + width: 100%; } .repo_tab td { border-top: 1px solid #eee; @@ -406,8 +443,8 @@ span.diff_banner { padding-right: 0.3em; } .diff_ins { - border-color: #7bea7b; - background-color: #d3f8d3; + border-color: #abf2ab; + background-color: #e0ffe0; } .diff_del { border-color: #ff667d; @@ -463,6 +500,7 @@ div.diff_head span.state-block span.none { table.diff_tab { font-family: Consolas, Courier, monospace; font-size: 10pt; + width: 100%; } table.diff_tab td,th { color: #444; @@ -490,26 +528,41 @@ table.diff_tab thead.nav_line th { color: #bbb; } table.diff_tab td.num, th.num { - text-align: right; + width: 1%; + min-width: 2em; + padding-right: 8px; + padding-left: 8px; + text-align: right !important; color: #ccc; border-left: 1px solid #eee; border-right: 1px solid #eee; + -ms-user-select: none; + user-select: none; +} +table.diff_tab td.num::before { + content: attr(line-num); } table.diff_tab code { font-family: inherit; white-space: pre; } - -table.diff_tab code span.keyword { color: #0a69ce; } -table.diff_tab code span.text { color: #48ce4f; } -table.diff_tab code span.comment { color: #808080; font-style: italic; } -table.diff_tab code span.xml_tag { color: #3370e0; } -table.diff_tab code span.attr { color: #f20707; } -table.diff_tab code span.attr_val { color: #7a02f9; } +table.diff_tab td.code { + word-wrap: break-word; + white-space: pre-wrap; + overflow: visible; +} table.diff_tab tbody tr:first-child td { padding-top: 0.5em; } table.diff_tab tbody tr:last-child td { padding-bottom: 0.5em; } +/* STYLES for Syntax Highlighting */ +.syntax-hl span.keyword { color: #0a69ce; } +.syntax-hl span.text { color: #48ce4f; } +.syntax-hl span.comment { color: #808080; font-style: italic; } +.syntax-hl span.xml_tag { color: #457ce3; } +.syntax-hl span.attr { color: #b777fb; } +.syntax-hl span.attr_val { color: #7a02f9; } + /* DEBUG INFO STYLES */ div.debug_container { padding: 0.5em; @@ -517,15 +570,17 @@ div.debug_container { color: #444; font-family: Consolas, Courier, monospace; } + div.debug_container p { margin: 0px; } /* DB ENTRIES */ div.db_list { - background-color: #f2f2f2; + background-color: #fff; padding: 0.5em; } + table.db_tab pre { display: inline-block; overflow: hidden; @@ -534,10 +589,11 @@ table.db_tab pre { margin: 0px; width: 30em; } + table.db_tab tr.firstrow td { padding-top: 0.5em; } table.db_tab th { + color: #888888; text-align: left; - color: #888; padding: 0.5em; border-bottom: 1px #ddd solid; } @@ -551,24 +607,34 @@ table.db_tab td.data { font-style: italic; } +table.db_tab tbody tr:hover, tr:active { + background-color: #f4f4f4; +} + /* DB ENTRY DISPLAY */ div.db_entry { background-color: #f2f2f2; padding: 0.5em; } + div.db_entry pre { display: block; + font-size: 10pt; overflow: hidden; word-wrap:break-word; white-space: pre-wrap; - background-color: #eaeaea; + background-color: #fcfcfc; + border: 1px #eaeaea solid; + border-radius: 3px; padding: 0.5em; margin: 0.5em 0em; - width: 50em; + width: 60em; } + div.db_entry table.toolbar { width: 50em; } + table.tag { display: inline-block; border: 1px #b3c1cc solid; diff --git a/src/zabapgit_css_common.w3mi.xml b/src/zabapgit_css_common.w3mi.xml index 10d1ffd0d..cbea95037 100644 --- a/src/zabapgit_css_common.w3mi.xml +++ b/src/zabapgit_css_common.w3mi.xml @@ -3,7 +3,7 @@ ZABAPGIT_CSS_COMMON - AbapGit common styles + Abapgit common CSS MI @@ -15,7 +15,7 @@ MI ZABAPGIT_CSS_COMMON filename - ~wwwtmp.css + common.css MI diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index 9726e9803..30a6e3e40 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -14,8 +14,11 @@ TYPES: BEGIN OF ty_file_signature, sha1 TYPE ty_sha1, END OF ty_file_signature. -TYPES: ty_file_signatures_tt TYPE STANDARD TABLE OF ty_file_signature WITH DEFAULT KEY. -TYPES: ty_file_signatures_ts TYPE SORTED TABLE OF ty_file_signature WITH UNIQUE KEY path filename. +TYPES: ty_file_signatures_tt TYPE STANDARD TABLE OF + ty_file_signature WITH DEFAULT KEY. + +TYPES: ty_file_signatures_ts TYPE SORTED TABLE OF + ty_file_signature WITH UNIQUE KEY path filename. TYPES: BEGIN OF ty_file. INCLUDE TYPE ty_file_signature. @@ -24,7 +27,6 @@ TYPES: data TYPE xstring, TYPES: ty_files_tt TYPE STANDARD TABLE OF ty_file WITH DEFAULT KEY. TYPES: ty_string_tt TYPE STANDARD TABLE OF string WITH DEFAULT KEY. -TYPES: tt_w3urls TYPE STANDARD TABLE OF w3url WITH DEFAULT KEY. TYPES: BEGIN OF ty_comment, username TYPE string, @@ -49,8 +51,9 @@ TYPES: ty_files_item_tt TYPE STANDARD TABLE OF ty_file_item WITH DEFAULT KEY. TYPES: BEGIN OF ty_metadata, class TYPE string, version TYPE string, - late_deser TYPE string, + late_deser TYPE abap_bool, delete_tadir TYPE abap_bool, + ddic TYPE abap_bool, END OF ty_metadata. TYPES: BEGIN OF ty_web_asset, @@ -156,7 +159,7 @@ CONSTANTS: BEGIN OF gc_event_state, END OF gc_event_state. CONSTANTS: BEGIN OF gc_html_opt, - emphas TYPE c VALUE 'E', + strong TYPE c VALUE 'E', cancel TYPE c VALUE 'C', crossout TYPE c VALUE 'X', END OF gc_html_opt. @@ -224,6 +227,7 @@ CONSTANTS: BEGIN OF gc_action, go_debuginfo TYPE string VALUE 'go_debuginfo', go_settings TYPE string VALUE 'go_settings', go_tutorial TYPE string VALUE 'go_tutorial', + jump TYPE string VALUE 'jump', jump_pkg TYPE string VALUE 'jump_pkg', - END OF gc_action. \ No newline at end of file + END OF gc_action. diff --git a/src/zabapgit_definitions.prog.xml b/src/zabapgit_definitions.prog.xml index 6ed0ef3cc..f18279278 100644 --- a/src/zabapgit_definitions.prog.xml +++ b/src/zabapgit_definitions.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_DEFINITIONS A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_DEFINITIONS 28 - diff --git a/src/zabapgit_dot_abapgit.prog.abap b/src/zabapgit_dot_abapgit.prog.abap index 36d823007..24f95ac35 100644 --- a/src/zabapgit_dot_abapgit.prog.abap +++ b/src/zabapgit_dot_abapgit.prog.abap @@ -219,4 +219,4 @@ CLASS lcl_dot_abapgit IMPLEMENTATION. ENDMETHOD. "get_signature -ENDCLASS. \ No newline at end of file +ENDCLASS. diff --git a/src/zabapgit_dot_abapgit.prog.xml b/src/zabapgit_dot_abapgit.prog.xml index 4225cb8d0..2bb3d0990 100644 --- a/src/zabapgit_dot_abapgit.prog.xml +++ b/src/zabapgit_dot_abapgit.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_DOT_ABAPGIT A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_DOT_ABAPGIT 28 - diff --git a/src/zabapgit_exceptions.prog.abap b/src/zabapgit_exceptions.prog.abap index 076cbd371..8302f029e 100644 --- a/src/zabapgit_exceptions.prog.abap +++ b/src/zabapgit_exceptions.prog.abap @@ -67,4 +67,4 @@ ENDCLASS. "lcx_cancel DEFINITION *----------------------------------------------------------------------* CLASS lcx_cancel IMPLEMENTATION. -ENDCLASS. "lcx_cancel IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcx_cancel IMPLEMENTATION diff --git a/src/zabapgit_exceptions.prog.xml b/src/zabapgit_exceptions.prog.xml index 86be0fe8d..de71cb87e 100644 --- a/src/zabapgit_exceptions.prog.xml +++ b/src/zabapgit_exceptions.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_EXCEPTIONS A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_EXCEPTIONS 27 - diff --git a/src/zabapgit_file_status.prog.abap b/src/zabapgit_file_status.prog.abap index 7aee25688..3f9921343 100644 --- a/src/zabapgit_file_status.prog.abap +++ b/src/zabapgit_file_status.prog.abap @@ -21,7 +21,8 @@ CLASS lcl_file_status DEFINITION FINAL PRIVATE SECTION. CLASS-METHODS calculate_status - IMPORTING it_local TYPE ty_files_item_tt + IMPORTING iv_devclass TYPE devclass + it_local TYPE ty_files_item_tt it_remote TYPE ty_files_tt it_cur_state TYPE ty_file_signatures_tt RETURNING VALUE(rt_results) TYPE ty_results_tt. @@ -36,7 +37,8 @@ CLASS lcl_file_status DEFINITION FINAL IMPORTING is_local TYPE ty_file_item RETURNING VALUE(rs_result) TYPE ty_result, build_new_remote - IMPORTING is_remote TYPE ty_file + IMPORTING iv_devclass TYPE devclass + is_remote TYPE ty_file it_items TYPE ty_items_ts it_state TYPE ty_file_signatures_ts RETURNING VALUE(rs_result) TYPE ty_result, @@ -61,7 +63,9 @@ CLASS lcl_file_status IMPLEMENTATION. rt_results = calculate_status( - it_local = io_repo->get_files_local( io_log ) + + iv_devclass = io_repo->get_package( ) + it_local = io_repo->get_files_local( io_log = io_log ) it_remote = io_repo->get_files_remote( ) it_cur_state = io_repo->get_local_checksums_per_file( ) ). @@ -147,9 +151,10 @@ CLASS lcl_file_status IMPLEMENTATION. " Process new remote files (marked above with empty SHA1) LOOP AT lt_remote ASSIGNING WHERE sha1 IS NOT INITIAL. APPEND INITIAL LINE TO rt_results ASSIGNING . - = build_new_remote( is_remote = - it_items = lt_items_idx - it_state = lt_state_idx ). + = build_new_remote( iv_devclass = iv_devclass + is_remote = + it_items = lt_items_idx + it_state = lt_state_idx ). ENDLOOP. SORT rt_results BY @@ -170,6 +175,8 @@ CLASS lcl_file_status IMPLEMENTATION. " Handle namespaces REPLACE ALL OCCURRENCES OF '#' IN lv_name WITH '/'. + REPLACE ALL OCCURRENCES OF '#' IN lv_type WITH '/'. + REPLACE ALL OCCURRENCES OF '#' IN lv_ext WITH '/'. CLEAR es_item. es_item-obj_type = lv_type. @@ -193,7 +200,8 @@ CLASS lcl_file_status IMPLEMENTATION. " Match against current state READ TABLE it_state INTO ls_file_sig - WITH KEY path = is_local-file-path filename = is_local-file-filename + WITH KEY path = is_local-file-path + filename = is_local-file-filename BINARY SEARCH. IF sy-subrc = 0. @@ -203,7 +211,8 @@ CLASS lcl_file_status IMPLEMENTATION. IF ls_file_sig-sha1 <> is_remote-sha1. rs_result-rstate = gc_state-modified. ENDIF. - rs_result-match = boolc( rs_result-lstate IS INITIAL AND rs_result-rstate IS INITIAL ). + rs_result-match = boolc( rs_result-lstate IS INITIAL + AND rs_result-rstate IS INITIAL ). ELSE. " This is a strange situation. As both local and remote exist " the state should also be present. Maybe this is a first run of the code. @@ -276,7 +285,8 @@ CLASS lcl_file_status IMPLEMENTATION. ENDIF. " Item is in state and in cache but with no package - it was deleted - IF ls_item-devclass IS INITIAL. + " OR devclass is the same as repo package (see #532) + IF ls_item-devclass IS INITIAL OR ls_item-devclass = iv_devclass. rs_result-match = abap_false. rs_result-lstate = gc_state-deleted. ENDIF. @@ -288,4 +298,4 @@ CLASS lcl_file_status IMPLEMENTATION. ENDMETHOD. "build_new_remote -ENDCLASS. "lcl_file_status IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_file_status IMPLEMENTATION diff --git a/src/zabapgit_file_status.prog.xml b/src/zabapgit_file_status.prog.xml index d4e829924..d137f4325 100644 --- a/src/zabapgit_file_status.prog.xml +++ b/src/zabapgit_file_status.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_FILE_STATUS A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_FILE_STATUS 28 - diff --git a/src/zabapgit_forms.prog.abap b/src/zabapgit_forms.prog.abap index d40ba19e7..e3d9d95d1 100644 --- a/src/zabapgit_forms.prog.abap +++ b/src/zabapgit_forms.prog.abap @@ -53,7 +53,8 @@ FORM branch_popup TABLES tt_fields TYPE ty_sval_tt DATA: lv_url TYPE string, lx_error TYPE REF TO lcx_exception, ls_package_data TYPE scompkdtln, - ls_branch TYPE lcl_git_branch_list=>ty_git_branch. + ls_branch TYPE lcl_git_branch_list=>ty_git_branch, + lv_create TYPE boolean. FIELD-SYMBOLS: LIKE LINE OF tt_fields, LIKE LINE OF tt_fields. @@ -88,24 +89,9 @@ FORM branch_popup TABLES tt_fields TYPE ty_sval_tt ELSEIF pv_code = 'COD2'. cv_show_popup = abap_true. - CALL FUNCTION 'FUNCTION_EXISTS' - EXPORTING - funcname = 'PB_POPUP_PACKAGE_CREATE' - EXCEPTIONS - function_not_exist = 1 - OTHERS = 2. - IF sy-subrc = 1. -* looks like the function module used does not exist on all -* versions since 702, so show an error - lcx_exception=>raise( 'Function module PB_POPUP_PACKAGE_CREATE does not exist' ). - ENDIF. - - CALL FUNCTION 'PB_POPUP_PACKAGE_CREATE' - CHANGING - p_object_data = ls_package_data - EXCEPTIONS - action_cancelled = 1. - IF sy-subrc = 1. + lcl_popups=>popup_to_create_package( IMPORTING es_package_data = ls_package_data + ev_create = lv_create ). + IF lv_create = abap_false. RETURN. ENDIF. @@ -119,6 +105,38 @@ FORM branch_popup TABLES tt_fields TYPE ty_sval_tt ENDFORM. "branch_popup +FORM package_popup TABLES tt_fields TYPE ty_sval_tt + USING pv_code TYPE clike + CHANGING cs_error TYPE svale + cv_show_popup TYPE c + RAISING lcx_exception ##called ##needed. +* called dynamically from function module POPUP_GET_VALUES_USER_BUTTONS + + DATA: ls_package_data TYPE scompkdtln, + lv_create TYPE boolean. + + FIELD-SYMBOLS: LIKE LINE OF tt_fields. + + CLEAR cs_error. + + IF pv_code = 'COD1'. + cv_show_popup = abap_true. + + lcl_popups=>popup_to_create_package( IMPORTING es_package_data = ls_package_data + ev_create = lv_create ). + IF lv_create = abap_false. + RETURN. + ENDIF. + + lcl_sap_package=>create( ls_package_data ). + COMMIT WORK. + + READ TABLE tt_fields ASSIGNING WITH KEY tabname = 'TDEVC'. + ASSERT sy-subrc = 0. + -value = ls_package_data-devclass. + ENDIF. +ENDFORM. "package_popup + FORM output. DATA: lt_ucomm TYPE TABLE OF sy-ucomm. PERFORM set_pf_status IN PROGRAM rsdbrunt IF FOUND. @@ -139,4 +157,4 @@ FORM exit RAISING lcx_exception. LEAVE TO SCREEN 1001. ENDIF. ENDCASE. -ENDFORM. \ No newline at end of file +ENDFORM. diff --git a/src/zabapgit_forms.prog.xml b/src/zabapgit_forms.prog.xml index d5f46747a..21eb950e5 100644 --- a/src/zabapgit_forms.prog.xml +++ b/src/zabapgit_forms.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_FORMS A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_FORMS 22 - diff --git a/src/zabapgit_git.prog.abap b/src/zabapgit_git.prog.abap index 08ebd1c45..42d46cee5 100644 --- a/src/zabapgit_git.prog.abap +++ b/src/zabapgit_git.prog.abap @@ -261,6 +261,8 @@ CLASS lcl_git_transport IMPLEMENTATION. lcx_exception=>raise( 'unpack not ok' ). ELSEIF lv_string CP '*pre-receive hook declined*'. lcx_exception=>raise( 'pre-receive hook declined' ). + ELSEIF lv_string CP '*funny refname*'. + lcx_exception=>raise( 'funny refname' ). ENDIF. ENDMETHOD. "receive_pack @@ -337,7 +339,8 @@ CLASS lcl_git_transport IMPLEMENTATION. LOOP AT lt_branches FROM 1 ASSIGNING . IF sy-tabix = 1. - lv_capa = 'side-band-64k no-progress multi_ack agent=' && lcl_http=>get_agent( ) ##NO_TEXT. + lv_capa = 'side-band-64k no-progress multi_ack agent=' + && lcl_http=>get_agent( ) ##NO_TEXT. lv_line = 'want' && ` ` && -sha1 && ` ` && lv_capa && gc_newline. "#EC NOTEXT ELSE. @@ -348,14 +351,16 @@ CLASS lcl_git_transport IMPLEMENTATION. ENDLOOP. IF iv_deepen = abap_true. - lv_buffer = lv_buffer && lcl_git_utils=>pkt_string( 'deepen 1' && gc_newline ). "#EC NOTEXT + lv_buffer = lv_buffer && lcl_git_utils=>pkt_string( 'deepen 1' + && gc_newline ). "#EC NOTEXT ENDIF. lv_buffer = lv_buffer && '0000' && '0009done' && gc_newline. - lv_xstring = lo_client->send_receive_close( lcl_convert=>string_to_xstring_utf8( lv_buffer ) ). + lv_xstring = lo_client->send_receive_close( + lcl_convert=>string_to_xstring_utf8( lv_buffer ) ). parse( IMPORTING ev_pack = lv_pack CHANGING cv_data = lv_xstring ). @@ -1578,4 +1583,4 @@ CLASS lcl_git_porcelain IMPLEMENTATION. ENDMETHOD. "walk -ENDCLASS. "lcl_porcelain IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_porcelain IMPLEMENTATION diff --git a/src/zabapgit_git.prog.xml b/src/zabapgit_git.prog.xml index 8e3e91b43..829207dc7 100644 --- a/src/zabapgit_git.prog.xml +++ b/src/zabapgit_git.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_GIT A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_GIT 20 - diff --git a/src/zabapgit_git_helpers.prog.abap b/src/zabapgit_git_helpers.prog.abap index bbcb29962..3d7353882 100644 --- a/src/zabapgit_git_helpers.prog.abap +++ b/src/zabapgit_git_helpers.prog.abap @@ -111,7 +111,7 @@ CLASS lcl_git_branch_list DEFINITION FINAL. tag TYPE ty_git_branch_type VALUE 'TG', other TYPE ty_git_branch_type VALUE 'ZZ', END OF c_type. - CONSTANTS head_name TYPE string VALUE 'HEAD'. + CONSTANTS c_head_name TYPE string VALUE 'HEAD'. METHODS constructor IMPORTING iv_data TYPE string @@ -126,6 +126,9 @@ CLASS lcl_git_branch_list DEFINITION FINAL. RETURNING VALUE(rs_branch) TYPE ty_git_branch RAISING lcx_exception. + METHODS get_head_symref + RETURNING VALUE(rv_head_symref) TYPE string. + METHODS get_branches_only RETURNING VALUE(rt_branches) TYPE ty_git_branch_list_tt RAISING lcx_exception. @@ -150,6 +153,10 @@ CLASS lcl_git_branch_list DEFINITION FINAL. IMPORTING iv_branch_name TYPE clike RETURNING VALUE(rv_name) TYPE string. + CLASS-METHODS normalize_branch_name + IMPORTING iv_branch_name TYPE clike + RETURNING VALUE(rv_name) TYPE string. + PRIVATE SECTION. DATA mt_branches TYPE ty_git_branch_list_tt. DATA mv_head_symref TYPE string. @@ -178,6 +185,10 @@ CLASS lcl_git_branch_list IMPLEMENTATION. ev_head_symref = me->mv_head_symref ). ENDMETHOD. "create + METHOD get_head_symref. + rv_head_symref = mv_head_symref. + ENDMETHOD. " get_head_symref. + METHOD find_by_name. IF iv_branch_name IS INITIAL. @@ -197,7 +208,7 @@ CLASS lcl_git_branch_list IMPLEMENTATION. IF mv_head_symref IS NOT INITIAL. rs_branch = find_by_name( mv_head_symref ). ELSE. - rs_branch = find_by_name( head_name ). + rs_branch = find_by_name( c_head_name ). ENDIF. ENDMETHOD. "get_head @@ -246,7 +257,7 @@ CLASS lcl_git_branch_list IMPLEMENTATION. -name = lv_name. -display_name = get_display_name( lv_name ). -type = get_type( lv_name ). - IF -name = head_name OR -name = ev_head_symref. + IF -name = c_head_name OR -name = ev_head_symref. -is_head = abap_true. ENDIF. ENDLOOP. @@ -273,9 +284,9 @@ CLASS lcl_git_branch_list IMPLEMENTATION. ENDIF. IF iv_branch_name CP 'refs/pull/*' - OR iv_branch_name CP 'refs/merge-requests/*' - OR iv_branch_name CP 'refs/keep-around/*' - OR iv_branch_name CP 'refs/tmp/*'. + OR iv_branch_name CP 'refs/merge-requests/*' + OR iv_branch_name CP 'refs/keep-around/*' + OR iv_branch_name CP 'refs/tmp/*'. rv_ignore = abap_true. ENDIF. @@ -295,7 +306,7 @@ CLASS lcl_git_branch_list IMPLEMENTATION. METHOD get_type. rv_type = c_type-other. - IF iv_branch_name CP 'refs/heads/*' OR iv_branch_name = head_name. + IF iv_branch_name CP 'refs/heads/*' OR iv_branch_name = c_head_name. rv_type = c_type-branch. RETURN. ENDIF. @@ -334,4 +345,11 @@ CLASS lcl_git_branch_list IMPLEMENTATION. ENDLOOP. ENDMETHOD. "get_tags_only -ENDCLASS. "lcl_git_branch_list \ No newline at end of file + METHOD normalize_branch_name. + + rv_name = iv_branch_name. " Force convert to string + REPLACE ALL OCCURRENCES OF ` ` IN rv_name WITH '-'. " Disallow space in branch name + + ENDMETHOD. " normalize_branch_name. + +ENDCLASS. "lcl_git_branch_list diff --git a/src/zabapgit_git_helpers.prog.xml b/src/zabapgit_git_helpers.prog.xml index 486b646d6..1f1c5039f 100644 --- a/src/zabapgit_git_helpers.prog.xml +++ b/src/zabapgit_git_helpers.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_GIT_HELPERS A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_GIT_HELPERS 28 - diff --git a/src/zabapgit_gui.prog.abap b/src/zabapgit_gui.prog.abap index b5397ea7d..a823ce468 100644 --- a/src/zabapgit_gui.prog.abap +++ b/src/zabapgit_gui.prog.abap @@ -251,9 +251,11 @@ CLASS lcl_gui IMPLEMENTATION. METHOD render. - DATA lv_url TYPE w3url. + DATA: lv_url TYPE w3url, + lo_html TYPE REF TO lcl_html. - lv_url = cache_html( mi_cur_page->render( )->mv_html ). + lo_html = mi_cur_page->render( ). + lv_url = cache_html( lo_html->render( iv_no_indent_jscss = abap_true ) ). mo_html_viewer->show_url( lv_url ). @@ -325,4 +327,4 @@ CLASS lcl_gui IMPLEMENTATION. ENDMETHOD. "get_current_page_name -ENDCLASS. "lcl_gui IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_gui IMPLEMENTATION diff --git a/src/zabapgit_gui.prog.xml b/src/zabapgit_gui.prog.xml index ed4afb635..99e351529 100644 --- a/src/zabapgit_gui.prog.xml +++ b/src/zabapgit_gui.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_GUI A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_GUI 20 - diff --git a/src/zabapgit_gui_asset_manager.prog.abap b/src/zabapgit_gui_asset_manager.prog.abap index 2ff246994..95b2d0aa1 100644 --- a/src/zabapgit_gui_asset_manager.prog.abap +++ b/src/zabapgit_gui_asset_manager.prog.abap @@ -13,6 +13,9 @@ CLASS lcl_gui_asset_manager DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_gui. METHODS get_images RETURNING VALUE(rt_images) TYPE tt_web_assets. + CLASS-METHODS get_webfont_link + RETURNING VALUE(rv_link) TYPE string. + PRIVATE SECTION. METHODS get_inline_asset @@ -108,11 +111,7 @@ CLASS lcl_gui_asset_manager IMPLEMENTATION. TABLES binary_tab = lt_w3mime EXCEPTIONS - failed = 1. - - IF sy-subrc IS NOT INITIAL. - RETURN. - ENDIF. + failed = 1 ##FM_SUBRC_OK. ENDMETHOD. " get_mime_asset. @@ -145,6 +144,7 @@ CLASS lcl_gui_asset_manager IMPLEMENTATION. DATA: lt_data TYPE ty_string_tt, lv_str TYPE string. + CASE iv_asset_name. WHEN 'CSS_COMMON'. " @@abapmerge include zabapgit_css_common.w3mi.data.css > _inline '$$'. @@ -158,11 +158,11 @@ CLASS lcl_gui_asset_manager IMPLEMENTATION. CALL FUNCTION 'SCMS_STRING_TO_XSTRING' EXPORTING - text = lv_str + text = lv_str IMPORTING - buffer = rv_data + buffer = rv_data EXCEPTIONS - OTHERS = 1. + OTHERS = 1. ASSERT sy-subrc = 0. ENDMETHOD. " get_inline_asset. @@ -255,160 +255,15 @@ CLASS lcl_gui_asset_manager IMPLEMENTATION. && 'cpUAAAAASUVORK5CYII='. APPEND ls_image TO rt_images. -* http://fa2png.io/r/octicons/ -* colour: #808080 -* size: 16 -* https://www.base64-image.de/ can be used to convert images to base64 - - ls_image-url = 'img/sync' ##NO_TEXT. - ls_image-base64 = - 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA6ElEQVQYGY3BIWuUAQAG' - && '4Pc7N72xsbGBYNE8tYpVZKDZX2CcYLEZ9yQxOQSz3D/YmkUsVovRQ2SYNJnlkFfH7VZu' - && 'wefJgrGHXnjrpQeu5B93smCwr6qqqp54433mDI5Ucds1u577o+p35hyoqe2cMThWVatJ' - && '7KiZrZxz18SJqqtJPFXPssRgw0oSH9WNXMCQU76qzSxx2cxxTlk3yhKb6mcSQy7kvjpM' - && 'Ylt98tpjN3POyFTdSuKSqppayxkjE/Uhc36p+m7PhhXr7vmmfhhnzpHPJqqqquqdcRY8' - && 'spq47sAXMyde2c3/+wvX7Y18BexhBwAAAABJRU5ErkJggg=='. - APPEND ls_image TO rt_images. - - ls_image-url = 'img/toc' ##NO_TEXT. - ls_image-base64 = - 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEUAAACAgICAgICA' - && 'gICAgICAgICAgIAO39T0AAAABnRSTlMABBCRlMXJzV0oAAAAN0lEQVQIW2NgwABuaWlB' - && 'YWlpDgwJDAxiAgxACshgYwAz0tLY2NISSBWBMYAmg4ADyBZhARCJAQBBchGypGCbQgAA' - && 'AABJRU5ErkJggg=='. - APPEND ls_image TO rt_images. - - ls_image-url = 'img/repo_online' ##NO_TEXT. - ls_image-base64 = - 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAApVBMVEUAAABQbJxQbJxQ' - && 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ' - && 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ' - && 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ' - && 'bJz+TJ01AAAANnRSTlMAAQIDBAcJCgwSFBocHygqMTM1NkRHSU1QUWFiZGlweHuDiImL' - && 'lZiio6a5vsfT3uTo6e3x9fsxY2JuAAAAgUlEQVQYGXXB6RaBUBSA0e+IEuIiMs9zhlDn' - && '/R/NZWmt/LA3f1RcoaB50SydCbn20wjedkPu3sKSpMGH21PhLdZ0BATZ+cCXtxtDHGLV' - && 'pgFW9QqJj2U0wvJvMF+5jiNGI3HK9dMQSouH6sRoFGoWd8l1dEDRWlWPQsFS98KPvvDH' - && 'C3HLClrWc70ZAAAAAElFTkSuQmCC'. - APPEND ls_image TO rt_images. - - ls_image-url = 'img/repo_offline' ##NO_TEXT. - ls_image-base64 = - 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAVFBMVEUAAACAgICAgICA' - && 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA' - && 'gICAgICAgICAgICAgICAgICAgICAgICuaWnmAAAAG3RSTlMAAgQFBgsQFxweIiMtN3yI' - && 'nqOvt9Hp6/Hz9fktMNR/AAAAXElEQVQYV5WO2xJAMAxES1q3ugfF/v9/0qLyyL4k58xk' - && 'J0p9D7N5oeqZgSwy7fDZnHNdEE1gWK116tksl7hPimGFFPWYl7MU0zksRCl8TStKg1AJ' - && '0XNC8Zm4/c0BUVQHi0llOUYAAAAASUVORK5CYII='. - APPEND ls_image TO rt_images. - - ls_image-url = 'img/pkg' ##NO_TEXT. - ls_image-base64 = - 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA30lEQVQoU43OIUuDcRSF' - && '8fvqhuB0mFwaKLbVBVdkX0GTFss+wYL2H4rJIIgyQQSzZcUPoGHZ9CKCmAwTMS8Y/ga3' - && 'BWVjT7hwOQ+HEzEbMhU7jrTd69q2KhtFRU2nrvS927dm3pyqPXcuNRVD7sxiRIQlDSc+' - && 'PGjZUFDWkYekLfdoV2XYua4rSZ61pZBkEUq2XPty41XuXJIiZGNhPDVZiFCYIMSor+Db' - && '7RQhYnQnCsNvNmGgPFFYMQh1PU9aqrLxyGUNx/p66r9mUc2hFx3JhU9vDtQU4y9KGjaV' - && '/gXT+AGZVIinhU2EAwAAAABJRU5ErkJggg=='. - APPEND ls_image TO rt_images. - - ls_image-url = 'img/branch' ##NO_TEXT. - ls_image-base64 = - 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAqFBMVEUAAACAgICAgICA' - && 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA' - && 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA' - && 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA' - && 'gICAgID/OyosAAAAN3RSTlMAAQIDBAYICQ8TFRweJScoKSo3Oj1FRk1dYWJjZmhzdIaJ' - && 'j5GVm6CwsrS5vsHDyszV19ne7/X583teZAAAAIFJREFUGFdVytkagVAYheFvFzJlnqc0' - && 'EEoR+u//zhxI7dbZ9z4LMJ1op9DmjpntdXiBigHbLiAYqukBVr63+YGRSazgCY/iEooP' - && 'xKZxr0EnSbo14B1Rg4msKzj150fJrQpERPLBv7mIfNxlq+zRbZsu0JYpGlcdwjY9Twfr' - && 'nAbNsr6IKQxJI/U5CgAAAABJRU5ErkJggg=='. - APPEND ls_image TO rt_images. - - ls_image-url = 'img/link' ##NO_TEXT. - ls_image-base64 = - 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAXVBMVEUAAACAgICAgICA' - && 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA' - && 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVwFMKAAAAHnRSTlMAAwQFBgcK' - && 'FR4gIiMmP0JHSm+RmKDByM/R09rg+/0jN/q+AAAAX0lEQVQYV43Nxw6AIBAE0FGw916Z' - && '//9MRQ0S4sG5bPZlCxqSCyBGXgFUJKUA4A8PUOKONzuQOxOZIjcLkrMvxGQg3skSCFYL' - && 'Kl1Ds5LWz+33yyf4rQOSf6CjnV6rHeAA87gJtKzI8ocAAAAASUVORK5CYII='. - APPEND ls_image TO rt_images. - - ls_image-url = 'img/code' ##NO_TEXT. - ls_image-base64 = - 'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAElBMVEUAAACAgICAgICA' - && 'gICAgICAgIC07w1vAAAABXRSTlMABECUxcOwZQcAAAA1SURBVAhbY2AODQ0NEWBgYGVg' - && 'YGByhNAMKgIMrKyhAQxMDhA+QwCCZgVqIIUP1Q+yJzTUAAAfUAq+Os55uAAAAABJRU5E' - && 'rkJggg=='. - APPEND ls_image TO rt_images. - - ls_image-url = 'img/bin' ##NO_TEXT. - ls_image-base64 = - 'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAElBMVEUAAACAgICAgICA' - && 'gICAgICAgIC07w1vAAAABXRSTlMABECUxcOwZQcAAABBSURBVAhbXcqxDYAwAMRAK8h9' - && 'hmAARoANvuD3X4UCiojqZMlsbe8JAuN6ZZ9ozThRCVmsJe9H0HwdXf19W9v2eAA6Fws2' - && 'RotPsQAAAABJRU5ErkJggg=='. - APPEND ls_image TO rt_images. - - ls_image-url = 'img/obj' ##NO_TEXT. - ls_image-base64 = - 'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAIVBMVEUAAACAgICAgICA' - && 'gICAgICAgICAgICAgICAgICAgICAgIDcWqnoAAAACnRSTlMABD1AZI+RlcPFIaFe1gAA' - && 'AEVJREFUCFtjYF+1atVKAQYGLgYGBuaJEJrBUgBCM0+A0AwLgLQIgyOIZmwCSgNptgAG' - && '1gQQfzKDhgCSPFw9Kg2yZ9WqAgBWJBENLk6V3AAAAABJRU5ErkJggg=='. - APPEND ls_image TO rt_images. - - ls_image-url = 'img/lock' ##NO_TEXT. - ls_image-base64 = - 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAOVBMVEUAAACIiIiIiIiI' - && 'iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIjNaTNB' - && 'AAAAEnRSTlMABgdBVXt8iYuRsNXZ3uDi6Pmu6tfUAAAASUlEQVQYV63KSxJAQBAE0TQ0' - && 'Znym1f0PayE0QdjJ5asCgGTu1hClqjppvaRXB60swBeA2QNUAIq+ICvKx367nqAn/P8Y' - && 't2jg3Q5rgASaF3KNRwAAAABJRU5ErkJggg=='. - APPEND ls_image TO rt_images. - - ls_image-url = 'img/dir' ##NO_TEXT. - ls_image-base64 = - 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAASFBMVEUAAABmksxmksxm' - && 'ksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxm' - && 'ksxmksxmksxmksxMwQo8AAAAF3RSTlMABhIYIy1fZmhpe3+IiYuMkZvD7e/x93sipD4A' - && 'AAA+SURBVBhXY2BABzwiokAgzAYXEGdiBAIWIYQAPzcQCApzgwEXM4M4KuBDFxAYKAEx' - && 'VAFeBlYOTiTAzoThewD5hBAcnWM4gwAAAABJRU5ErkJggg=='. - APPEND ls_image TO rt_images. - - ls_image-url = 'img/burger' ##NO_TEXT. - ls_image-base64 = - 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAHlBMVEUAAABtktltktlt' - && 'ktltktltktltktltktltktltktk7ccVDAAAACXRSTlMAFDBLY2SFoPGv/DFMAAAAJ0lE' - && 'QVQIW2NggIHKmWAwmaETwpjGoBoKBo4MmIAkxXApuGK4dgwAAJa5IzLs+gRBAAAAAElF' - && 'TkSuQmCC'. - APPEND ls_image TO rt_images. - - ls_image-url = 'img/star' ##NO_TEXT. - ls_image-base64 = - 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAilBMVEUAAABejclejcle' - && 'jclejclejclejclejclejclejclejclejclejclejclejclejclejclejclejclejcle' - && 'jclejclejclejclejclejclejclejclejclejclejclejclejclejclejclejclejcle' - && 'jclejclejclejclejclejclejclejclejcn2yvsVAAAALXRSTlMAAQIFBwkKCw0QERUY' - && 'HB4jLzEzNjg7PVdYYmRvd3mDm52eub7R0+Tr8fX3+/16wo8zAAAAcElEQVQYGW3BBxKC' - && 'MABFwYcQETv2hg1UVP79ryeTZBxw3MWL+JGltBgVtGRSSoORVOAE8Xi5zVU7rWfDCOaV' - && 'Gu59mLz0dTPUBg95eYjVK2VdOzjBW9YZL5FT4i2k5+YoKcY5VPsQkoumOLsu1mjFHx8o' - && 'ahA3YV7OfwAAAABJRU5ErkJggg=='. - APPEND ls_image TO rt_images. - - ls_image-url = 'img/star-grey' ##NO_TEXT. - ls_image-base64 = - 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAilBMVEUAAADQ0NDQ0NDQ' - && '0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ' - && '0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ' - && '0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NC2QdifAAAALXRSTlMAAQIFBwkKCw0QERUY' - && 'HB4jLzEzNjg7PVdYYmRvd3mDm52eub7R0+Tr8fX3+/16wo8zAAAAcElEQVQYGW3BBxKC' - && 'MABFwYcQETv2hg1UVP79ryeTZBxw3MWL+JGltBgVtGRSSoORVOAE8Xi5zVU7rWfDCOaV' - && 'Gu59mLz0dTPUBg95eYjVK2VdOzjBW9YZL5FT4i2k5+YoKcY5VPsQkoumOLsu1mjFHx8o' - && 'ahA3YV7OfwAAAABJRU5ErkJggg=='. - APPEND ls_image TO rt_images. - - ENDMETHOD. " get_inline_images. -ENDCLASS. "lcl_gui_asset_manager \ No newline at end of file + METHOD get_webfont_link. + + rv_link = ''. "#EC NOTEXT + + ENDMETHOD. " get_webfont_link + +ENDCLASS. "lcl_gui_asset_manager diff --git a/src/zabapgit_gui_asset_manager.prog.xml b/src/zabapgit_gui_asset_manager.prog.xml index bcab6cac1..f80a3d729 100644 --- a/src/zabapgit_gui_asset_manager.prog.xml +++ b/src/zabapgit_gui_asset_manager.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_GUI_ASSET_MANAGER A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_GUI_ASSET_MANAGER 34 - diff --git a/src/zabapgit_gui_pages.prog.abap b/src/zabapgit_gui_pages.prog.abap index 910211fd0..9d3c60c7c 100644 --- a/src/zabapgit_gui_pages.prog.abap +++ b/src/zabapgit_gui_pages.prog.abap @@ -4,17 +4,18 @@ * All UI pages -* Super class +* Super class & common html chunks +INCLUDE zabapgit_html_chunks. INCLUDE zabapgit_page. * Utils and helpers INCLUDE zabapgit_html_action_utils. INCLUDE zabapgit_repo_browser_util. +INCLUDE zabapgit_syntax_highlighter. * Components and templates INCLUDE zabapgit_view_repo. INCLUDE zabapgit_view_tutorial. -INCLUDE zabapgit_syntax_highlighter. * Pages INCLUDE zabapgit_page_commit. @@ -27,4 +28,4 @@ INCLUDE zabapgit_page_explore. INCLUDE zabapgit_page_main. INCLUDE zabapgit_page_stage. INCLUDE zabapgit_page_debug. -INCLUDE zabapgit_page_settings. \ No newline at end of file +INCLUDE zabapgit_page_settings. diff --git a/src/zabapgit_gui_pages.prog.xml b/src/zabapgit_gui_pages.prog.xml index 068beb75a..e96a5afbe 100644 --- a/src/zabapgit_gui_pages.prog.xml +++ b/src/zabapgit_gui_pages.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_GUI_PAGES A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_GUI_PAGES 26 - diff --git a/src/zabapgit_gui_router.prog.abap b/src/zabapgit_gui_router.prog.abap index 3c259c095..d910693cb 100644 --- a/src/zabapgit_gui_router.prog.abap +++ b/src/zabapgit_gui_router.prog.abap @@ -35,8 +35,8 @@ CLASS lcl_gui_router DEFINITION FINAL. RAISING lcx_exception. METHODS get_page_stage - IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key - RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page + IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key + RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page RAISING lcx_exception. METHODS get_page_db_by_name @@ -310,7 +310,7 @@ CLASS lcl_gui_router IMPLEMENTATION. CREATE OBJECT lo_stage_page EXPORTING - io_repo = lo_repo. + io_repo = lo_repo. ri_page = lo_stage_page. @@ -342,4 +342,4 @@ CLASS lcl_gui_router IMPLEMENTATION. ENDMETHOD. "get_page_playground -ENDCLASS. " lcl_gui_router \ No newline at end of file +ENDCLASS. " lcl_gui_router diff --git a/src/zabapgit_gui_router.prog.xml b/src/zabapgit_gui_router.prog.xml index 554bbc558..4330cfa4f 100644 --- a/src/zabapgit_gui_router.prog.xml +++ b/src/zabapgit_gui_router.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_GUI_ROUTER A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_GUI_ROUTER 27 - diff --git a/src/zabapgit_html.prog.abap b/src/zabapgit_html.prog.abap index 784e91e9f..cba8b08e3 100644 --- a/src/zabapgit_html.prog.abap +++ b/src/zabapgit_html.prog.abap @@ -7,59 +7,126 @@ DEFINE _add. END-OF-DEFINITION. *----------------------------------------------------------------------* -* CLASS lcl_html_helper DEFINITION +* CLASS lcl_html DEFINITION *----------------------------------------------------------------------* -CLASS lcl_html_helper DEFINITION FINAL. + +CLASS lcl_html DEFINITION FINAL. PUBLIC SECTION. CONSTANTS: c_indent_size TYPE i VALUE 2. - DATA mv_html TYPE string READ-ONLY. - DATA mv_indent TYPE i READ-ONLY. - DATA mv_within_style TYPE i READ-ONLY. - DATA mv_within_js TYPE i READ-ONLY. - - METHODS add IMPORTING iv_chunk TYPE any. + CLASS-METHODS class_constructor. METHODS reset. + METHODS add + IMPORTING iv_chunk TYPE any. + METHODS render + IMPORTING iv_no_indent_jscss TYPE abap_bool OPTIONAL + RETURNING VALUE(rv_html) TYPE string. + METHODS is_empty + RETURNING VALUE(rv_yes) TYPE abap_bool. - METHODS add_anchor IMPORTING iv_txt TYPE string - iv_act TYPE string - iv_opt TYPE clike OPTIONAL - iv_typ TYPE char1 DEFAULT gc_action_type-sapevent - iv_class TYPE string OPTIONAL - iv_id TYPE string OPTIONAL - iv_style TYPE string OPTIONAL. + METHODS add_a + IMPORTING + iv_txt TYPE string + iv_act TYPE string + iv_typ TYPE char1 DEFAULT gc_action_type-sapevent + iv_opt TYPE clike OPTIONAL + iv_class TYPE string OPTIONAL + iv_id TYPE string OPTIONAL + iv_style TYPE string OPTIONAL. + + METHODS add_icon + IMPORTING + iv_name TYPE string + iv_hint TYPE string OPTIONAL + iv_alt TYPE string OPTIONAL + iv_class TYPE string OPTIONAL. + + CLASS-METHODS a + IMPORTING + iv_txt TYPE string + iv_act TYPE string + iv_typ TYPE char1 DEFAULT gc_action_type-sapevent + iv_opt TYPE clike OPTIONAL + iv_class TYPE string OPTIONAL + iv_id TYPE string OPTIONAL + iv_style TYPE string OPTIONAL + RETURNING VALUE(rv_str) TYPE string. + + CLASS-METHODS icon + IMPORTING + iv_name TYPE string + iv_hint TYPE string OPTIONAL + iv_alt TYPE string OPTIONAL + iv_class TYPE string OPTIONAL + RETURNING VALUE(rv_str) TYPE string. PRIVATE SECTION. - METHODS _add_str IMPORTING iv_str TYPE csequence. - METHODS _add_htm IMPORTING io_html TYPE REF TO lcl_html_helper. + CLASS-DATA go_single_tags_re TYPE REF TO cl_abap_regex. + DATA mt_buffer TYPE string_table. -ENDCLASS. "lcl_html_helper DEFINITION + TYPES: + BEGIN OF ty_indent_context, + no_indent_jscss TYPE abap_bool, + within_style TYPE abap_bool, + within_js TYPE abap_bool, + indent TYPE i, + indent_str TYPE string, + END OF ty_indent_context, + + BEGIN OF ty_study_result, + style_open TYPE abap_bool, + style_close TYPE abap_bool, + script_open TYPE abap_bool, + script_close TYPE abap_bool, + tag_close TYPE abap_bool, + curly_close TYPE abap_bool, + openings TYPE i, + closings TYPE i, + singles TYPE i, + END OF ty_study_result. + + METHODS indent_line + CHANGING + cs_context TYPE ty_indent_context + cv_line TYPE string. + + METHODS study_line + IMPORTING + iv_line TYPE string + is_context TYPE ty_indent_context + RETURNING VALUE(rs_result) TYPE ty_study_result. + +ENDCLASS. "lcl_html DEFINITION *----------------------------------------------------------------------* -* CLASS lcl_html_helper IMPLEMENTATION +* CLASS lcl_html IMPLEMENTATION *----------------------------------------------------------------------* -CLASS lcl_html_helper IMPLEMENTATION. +CLASS lcl_html IMPLEMENTATION. + METHOD add. - DATA lo_type TYPE REF TO cl_abap_typedescr. - DATA lo_html TYPE REF TO lcl_html_helper. - lo_type = cl_abap_typedescr=>describe_by_data( iv_chunk ). + DATA: lv_type TYPE c, + lo_html TYPE REF TO lcl_html. - CASE lo_type->type_kind. - WHEN cl_abap_typedescr=>typekind_char - OR cl_abap_typedescr=>typekind_string. - IF strlen( iv_chunk ) = 0. - RETURN. - ENDIF. - _add_str( iv_chunk ). - WHEN cl_abap_typedescr=>typekind_oref. + FIELD-SYMBOLS: TYPE string_table, + LIKE LINE OF . + + DESCRIBE FIELD iv_chunk TYPE lv_type. " Describe is faster than RTTI classes + + CASE lv_type. + WHEN 'C' OR 'g'. " Char or string + APPEND iv_chunk TO mt_buffer. + WHEN 'h'. " Table + ASSIGN iv_chunk TO . " Assuming table of strings ! Will dump otherwise + APPEND LINES OF TO mt_buffer. + WHEN 'r'. " Object ref ASSERT iv_chunk IS BOUND. " Dev mistake TRY. lo_html ?= iv_chunk. CATCH cx_sy_move_cast_error. ASSERT 1 = 0. " Dev mistake ENDTRY. - _add_htm( lo_html ). + APPEND LINES OF lo_html->mt_buffer TO mt_buffer. WHEN OTHERS. ASSERT 1 = 0. " Dev mistake ENDCASE. @@ -67,85 +134,158 @@ CLASS lcl_html_helper IMPLEMENTATION. ENDMETHOD. " add METHOD reset. - CLEAR: me->mv_html, me->mv_indent. + CLEAR me->mt_buffer. ENDMETHOD. "reset - METHOD _add_str. - CONSTANTS lc_single_tags_re TYPE string " HTML5 singleton tags - VALUE '<(area|base|br|col|command|embed|hr|img|input|link|meta|param|source|!)'. + METHOD is_empty. + rv_yes = boolc( lines( mt_buffer ) = 0 ). + ENDMETHOD. "is_empty - DATA lv_tags TYPE i. - DATA lv_tags_open TYPE i. - DATA lv_tags_close TYPE i. - DATA lv_tags_single TYPE i. - DATA lv_close_offs TYPE i. - DATA lv_shift_back TYPE i. - DATA lv_style_tag_open TYPE i. - DATA lv_style_tag_close TYPE i. - DATA lv_js_tag_open TYPE i. - DATA lv_js_tag_close TYPE i. - DATA lv_curly TYPE i. + METHOD class_constructor. + CREATE OBJECT go_single_tags_re + EXPORTING + pattern = '<(AREA|BASE|BR|COL|COMMAND|EMBED|HR|IMG|INPUT|LINK|META|PARAM|SOURCE|!)' + ignore_case = abap_false. + ENDMETHOD. "class_constructor + + METHOD study_line. + + DATA: lv_line TYPE string, + lv_len TYPE i. + + lv_line = to_upper( shift_left( val = iv_line sub = ` ` ) ). + lv_len = strlen( lv_line ). + + " Some assumptions for simplification and speed + " - style & scripts tag should be opened/closed in a separate line + " - style & scripts opening and closing in one line is possible but only once + + " TODO & Issues + " - What if the string IS a well formed html already not just single line ? + + IF is_context-within_js = abap_true OR is_context-within_style = abap_true. + + IF is_context-within_js = abap_true AND lv_len >= 8 AND lv_line(8) = '= 7 AND lv_line(7) = '= 1 AND lv_line(1) = '}'. + rs_result-curly_close = abap_true. + ENDIF. + + FIND ALL OCCURRENCES OF '{' IN lv_line MATCH COUNT rs_result-openings. + FIND ALL OCCURRENCES OF '}' IN lv_line MATCH COUNT rs_result-closings. + ENDIF. + + ELSE. + IF lv_len >= 7 AND lv_line(7) = ' 0. " Not found + rs_result-script_open = abap_true. + ENDIF. + ENDIF. + IF lv_len >= 6 AND lv_line(6) = ' 0. " Not found + rs_result-style_open = abap_true. + ENDIF. + ENDIF. + IF lv_len >= 2 AND lv_line(2) = ' 0. " Found close tag @beginning - lv_shift_back = 1. ENDIF. - FIND FIRST OCCURRENCE OF '}' IN iv_str MATCH OFFSET lv_close_offs. " Find close } @beginning - IF ( mv_within_style > 0 OR mv_within_js > 0 ) - AND sy-subrc = 0 AND lv_close_offs = 0 AND mv_indent > 0. - lv_shift_back = 1. + ENDMETHOD. "study_line + + METHOD indent_line. + + DATA: ls_study TYPE ty_study_result, + lv_x_str TYPE string. + + ls_study = study_line( + is_context = cs_context + iv_line = cv_line ). + + " First closing tag - shift back exceptionally + IF ( ls_study-script_close = abap_true + OR ls_study-style_close = abap_true + OR ls_study-curly_close = abap_true + OR ls_study-tag_close = abap_true ) + AND cs_context-indent > 0. + lv_x_str = repeat( val = ` ` occ = ( cs_context-indent - 1 ) * c_indent_size ). + cv_line = lv_x_str && cv_line. + ELSE. + cv_line = cs_context-indent_str && cv_line. ENDIF. - mv_html = mv_html - && repeat( val = ` ` occ = ( mv_indent - lv_shift_back ) * c_indent_size ) - && iv_str - && gc_newline. - - FIND ALL OCCURRENCES OF '<' IN iv_str MATCH COUNT lv_tags. - FIND ALL OCCURRENCES OF '' IN iv_str MATCH COUNT lv_style_tag_close IGNORING CASE. - mv_within_style = mv_within_style + lv_style_tag_open - lv_style_tag_close. - - FIND ALL OCCURRENCES OF '' IN iv_str MATCH COUNT lv_js_tag_close IGNORING CASE. - mv_within_js = mv_within_js + lv_js_tag_open - lv_js_tag_close. - - IF mv_within_style > 0 OR mv_within_js > 0. - FIND ALL OCCURRENCES OF '{' IN iv_str MATCH COUNT lv_curly. - lv_tags_open = lv_tags_open + lv_curly. - FIND ALL OCCURRENCES OF '}' IN iv_str MATCH COUNT lv_curly. - lv_tags_close = lv_tags_close + lv_curly. - ENDIF. + " Context status update + CASE abap_true. + WHEN ls_study-script_open. + cs_context-within_js = abap_true. + cs_context-within_style = abap_false. + WHEN ls_study-style_open. + cs_context-within_js = abap_false. + cs_context-within_style = abap_true. + WHEN ls_study-script_close OR ls_study-style_close. + cs_context-within_js = abap_false. + cs_context-within_style = abap_false. + ls_study-closings = ls_study-closings + 1. + ENDCASE. " More-less logic chosen due to possible double tags in a line '' - IF lv_tags_open > lv_tags_close. - mv_indent = mv_indent + 1. - ELSEIF lv_tags_open < lv_tags_close AND mv_indent > 0. - mv_indent = mv_indent - 1. + IF ls_study-openings <> ls_study-closings. + IF ls_study-openings > ls_study-closings. + cs_context-indent = cs_context-indent + 1. + ELSEIF cs_context-indent > 0. " AND ls_study-openings < ls_study-closings + cs_context-indent = cs_context-indent - 1. + ENDIF. + cs_context-indent_str = repeat( val = ` ` occ = cs_context-indent * c_indent_size ). ENDIF. - ENDMETHOD. "_add_str + ENDMETHOD. "indent_line - METHOD _add_htm. + METHOD render. - DATA lt_strtab TYPE TABLE OF string. - DATA lv_str TYPE string. + DATA: ls_context TYPE ty_indent_context, + lt_temp TYPE string_table. - SPLIT io_html->mv_html AT gc_newline INTO TABLE lt_strtab. - LOOP AT lt_strtab INTO lv_str. - SHIFT lv_str LEFT DELETING LEADING space. - _add_str( lv_str ). + FIELD-SYMBOLS: LIKE LINE OF lt_temp, + LIKE LINE OF lt_temp. + + ls_context-no_indent_jscss = iv_no_indent_jscss. + + LOOP AT mt_buffer ASSIGNING . + APPEND TO lt_temp ASSIGNING . + indent_line( CHANGING cs_context = ls_context cv_line = ). ENDLOOP. - ENDMETHOD. "_add_htm + CONCATENATE LINES OF lt_temp INTO rv_html SEPARATED BY gc_newline. + + ENDMETHOD. "render + + METHOD add_a. + + add( a( iv_txt = iv_txt + iv_act = iv_act + iv_typ = iv_typ + iv_opt = iv_opt + iv_class = iv_class + iv_id = iv_id + iv_style = iv_style ) ). + + ENDMETHOD. "add_a + + METHOD a. - METHOD add_anchor. DATA: lv_class TYPE string, lv_href TYPE string, lv_id TYPE string, @@ -153,7 +293,7 @@ CLASS lcl_html_helper IMPLEMENTATION. lv_class = iv_class. - IF iv_opt CA gc_html_opt-emphas. + IF iv_opt CA gc_html_opt-strong. lv_class = lv_class && ' emphasis' ##NO_TEXT. ENDIF. IF iv_opt CA gc_html_opt-cancel. @@ -186,11 +326,43 @@ CLASS lcl_html_helper IMPLEMENTATION. lv_style = | style="{ iv_style }"|. ENDIF. - _add_str( |{ iv_txt }| ). + rv_str = |{ iv_txt }|. - ENDMETHOD. "add_action + ENDMETHOD. "a -ENDCLASS. "lcl_html_helper IMPLEMENTATION + METHOD add_icon. + + add( icon( iv_name = iv_name + iv_class = iv_class + iv_alt = iv_alt + iv_hint = iv_hint ) ). + + ENDMETHOD. "add_icon + + METHOD icon. + + DATA: lv_hint TYPE string, + lv_name TYPE string, + lv_color TYPE string, + lv_class TYPE string. + + SPLIT iv_name AT '/' INTO lv_name lv_color. + + IF iv_hint IS NOT INITIAL. + lv_hint = | title="{ iv_hint }"|. + ENDIF. + IF iv_class IS NOT INITIAL. + lv_class = | { iv_class }|. + ENDIF. + IF lv_color IS NOT INITIAL. + lv_color = | { lv_color }|. + ENDIF. + + rv_str = ||. + + ENDMETHOD. "icon + +ENDCLASS. "lcl_html IMPLEMENTATION *----------------------------------------------------------------------* * CLASS lcl_html_toolbar DEFINITION @@ -219,7 +391,7 @@ CLASS lcl_html_toolbar DEFINITION FINAL. iv_with_icons TYPE abap_bool OPTIONAL iv_add_minizone TYPE abap_bool OPTIONAL RETURNING - VALUE(ro_html) TYPE REF TO lcl_html_helper. + VALUE(ro_html) TYPE REF TO lcl_html. PRIVATE SECTION. TYPES: BEGIN OF ty_item, @@ -264,8 +436,7 @@ CLASS lcl_html_toolbar IMPLEMENTATION. METHOD render. "TODO refactor DATA: lv_class TYPE string, - lv_is_drop TYPE abap_bool, - lv_last TYPE abap_bool. + lv_is_drop TYPE abap_bool. FIELD-SYMBOLS LIKE LINE OF mt_items. @@ -291,11 +462,9 @@ CLASS lcl_html_toolbar IMPLEMENTATION. IF iv_as_angle = abap_true. ro_html->add( '
' ). ELSE. - lv_class = 'dropbtn'. - IF iv_no_separator = abap_true. - lv_class = lv_class && ' menu_end' ##NO_TEXT. - ENDIF. - ro_html->add( |{ iv_as_droplist_with_label }| ). + ro_html->add_a( iv_txt = iv_as_droplist_with_label + iv_class = 'dropbtn' + iv_act = '' ). ENDIF. IF iv_add_minizone = abap_true. @@ -315,27 +484,19 @@ CLASS lcl_html_toolbar IMPLEMENTATION. ENDIF. LOOP AT mt_items ASSIGNING . - lv_last = boolc( sy-tabix = lines( mt_items ) ). IF -sub IS INITIAL. - CLEAR lv_class. - IF iv_no_separator = abap_true - OR lv_last = abap_true - AND iv_as_droplist_with_label IS INITIAL. - lv_class = 'menu_end'. - ENDIF. IF iv_with_icons = abap_true. ro_html->add( '' ). - ro_html->add( |{ -ico }| ). - ro_html->add( '' ). + ro_html->add( |{ lcl_html=>icon( -ico ) }| ). + ro_html->add( '' ). ENDIF. - ro_html->add_anchor( iv_txt = -txt - iv_act = -act - iv_opt = -opt - iv_typ = -typ - iv_class = lv_class ). + ro_html->add_a( iv_txt = -txt + iv_act = -act + iv_opt = -opt + iv_typ = -typ ). IF iv_with_icons = abap_true. ro_html->add( '' ). @@ -343,9 +504,7 @@ CLASS lcl_html_toolbar IMPLEMENTATION. ENDIF. ELSE. - ro_html->add( -sub->render( - iv_as_droplist_with_label = -txt - iv_no_separator = lv_last ) ). + ro_html->add( -sub->render( iv_as_droplist_with_label = -txt ) ). ENDIF. ENDLOOP. @@ -355,11 +514,12 @@ CLASS lcl_html_toolbar IMPLEMENTATION. ENDIF. IF lv_is_drop = abap_true. " Dropdown - ro_html->add( '' ). + ro_html->add( '' ). + ro_html->add( '' ). ENDIF. ro_html->add( '' ). ENDMETHOD. "render -ENDCLASS. "lcl_html_toolbar IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_html_toolbar IMPLEMENTATION diff --git a/src/zabapgit_html.prog.xml b/src/zabapgit_html.prog.xml index 60fedebc9..722e3f464 100644 --- a/src/zabapgit_html.prog.xml +++ b/src/zabapgit_html.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_HTML A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_HTML 21 - diff --git a/src/zabapgit_html_action_utils.prog.abap b/src/zabapgit_html_action_utils.prog.abap index 8fd1ed7bb..8de0a7462 100644 --- a/src/zabapgit_html_action_utils.prog.abap +++ b/src/zabapgit_html_action_utils.prog.abap @@ -271,8 +271,8 @@ CLASS lcl_html_action_utils IMPLEMENTATION. get_field( EXPORTING name = 'XMLDATA' it = lt_fields CHANGING cv = rs_content-data_str ). IF rs_content-data_str(1) <> '<' AND rs_content-data_str+1(1) = '<'. " Hmmm ??? rs_content-data_str = rs_content-data_str+1. - ELSE. - CLEAR rs_content-data_str. +* ELSE. +* CLEAR rs_content-data_str. ENDIF. ENDMETHOD. "dbcontent_decode @@ -326,4 +326,4 @@ CLASS lcl_html_action_utils IMPLEMENTATION. ENDMETHOD. "decode_bg_update -ENDCLASS. "lcl_html_action_utils IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_html_action_utils IMPLEMENTATION diff --git a/src/zabapgit_html_action_utils.prog.xml b/src/zabapgit_html_action_utils.prog.xml index a83a04c8a..83227eaaa 100644 --- a/src/zabapgit_html_action_utils.prog.xml +++ b/src/zabapgit_html_action_utils.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_HTML_ACTION_UTILS A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_HTML_ACTION_UTILS 34 - diff --git a/src/zabapgit_html_chunks.prog.abap b/src/zabapgit_html_chunks.prog.abap new file mode 100644 index 000000000..0b5780749 --- /dev/null +++ b/src/zabapgit_html_chunks.prog.abap @@ -0,0 +1,205 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_HTML_CHUNKS +*&---------------------------------------------------------------------* + +CLASS lcl_gui_chunk_lib DEFINITION FINAL. + + PUBLIC SECTION. + + CLASS-METHODS render_error + IMPORTING ix_error TYPE REF TO lcx_exception OPTIONAL + iv_error TYPE string OPTIONAL + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. + + CLASS-METHODS render_repo_top + IMPORTING io_repo TYPE REF TO lcl_repo + iv_show_package TYPE abap_bool DEFAULT abap_true + iv_show_branch TYPE abap_bool DEFAULT abap_true + iv_interactive_branch TYPE abap_bool DEFAULT abap_false + iv_branch TYPE string OPTIONAL + RETURNING VALUE(ro_html) TYPE REF TO lcl_html + RAISING lcx_exception. + + CLASS-METHODS render_item_state + IMPORTING iv1 TYPE char1 + iv2 TYPE char1 + RETURNING VALUE(rv_html) TYPE string. + + CLASS-METHODS render_branch_span + IMPORTING iv_branch TYPE string + io_repo TYPE REF TO lcl_repo_online + iv_interactive TYPE abap_bool + RETURNING VALUE(ro_html) TYPE REF TO lcl_html + RAISING lcx_exception. + +ENDCLASS. "lcl_gui_chunk_lib + +CLASS lcl_gui_chunk_lib IMPLEMENTATION. + + METHOD render_repo_top. + + DATA: lo_repo_online TYPE REF TO lcl_repo_online, + lo_pback TYPE REF TO lcl_persistence_background, + lv_hint TYPE string, + lv_icon TYPE string. + + + CREATE OBJECT ro_html. + CREATE OBJECT lo_pback. + + IF io_repo->is_offline( ) = abap_true. + lv_icon = 'plug/darkgrey' ##NO_TEXT. + lv_hint = 'Offline repository' ##NO_TEXT. + ELSE. + lv_icon = 'cloud-upload/blue' ##NO_TEXT. + lv_hint = 'On-line repository' ##NO_TEXT. + ENDIF. + + ro_html->add( '' ). + + ro_html->add( '' ). + + ro_html->add( '' ). + ro_html->add( '
' ). + ro_html->add_icon( iv_name = lv_icon iv_hint = lv_hint ). + ro_html->add( |{ io_repo->get_name( ) }| ). + IF io_repo->is_offline( ) = abap_false. + lo_repo_online ?= io_repo. + ro_html->add( |{ lo_repo_online->get_url( ) }| ). + ENDIF. + ro_html->add( '' ). + + IF abap_true = lcl_app=>user( )->is_favorite_repo( io_repo->get_key( ) ). + lv_icon = 'star/blue' ##NO_TEXT. + ELSE. + lv_icon = 'star/grey' ##NO_TEXT. + ENDIF. + ro_html->add_a( iv_act = |{ gc_action-repo_toggle_fav }?{ io_repo->get_key( ) }| + iv_txt = lcl_html=>icon( iv_name = lv_icon + iv_class = 'pad-sides' + iv_hint = 'Click to toggle favorite' ) ). + + IF lo_pback->exists( io_repo->get_key( ) ) = abap_true. + ro_html->add( 'BG' ). + ENDIF. + + IF io_repo->is_write_protected( ) = abap_true. + ro_html->add_icon( iv_name = 'lock/darkgrey' iv_hint = 'Locked from pulls' ). + ENDIF. + + IF io_repo->is_offline( ) = abap_false. + lo_repo_online ?= io_repo. + IF iv_show_branch = abap_true. + IF iv_branch IS INITIAL. + ro_html->add( render_branch_span( iv_branch = lo_repo_online->get_branch_name( ) + io_repo = lo_repo_online + iv_interactive = iv_interactive_branch ) ). + ELSE. + ro_html->add( render_branch_span( iv_branch = iv_branch + io_repo = lo_repo_online + iv_interactive = iv_interactive_branch ) ). + ENDIF. + ENDIF. + ENDIF. + + IF iv_show_package = abap_true. + ro_html->add_icon( iv_name = 'package/darkgrey' iv_hint = 'SAP package' ). + ro_html->add( '' ). + ro_html->add_a( iv_txt = io_repo->get_package( ) + iv_act = |{ gc_action-jump_pkg }?{ io_repo->get_package( ) }| ). + ro_html->add( '' ). + ENDIF. + + ro_html->add( '
' ). + + ENDMETHOD. + + METHOD render_item_state. + + DATA: lv_system TYPE string. + + FIELD-SYMBOLS TYPE char1. + + + rv_html = ''. + + DO 2 TIMES. + CASE sy-index. + WHEN 1. + ASSIGN iv1 TO . + lv_system = 'Local:'. + WHEN 2. + ASSIGN iv2 TO . + lv_system = 'Remote:'. + ENDCASE. + + CASE . + WHEN gc_state-unchanged. "None or unchanged + IF iv1 = gc_state-added OR iv2 = gc_state-added. + rv_html = rv_html && |X|. + ELSE. + rv_html = rv_html && | |. + ENDIF. + WHEN gc_state-modified. "Changed + rv_html = rv_html && |M|. + WHEN gc_state-added. "Added new + rv_html = rv_html && |A|. + WHEN gc_state-mixed. "Multiple changes (multifile) + rv_html = rv_html && ||. + WHEN gc_state-deleted. "Deleted + rv_html = rv_html && |D|. + ENDCASE. + ENDDO. + + rv_html = rv_html && ''. + + ENDMETHOD. "render_item_state + + METHOD render_branch_span. + + DATA: lv_text TYPE string, + lv_class TYPE string. + + lv_text = lcl_git_branch_list=>get_display_name( iv_branch ). + + IF iv_branch = io_repo->get_head_branch_name( ) + OR iv_branch = lcl_git_branch_list=>c_head_name. + lv_class = 'branch branch_head'. + ELSEIF lcl_git_branch_list=>get_type( iv_branch ) = lcl_git_branch_list=>c_type-branch. + lv_class = 'branch branch_branch'. + ELSE. + lv_class = 'branch'. + ENDIF. + + CREATE OBJECT ro_html. + ro_html->add( || ). + ro_html->add_icon( iv_name = 'git-branch/darkgrey' iv_hint = 'Current branch' ). + IF iv_interactive = abap_true. + ro_html->add_a( iv_act = |{ gc_action-git_branch_switch }?{ io_repo->get_key( ) }| + iv_txt = lv_text ). + ELSE. + ro_html->add( lv_text ). + ENDIF. + ro_html->add( '' ). + + ENDMETHOD. "render_branch_span + + METHOD render_error. + + DATA lv_error TYPE string. + + CREATE OBJECT ro_html. + + IF ix_error IS BOUND. + lv_error = ix_error->mv_text. + ELSE. + lv_error = iv_error. + ENDIF. + + ro_html->add( '
' ). + ro_html->add( |{ lcl_html=>icon( 'alert/red' ) } Error: { lv_error }| ). + ro_html->add( '
' ). + + ENDMETHOD. "render_error + +ENDCLASS. "lcl_gui_chunk_lib diff --git a/src/zabapgit_html_chunks.prog.xml b/src/zabapgit_html_chunks.prog.xml new file mode 100644 index 000000000..f469b1b49 --- /dev/null +++ b/src/zabapgit_html_chunks.prog.xml @@ -0,0 +1,22 @@ + + + + + + ZABAPGIT_HTML_CHUNKS + A + X + I + E + X + + + + R + Include ZABAPGIT_HTML_CHUNKS + 28 + + + + + diff --git a/src/zabapgit_http.prog.abap b/src/zabapgit_http.prog.abap index 1f08d18f5..b8e12a738 100644 --- a/src/zabapgit_http.prog.abap +++ b/src/zabapgit_http.prog.abap @@ -469,10 +469,10 @@ CLASS lcl_http IMPLEMENTATION. METHOD acquire_login_details. - DATA: lv_default_user TYPE string, - lv_user TYPE string, - lv_pass TYPE string, - lo_digest TYPE REF TO lcl_http_digest. + DATA: lv_default_user TYPE string, + lv_user TYPE string, + lv_pass TYPE string, + lo_digest TYPE REF TO lcl_http_digest. lv_default_user = lcl_app=>user( )->get_repo_username( iv_url ). @@ -480,10 +480,10 @@ CLASS lcl_http IMPLEMENTATION. lcl_password_dialog=>popup( EXPORTING - iv_repo_url = iv_url + iv_repo_url = iv_url CHANGING - cv_user = lv_user - cv_pass = lv_pass ). + cv_user = lv_user + cv_pass = lv_pass ). IF lv_user IS INITIAL. lcx_exception=>raise( 'HTTP 401, unauthorized' ). @@ -494,6 +494,14 @@ CLASS lcl_http IMPLEMENTATION. iv_username = lv_user ). ENDIF. + " Offer two factor authentication if it is available and required + lcl_2fa_authenticator_registry=>use_2fa_if_required( + EXPORTING + iv_url = iv_url + CHANGING + cv_username = lv_user + cv_password = lv_pass ). + rv_scheme = ii_client->response->get_header_field( 'www-authenticate' ). FIND REGEX '^(\w+)' IN rv_scheme SUBMATCHES rv_scheme. @@ -517,4 +525,4 @@ CLASS lcl_http IMPLEMENTATION. ENDMETHOD. "acquire_login_details -ENDCLASS. \ No newline at end of file +ENDCLASS. diff --git a/src/zabapgit_http.prog.xml b/src/zabapgit_http.prog.xml index e17d9183e..916ca0370 100644 --- a/src/zabapgit_http.prog.xml +++ b/src/zabapgit_http.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_HTTP A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_HTTP 21 - diff --git a/src/zabapgit_macros.prog.abap b/src/zabapgit_macros.prog.abap index 5bf603e19..ddb8c245e 100644 --- a/src/zabapgit_macros.prog.abap +++ b/src/zabapgit_macros.prog.abap @@ -20,4 +20,4 @@ DEFINE _object_check_timestamp. rv_changed = abap_true. RETURN. ENDIF. -END-OF-DEFINITION. \ No newline at end of file +END-OF-DEFINITION. diff --git a/src/zabapgit_macros.prog.xml b/src/zabapgit_macros.prog.xml index 0e9ebfa35..0859bb7e0 100644 --- a/src/zabapgit_macros.prog.xml +++ b/src/zabapgit_macros.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_MACROS A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_MACROS 23 - diff --git a/src/zabapgit_migrations.prog.abap b/src/zabapgit_migrations.prog.abap index a8f3f0aa0..cf708f7d1 100644 --- a/src/zabapgit_migrations.prog.abap +++ b/src/zabapgit_migrations.prog.abap @@ -46,7 +46,7 @@ CLASS lcl_migrations IMPLEMENTATION. " Ignore empty repos or repos with file checksums IF lines( ->get_local_checksums( ) ) = 0 - OR lines( ->get_local_checksums_per_file( ) ) > 0 . + OR lines( ->get_local_checksums_per_file( ) ) > 0. DELETE lt_repos INDEX lv_index. CONTINUE. ENDIF. @@ -61,13 +61,13 @@ CLASS lcl_migrations IMPLEMENTATION. SHIFT lv_repo_list BY 2 PLACES LEFT. " Remove leading ', ' - lv_question = 'abapGit wants to rebuild missing local checksums' - && ' (changes from 2016-12-11).' - && ' Generally this is safe except if there are both local ' - && ' and remote changes at the same time. If unsure, please' - && ' skip and update repos individually' - && ' by "Advances/Update local checksums" command.' - && | Repos affected: { lv_repo_list }|. + lv_question = 'abapGit wants to rebuild missing local checksums' + && ' (changes from 2016-12-11).' + && ' Generally this is safe except if there are both local ' + && ' and remote changes at the same time. If unsure, please' + && ' skip and update repos individually' + && ' by "Advances/Update local checksums" command.' + && | Repos affected: { lv_repo_list }|. lv_answer = lcl_popups=>popup_to_confirm( titlebar = 'Warning' @@ -90,4 +90,4 @@ CLASS lcl_migrations IMPLEMENTATION. ENDMETHOD. " rebuild_local_checksums_20161112. -ENDCLASS. "lcl_migrations \ No newline at end of file +ENDCLASS. "lcl_migrations diff --git a/src/zabapgit_migrations.prog.xml b/src/zabapgit_migrations.prog.xml index 69876d498..188245fd5 100644 --- a/src/zabapgit_migrations.prog.xml +++ b/src/zabapgit_migrations.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_MIGRATIONS A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_MIGRATIONS 27 - diff --git a/src/zabapgit_object_acid.prog.abap b/src/zabapgit_object_acid.prog.abap index efc47f9e1..24c2d9c50 100644 --- a/src/zabapgit_object_acid.prog.abap +++ b/src/zabapgit_object_acid.prog.abap @@ -71,7 +71,9 @@ CLASS lcl_object_acid IMPLEMENTATION. lo_aab = create_object( ). - lo_aab->get_descript( IMPORTING ex_descript = lv_description ). + lo_aab->get_descript( + IMPORTING ex_descript = lv_description + EXCEPTIONS no_description_found = 1 ). io_xml->add( iv_name = 'DESCRIPTION' ig_data = lv_description ). @@ -150,4 +152,4 @@ CLASS lcl_object_acid IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_acid IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_acid IMPLEMENTATION diff --git a/src/zabapgit_object_acid.prog.xml b/src/zabapgit_object_acid.prog.xml index 8c047a765..5d51af2d2 100644 --- a/src/zabapgit_object_acid.prog.xml +++ b/src/zabapgit_object_acid.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_ACID A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_ACID 28 - diff --git a/src/zabapgit_object_auth.prog.abap b/src/zabapgit_object_auth.prog.abap index f772b72ce..92b7a294f 100644 --- a/src/zabapgit_object_auth.prog.abap +++ b/src/zabapgit_object_auth.prog.abap @@ -123,4 +123,4 @@ CLASS lcl_object_auth IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_auth IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_auth IMPLEMENTATION diff --git a/src/zabapgit_object_auth.prog.xml b/src/zabapgit_object_auth.prog.xml index 9206032e1..e25a487be 100644 --- a/src/zabapgit_object_auth.prog.xml +++ b/src/zabapgit_object_auth.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_AUTH A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_AUTH 28 - diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap index 7dec96873..6aef8f77c 100644 --- a/src/zabapgit_object_clas.prog.abap +++ b/src/zabapgit_object_clas.prog.abap @@ -7,210 +7,421 @@ *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -INTERFACE lif_object_oriented_object. - METHODS: - create - IMPORTING - iv_package TYPE devclass - iv_overwrite TYPE seox_boolean DEFAULT seox_true - CHANGING - is_properties TYPE any - RAISING - lcx_exception, - generate_locals - IMPORTING - is_key TYPE seoclskey - iv_force TYPE seox_boolean DEFAULT seox_true - it_local_definitions TYPE seop_source_string OPTIONAL - it_local_implementations TYPE seop_source_string OPTIONAL - it_local_macros TYPE seop_source_string OPTIONAL - it_local_test_classes TYPE seop_source_string OPTIONAL - RAISING - lcx_exception, - deserialize_source - IMPORTING - is_key TYPE seoclskey - it_source TYPE ty_string_tt - RAISING - lcx_exception - cx_sy_dyn_call_error, - insert_text_pool - IMPORTING - iv_class_name TYPE seoclsname - it_text_pool TYPE textpool_table - iv_language TYPE spras - RAISING - lcx_exception, - update_descriptions - IMPORTING - is_key TYPE seoclskey - it_descriptions TYPE ty_seocompotx_tt, - add_to_activation_list - IMPORTING - is_item TYPE ty_item - RAISING - lcx_exception, - create_sotr - IMPORTING - iv_package TYPE devclass - it_sotr TYPE ty_sotr_tt - RAISING - lcx_exception, - create_documentation - IMPORTING - it_lines TYPE tlinetab - iv_object_name TYPE dokhl-object - iv_language TYPE spras - RAISING - lcx_exception. -ENDINTERFACE. +CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program. -CLASS lcl_object_oriented_base DEFINITION ABSTRACT. PUBLIC SECTION. - INTERFACES: lif_object_oriented_object. - PRIVATE SECTION. - METHODS deserialize_abap_source_old - IMPORTING is_clskey TYPE seoclskey - it_source TYPE ty_string_tt + INTERFACES lif_object. + ALIASES mo_files FOR lif_object~mo_files. + METHODS constructor + IMPORTING + is_item TYPE ty_item + iv_language TYPE spras. + + PROTECTED SECTION. + METHODS deserialize_abap + IMPORTING io_xml TYPE REF TO lcl_xml_input + iv_package TYPE devclass RAISING lcx_exception. - METHODS deserialize_abap_source_new - IMPORTING is_clskey TYPE seoclskey - it_source TYPE ty_string_tt - RAISING lcx_exception - cx_sy_dyn_call_error. -ENDCLASS. + METHODS deserialize_docu + IMPORTING io_xml TYPE REF TO lcl_xml_input + RAISING lcx_exception. + DATA mo_object_oriented_object_fct TYPE REF TO lif_object_oriented_object_fnc. + PRIVATE SECTION. + DATA mv_skip_testclass TYPE abap_bool. -CLASS lcl_object_oriented_base IMPLEMENTATION. + METHODS deserialize_tpool + IMPORTING io_xml TYPE REF TO lcl_xml_input + RAISING lcx_exception. - METHOD lif_object_oriented_object~create. - "Subclass responsibility - RETURN. - ENDMETHOD. + METHODS deserialize_sotr + IMPORTING io_xml TYPE REF TO lcl_xml_input + iv_package TYPE devclass + RAISING lcx_exception. - METHOD lif_object_oriented_object~deserialize_source. - TRY. - deserialize_abap_source_new( - is_clskey = is_key - it_source = it_source ). - CATCH cx_sy_dyn_call_error. - deserialize_abap_source_old( - is_clskey = is_key - it_source = it_source ). - ENDTRY. - ENDMETHOD. - METHOD lif_object_oriented_object~generate_locals. - "Subclass responsibility - RETURN. - ENDMETHOD. + METHODS serialize_xml + IMPORTING io_xml TYPE REF TO lcl_xml_output + RAISING lcx_exception. - METHOD deserialize_abap_source_old. - "for backwards compatability down to 702 - DATA: lo_source TYPE REF TO cl_oo_source. +ENDCLASS. "lcl_object_dtel DEFINITION - CREATE OBJECT lo_source - EXPORTING - clskey = is_clskey - EXCEPTIONS - class_not_existing = 1 - OTHERS = 2. +*----------------------------------------------------------------------* +* CLASS lcl_object_clas IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_clas IMPLEMENTATION. + + METHOD lif_object~has_changed_since. + DATA: + lt_includes TYPE seoincl_t. + + FIELD-SYMBOLS LIKE LINE OF lt_includes. + + lt_includes = mo_object_oriented_object_fct->get_includes( ms_item-obj_name ). + LOOP AT lt_includes ASSIGNING . + rv_changed = check_prog_changed_since( + iv_program = + iv_timestamp = iv_timestamp + iv_skip_gui = abap_true ). + IF rv_changed = abap_true. + RETURN. + ENDIF. + ENDLOOP. + ENDMETHOD. "lif_object~has_changed_since + + METHOD lif_object~get_metadata. + rs_metadata = get_metadata( ). + ENDMETHOD. "lif_object~get_metadata + + METHOD lif_object~changed_by. + + TYPES: BEGIN OF ty_includes, + programm TYPE programm, + END OF ty_includes. + + TYPES: BEGIN OF ty_reposrc, + unam TYPE reposrc-unam, + udat TYPE reposrc-udat, + utime TYPE reposrc-utime, + END OF ty_reposrc. + + DATA: lt_reposrc TYPE STANDARD TABLE OF ty_reposrc, + ls_reposrc LIKE LINE OF lt_reposrc, + lt_includes TYPE STANDARD TABLE OF ty_includes. + + lt_includes = mo_object_oriented_object_fct->get_includes( ms_item-obj_name ). + ASSERT lines( lt_includes ) > 0. + + SELECT unam udat utime FROM reposrc + INTO TABLE lt_reposrc + FOR ALL ENTRIES IN lt_includes + WHERE progname = lt_includes-programm + AND r3state = 'A'. IF sy-subrc <> 0. - lcx_exception=>raise( 'error from CL_OO_SOURCE' ). + rv_user = c_user_unknown. + ELSE. + SORT lt_reposrc BY udat DESCENDING utime DESCENDING. + READ TABLE lt_reposrc INDEX 1 INTO ls_reposrc. + ASSERT sy-subrc = 0. + rv_user = ls_reposrc-unam. ENDIF. - TRY. - lo_source->access_permission( seok_access_modify ). - lo_source->set_source( it_source ). - lo_source->save( ). - lo_source->access_permission( seok_access_free ). - CATCH cx_oo_access_permission. - lcx_exception=>raise( 'permission error' ). - CATCH cx_oo_source_save_failure. - lcx_exception=>raise( 'save failure' ). - ENDTRY. - ENDMETHOD. - METHOD deserialize_abap_source_new. - DATA: lo_factory TYPE REF TO object, - lo_source TYPE REF TO object. + METHOD lif_object~exists. + DATA: ls_class_key TYPE seoclskey. + ls_class_key-clsname = ms_item-obj_name. - CALL METHOD ('CL_OO_FACTORY')=>('CREATE_INSTANCE') - RECEIVING - result = lo_factory. + rv_bool = mo_object_oriented_object_fct->exists( iv_object_name = ls_class_key ). + ENDMETHOD. "lif_object~exists - CALL METHOD lo_factory->('CREATE_CLIF_SOURCE') + METHOD lif_object~jump. + CALL FUNCTION 'RS_TOOL_ACCESS' EXPORTING - clif_name = is_clskey-clsname - RECEIVING - result = lo_source. + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = 'CLAS' + in_new_window = abap_true. + ENDMETHOD. "jump - TRY. - CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~LOCK'). - CATCH cx_oo_access_permission. - lcx_exception=>raise( 'source_new, access permission exception' ). - ENDTRY. + METHOD lif_object~delete. + DATA: ls_clskey TYPE seoclskey. + ls_clskey-clsname = ms_item-obj_name. - CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SET_SOURCE') - EXPORTING - source = it_source. + mo_object_oriented_object_fct->delete( ls_clskey ). + ENDMETHOD. "delete - CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SAVE'). + METHOD lif_object~serialize. - CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~UNLOCK'). + DATA: lt_source TYPE seop_source_string, + ls_class_key TYPE seoclskey. - ENDMETHOD. - METHOD lif_object_oriented_object~add_to_activation_list. - lcl_objects_activation=>add_item( is_item ). - ENDMETHOD. + ls_class_key-clsname = ms_item-obj_name. - METHOD lif_object_oriented_object~update_descriptions. - DELETE FROM seocompotx WHERE clsname = is_key-clsname. - INSERT seocompotx FROM TABLE it_descriptions. - ENDMETHOD. - METHOD lif_object_oriented_object~insert_text_pool. - "Subclass responsibility - RETURN. - ENDMETHOD. - - METHOD lif_object_oriented_object~create_sotr. - "Subclass responsibility - RETURN. - ENDMETHOD. - - METHOD lif_object_oriented_object~create_documentation. - CALL FUNCTION 'DOCU_UPD' - EXPORTING - id = 'CL' - langu = iv_language - object = iv_object_name - TABLES - line = it_lines - EXCEPTIONS - ret_code = 1 - OTHERS = 2. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from DOCU_UPD' ). + IF lif_object~exists( ) = abap_false. + RETURN. ENDIF. + + CALL FUNCTION 'SEO_BUFFER_REFRESH' + EXPORTING + version = seoc_version_active + force = seox_true. + CALL FUNCTION 'SEO_BUFFER_REFRESH' + EXPORTING + version = seoc_version_inactive + force = seox_true. + + lt_source = mo_object_oriented_object_fct->serialize_abap( ls_class_key ). + + mo_files->add_abap( lt_source ). + + lt_source = mo_object_oriented_object_fct->serialize_abap( + is_class_key = ls_class_key + iv_type = seop_ext_class_locals_def ). + IF NOT lt_source[] IS INITIAL. + mo_files->add_abap( iv_extra = 'locals_def' + it_abap = lt_source ). "#EC NOTEXT + ENDIF. + + lt_source = mo_object_oriented_object_fct->serialize_abap( + is_class_key = ls_class_key + iv_type = seop_ext_class_locals_imp ). + IF NOT lt_source[] IS INITIAL. + mo_files->add_abap( iv_extra = 'locals_imp' + it_abap = lt_source ). "#EC NOTEXT + ENDIF. + + lt_source = mo_object_oriented_object_fct->serialize_abap( + is_class_key = ls_class_key + iv_type = seop_ext_class_testclasses ). + + mv_skip_testclass = mo_object_oriented_object_fct->get_skip_test_classes( ). + IF NOT lt_source[] IS INITIAL AND mv_skip_testclass = abap_false. + mo_files->add_abap( iv_extra = 'testclasses' + it_abap = lt_source ). "#EC NOTEXT + ENDIF. + + lt_source = mo_object_oriented_object_fct->serialize_abap( + is_class_key = ls_class_key + iv_type = seop_ext_class_macros ). + IF NOT lt_source[] IS INITIAL. + mo_files->add_abap( iv_extra = 'macros' + it_abap = lt_source ). "#EC NOTEXT + ENDIF. + + serialize_xml( io_xml ). + + ENDMETHOD. "serialize + + + + METHOD serialize_xml. + + DATA: ls_vseoclass TYPE vseoclass, + lt_tpool TYPE textpool_table, + lv_object TYPE dokhl-object, + lv_state TYPE dokhl-dokstate, + lt_descriptions TYPE ty_seocompotx_tt, + ls_clskey TYPE seoclskey, + lt_sotr TYPE ty_sotr_tt, + lt_lines TYPE tlinetab. + + + ls_clskey-clsname = ms_item-obj_name. + + ls_vseoclass = mo_object_oriented_object_fct->get_class_properties( is_class_key = ls_clskey ). + + CLEAR: ls_vseoclass-uuid, + ls_vseoclass-author, + ls_vseoclass-createdon, + ls_vseoclass-changedby, + ls_vseoclass-changedon, + ls_vseoclass-r3release, + ls_vseoclass-chgdanyby, + ls_vseoclass-chgdanyon. + + IF mv_skip_testclass = abap_true. + CLEAR ls_vseoclass-with_unit_tests. + ENDIF. + + io_xml->add( iv_name = 'VSEOCLASS' + ig_data = ls_vseoclass ). + + lt_tpool = mo_object_oriented_object_fct->read_text_pool( + iv_class_name = ls_clskey-clsname + iv_language = mv_language ). + io_xml->add( iv_name = 'TPOOL' + ig_data = add_tpool( lt_tpool ) ). + + IF ls_vseoclass-category = seoc_category_exception. + lt_sotr = mo_object_oriented_object_fct->read_sotr( ms_item-obj_name ). + IF lines( lt_sotr ) > 0. + io_xml->add( iv_name = 'SOTR' + ig_data = lt_sotr ). + ENDIF. + ENDIF. + + lt_lines = mo_object_oriented_object_fct->read_documentation( + iv_class_name = ls_clskey-clsname + iv_language = mv_language ). + IF lines( lt_lines ) > 0. + io_xml->add( iv_name = 'LINES' + ig_data = lt_lines ). + ENDIF. + + lt_descriptions = mo_object_oriented_object_fct->read_descriptions( ls_clskey-clsname ). + IF lines( lt_descriptions ) > 0. + io_xml->add( iv_name = 'DESCRIPTIONS' + ig_data = lt_descriptions ). + ENDIF. + + ENDMETHOD. "serialize_xml + + METHOD lif_object~deserialize. + deserialize_abap( io_xml = io_xml + iv_package = iv_package ). + + deserialize_tpool( io_xml ). + + deserialize_sotr( io_xml = io_xml + iv_package = iv_package ). + + deserialize_docu( io_xml ). + ENDMETHOD. "deserialize + + METHOD deserialize_sotr. + "OTR stands for Online Text Repository + DATA: lt_sotr TYPE ty_sotr_tt, + lt_objects TYPE sotr_objects. + + io_xml->read( EXPORTING iv_name = 'SOTR' + CHANGING cg_data = lt_sotr ). + + IF lines( lt_sotr ) = 0. + RETURN. + ENDIF. + + mo_object_oriented_object_fct->create_sotr( + iv_package = iv_package + it_sotr = lt_sotr ). ENDMETHOD. -ENDCLASS. + METHOD deserialize_docu. + + DATA: lt_lines TYPE tlinetab, + lv_object TYPE dokhl-object. + + io_xml->read( EXPORTING iv_name = 'LINES' + CHANGING cg_data = lt_lines ). + + IF lt_lines[] IS INITIAL. + RETURN. + ENDIF. + + lv_object = ms_item-obj_name. + + mo_object_oriented_object_fct->create_documentation( + it_lines = lt_lines + iv_object_name = lv_object + iv_language = mv_language ). + ENDMETHOD. + + METHOD deserialize_tpool. + + DATA: lv_clsname TYPE seoclsname, + lt_tpool_ext TYPE ty_tpool_tt, + lt_tpool TYPE textpool_table. + + + io_xml->read( EXPORTING iv_name = 'TPOOL' + CHANGING cg_data = lt_tpool_ext ). + lt_tpool = read_tpool( lt_tpool_ext ). + + IF lt_tpool[] IS INITIAL. + RETURN. + ENDIF. + + lv_clsname = ms_item-obj_name. + + mo_object_oriented_object_fct->insert_text_pool( + iv_class_name = lv_clsname + it_text_pool = lt_tpool + iv_language = mv_language ). + + ENDMETHOD. "deserialize_textpool + + METHOD deserialize_abap. + + DATA: ls_vseoclass TYPE vseoclass, + lt_source TYPE seop_source_string, + lt_local_definitions TYPE seop_source_string, + lt_local_implementations TYPE seop_source_string, + lt_local_macros TYPE seop_source_string, + lt_test_classes TYPE seop_source_string, + lt_descriptions TYPE ty_seocompotx_tt, + ls_class_key TYPE seoclskey. + + + lt_source = mo_files->read_abap( ). + + lt_local_definitions = mo_files->read_abap( iv_extra = 'locals_def' + iv_error = abap_false ). "#EC NOTEXT + + lt_local_implementations = mo_files->read_abap( iv_extra = 'locals_imp' + iv_error = abap_false ). "#EC NOTEXT + + lt_local_macros = mo_files->read_abap( iv_extra = 'macros' + iv_error = abap_false ). "#EC NOTEXT + + lt_test_classes = mo_files->read_abap( iv_extra = 'testclasses' + iv_error = abap_false ). "#EC NOTEXT + + ls_class_key-clsname = ms_item-obj_name. + + io_xml->read( EXPORTING iv_name = 'VSEOCLASS' + CHANGING cg_data = ls_vseoclass ). + + mo_object_oriented_object_fct->create( + EXPORTING + iv_package = iv_package + CHANGING + is_properties = ls_vseoclass ). + mo_object_oriented_object_fct->generate_locals( + is_key = ls_class_key + iv_force = seox_true + it_local_definitions = lt_local_definitions + it_local_implementations = lt_local_implementations + it_local_macros = lt_local_macros + it_local_test_classes = lt_test_classes ). + + mo_object_oriented_object_fct->deserialize_source( + is_key = ls_class_key + it_source = lt_source ). + + io_xml->read( EXPORTING iv_name = 'DESCRIPTIONS' + CHANGING cg_data = lt_descriptions ). + + mo_object_oriented_object_fct->update_descriptions( + is_key = ls_class_key + it_descriptions = lt_descriptions ). + + mo_object_oriented_object_fct->add_to_activation_list( is_item = ms_item ). + ENDMETHOD. "deserialize + + METHOD lif_object~compare_to_remote_version. + CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. + ENDMETHOD. + + METHOD constructor. + super->constructor( + is_item = is_item + iv_language = iv_language ). + mo_object_oriented_object_fct = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ). + ENDMETHOD. + +ENDCLASS. "lcl_object_CLAS IMPLEMENTATION CLASS lcl_object_oriented_class DEFINITION INHERITING FROM lcl_object_oriented_base. PUBLIC SECTION. METHODS: - lif_object_oriented_object~create REDEFINITION, - lif_object_oriented_object~generate_locals REDEFINITION, - lif_object_oriented_object~insert_text_pool REDEFINITION, - lif_object_oriented_object~create_sotr REDEFINITION. + lif_object_oriented_object_fnc~create REDEFINITION, + lif_object_oriented_object_fnc~generate_locals REDEFINITION, + lif_object_oriented_object_fnc~insert_text_pool REDEFINITION, + lif_object_oriented_object_fnc~create_sotr REDEFINITION, + lif_object_oriented_object_fnc~get_includes REDEFINITION, + lif_object_oriented_object_fnc~get_class_properties REDEFINITION, + lif_object_oriented_object_fnc~read_text_pool REDEFINITION, + lif_object_oriented_object_fnc~read_sotr REDEFINITION, + lif_object_oriented_object_fnc~delete REDEFINITION. ENDCLASS. CLASS lcl_object_oriented_class IMPLEMENTATION. - METHOD lif_object_oriented_object~create. + METHOD lif_object_oriented_object_fnc~create. CALL FUNCTION 'SEO_CLASS_CREATE_COMPLETE' EXPORTING devclass = iv_package @@ -229,7 +440,7 @@ CLASS lcl_object_oriented_class IMPLEMENTATION. lcx_exception=>raise( 'error from SEO_CLASS_CREATE_COMPLETE' ). ENDIF. ENDMETHOD. - METHOD lif_object_oriented_object~generate_locals. + METHOD lif_object_oriented_object_fnc~generate_locals. CALL FUNCTION 'SEO_CLASS_GENERATE_LOCALS' EXPORTING clskey = is_key @@ -248,7 +459,7 @@ CLASS lcl_object_oriented_class IMPLEMENTATION. lcx_exception=>raise( 'error from generate_locals' ). ENDIF. ENDMETHOD. - METHOD lif_object_oriented_object~insert_text_pool. + METHOD lif_object_oriented_object_fnc~insert_text_pool. DATA: lv_cp TYPE program. lv_cp = cl_oo_classname_service=>get_classpool_name( iv_class_name ). @@ -265,7 +476,7 @@ CLASS lcl_object_oriented_class IMPLEMENTATION. iv_name = lv_cp ). ENDMETHOD. - METHOD lif_object_oriented_object~create_sotr. + METHOD lif_object_oriented_object_fnc~create_sotr. DATA: lt_sotr TYPE ty_sotr_tt, lt_objects TYPE sotr_objects, ls_paket TYPE sotr_pack, @@ -325,609 +536,64 @@ CLASS lcl_object_oriented_class IMPLEMENTATION. ENDLOOP. ENDMETHOD. -ENDCLASS. - -CLASS lcl_object_oriented_interface DEFINITION - INHERITING FROM lcl_object_oriented_base. - PUBLIC SECTION. - METHODS: - lif_object_oriented_object~create REDEFINITION. -ENDCLASS. - -CLASS lcl_object_oriented_interface IMPLEMENTATION. - METHOD lif_object_oriented_object~create. - CALL FUNCTION 'SEO_INTERFACE_CREATE_COMPLETE' - EXPORTING - devclass = iv_package - overwrite = iv_overwrite - CHANGING - interface = is_properties - EXCEPTIONS - existing = 1 - is_class = 2 - db_error = 3 - component_error = 4 - no_access = 5 - other = 6 - OTHERS = 7. - IF sy-subrc <> 0. - lcx_exception=>raise( 'Error from SEO_INTERFACE_CREATE_COMPLETE' ). - ENDIF. - ENDMETHOD. -ENDCLASS. - -CLASS lth_oo_factory_injector DEFINITION DEFERRED. - -CLASS lcl_object_oriented_factory DEFINITION - FRIENDS lth_oo_factory_injector. - PUBLIC SECTION. - CLASS-METHODS: - make - IMPORTING - iv_object_type TYPE tadir-object - RETURNING - VALUE(ro_object_oriented_object) TYPE REF TO lif_object_oriented_object. - PRIVATE SECTION. - CLASS-DATA: - go_object_oriented_object TYPE REF TO lif_object_oriented_object. -ENDCLASS. -CLASS lcl_object_oriented_factory IMPLEMENTATION. - METHOD make. - IF go_object_oriented_object IS BOUND. - ro_object_oriented_object = go_object_oriented_object. - RETURN. - ENDIF. - IF iv_object_type = 'CLAS'. - CREATE OBJECT ro_object_oriented_object TYPE lcl_object_oriented_class. - ELSEIF iv_object_type = 'INTF'. - CREATE OBJECT ro_object_oriented_object TYPE lcl_object_oriented_interface. - ENDIF. - ENDMETHOD. -ENDCLASS. - -CLASS lth_oo_factory_injector DEFINITION FOR TESTING. - PUBLIC SECTION. - CLASS-METHODS: - inject - IMPORTING - io_object_oriented_object TYPE REF TO lif_object_oriented_object. -ENDCLASS. -CLASS lth_oo_factory_injector IMPLEMENTATION. - METHOD inject. - lcl_object_oriented_factory=>go_object_oriented_object = io_object_oriented_object. - ENDMETHOD. -ENDCLASS. - -CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program. - - PUBLIC SECTION. - INTERFACES lif_object. - ALIASES mo_files FOR lif_object~mo_files. - PROTECTED SECTION. - METHODS deserialize_abap - IMPORTING io_xml TYPE REF TO lcl_xml_input - iv_package TYPE devclass - RAISING lcx_exception. - - METHODS deserialize_docu - IMPORTING io_xml TYPE REF TO lcl_xml_input - RAISING lcx_exception. - DATA mo_object_oriented_object TYPE REF TO lif_object_oriented_object. - PRIVATE SECTION. - DATA mv_skip_testclass TYPE abap_bool. - - METHODS deserialize_tpool - IMPORTING io_xml TYPE REF TO lcl_xml_input - RAISING lcx_exception. - - METHODS deserialize_sotr - IMPORTING io_xml TYPE REF TO lcl_xml_input - iv_package TYPE devclass - RAISING lcx_exception. - - METHODS serialize_abap_old - IMPORTING is_clskey TYPE seoclskey - RETURNING VALUE(rt_source) TYPE ty_string_tt - RAISING lcx_exception. - - METHODS serialize_abap_new - IMPORTING is_clskey TYPE seoclskey - RETURNING VALUE(rt_source) TYPE ty_string_tt - RAISING lcx_exception - cx_sy_dyn_call_error. - - METHODS serialize_locals_imp - IMPORTING is_clskey TYPE seoclskey - RETURNING VALUE(rt_source) TYPE ty_string_tt - RAISING lcx_exception. - - METHODS serialize_locals_def - IMPORTING is_clskey TYPE seoclskey - RETURNING VALUE(rt_source) TYPE ty_string_tt - RAISING lcx_exception. - - METHODS read_include - IMPORTING is_clskey TYPE seoclskey - iv_type TYPE seop_include_ext_app - RETURNING VALUE(rt_source) TYPE seop_source_string. - - METHODS serialize_testclasses - IMPORTING is_clskey TYPE seoclskey - RETURNING VALUE(rt_source) TYPE ty_string_tt - RAISING lcx_exception. - - METHODS serialize_macros - IMPORTING is_clskey TYPE seoclskey - RETURNING VALUE(rt_source) TYPE ty_string_tt - RAISING lcx_exception. - - METHODS serialize_xml - IMPORTING io_xml TYPE REF TO lcl_xml_output - RAISING lcx_exception. - - METHODS read_sotr - RETURNING VALUE(rt_sotr) TYPE ty_sotr_tt - RAISING lcx_exception. - - METHODS remove_signatures - CHANGING ct_source TYPE ty_string_tt. - - METHODS reduce - CHANGING ct_source TYPE ty_string_tt. - - METHODS get_all_class_includes - RETURNING VALUE(rt_includes) TYPE seoincl_t. - -ENDCLASS. "lcl_object_dtel DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_object_clas IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_object_clas IMPLEMENTATION. - - METHOD get_all_class_includes. + METHOD lif_object_oriented_object_fnc~get_includes. * note: includes returned might not exist * method cl_oo_classname_service=>GET_ALL_CLASS_INCLUDES does not exist in 702 - DATA: lv_clsname TYPE seoclsname, - lt_methods TYPE seop_methods_w_include. + DATA: lv_class_name TYPE seoclsname, + lt_methods TYPE seop_methods_w_include. FIELD-SYMBOLS: LIKE LINE OF lt_methods. + lv_class_name = iv_object_name. - lv_clsname = ms_item-obj_name. + APPEND cl_oo_classname_service=>get_ccdef_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_ccmac_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_ccimp_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_cl_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_ccau_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_pubsec_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_prosec_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_prisec_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_classpool_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_ct_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_cs_name( lv_class_name ) TO rt_includes. - APPEND cl_oo_classname_service=>get_ccdef_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_ccmac_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_ccimp_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_cl_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_ccau_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_pubsec_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_prosec_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_prisec_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_classpool_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_ct_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_cs_name( lv_clsname ) TO rt_includes. - - lt_methods = cl_oo_classname_service=>get_all_method_includes( lv_clsname ). + lt_methods = cl_oo_classname_service=>get_all_method_includes( lv_class_name ). LOOP AT lt_methods ASSIGNING . APPEND -incname TO rt_includes. ENDLOOP. ENDMETHOD. - METHOD lif_object~has_changed_since. - - DATA: lv_clsname TYPE seoclsname, - lv_program TYPE program, - lt_incl TYPE seoincl_t. - - FIELD-SYMBOLS LIKE LINE OF lt_incl. - - lv_clsname = ms_item-obj_name. - - CASE ms_item-obj_type. - WHEN 'CLAS'. - TRY. - CALL METHOD cl_oo_classname_service=>('GET_ALL_CLASS_INCLUDES') - EXPORTING - class_name = lv_clsname - RECEIVING - result = lt_incl. - CATCH cx_sy_dyn_call_illegal_method. -* method does not exist in 702, just report everything as changed - rv_changed = abap_true. - ENDTRY. - LOOP AT lt_incl ASSIGNING . - rv_changed = check_prog_changed_since( - iv_program = - iv_timestamp = iv_timestamp - iv_skip_gui = abap_true ). - IF rv_changed = abap_true. - RETURN. - ENDIF. - ENDLOOP. - WHEN 'INTF'. - lv_program = cl_oo_classname_service=>get_interfacepool_name( lv_clsname ). - rv_changed = check_prog_changed_since( - iv_program = lv_program - iv_timestamp = iv_timestamp - iv_skip_gui = abap_true ). - WHEN OTHERS. - lcx_exception=>raise( 'class delete, unknown type' ). - ENDCASE. - - ENDMETHOD. "lif_object~has_changed_since - - METHOD lif_object~get_metadata. - rs_metadata = get_metadata( ). - ENDMETHOD. "lif_object~get_metadata - - METHOD lif_object~changed_by. - - TYPES: BEGIN OF ty_includes, - programm TYPE programm, - END OF ty_includes. - - TYPES: BEGIN OF ty_reposrc, - unam TYPE reposrc-unam, - udat TYPE reposrc-udat, - utime TYPE reposrc-utime, - END OF ty_reposrc. - - DATA: lt_reposrc TYPE STANDARD TABLE OF ty_reposrc, - ls_reposrc LIKE LINE OF lt_reposrc, - lt_includes TYPE STANDARD TABLE OF ty_includes, - lv_clsname TYPE seoclsname. - - - lv_clsname = ms_item-obj_name. - - CASE ms_item-obj_type. - WHEN 'CLAS'. - lt_includes = get_all_class_includes( ). - ASSERT lines( lt_includes ) > 0. - WHEN 'INTF'. - APPEND cl_oo_classname_service=>get_interfacepool_name( lv_clsname ) TO lt_includes. - WHEN OTHERS. - ASSERT 0 = 1. - ENDCASE. - - SELECT unam udat utime FROM reposrc - INTO TABLE lt_reposrc - FOR ALL ENTRIES IN lt_includes - WHERE progname = lt_includes-programm - AND r3state = 'A'. - IF sy-subrc <> 0. - rv_user = c_user_unknown. - ELSE. - SORT lt_reposrc BY udat DESCENDING utime DESCENDING. - READ TABLE lt_reposrc INDEX 1 INTO ls_reposrc. - ASSERT sy-subrc = 0. - rv_user = ls_reposrc-unam. - ENDIF. - - ENDMETHOD. - - METHOD lif_object~exists. - - DATA: ls_clskey TYPE seoclskey. - - - ls_clskey-clsname = ms_item-obj_name. - - CALL FUNCTION 'SEO_CLASS_EXISTENCE_CHECK' + METHOD lif_object_oriented_object_fnc~get_class_properties. + CALL FUNCTION 'SEO_CLIF_GET' EXPORTING - clskey = ls_clskey - EXCEPTIONS - not_specified = 1 - not_existing = 2 - is_interface = 3 - no_text = 4 - inconsistent = 5 - OTHERS = 6. - rv_bool = boolc( sy-subrc <> 2 ). - - ENDMETHOD. "lif_object~exists - - METHOD lif_object~jump. - - CALL FUNCTION 'RS_TOOL_ACCESS' - EXPORTING - operation = 'SHOW' - object_name = ms_item-obj_name - object_type = 'CLAS' - in_new_window = abap_true. - - ENDMETHOD. "jump - - METHOD lif_object~delete. - - DATA: ls_clskey TYPE seoclskey. - - - ls_clskey-clsname = ms_item-obj_name. - - CASE ms_item-obj_type. - WHEN 'CLAS'. - CALL FUNCTION 'SEO_CLASS_DELETE_COMPLETE' - EXPORTING - clskey = ls_clskey - EXCEPTIONS - not_existing = 1 - is_interface = 2 - db_error = 3 - no_access = 4 - other = 5 - OTHERS = 6. - IF sy-subrc <> 0. - lcx_exception=>raise( 'Error from SEO_CLASS_DELETE_COMPLETE' ). - ENDIF. - WHEN 'INTF'. - CALL FUNCTION 'SEO_INTERFACE_DELETE_COMPLETE' - EXPORTING - intkey = ls_clskey - EXCEPTIONS - not_existing = 1 - is_class = 2 - db_error = 3 - no_access = 4 - other = 5 - OTHERS = 6. - IF sy-subrc <> 0. - lcx_exception=>raise( 'Error from SEO_INTERFACE_DELETE_COMPLETE' ). - ENDIF. - WHEN OTHERS. - lcx_exception=>raise( 'class delete, unknown type' ). - ENDCASE. - - ENDMETHOD. "delete - - METHOD reduce. - - DATA: lv_source LIKE LINE OF ct_source, - lv_found TYPE sap_bool. - - -* skip files that only contain the standard comments - lv_found = abap_false. - LOOP AT ct_source INTO lv_source. - IF strlen( lv_source ) >= 3 AND lv_source(3) <> '*"*'. - lv_found = abap_true. - ENDIF. - ENDLOOP. - IF lv_found = abap_false. - CLEAR ct_source[]. - ENDIF. - - ENDMETHOD. "reduce - - METHOD serialize_locals_imp. - - rt_source = read_include( is_clskey = is_clskey - iv_type = seop_ext_class_locals_imp ). - - reduce( CHANGING ct_source = rt_source ). - - ENDMETHOD. "serialize_local - - METHOD serialize_locals_def. - - rt_source = read_include( is_clskey = is_clskey - iv_type = seop_ext_class_locals_def ). - - reduce( CHANGING ct_source = rt_source ). - - ENDMETHOD. "serialize_locals_def - - METHOD read_include. - - DATA: ls_include TYPE progstruc. - - - ASSERT iv_type = seop_ext_class_locals_def - OR iv_type = seop_ext_class_locals_imp - OR iv_type = seop_ext_class_macros - OR iv_type = seop_ext_class_testclasses. - - ls_include-rootname = is_clskey-clsname. - TRANSLATE ls_include-rootname USING ' ='. - ls_include-categorya = iv_type(1). - ls_include-codea = iv_type+1(4). - -* it looks like there is an issue in function module SEO_CLASS_GET_INCLUDE_SOURCE -* on 750 kernels, where the READ REPORT without STATE addition does not -* return the active version, this method is a workaround for this issue - READ REPORT ls_include INTO rt_source STATE 'A'. - - ENDMETHOD. - - METHOD serialize_testclasses. - - DATA: lv_line1 LIKE LINE OF rt_source, - lv_line2 LIKE LINE OF rt_source. - - - rt_source = read_include( is_clskey = is_clskey - iv_type = seop_ext_class_testclasses ). - -* when creating classes in Eclipse it automatically generates the -* testclass include, but it is not needed, so skip to avoid -* creating an extra file in the repository. -* Also remove it if the content is manually removed, but -* the class still thinks it contains tests - mv_skip_testclass = abap_false. - IF lines( rt_source ) = 2. - READ TABLE rt_source INDEX 1 INTO lv_line1. - ASSERT sy-subrc = 0. - READ TABLE rt_source INDEX 2 INTO lv_line2. - ASSERT sy-subrc = 0. - IF lv_line1(3) = '*"*' AND lv_line2 IS INITIAL. - mv_skip_testclass = abap_true. - ENDIF. - ELSEIF lines( rt_source ) = 1. - READ TABLE rt_source INDEX 1 INTO lv_line1. - ASSERT sy-subrc = 0. - IF lv_line1(3) = '*"*' OR lv_line1 IS INITIAL. - mv_skip_testclass = abap_true. - ENDIF. - ELSEIF lines( rt_source ) = 0. - mv_skip_testclass = abap_true. - ENDIF. - - ENDMETHOD. "serialize_test - - METHOD serialize_macros. - - rt_source = read_include( is_clskey = is_clskey - iv_type = seop_ext_class_macros ). - - reduce( CHANGING ct_source = rt_source ). - - ENDMETHOD. "serialize_macro - - METHOD serialize_abap_old. -* for old ABAP AS versions - DATA: lo_source TYPE REF TO cl_oo_source. - - - CREATE OBJECT lo_source - EXPORTING - clskey = is_clskey - EXCEPTIONS - class_not_existing = 1 - OTHERS = 2. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from CL_OO_SOURCE' ). - ENDIF. - - lo_source->read( 'A' ). - rt_source = lo_source->get_old_source( ). - remove_signatures( CHANGING ct_source = rt_source ). - - ENDMETHOD. "serialize_abap - - METHOD serialize_abap_new. - - DATA: lo_source TYPE REF TO object, - lo_instance TYPE REF TO object. - -* do not call the class/methods statically, as it will -* give syntax errors on old versions - CALL METHOD ('CL_OO_FACTORY')=>('CREATE_INSTANCE') - RECEIVING - result = lo_instance. - - CALL METHOD lo_instance->('CREATE_CLIF_SOURCE') - EXPORTING - clif_name = is_clskey-clsname - version = 'A' - RECEIVING - result = lo_source. - - CALL METHOD lo_source->('GET_SOURCE') + cifkey = is_class_key + version = seoc_version_active IMPORTING - source = rt_source. - + class = rs_class_properties + EXCEPTIONS + not_existing = 1 + deleted = 2 + model_only = 3 + OTHERS = 4. + IF sy-subrc = 1. + RETURN. " in case only inactive version exists + ELSEIF sy-subrc <> 0. + lcx_exception=>raise( 'error from seo_clif_get' ). + ENDIF. ENDMETHOD. - METHOD remove_signatures. + METHOD lif_object_oriented_object_fnc~read_text_pool. + DATA: + lv_cp TYPE program. -* signatures messes up in CL_OO_SOURCE when deserializing and serializing -* within same session - - DATA: lv_begin TYPE string, - lv_end TYPE string, - lv_remove TYPE sap_bool, - lv_source LIKE LINE OF ct_source. - - - CONCATENATE '* ------------------------------------' - '---------------------------------------------------+' - INTO lv_begin. - - CONCATENATE '* +------------------------------------------------' - '--------------------------------------' - INTO lv_end. - - lv_remove = abap_false. - LOOP AT ct_source INTO lv_source. - IF lv_source = lv_begin. - lv_remove = abap_true. - ENDIF. - IF lv_remove = abap_true. - DELETE ct_source INDEX sy-tabix. - ENDIF. - IF lv_source = lv_end. - lv_remove = abap_false. - ENDIF. - ENDLOOP. - - ENDMETHOD. "remove_signatures - - METHOD lif_object~serialize. - - DATA: lt_source TYPE seop_source_string, - ls_clskey TYPE seoclskey. - - - ls_clskey-clsname = ms_item-obj_name. - - IF lif_object~exists( ) = abap_false. - RETURN. - ENDIF. - - CALL FUNCTION 'SEO_BUFFER_REFRESH' - EXPORTING - version = seoc_version_active - force = seox_true. - CALL FUNCTION 'SEO_BUFFER_REFRESH' - EXPORTING - version = seoc_version_inactive - force = seox_true. - - TRY. - lt_source = serialize_abap_new( ls_clskey ). - CATCH cx_sy_dyn_call_error. - lt_source = serialize_abap_old( ls_clskey ). - ENDTRY. - - mo_files->add_abap( lt_source ). - - IF ms_item-obj_type = 'CLAS'. - lt_source = serialize_locals_def( ls_clskey ). - IF NOT lt_source[] IS INITIAL. - mo_files->add_abap( iv_extra = 'locals_def' - it_abap = lt_source ). "#EC NOTEXT - ENDIF. - - lt_source = serialize_locals_imp( ls_clskey ). - IF NOT lt_source[] IS INITIAL. - mo_files->add_abap( iv_extra = 'locals_imp' - it_abap = lt_source ). "#EC NOTEXT - ENDIF. - - lt_source = serialize_testclasses( ls_clskey ). - IF NOT lt_source[] IS INITIAL AND mv_skip_testclass = abap_false. - mo_files->add_abap( iv_extra = 'testclasses' - it_abap = lt_source ). "#EC NOTEXT - ENDIF. - - lt_source = serialize_macros( ls_clskey ). - IF NOT lt_source[] IS INITIAL. - mo_files->add_abap( iv_extra = 'macros' - it_abap = lt_source ). "#EC NOTEXT - ENDIF. - ENDIF. - - serialize_xml( io_xml ). - - ENDMETHOD. "serialize - - METHOD read_sotr. + lv_cp = cl_oo_classname_service=>get_classpool_name( iv_class_name ). + READ TEXTPOOL lv_cp INTO rt_text_pool LANGUAGE iv_language. "#EC CI_READ_REP + ENDMETHOD. + METHOD lif_object_oriented_object_fnc~read_sotr. DATA: lv_concept TYPE sotr_head-concept, lt_seocompodf TYPE STANDARD TABLE OF seocompodf WITH DEFAULT KEY, ls_header TYPE sotr_head, @@ -940,7 +606,7 @@ CLASS lcl_object_clas IMPLEMENTATION. SELECT * FROM seocompodf INTO TABLE lt_seocompodf - WHERE clsname = ms_item-obj_name + WHERE clsname = iv_object_name AND version = '1' AND exposure = '2' AND attdecltyp = '2' @@ -962,7 +628,7 @@ CLASS lcl_object_clas IMPLEMENTATION. no_entry_found = 1 OTHERS = 2. IF sy-subrc <> 0. - lcx_exception=>raise( 'error from SOTR_GET_CONCEPT' ). + CONTINUE. ENDIF. CLEAR: ls_header-paket, @@ -984,317 +650,22 @@ CLASS lcl_object_clas IMPLEMENTATION. -entries = lt_entries. ENDLOOP. - ENDMETHOD. - METHOD serialize_xml. - - DATA: ls_vseoclass TYPE vseoclass, - lv_cp TYPE program, - lt_tpool TYPE textpool_table, - lv_object TYPE dokhl-object, - lv_state TYPE dokhl-dokstate, - lt_descriptions TYPE ty_seocompotx_tt, - ls_vseointerf TYPE vseointerf, - ls_clskey TYPE seoclskey, - lt_sotr TYPE ty_sotr_tt, - lt_lines TYPE tlinetab. - - - ls_clskey-clsname = ms_item-obj_name. - - CALL FUNCTION 'SEO_CLIF_GET' + METHOD lif_object_oriented_object_fnc~delete. + CALL FUNCTION 'SEO_CLASS_DELETE_COMPLETE' EXPORTING - cifkey = ls_clskey - version = seoc_version_active - IMPORTING - class = ls_vseoclass - interface = ls_vseointerf + clskey = is_deletion_key EXCEPTIONS not_existing = 1 - deleted = 2 - model_only = 3 - OTHERS = 4. - IF sy-subrc = 1. - RETURN. " in case only inactive version exists - ELSEIF sy-subrc <> 0. - lcx_exception=>raise( 'error from seo_clif_get' ). + is_interface = 2 + db_error = 3 + no_access = 4 + other = 5 + OTHERS = 6. + IF sy-subrc <> 0. + lcx_exception=>raise( 'Error from SEO_CLASS_DELETE_COMPLETE' ). ENDIF. - - CLEAR: ls_vseoclass-uuid, - ls_vseoclass-author, - ls_vseoclass-createdon, - ls_vseoclass-changedby, - ls_vseoclass-changedon, - ls_vseoclass-r3release, - ls_vseoclass-chgdanyby, - ls_vseoclass-chgdanyon. - - IF mv_skip_testclass = abap_true. - CLEAR ls_vseoclass-with_unit_tests. - ENDIF. - - CLEAR: ls_vseointerf-uuid, - ls_vseointerf-author, - ls_vseointerf-createdon, - ls_vseointerf-changedby, - ls_vseointerf-changedon, - ls_vseointerf-r3release. - - CASE ms_item-obj_type. - WHEN 'CLAS'. - io_xml->add( iv_name = 'VSEOCLASS' - ig_data = ls_vseoclass ). - - lv_cp = cl_oo_classname_service=>get_classpool_name( ls_clskey-clsname ). - READ TEXTPOOL lv_cp INTO lt_tpool LANGUAGE mv_language. "#EC CI_READ_REP - io_xml->add( iv_name = 'TPOOL' - ig_data = add_tpool( lt_tpool ) ). - - IF ls_vseoclass-category = seoc_category_exception. - lt_sotr = read_sotr( ). - IF lines( lt_sotr ) > 0. - io_xml->add( iv_name = 'SOTR' - ig_data = lt_sotr ). - ENDIF. - ENDIF. - WHEN 'INTF'. - io_xml->add( iv_name = 'VSEOINTERF' - ig_data = ls_vseointerf ). - WHEN OTHERS. - ASSERT 0 = 1. - ENDCASE. - - lv_object = ls_clskey-clsname. - CALL FUNCTION 'DOCU_GET' - EXPORTING - id = 'CL' - langu = mv_language - object = lv_object - IMPORTING - dokstate = lv_state - TABLES - line = lt_lines - EXCEPTIONS - no_docu_on_screen = 1 - no_docu_self_def = 2 - no_docu_temp = 3 - ret_code = 4 - OTHERS = 5. - IF sy-subrc = 0 AND lv_state = 'R'. - io_xml->add( iv_name = 'LINES' - ig_data = lt_lines ). - ENDIF. - - SELECT * FROM seocompotx INTO TABLE lt_descriptions - WHERE clsname = ls_clskey-clsname. - DELETE lt_descriptions WHERE descript IS INITIAL. - IF lines( lt_descriptions ) > 0. - io_xml->add( iv_name = 'DESCRIPTIONS' - ig_data = lt_descriptions ). - ENDIF. - - ENDMETHOD. "serialize_xml - - METHOD lif_object~deserialize. - - mo_object_oriented_object = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ). - - deserialize_abap( io_xml = io_xml - iv_package = iv_package ). - - deserialize_tpool( io_xml ). - - deserialize_sotr( io_xml = io_xml - iv_package = iv_package ). - - deserialize_docu( io_xml ). - ENDMETHOD. "deserialize - - METHOD deserialize_sotr. - "OTR stands for Online Text Repository - DATA: lt_sotr TYPE ty_sotr_tt, - lt_objects TYPE sotr_objects, - ls_paket TYPE sotr_pack, - lv_object LIKE LINE OF lt_objects. - - FIELD-SYMBOLS: LIKE LINE OF lt_sotr. - - - io_xml->read( EXPORTING iv_name = 'SOTR' - CHANGING cg_data = lt_sotr ). - - IF lines( lt_sotr ) = 0. - RETURN. - ENDIF. - - mo_object_oriented_object->create_sotr( - iv_package = iv_package - it_sotr = lt_sotr ). ENDMETHOD. - METHOD deserialize_docu. - - DATA: lt_lines TYPE tlinetab, - lv_object TYPE dokhl-object. - - io_xml->read( EXPORTING iv_name = 'LINES' - CHANGING cg_data = lt_lines ). - - IF lt_lines[] IS INITIAL. - RETURN. - ENDIF. - - lv_object = ms_item-obj_name. - - mo_object_oriented_object->create_documentation( - it_lines = lt_lines - iv_object_name = lv_object - iv_language = mv_language ). - ENDMETHOD. "deserialize_doku - - METHOD deserialize_tpool. - - DATA: lv_cp TYPE program, - lv_clsname TYPE seoclsname, - lt_tpool_ext TYPE ty_tpool_tt, - lt_tpool TYPE textpool_table. - - - io_xml->read( EXPORTING iv_name = 'TPOOL' - CHANGING cg_data = lt_tpool_ext ). - lt_tpool = read_tpool( lt_tpool_ext ). - - IF lt_tpool[] IS INITIAL. - RETURN. - ENDIF. - - lv_clsname = ms_item-obj_name. - - mo_object_oriented_object->insert_text_pool( - iv_class_name = lv_clsname - it_text_pool = lt_tpool - iv_language = mv_language ). - - ENDMETHOD. "deserialize_textpool - - METHOD deserialize_abap. - - DATA: ls_vseoclass TYPE vseoclass, - lt_source TYPE seop_source_string, - lt_local_definitions TYPE seop_source_string, - lt_local_implementations TYPE seop_source_string, - lt_local_macros TYPE seop_source_string, - lt_test_classes TYPE seop_source_string, - lt_descriptions TYPE ty_seocompotx_tt, - ls_class_key TYPE seoclskey. - - - lt_source = mo_files->read_abap( ). - - lt_local_definitions = mo_files->read_abap( iv_extra = 'locals_def' - iv_error = abap_false ). "#EC NOTEXT - - lt_local_implementations = mo_files->read_abap( iv_extra = 'locals_imp' - iv_error = abap_false ). "#EC NOTEXT - - lt_local_macros = mo_files->read_abap( iv_extra = 'macros' - iv_error = abap_false ). "#EC NOTEXT - - lt_test_classes = mo_files->read_abap( iv_extra = 'testclasses' - iv_error = abap_false ). "#EC NOTEXT - - ls_class_key-clsname = ms_item-obj_name. - - io_xml->read( EXPORTING iv_name = 'VSEOCLASS' - CHANGING cg_data = ls_vseoclass ). - - mo_object_oriented_object->create( - EXPORTING - iv_package = iv_package - CHANGING - is_properties = ls_vseoclass ). - mo_object_oriented_object->generate_locals( - is_key = ls_class_key - iv_force = seox_true - it_local_definitions = lt_local_definitions - it_local_implementations = lt_local_implementations - it_local_macros = lt_local_macros - it_local_test_classes = lt_test_classes ). - - mo_object_oriented_object->deserialize_source( - is_key = ls_class_key - it_source = lt_source ). - - io_xml->read( EXPORTING iv_name = 'DESCRIPTIONS' - CHANGING cg_data = lt_descriptions ). - - mo_object_oriented_object->update_descriptions( - is_key = ls_class_key - it_descriptions = lt_descriptions ). - - mo_object_oriented_object->add_to_activation_list( is_item = ms_item ). - ENDMETHOD. "deserialize - - METHOD lif_object~compare_to_remote_version. - CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. - ENDMETHOD. - -ENDCLASS. "lcl_object_CLAS IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_object_intf DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_object_intf DEFINITION INHERITING FROM lcl_object_clas FINAL. -* todo, CLAS + INTF to be refactored, see: -* https://github.com/larshp/abapGit/issues/21 - PUBLIC SECTION. - METHODS: - lif_object~deserialize REDEFINITION. - PROTECTED SECTION. - METHODS: - deserialize_abap REDEFINITION. -ENDCLASS. "lcl_object_intf DEFINITION -CLASS lcl_object_intf IMPLEMENTATION. - METHOD lif_object~deserialize. - mo_object_oriented_object = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ). - - deserialize_abap( io_xml = io_xml - iv_package = iv_package ). - - deserialize_docu( io_xml ). - ENDMETHOD. - METHOD deserialize_abap. - DATA: ls_vseointerf TYPE vseointerf, - lt_source TYPE seop_source_string, - lt_descriptions TYPE ty_seocompotx_tt, - ls_clskey TYPE seoclskey. - ls_clskey-clsname = ms_item-obj_name. - - lt_source = mo_files->read_abap( ). - - io_xml->read( EXPORTING iv_name = 'VSEOINTERF' - CHANGING cg_data = ls_vseointerf ). - - mo_object_oriented_object->create( - EXPORTING - iv_package = iv_package - CHANGING - is_properties = ls_vseointerf ). - - mo_object_oriented_object->deserialize_source( - is_key = ls_clskey - it_source = lt_source ). - - io_xml->read( EXPORTING iv_name = 'DESCRIPTIONS' - CHANGING cg_data = lt_descriptions ). - - mo_object_oriented_object->update_descriptions( - is_key = ls_clskey - it_descriptions = lt_descriptions ). - - mo_object_oriented_object->add_to_activation_list( is_item = ms_item ). - ENDMETHOD. -ENDCLASS. \ No newline at end of file +ENDCLASS. diff --git a/src/zabapgit_object_clas.prog.xml b/src/zabapgit_object_clas.prog.xml index 5b52c65de..7299c946b 100644 --- a/src/zabapgit_object_clas.prog.xml +++ b/src/zabapgit_object_clas.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_CLAS A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_CLAS 28 - diff --git a/src/zabapgit_object_doct.prog.abap b/src/zabapgit_object_doct.prog.abap index 76ed284a4..250730cd6 100644 --- a/src/zabapgit_object_doct.prog.abap +++ b/src/zabapgit_object_doct.prog.abap @@ -155,4 +155,4 @@ CLASS lcl_object_doct IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_msag IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_msag IMPLEMENTATION diff --git a/src/zabapgit_object_doct.prog.xml b/src/zabapgit_object_doct.prog.xml index 6cf5b9d7b..1a330c342 100644 --- a/src/zabapgit_object_doct.prog.xml +++ b/src/zabapgit_object_doct.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_DOCT A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_DOCT 28 - diff --git a/src/zabapgit_object_docv.prog.abap b/src/zabapgit_object_docv.prog.abap index c54655a2e..ef3374284 100644 --- a/src/zabapgit_object_docv.prog.abap +++ b/src/zabapgit_object_docv.prog.abap @@ -159,4 +159,4 @@ CLASS lcl_object_docv IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_msag IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_msag IMPLEMENTATION diff --git a/src/zabapgit_object_docv.prog.xml b/src/zabapgit_object_docv.prog.xml index 89a002ba1..f35b5a0a3 100644 --- a/src/zabapgit_object_docv.prog.xml +++ b/src/zabapgit_object_docv.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_DOCV A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_DOCT 28 - diff --git a/src/zabapgit_object_doma.prog.abap b/src/zabapgit_object_doma.prog.abap index 1864422a2..53eacb1c6 100644 --- a/src/zabapgit_object_doma.prog.abap +++ b/src/zabapgit_object_doma.prog.abap @@ -80,6 +80,7 @@ CLASS lcl_object_doma IMPLEMENTATION. METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). + rs_metadata-ddic = abap_true. ENDMETHOD. "lif_object~get_metadata METHOD lif_object~exists. @@ -128,9 +129,10 @@ CLASS lcl_object_doma IMPLEMENTATION. METHOD lif_object~serialize. - DATA: lv_name TYPE ddobjname, - ls_dd01v TYPE dd01v, - lt_dd07v TYPE TABLE OF dd07v. + DATA: lv_name TYPE ddobjname, + ls_dd01v TYPE dd01v, + lv_masklen TYPE c LENGTH 4, + lt_dd07v TYPE TABLE OF dd07v. lv_name = ms_item-obj_name. @@ -154,6 +156,16 @@ CLASS lcl_object_doma IMPLEMENTATION. ls_dd01v-as4date, ls_dd01v-as4time. +* make sure XML serialization does not dump if the field contains invalid data +* note that this is a N field, so '' is not valid + IF ls_dd01v-authclass = ''. + CLEAR ls_dd01v-authclass. + ENDIF. + lv_masklen = ls_dd01v-masklen. + IF lv_masklen = '' OR NOT lv_masklen CO '0123456789'. + CLEAR ls_dd01v-masklen. + ENDIF. + io_xml->add( iv_name = 'DD01V' ig_data = ls_dd01v ). io_xml->add( iv_name = 'DD07V_TAB' @@ -351,4 +363,4 @@ CLASS lcl_object_doma IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_doma IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_doma IMPLEMENTATION diff --git a/src/zabapgit_object_doma.prog.xml b/src/zabapgit_object_doma.prog.xml index fe2045f3b..c9433ef8d 100644 --- a/src/zabapgit_object_doma.prog.xml +++ b/src/zabapgit_object_doma.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_DOMA A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_DOMA 28 - diff --git a/src/zabapgit_object_dtel.prog.abap b/src/zabapgit_object_dtel.prog.abap index 024786107..bb8cf957f 100644 --- a/src/zabapgit_object_dtel.prog.abap +++ b/src/zabapgit_object_dtel.prog.abap @@ -73,6 +73,7 @@ CLASS lcl_object_dtel IMPLEMENTATION. METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). + rs_metadata-ddic = abap_true. ENDMETHOD. "lif_object~get_metadata METHOD lif_object~exists. @@ -158,6 +159,14 @@ CLASS lcl_object_dtel IMPLEMENTATION. ls_dd04v-entitytab. ENDIF. + IF ls_dd04v-routputlen = ''. +* numeric field, make sure it is initial or XML serilization will dump + CLEAR ls_dd04v-routputlen. + ENDIF. + IF ls_dd04v-authclass = ''. + CLEAR ls_dd04v-authclass. + ENDIF. + io_xml->add( iv_name = 'DD04V' ig_data = ls_dd04v ). io_xml->add( iv_name = 'TPARA' @@ -232,7 +241,7 @@ CLASS lcl_object_dtel IMPLEMENTATION. langu = IMPORTING dd04v_wa = ls_dd04v -* tpara_wa = ls_tpara +* tpara_wa = ls_tpara EXCEPTIONS illegal_input = 1 OTHERS = 2. @@ -310,4 +319,4 @@ CLASS lcl_object_dtel IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_dtel IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_dtel IMPLEMENTATION diff --git a/src/zabapgit_object_dtel.prog.xml b/src/zabapgit_object_dtel.prog.xml index f27be3dc9..7993eff31 100644 --- a/src/zabapgit_object_dtel.prog.xml +++ b/src/zabapgit_object_dtel.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_DTEL A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_DTEL 28 - diff --git a/src/zabapgit_object_enho.prog.abap b/src/zabapgit_object_enho.prog.abap index 95ba504f9..4df55118e 100644 --- a/src/zabapgit_object_enho.prog.abap +++ b/src/zabapgit_object_enho.prog.abap @@ -2,211 +2,378 @@ *& Include ZABAPGIT_OBJECT_ENHO *&---------------------------------------------------------------------* +* For complete list of tool_type - see ENHTOOLS table + +INTERFACE lif_object_enho. + + METHODS: + deserialize + IMPORTING io_xml TYPE REF TO lcl_xml_input + iv_package TYPE devclass + RAISING lcx_exception, + serialize + IMPORTING io_xml TYPE REF TO lcl_xml_output + ii_enh_tool TYPE REF TO if_enh_tool + RAISING lcx_exception. + +ENDINTERFACE. "lif_object_enho + *----------------------------------------------------------------------* -* CLASS lcl_object_enho DEFINITION +* CLASS lcl_object_enho_wdyconf DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -CLASS lcl_object_enho DEFINITION INHERITING FROM lcl_objects_super FINAL. -* For complete list of tool_type - see ENHTOOLS table +CLASS lcl_object_enho_wdyconf DEFINITION. + PUBLIC SECTION. - INTERFACES lif_object. - ALIASES mo_files FOR lif_object~mo_files. + METHODS: constructor + IMPORTING + is_item TYPE ty_item + io_files TYPE REF TO lcl_objects_files. + INTERFACES: lif_object_enho. PRIVATE SECTION. - TYPES: BEGIN OF ty_spaces, - full_name TYPE string. - TYPES: spaces TYPE STANDARD TABLE OF i WITH DEFAULT KEY, - END OF ty_spaces. + DATA: ms_item TYPE ty_item, + mo_files TYPE REF TO lcl_objects_files. - TYPES: ty_spaces_tt TYPE STANDARD TABLE OF ty_spaces WITH DEFAULT KEY. - - METHODS deserialize_badi - IMPORTING io_xml TYPE REF TO lcl_xml_input - iv_package TYPE devclass - RAISING lcx_exception. - METHODS deserialize_hook - IMPORTING io_xml TYPE REF TO lcl_xml_input - iv_package TYPE devclass - RAISING lcx_exception. - - METHODS serialize_badi - IMPORTING io_xml TYPE REF TO lcl_xml_output - iv_tool TYPE enhtooltype - ii_enh_tool TYPE REF TO if_enh_tool - RAISING lcx_exception. - METHODS serialize_hook - IMPORTING io_xml TYPE REF TO lcl_xml_output - iv_tool TYPE enhtooltype - ii_enh_tool TYPE REF TO if_enh_tool - RAISING lcx_exception. - - METHODS hook_impl_serialize - EXPORTING et_spaces TYPE ty_spaces_tt - CHANGING ct_impl TYPE enh_hook_impl_it - RAISING lcx_exception. - METHODS hook_impl_deserialize - IMPORTING it_spaces TYPE ty_spaces_tt - CHANGING ct_impl TYPE enh_hook_impl_it - RAISING lcx_exception. - -ENDCLASS. "lcl_object_enho DEFINITION +ENDCLASS. "lcl_object_enho_wdyconf DEFINITION *----------------------------------------------------------------------* -* CLASS lcl_object_enho IMPLEMENTATION +* CLASS lcl_object_enho_wdyconf IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -CLASS lcl_object_enho IMPLEMENTATION. +CLASS lcl_object_enho_wdyconf IMPLEMENTATION. - METHOD lif_object~has_changed_since. - rv_changed = abap_true. - ENDMETHOD. "lif_object~has_changed_since + METHOD constructor. + ms_item = is_item. + mo_files = io_files. + ENDMETHOD. "constructor - METHOD lif_object~get_metadata. - rs_metadata = get_metadata( ). - ENDMETHOD. "lif_object~get_metadata + METHOD lif_object_enho~deserialize. - METHOD lif_object~changed_by. - rv_user = c_user_unknown. " todo - ENDMETHOD. - - METHOD hook_impl_serialize. -* handle normalization of XML values -* i.e. remove leading spaces - - FIELD-SYMBOLS: LIKE LINE OF ct_impl, - LIKE LINE OF et_spaces, - TYPE i, - TYPE string. + DATA: lv_enhname TYPE enhname, + lo_wdyconf TYPE REF TO cl_wdr_cfg_enhancement, + li_tool TYPE REF TO if_enh_tool, + ls_obj TYPE wdy_config_key, + lv_package TYPE devclass. - LOOP AT ct_impl ASSIGNING . - APPEND INITIAL LINE TO et_spaces ASSIGNING . - -full_name = -full_name. - LOOP AT -source ASSIGNING . - APPEND INITIAL LINE TO -spaces ASSIGNING . - WHILE strlen( ) >= 1 AND (1) = ` `. - = +1. - = + 1. - ENDWHILE. - ENDLOOP. - ENDLOOP. - ENDMETHOD. + io_xml->read( EXPORTING iv_name = 'ORIGINAL_OBJECT' + CHANGING cg_data = ls_obj ). - METHOD hook_impl_deserialize. + lv_enhname = ms_item-obj_name. + lv_package = iv_package. + TRY. + cl_enh_factory=>create_enhancement( + EXPORTING + enhname = lv_enhname + enhtype = '' + enhtooltype = cl_wdr_cfg_enhancement=>tooltype + IMPORTING + enhancement = li_tool + CHANGING + devclass = lv_package ). + lo_wdyconf ?= li_tool. - FIELD-SYMBOLS: LIKE LINE OF ct_impl, - TYPE string, - TYPE i, - LIKE LINE OF it_spaces. +* todo +* io_xml->read_xml() +* CL_WDR_CFG_PERSISTENCE_UTILS=>COMP_XML_TO_TABLES( ) +* lo_wdyconf->set_enhancement_data( ) + ASSERT 0 = 1. + + lo_wdyconf->if_enh_object~save( ). + lo_wdyconf->if_enh_object~unlock( ). + CATCH cx_enh_root. + lcx_exception=>raise( 'error deserializing ENHO wdyconf' ). + ENDTRY. + + ENDMETHOD. "lif_object_enho~deserialize + + METHOD lif_object_enho~serialize. + + DATA: lo_wdyconf TYPE REF TO cl_wdr_cfg_enhancement, + lt_data TYPE wdy_cfg_expl_data_tab, + ls_outline TYPE wdy_cfg_outline_data, + ls_obj TYPE wdy_config_key, + li_document TYPE REF TO if_ixml_document, + li_element TYPE REF TO if_ixml_element. - LOOP AT ct_impl ASSIGNING . - READ TABLE it_spaces ASSIGNING WITH KEY full_name = -full_name. + lo_wdyconf ?= ii_enh_tool. + + ls_obj = lo_wdyconf->get_original_object( ). + io_xml->add( iv_name = 'TOOL' + ig_data = ii_enh_tool->get_tool( ) ). + io_xml->add( iv_name = 'ORIGINAL_OBJECT' + ig_data = ls_obj ). + +* only works on new ABAP versions, parameters differ between versions + CALL METHOD lo_wdyconf->('GET_ENHANCEMENT_DATA') + EXPORTING + p_scope = 1 + IMPORTING + p_enh_data = lt_data. + + CALL METHOD cl_wdr_cfg_persistence_utils=>('COMP_TABLES_TO_XML') + EXPORTING + outline_data = ls_outline + expl_data_tab = lt_data + IMPORTING + element = li_element + CHANGING + document = li_document. + + io_xml->add_xml( iv_name = 'ENHANCEMENT_DATA' + ii_xml = li_element ). + + ENDMETHOD. "lif_object_enho~serialize + +ENDCLASS. "lcl_object_enho_wdyconf IMPLEMENTATION + + +*----------------------------------------------------------------------* +* CLASS lcl_object_enho_clif DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_enho_clif DEFINITION. + + PUBLIC SECTION. + CLASS-METHODS: + deserialize + IMPORTING io_xml TYPE REF TO lcl_xml_input + io_clif TYPE REF TO cl_enh_tool_clif + RAISING lcx_exception + cx_enh_root, + serialize + IMPORTING io_xml TYPE REF TO lcl_xml_output + io_files TYPE REF TO lcl_objects_files + io_clif TYPE REF TO cl_enh_tool_clif + RAISING lcx_exception. + + PRIVATE SECTION. + CLASS-METHODS: serialize_includes + IMPORTING io_files TYPE REF TO lcl_objects_files + io_clif TYPE REF TO cl_enh_tool_clif + RAISING lcx_exception. + +ENDCLASS. "lcl_object_enho_clif DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_object_enho_clif IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_enho_clif IMPLEMENTATION. + + METHOD serialize_includes. + + DATA: lt_includes TYPE enhnewmeth_tabincl_plus_enha, + lt_source TYPE TABLE OF abaptxt255, + lv_include TYPE programm. + + FIELD-SYMBOLS: LIKE LINE OF lt_includes. + + + lt_includes = io_clif->get_enh_method_includes( ). + LOOP AT lt_includes ASSIGNING . + lv_include = io_clif->if_enh_tool~get_name( ). + TRANSLATE lv_include USING ' ='. + lv_include+30 = 'EM'. + lv_include+32(8) = -includenr. + + CALL FUNCTION 'RPY_PROGRAM_READ' + EXPORTING + program_name = lv_include + with_lowercase = abap_true + TABLES + source_extended = lt_source + EXCEPTIONS + cancelled = 1 + not_found = 2 + permission_error = 3 + OTHERS = 4. IF sy-subrc = 0. - LOOP AT -source ASSIGNING . - READ TABLE -spaces ASSIGNING INDEX sy-tabix. - IF sy-subrc = 0 AND > 0. - DO TIMES. - CONCATENATE space INTO RESPECTING BLANKS. - ENDDO. - ENDIF. - ENDLOOP. + io_files->add_abap( iv_extra = |EM{ -includenr }| + it_abap = lt_source ). ENDIF. ENDLOOP. - ENDMETHOD. + ENDMETHOD. "serialize_includes - METHOD lif_object~exists. + METHOD serialize. - DATA: ls_tadir TYPE tadir. + DATA: lt_tab_attributes TYPE enhclasstabattrib, + lt_tab_methods TYPE enhnewmeth_tab. -* todo, it should look up in the ENHO database tables or call some methods -* to see if the object exists, looking in TADIR will not work - ls_tadir = lcl_tadir=>read_single( - iv_object = ms_item-obj_type - iv_obj_name = ms_item-obj_name ). - IF ls_tadir IS NOT INITIAL. - rv_bool = abap_true. - ENDIF. - ENDMETHOD. "lif_object~exists - - METHOD lif_object~serialize. - - DATA: lv_enh_id TYPE enhname, - lv_tool TYPE enhtooltype, - li_enh_tool TYPE REF TO if_enh_tool. + FIELD-SYMBOLS: LIKE LINE OF lt_tab_attributes, + LIKE LINE OF lt_tab_methods. - IF lif_object~exists( ) = abap_false. - RETURN. - ENDIF. + io_clif->get_enhattributes( + IMPORTING + tab_attributes = lt_tab_attributes ). - lv_enh_id = ms_item-obj_name. - TRY. - li_enh_tool = cl_enh_factory=>get_enhancement( - enhancement_id = lv_enh_id - bypassing_buffer = abap_true ). - CATCH cx_enh_root. - lcx_exception=>raise( 'Error from CL_ENH_FACTORY' ). - ENDTRY. - lv_tool = li_enh_tool->get_tool( ). + io_clif->get_enh_new_methodes( + IMPORTING + tab_methodes = lt_tab_methods ). - CASE lv_tool. - WHEN cl_enh_tool_badi_impl=>tooltype. - serialize_badi( io_xml = io_xml - iv_tool = lv_tool - ii_enh_tool = li_enh_tool ). - WHEN cl_enh_tool_hook_impl=>tooltype. - serialize_hook( io_xml = io_xml - iv_tool = lv_tool - ii_enh_tool = li_enh_tool ). -* ToDo: -* WHEN cl_enh_tool_class=>tooltype. -* WHEN 'ENHFUGRDATA'. "cl_enh_tool_fugr -* WHEN cl_enh_tool_intf=>tooltype. -* WHEN cl_wdr_cfg_enhancement=>tooltype. -* WHEN 'ENHWDYN'. "cl_enh_tool_wdy - WHEN OTHERS. - lcx_exception=>raise( |Unsupported ENHO type { lv_tool }| ). - ENDCASE. + serialize_includes( io_clif = io_clif + io_files = io_files ). + + LOOP AT lt_tab_attributes ASSIGNING . + CLEAR: -author, + -createdon, + -changedby, + -changedon. + ENDLOOP. + + LOOP AT lt_tab_methods ASSIGNING . + CLEAR: -meth_header-author, + -meth_header-createdon, + -meth_header-changedby, + -meth_header-changedon, + -meth_header-descript_id. + ENDLOOP. + + io_xml->add( iv_name = 'TAB_ATTRIBUTES' + ig_data = lt_tab_attributes ). + io_xml->add( iv_name = 'TAB_METHODS' + ig_data = lt_tab_methods ). ENDMETHOD. "serialize - METHOD lif_object~deserialize. + METHOD deserialize. - DATA: lv_tool TYPE enhtooltype. + DATA: lt_tab_attributes TYPE enhclasstabattrib, + lt_tab_methods TYPE enhnewmeth_tab, + ls_header TYPE vseomethod, + ls_param TYPE vseomepara, + ls_exc TYPE vseoexcep. - IF lif_object~exists( ) = abap_true. - lif_object~delete( ). - ENDIF. + FIELD-SYMBOLS: LIKE LINE OF lt_tab_methods, + LIKE LINE OF -meth_param, + LIKE LINE OF -meth_exc. - io_xml->read( EXPORTING iv_name = 'TOOL' - CHANGING cg_data = lv_tool ). - CASE lv_tool. - WHEN cl_enh_tool_badi_impl=>tooltype. - deserialize_badi( io_xml = io_xml - iv_package = iv_package ). - WHEN cl_enh_tool_hook_impl=>tooltype. - deserialize_hook( io_xml = io_xml - iv_package = iv_package ). -* ToDo: -* WHEN cl_enh_tool_class=>tooltype. -* WHEN 'ENHFUGRDATA'. "cl_enh_tool_fugr -* WHEN cl_enh_tool_intf=>tooltype. -* WHEN cl_wdr_cfg_enhancement=>tooltype. -* WHEN 'ENHWDYN'. "cl_enh_tool_wdy - WHEN OTHERS. - lcx_exception=>raise( |Unsupported ENHO type { lv_tool }| ). - ENDCASE. + io_xml->read( EXPORTING iv_name = 'TAB_ATTRIBUTES' + CHANGING cg_data = lt_tab_attributes ). + io_xml->read( EXPORTING iv_name = 'TAB_METHODS' + CHANGING cg_data = lt_tab_methods ). - lcl_objects_activation=>add_item( ms_item ). + io_clif->set_enhattributes( tab_attributes = lt_tab_attributes ). + +* todo: deserialize includes + +* SAP standard SET_ENH_NEW_METHOS does not work + + LOOP AT lt_tab_methods ASSIGNING . + + MOVE-CORRESPONDING -meth_header TO ls_header. + + io_clif->add_change_new_enh_method( + methkey = -methkey + method_header = ls_header ). + +* parameters + LOOP AT -meth_param ASSIGNING . + MOVE-CORRESPONDING TO ls_param. + io_clif->add_change_enh_methparam( + methname = -methkey-cmpname + param_line = ls_param ). + ENDLOOP. + +* exceptions + LOOP AT -meth_exc ASSIGNING . + MOVE-CORRESPONDING TO ls_exc. + io_clif->add_change_enh_methexc( + methname = -methkey-cmpname + except_line = ls_exc ). + ENDLOOP. + + ENDLOOP. ENDMETHOD. "deserialize - METHOD deserialize_badi. +ENDCLASS. "lcl_object_enho_clif IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS lcl_object_enho_badi DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_enho_badi DEFINITION. + + PUBLIC SECTION. + METHODS: constructor + IMPORTING + is_item TYPE ty_item + io_files TYPE REF TO lcl_objects_files. + INTERFACES: lif_object_enho. + + PRIVATE SECTION. + DATA: ms_item TYPE ty_item, + mo_files TYPE REF TO lcl_objects_files. + +ENDCLASS. "lcl_object_enho_badi DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_object_enho_badi IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_enho_badi IMPLEMENTATION. + + METHOD constructor. + ms_item = is_item. + mo_files = io_files. + ENDMETHOD. "constructor + + METHOD lif_object_enho~serialize. + + DATA: lo_badi_impl TYPE REF TO cl_enh_tool_badi_impl, + lv_spot_name TYPE enhspotname, + lv_shorttext TYPE string, + lt_impl TYPE enh_badi_impl_data_it. + + FIELD-SYMBOLS: LIKE LINE OF lt_impl, + LIKE LINE OF -filter_values, + LIKE LINE OF -filters. + + + lo_badi_impl ?= ii_enh_tool. + + lv_shorttext = lo_badi_impl->if_enh_object_docu~get_shorttext( ). + lv_spot_name = lo_badi_impl->get_spot_name( ). + lt_impl = lo_badi_impl->get_implementations( ). + + LOOP AT lt_impl ASSIGNING . +* make sure the XML serialization does not dump, field type = N + LOOP AT -filter_values ASSIGNING . + IF -filter_numeric_value1 CA space. + CLEAR -filter_numeric_value1. + ENDIF. + ENDLOOP. + LOOP AT -filters ASSIGNING . + IF -filter_numeric_value1 CA space. + CLEAR -filter_numeric_value1. + ENDIF. + ENDLOOP. + ENDLOOP. + + io_xml->add( iv_name = 'TOOL' + ig_data = ii_enh_tool->get_tool( ) ). + io_xml->add( ig_data = lv_shorttext + iv_name = 'SHORTTEXT' ). + io_xml->add( iv_name = 'SPOT_NAME' + ig_data = lv_spot_name ). + io_xml->add( iv_name = 'IMPL' + ig_data = lt_impl ). + + ENDMETHOD. "lif_object_enho~serialize + + METHOD lif_object_enho~deserialize. DATA: lv_spot_name TYPE enhspotname, lv_shorttext TYPE string, @@ -220,24 +387,24 @@ CLASS lcl_object_enho IMPLEMENTATION. io_xml->read( EXPORTING iv_name = 'SHORTTEXT' - CHANGING cg_data = lv_shorttext ). + CHANGING cg_data = lv_shorttext ). io_xml->read( EXPORTING iv_name = 'SPOT_NAME' - CHANGING cg_data = lv_spot_name ). + CHANGING cg_data = lv_spot_name ). io_xml->read( EXPORTING iv_name = 'IMPL' - CHANGING cg_data = lt_impl ). + CHANGING cg_data = lt_impl ). lv_enhname = ms_item-obj_name. lv_package = iv_package. TRY. cl_enh_factory=>create_enhancement( EXPORTING - enhname = lv_enhname - enhtype = cl_abstract_enh_tool_redef=>credefinition - enhtooltype = cl_enh_tool_badi_impl=>tooltype + enhname = lv_enhname + enhtype = cl_abstract_enh_tool_redef=>credefinition + enhtooltype = cl_enh_tool_badi_impl=>tooltype IMPORTING - enhancement = li_tool + enhancement = li_tool CHANGING - devclass = lv_package ). + devclass = lv_package ). lo_badi ?= li_tool. lo_badi->set_spot_name( lv_spot_name ). @@ -251,101 +418,60 @@ CLASS lcl_object_enho IMPLEMENTATION. lcx_exception=>raise( 'error deserializing ENHO badi' ). ENDTRY. - ENDMETHOD. "deserialize_badi + ENDMETHOD. "lif_object_enho~deserialize - METHOD deserialize_hook. +ENDCLASS. "lcl_object_enho_badi IMPLEMENTATION - DATA: lv_shorttext TYPE string, - lo_hook_impl TYPE REF TO cl_enh_tool_hook_impl, - li_tool TYPE REF TO if_enh_tool, - lv_enhname TYPE enhname, - lv_package TYPE devclass, - ls_original_object TYPE enh_hook_admin, - lt_spaces TYPE ty_spaces_tt, - lt_enhancements TYPE enh_hook_impl_it. +*----------------------------------------------------------------------* +* CLASS lcl_object_enho_hook DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_enho_hook DEFINITION. + PUBLIC SECTION. + METHODS: constructor + IMPORTING + is_item TYPE ty_item + io_files TYPE REF TO lcl_objects_files. - FIELD-SYMBOLS: LIKE LINE OF lt_enhancements. + INTERFACES: lif_object_enho. + PRIVATE SECTION. + TYPES: BEGIN OF ty_spaces, + full_name TYPE string. + TYPES: spaces TYPE STANDARD TABLE OF i WITH DEFAULT KEY, + END OF ty_spaces. - io_xml->read( EXPORTING iv_name = 'SHORTTEXT' - CHANGING cg_data = lv_shorttext ). - io_xml->read( EXPORTING iv_name = 'ORIGINAL_OBJECT' - CHANGING cg_data = ls_original_object ). - io_xml->read( EXPORTING iv_name = 'ENHANCEMENTS' - CHANGING cg_data = lt_enhancements ). - io_xml->read( EXPORTING iv_name = 'SPACES' - CHANGING cg_data = lt_spaces ). + TYPES: ty_spaces_tt TYPE STANDARD TABLE OF ty_spaces WITH DEFAULT KEY. - hook_impl_deserialize( EXPORTING it_spaces = lt_spaces - CHANGING ct_impl = lt_enhancements ). + DATA: ms_item TYPE ty_item. + DATA: mo_files TYPE REF TO lcl_objects_files. - lv_enhname = ms_item-obj_name. - lv_package = iv_package. - TRY. - cl_enh_factory=>create_enhancement( - EXPORTING - enhname = lv_enhname - enhtype = cl_abstract_enh_tool_redef=>credefinition - enhtooltype = cl_enh_tool_hook_impl=>tooltype - IMPORTING - enhancement = li_tool - CHANGING - devclass = lv_package ). - lo_hook_impl ?= li_tool. + METHODS hook_impl_deserialize + IMPORTING it_spaces TYPE ty_spaces_tt + CHANGING ct_impl TYPE enh_hook_impl_it + RAISING lcx_exception. - lo_hook_impl->if_enh_object_docu~set_shorttext( lv_shorttext ). - lo_hook_impl->set_original_object( - pgmid = ls_original_object-pgmid - obj_name = ls_original_object-org_obj_name - obj_type = ls_original_object-org_obj_type - program = ls_original_object-programname - main_type = ls_original_object-org_main_type - main_name = ls_original_object-org_main_name ). - lo_hook_impl->set_include_bound( ls_original_object-include_bound ). + METHODS hook_impl_serialize + EXPORTING et_spaces TYPE ty_spaces_tt + CHANGING ct_impl TYPE enh_hook_impl_it + RAISING lcx_exception. - LOOP AT lt_enhancements ASSIGNING . - lo_hook_impl->add_hook_impl( - overwrite = -overwrite - method = -method - enhmode = -enhmode - full_name = -full_name - source = -source - spot = -spotname - parent_full_name = -parent_full_name ). - ENDLOOP. - lo_hook_impl->if_enh_object~save( ). - lo_hook_impl->if_enh_object~unlock( ). - CATCH cx_enh_root. - lcx_exception=>raise( 'error deserializing ENHO hook' ). - ENDTRY. +ENDCLASS. "lcl_object_enho_hook DEFINITION - ENDMETHOD. "deserialize_hook +*----------------------------------------------------------------------* +* CLASS lcl_object_enho_hook IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_enho_hook IMPLEMENTATION. - METHOD serialize_badi. + METHOD constructor. + ms_item = is_item. + mo_files = io_files. + ENDMETHOD. "constructor - DATA: lo_badi_impl TYPE REF TO cl_enh_tool_badi_impl, - lv_spot_name TYPE enhspotname, - lv_shorttext TYPE string, - lt_impl TYPE enh_badi_impl_data_it. - - lo_badi_impl ?= ii_enh_tool. - - lv_shorttext = lo_badi_impl->if_enh_object_docu~get_shorttext( ). - lv_spot_name = lo_badi_impl->get_spot_name( ). - lt_impl = lo_badi_impl->get_implementations( ). - - io_xml->add( iv_name = 'TOOL' - ig_data = iv_tool ). - io_xml->add( ig_data = lv_shorttext - iv_name = 'SHORTTEXT' ). - io_xml->add( iv_name = 'SPOT_NAME' - ig_data = lv_spot_name ). - io_xml->add( iv_name = 'IMPL' - ig_data = lt_impl ). - - ENDMETHOD. "serialize_badi - - METHOD serialize_hook. + METHOD lif_object_enho~serialize. DATA: lv_shorttext TYPE string, lo_hook_impl TYPE REF TO cl_enh_tool_hook_impl, @@ -373,7 +499,7 @@ CLASS lcl_object_enho IMPLEMENTATION. CHANGING ct_impl = lt_enhancements ). io_xml->add( iv_name = 'TOOL' - ig_data = iv_tool ). + ig_data = ii_enh_tool->get_tool( ) ). io_xml->add( ig_data = lv_shorttext iv_name = 'SHORTTEXT' ). io_xml->add( ig_data = ls_original_object @@ -383,7 +509,516 @@ CLASS lcl_object_enho IMPLEMENTATION. io_xml->add( iv_name = 'SPACES' ig_data = lt_spaces ). - ENDMETHOD. "serialize_hook + ENDMETHOD. "lif_object_enho~serialize + + METHOD hook_impl_serialize. +* handle normalization of XML values +* i.e. remove leading spaces + + FIELD-SYMBOLS: LIKE LINE OF ct_impl, + LIKE LINE OF et_spaces, + TYPE i, + TYPE string. + + + LOOP AT ct_impl ASSIGNING . + APPEND INITIAL LINE TO et_spaces ASSIGNING . + -full_name = -full_name. + LOOP AT -source ASSIGNING . + APPEND INITIAL LINE TO -spaces ASSIGNING . + WHILE strlen( ) >= 1 AND (1) = ` `. + = +1. + = + 1. + ENDWHILE. + ENDLOOP. + ENDLOOP. + ENDMETHOD. "hook_impl_serialize + + METHOD hook_impl_deserialize. + + FIELD-SYMBOLS: LIKE LINE OF ct_impl, + TYPE string, + TYPE i, + LIKE LINE OF it_spaces. + + + LOOP AT ct_impl ASSIGNING . + READ TABLE it_spaces ASSIGNING WITH KEY full_name = -full_name. + IF sy-subrc = 0. + LOOP AT -source ASSIGNING . + READ TABLE -spaces ASSIGNING INDEX sy-tabix. + IF sy-subrc = 0 AND > 0. + DO TIMES. + CONCATENATE space INTO RESPECTING BLANKS. + ENDDO. + ENDIF. + ENDLOOP. + ENDIF. + ENDLOOP. + + ENDMETHOD. "hook_impl_deserialize + + METHOD lif_object_enho~deserialize. + + DATA: lv_shorttext TYPE string, + lo_hook_impl TYPE REF TO cl_enh_tool_hook_impl, + li_tool TYPE REF TO if_enh_tool, + lv_enhname TYPE enhname, + lv_package TYPE devclass, + ls_original_object TYPE enh_hook_admin, + lt_spaces TYPE ty_spaces_tt, + lt_enhancements TYPE enh_hook_impl_it. + + FIELD-SYMBOLS: LIKE LINE OF lt_enhancements. + + + io_xml->read( EXPORTING iv_name = 'SHORTTEXT' + CHANGING cg_data = lv_shorttext ). + io_xml->read( EXPORTING iv_name = 'ORIGINAL_OBJECT' + CHANGING cg_data = ls_original_object ). + io_xml->read( EXPORTING iv_name = 'ENHANCEMENTS' + CHANGING cg_data = lt_enhancements ). + io_xml->read( EXPORTING iv_name = 'SPACES' + CHANGING cg_data = lt_spaces ). + + hook_impl_deserialize( EXPORTING it_spaces = lt_spaces + CHANGING ct_impl = lt_enhancements ). + + lv_enhname = ms_item-obj_name. + lv_package = iv_package. + TRY. + cl_enh_factory=>create_enhancement( + EXPORTING + enhname = lv_enhname + enhtype = cl_abstract_enh_tool_redef=>credefinition + enhtooltype = cl_enh_tool_hook_impl=>tooltype + IMPORTING + enhancement = li_tool + CHANGING + devclass = lv_package ). + lo_hook_impl ?= li_tool. + + lo_hook_impl->if_enh_object_docu~set_shorttext( lv_shorttext ). + lo_hook_impl->set_original_object( + pgmid = ls_original_object-pgmid + obj_name = ls_original_object-org_obj_name + obj_type = ls_original_object-org_obj_type + program = ls_original_object-programname + main_type = ls_original_object-org_main_type + main_name = ls_original_object-org_main_name ). + lo_hook_impl->set_include_bound( ls_original_object-include_bound ). + + LOOP AT lt_enhancements ASSIGNING . + lo_hook_impl->add_hook_impl( + overwrite = -overwrite + method = -method + enhmode = -enhmode + full_name = -full_name + source = -source + spot = -spotname + parent_full_name = -parent_full_name ). + ENDLOOP. + lo_hook_impl->if_enh_object~save( ). + lo_hook_impl->if_enh_object~unlock( ). + CATCH cx_enh_root. + lcx_exception=>raise( 'error deserializing ENHO hook' ). + ENDTRY. + + ENDMETHOD. "lif_object_enho~deserialize + +ENDCLASS. "lcl_object_enho_hook IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS lcl_object_enho_interface DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_enho_interface DEFINITION. + + PUBLIC SECTION. + METHODS: + constructor + IMPORTING + is_item TYPE ty_item + io_files TYPE REF TO lcl_objects_files. + INTERFACES: lif_object_enho. + + PRIVATE SECTION. + DATA: ms_item TYPE ty_item, + mo_files TYPE REF TO lcl_objects_files. + +ENDCLASS. "lcl_object_enho_interface DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_object_enho_interface IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_enho_interface IMPLEMENTATION. + + METHOD constructor. + ms_item = is_item. + mo_files = io_files. + ENDMETHOD. "constructor + + METHOD lif_object_enho~serialize. + + DATA: lo_enh_intf TYPE REF TO cl_enh_tool_intf, + lv_class TYPE seoclsname, + lv_shorttext TYPE string. + + + lo_enh_intf ?= ii_enh_tool. + + lv_shorttext = lo_enh_intf->if_enh_object_docu~get_shorttext( ). + lo_enh_intf->get_class( IMPORTING class_name = lv_class ). + + io_xml->add( iv_name = 'TOOL' + ig_data = ii_enh_tool->get_tool( ) ). + io_xml->add( ig_data = lv_shorttext + iv_name = 'SHORTTEXT' ). + io_xml->add( iv_name = 'CLASS' + ig_data = lv_class ). + + lcl_object_enho_clif=>serialize( + io_xml = io_xml + io_files = mo_files + io_clif = lo_enh_intf ). + + ENDMETHOD. "lif_object_enho~serialize + + METHOD lif_object_enho~deserialize. + + DATA: lo_enh_intf TYPE REF TO cl_enh_tool_intf, + lt_source TYPE rswsourcet, + li_tool TYPE REF TO if_enh_tool, + lv_shorttext TYPE string, + lv_class TYPE seoclsname, + lv_enhname TYPE enhname, + lv_package TYPE devclass. + + + io_xml->read( EXPORTING iv_name = 'SHORTTEXT' + CHANGING cg_data = lv_shorttext ). + io_xml->read( EXPORTING iv_name = 'CLASS' + CHANGING cg_data = lv_class ). + + lv_enhname = ms_item-obj_name. + lv_package = iv_package. + TRY. + cl_enh_factory=>create_enhancement( + EXPORTING + enhname = lv_enhname + enhtype = '' + enhtooltype = cl_enh_tool_intf=>tooltype + IMPORTING + enhancement = li_tool + CHANGING + devclass = lv_package ). + lo_enh_intf ?= li_tool. + + lo_enh_intf->if_enh_object_docu~set_shorttext( lv_shorttext ). + lo_enh_intf->set_class( lv_class ). + + lcl_object_enho_clif=>deserialize( + io_xml = io_xml + io_clif = lo_enh_intf ). + + lo_enh_intf->if_enh_object~save( ). + lo_enh_intf->if_enh_object~unlock( ). + CATCH cx_enh_root. + lcx_exception=>raise( 'error deserializing ENHO interface' ). + ENDTRY. + + ENDMETHOD. "lif_object_enho~deserialize + +ENDCLASS. "lcl_object_enho_interface IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS lcl_object_enho_class DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_enho_class DEFINITION. + + PUBLIC SECTION. + METHODS: + constructor + IMPORTING + is_item TYPE ty_item + io_files TYPE REF TO lcl_objects_files. + INTERFACES: lif_object_enho. + + PRIVATE SECTION. + DATA: ms_item TYPE ty_item. + DATA: mo_files TYPE REF TO lcl_objects_files. + +ENDCLASS. "lcl_object_enho_class DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_object_enho_class IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_enho_class IMPLEMENTATION. + + METHOD constructor. + ms_item = is_item. + mo_files = io_files. + ENDMETHOD. "constructor + + METHOD lif_object_enho~serialize. + + DATA: lo_enh_class TYPE REF TO cl_enh_tool_class, + lt_owr TYPE enhmeth_tabkeys, + lt_pre TYPE enhmeth_tabkeys, + lt_post TYPE enhmeth_tabkeys, + lt_source TYPE rswsourcet, + lv_class TYPE seoclsname, + lv_shorttext TYPE string. + + + lo_enh_class ?= ii_enh_tool. + + lv_shorttext = lo_enh_class->if_enh_object_docu~get_shorttext( ). + lt_owr = lo_enh_class->get_owr_methods( ). + lt_pre = lo_enh_class->get_pre_methods( ). + lt_post = lo_enh_class->get_post_methods( ). + lt_source = lo_enh_class->get_eimp_include( ). + lo_enh_class->get_class( IMPORTING class_name = lv_class ). + + io_xml->add( iv_name = 'TOOL' + ig_data = ii_enh_tool->get_tool( ) ). + io_xml->add( ig_data = lv_shorttext + iv_name = 'SHORTTEXT' ). + io_xml->add( iv_name = 'CLASS' + ig_data = lv_class ). + io_xml->add( iv_name = 'OWR_METHODS' + ig_data = lt_owr ). + io_xml->add( iv_name = 'PRE_METHODS' + ig_data = lt_pre ). + io_xml->add( iv_name = 'POST_METHODS' + ig_data = lt_post ). + + mo_files->add_abap( lt_source ). + + lcl_object_enho_clif=>serialize( + io_xml = io_xml + io_files = mo_files + io_clif = lo_enh_class ). + + ENDMETHOD. "lif_object_enho~serialize + + METHOD lif_object_enho~deserialize. + + DATA: lo_enh_class TYPE REF TO cl_enh_tool_class, + lt_owr TYPE enhmeth_tabkeys, + lt_pre TYPE enhmeth_tabkeys, + lt_post TYPE enhmeth_tabkeys, + lt_source TYPE rswsourcet, + li_tool TYPE REF TO if_enh_tool, + lv_shorttext TYPE string, + lv_class TYPE seoclsname, + lv_enhname TYPE enhname, + lv_package TYPE devclass. + + + io_xml->read( EXPORTING iv_name = 'SHORTTEXT' + CHANGING cg_data = lv_shorttext ). + io_xml->read( EXPORTING iv_name = 'OWR_METHODS' + CHANGING cg_data = lt_owr ). + io_xml->read( EXPORTING iv_name = 'PRE_METHODS' + CHANGING cg_data = lt_pre ). + io_xml->read( EXPORTING iv_name = 'POST_METHODS' + CHANGING cg_data = lt_post ). + io_xml->read( EXPORTING iv_name = 'CLASS' + CHANGING cg_data = lv_class ). + lt_source = mo_files->read_abap( ). + + lv_enhname = ms_item-obj_name. + lv_package = iv_package. + TRY. + cl_enh_factory=>create_enhancement( + EXPORTING + enhname = lv_enhname + enhtype = '' + enhtooltype = cl_enh_tool_class=>tooltype + IMPORTING + enhancement = li_tool + CHANGING + devclass = lv_package ). + lo_enh_class ?= li_tool. + + lo_enh_class->if_enh_object_docu~set_shorttext( lv_shorttext ). + lo_enh_class->set_class( lv_class ). + lo_enh_class->set_owr_methods( version = 'I' + owr_methods = lt_owr ). + lo_enh_class->set_pre_methods( version = 'I' + pre_methods = lt_pre ). + lo_enh_class->set_post_methods( version = 'I' + post_methods = lt_post ). + lo_enh_class->set_eimp_include( version = 'I' + eimp_source = lt_source ). + + lcl_object_enho_clif=>deserialize( + io_xml = io_xml + io_clif = lo_enh_class ). + + lo_enh_class->if_enh_object~save( ). + lo_enh_class->if_enh_object~unlock( ). + CATCH cx_enh_root. + lcx_exception=>raise( 'error deserializing ENHO class' ). + ENDTRY. + + ENDMETHOD. "lif_object_enho~deserialize + +ENDCLASS. "lcl_object_enho_class IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS lcl_object_enho DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_enho DEFINITION INHERITING FROM lcl_objects_super FINAL. + + PUBLIC SECTION. + INTERFACES lif_object. + ALIASES mo_files FOR lif_object~mo_files. + + PRIVATE SECTION. + + METHODS: + factory + IMPORTING + iv_tool TYPE enhtooltype + RETURNING + value(ri_enho) TYPE REF TO lif_object_enho + RAISING + lcx_exception. + +ENDCLASS. "lcl_object_enho DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_object_enho IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_enho IMPLEMENTATION. + + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + + METHOD lif_object~get_metadata. + rs_metadata = get_metadata( ). + ENDMETHOD. "lif_object~get_metadata + + METHOD lif_object~changed_by. + rv_user = c_user_unknown. " todo + ENDMETHOD. "lif_object~changed_by + + METHOD lif_object~exists. + + DATA: lv_enh_id TYPE enhname. + + + lv_enh_id = ms_item-obj_name. + TRY. + cl_enh_factory=>get_enhancement( + enhancement_id = lv_enh_id + bypassing_buffer = abap_true ). + rv_bool = abap_true. + CATCH cx_enh_root. + rv_bool = abap_false. + ENDTRY. + + ENDMETHOD. "lif_object~exists + + METHOD lif_object~serialize. + + DATA: lv_enh_id TYPE enhname, + li_enho TYPE REF TO lif_object_enho, + li_enh_tool TYPE REF TO if_enh_tool. + + + IF lif_object~exists( ) = abap_false. + RETURN. + ENDIF. + + lv_enh_id = ms_item-obj_name. + TRY. + li_enh_tool = cl_enh_factory=>get_enhancement( + enhancement_id = lv_enh_id + bypassing_buffer = abap_true ). + CATCH cx_enh_root. + lcx_exception=>raise( 'Error from CL_ENH_FACTORY' ). + ENDTRY. + + li_enho = factory( li_enh_tool->get_tool( ) ). + + li_enho->serialize( io_xml = io_xml + ii_enh_tool = li_enh_tool ). + + ENDMETHOD. "serialize + + METHOD factory. + + CASE iv_tool. + WHEN cl_enh_tool_badi_impl=>tooltype. + CREATE OBJECT ri_enho TYPE lcl_object_enho_badi + EXPORTING + is_item = ms_item + io_files = mo_files. + WHEN cl_enh_tool_hook_impl=>tooltype. + CREATE OBJECT ri_enho TYPE lcl_object_enho_hook + EXPORTING + is_item = ms_item + io_files = mo_files. + WHEN cl_enh_tool_class=>tooltype. + CREATE OBJECT ri_enho TYPE lcl_object_enho_class + EXPORTING + is_item = ms_item + io_files = mo_files. + WHEN cl_enh_tool_intf=>tooltype. + CREATE OBJECT ri_enho TYPE lcl_object_enho_interface + EXPORTING + is_item = ms_item + io_files = mo_files. + WHEN cl_wdr_cfg_enhancement=>tooltype. + CREATE OBJECT ri_enho TYPE lcl_object_enho_wdyconf + EXPORTING + is_item = ms_item + io_files = mo_files. +* ToDo: +* WHEN 'ENHFUGRDATA'. "cl_enh_tool_fugr +* WHEN 'ENHWDYN'. "cl_enh_tool_wdy + WHEN OTHERS. + lcx_exception=>raise( |Unsupported ENHO type { iv_tool }| ). + ENDCASE. + + ENDMETHOD. "factory + + METHOD lif_object~deserialize. + + DATA: lv_tool TYPE enhtooltype, + li_enho TYPE REF TO lif_object_enho. + + + IF lif_object~exists( ) = abap_true. + lif_object~delete( ). + ENDIF. + + io_xml->read( EXPORTING iv_name = 'TOOL' + CHANGING cg_data = lv_tool ). + + li_enho = factory( lv_tool ). + + li_enho->deserialize( io_xml = io_xml + iv_package = iv_package ). + + lcl_objects_activation=>add_item( ms_item ). + + ENDMETHOD. "deserialize METHOD lif_object~delete. @@ -418,6 +1053,6 @@ CLASS lcl_object_enho IMPLEMENTATION. METHOD lif_object~compare_to_remote_version. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. - ENDMETHOD. + ENDMETHOD. "lif_object~compare_to_remote_version -ENDCLASS. "lcl_object_enho IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_enho IMPLEMENTATION diff --git a/src/zabapgit_object_enho.prog.xml b/src/zabapgit_object_enho.prog.xml index 5e8fde11e..506c910ff 100644 --- a/src/zabapgit_object_enho.prog.xml +++ b/src/zabapgit_object_enho.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_ENHO A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_ENHO 28 - diff --git a/src/zabapgit_object_enhs.prog.abap b/src/zabapgit_object_enhs.prog.abap index e3e021e3a..623d4dbbd 100644 --- a/src/zabapgit_object_enhs.prog.abap +++ b/src/zabapgit_object_enhs.prog.abap @@ -215,4 +215,4 @@ CLASS lcl_object_enhs IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_enhs \ No newline at end of file +ENDCLASS. "lcl_object_enhs diff --git a/src/zabapgit_object_enhs.prog.xml b/src/zabapgit_object_enhs.prog.xml index aba2f76bd..afb39dbdc 100644 --- a/src/zabapgit_object_enhs.prog.xml +++ b/src/zabapgit_object_enhs.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_ENHS A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_ENHS 28 - diff --git a/src/zabapgit_object_enqu.prog.abap b/src/zabapgit_object_enqu.prog.abap index 53d08681f..0daf862d9 100644 --- a/src/zabapgit_object_enqu.prog.abap +++ b/src/zabapgit_object_enqu.prog.abap @@ -53,6 +53,7 @@ CLASS lcl_object_enqu IMPLEMENTATION. METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). + rs_metadata-ddic = abap_true. ENDMETHOD. "lif_object~get_metadata METHOD lif_object~exists. @@ -186,4 +187,4 @@ CLASS lcl_object_enqu IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_enqu IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_enqu IMPLEMENTATION diff --git a/src/zabapgit_object_enqu.prog.xml b/src/zabapgit_object_enqu.prog.xml index 205e9f4bd..0b58488cc 100644 --- a/src/zabapgit_object_enqu.prog.xml +++ b/src/zabapgit_object_enqu.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_ENQU A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_ENUQ 28 - diff --git a/src/zabapgit_object_ensc.prog.abap b/src/zabapgit_object_ensc.prog.abap index cc29f012f..c7bdc0a8b 100644 --- a/src/zabapgit_object_ensc.prog.abap +++ b/src/zabapgit_object_ensc.prog.abap @@ -194,4 +194,4 @@ CLASS lcl_object_ensc IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_ensc \ No newline at end of file +ENDCLASS. "lcl_object_ensc diff --git a/src/zabapgit_object_ensc.prog.xml b/src/zabapgit_object_ensc.prog.xml index 24fe588db..735d6a196 100644 --- a/src/zabapgit_object_ensc.prog.xml +++ b/src/zabapgit_object_ensc.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_ENSC A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_ENSC 28 - diff --git a/src/zabapgit_object_fugr.prog.abap b/src/zabapgit_object_fugr.prog.abap index d09713ae7..63a63ab96 100644 --- a/src/zabapgit_object_fugr.prog.abap +++ b/src/zabapgit_object_fugr.prog.abap @@ -17,19 +17,20 @@ CLASS lcl_object_fugr DEFINITION INHERITING FROM lcl_objects_program FINAL. TYPES: ty_rs38l_incl_tt TYPE STANDARD TABLE OF rs38l_incl WITH DEFAULT KEY. TYPES: BEGIN OF ty_function, - funcname TYPE rs38l_fnam, - include TYPE progname, - global_flag TYPE rs38l-global, - remote_call TYPE rs38l-remote, - update_task TYPE rs38l-utask, - short_text TYPE tftit-stext, - remote_basxml TYPE rs38l-basxml_enabled, - import TYPE STANDARD TABLE OF rsimp WITH DEFAULT KEY, - changing TYPE STANDARD TABLE OF rscha WITH DEFAULT KEY, - export TYPE STANDARD TABLE OF rsexp WITH DEFAULT KEY, - tables TYPE STANDARD TABLE OF rstbl WITH DEFAULT KEY, - exception TYPE STANDARD TABLE OF rsexc WITH DEFAULT KEY, - documentation TYPE STANDARD TABLE OF rsfdo WITH DEFAULT KEY, + funcname TYPE rs38l_fnam, + include TYPE progname, + global_flag TYPE rs38l-global, + remote_call TYPE rs38l-remote, + update_task TYPE rs38l-utask, + short_text TYPE tftit-stext, + remote_basxml TYPE rs38l-basxml_enabled, + import TYPE STANDARD TABLE OF rsimp WITH DEFAULT KEY, + changing TYPE STANDARD TABLE OF rscha WITH DEFAULT KEY, + export TYPE STANDARD TABLE OF rsexp WITH DEFAULT KEY, + tables TYPE STANDARD TABLE OF rstbl WITH DEFAULT KEY, + exception TYPE STANDARD TABLE OF rsexc WITH DEFAULT KEY, + documentation TYPE STANDARD TABLE OF rsfdo WITH DEFAULT KEY, + exception_classes TYPE abap_bool, END OF ty_function. TYPES: ty_function_tt TYPE STANDARD TABLE OF ty_function WITH DEFAULT KEY. @@ -71,6 +72,11 @@ CLASS lcl_object_fugr DEFINITION INHERITING FROM lcl_objects_program FINAL. iv_package TYPE devclass RAISING lcx_exception. + METHODS are_exceptions_class_based + IMPORTING iv_function_name TYPE rs38l_fnam + RETURNING VALUE(rv_return) TYPE abap_bool + RAISING lcx_exception. + ENDCLASS. "lcl_object_fugr DEFINITION *----------------------------------------------------------------------* @@ -247,6 +253,7 @@ CLASS lcl_object_fugr IMPLEMENTATION. remote_call = -remote_call short_text = -short_text update_task = -update_task + exception_class = -exception_classes * NAMESPACE = ' ' todo remote_basxml_supported = -remote_basxml IMPORTING @@ -276,10 +283,6 @@ CLASS lcl_object_fugr IMPLEMENTATION. ENDIF. INSERT REPORT lv_include FROM lt_source. - -* lcl_objects_activation=>add( iv_type = 'FUNC' -* iv_name = -funcname ). - ENDLOOP. ENDMETHOD. "deserialize_functions @@ -398,10 +401,7 @@ CLASS lcl_object_fugr IMPLEMENTATION. SELECT SINGLE areat INTO lv_areat FROM tlibt WHERE spras = mv_language - AND area = ms_item-obj_name. "#EC CI_GENBUFF - IF sy-subrc <> 0. - lcx_exception=>raise( 'not found in TLIBT' ). - ENDIF. + AND area = ms_item-obj_name. "#EC CI_GENBUFF "#EC CI_SUBRC lt_functab = functions( ). lt_includes = includes( ). @@ -493,6 +493,9 @@ CLASS lcl_object_fugr IMPLEMENTATION. lcx_exception=>raise( 'Error from RS_FUNCTION_POOL_CONTENTS' ). ENDIF. + SORT rt_functab BY funcname ASCENDING. + DELETE ADJACENT DUPLICATES FROM rt_functab COMPARING funcname. + ENDMETHOD. "functions METHOD main_name. @@ -536,10 +539,10 @@ CLASS lcl_object_fugr IMPLEMENTATION. DATA: lt_source TYPE TABLE OF rssource, lt_functab TYPE ty_rs38l_incl_tt, - lt_new_source TYPE rsfb_source. + lt_new_source TYPE rsfb_source, + ls_function LIKE LINE OF rt_functions. - FIELD-SYMBOLS: LIKE LINE OF lt_functab, - LIKE LINE OF rt_functions. + FIELD-SYMBOLS: LIKE LINE OF lt_functab. lt_functab = functions( ). @@ -547,8 +550,8 @@ CLASS lcl_object_fugr IMPLEMENTATION. LOOP AT lt_functab ASSIGNING . * fm RPY_FUNCTIONMODULE_READ does not support source code * lines longer than 72 characters - APPEND INITIAL LINE TO rt_functions ASSIGNING . - MOVE-CORRESPONDING TO . + CLEAR ls_function. + MOVE-CORRESPONDING TO ls_function. CLEAR lt_new_source. CLEAR lt_source. @@ -557,18 +560,18 @@ CLASS lcl_object_fugr IMPLEMENTATION. EXPORTING functionname = -funcname IMPORTING - global_flag = -global_flag - remote_call = -remote_call - update_task = -update_task - short_text = -short_text - remote_basxml_supported = -remote_basxml + global_flag = ls_function-global_flag + remote_call = ls_function-remote_call + update_task = ls_function-update_task + short_text = ls_function-short_text + remote_basxml_supported = ls_function-remote_basxml TABLES - import_parameter = -import - changing_parameter = -changing - export_parameter = -export - tables_parameter = -tables - exception_list = -exception - documentation = -documentation + import_parameter = ls_function-import + changing_parameter = ls_function-changing + export_parameter = ls_function-export + tables_parameter = ls_function-tables + exception_list = ls_function-exception + documentation = ls_function-documentation source = lt_source CHANGING new_source = lt_new_source @@ -577,10 +580,16 @@ CLASS lcl_object_fugr IMPLEMENTATION. function_not_found = 2 invalid_name = 3 OTHERS = 4. - IF sy-subrc <> 0. + IF sy-subrc = 2. + CONTINUE. + ELSEIF sy-subrc <> 0. lcx_exception=>raise( 'Error from RPY_FUNCTIONMODULE_READ_NEW' ). ENDIF. + ls_function-exception_classes = are_exceptions_class_based( -funcname ). + + APPEND ls_function TO rt_functions. + IF NOT lt_new_source IS INITIAL. mo_files->add_abap( iv_extra = -funcname it_abap = lt_new_source ). @@ -614,6 +623,35 @@ CLASS lcl_object_fugr IMPLEMENTATION. ENDMETHOD. "serialize_includes + METHOD are_exceptions_class_based. + DATA: + lt_dokumentation TYPE TABLE OF funct, + lt_exception_list TYPE TABLE OF rsexc, + lt_export_parameter TYPE TABLE OF rsexp, + lt_import_parameter TYPE TABLE OF rsimp, + lt_tables_parameter TYPE TABLE OF rstbl. + + CALL FUNCTION 'FUNCTION_IMPORT_DOKU' + EXPORTING + funcname = iv_function_name + IMPORTING + exception_class = rv_return + TABLES + dokumentation = lt_dokumentation + exception_list = lt_exception_list + export_parameter = lt_export_parameter + import_parameter = lt_import_parameter + tables_parameter = lt_tables_parameter + EXCEPTIONS + error_message = 1 + function_not_found = 2 + invalid_name = 3 + OTHERS = 4. + IF sy-subrc <> 0. + lcx_exception=>raise( 'Error from FUNCTION_IMPORT_DOKU' ). + ENDIF. + ENDMETHOD. + METHOD lif_object~serialize. DATA: lt_functions TYPE ty_function_tt, @@ -726,4 +764,4 @@ CLASS lcl_object_fugr IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_fugr IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_fugr IMPLEMENTATION diff --git a/src/zabapgit_object_fugr.prog.xml b/src/zabapgit_object_fugr.prog.xml index 1d911fdc1..2db659b49 100644 --- a/src/zabapgit_object_fugr.prog.xml +++ b/src/zabapgit_object_fugr.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_FUGR A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_FUGR 28 - diff --git a/src/zabapgit_object_iarp.prog.abap b/src/zabapgit_object_iarp.prog.abap index 9d6fb5bed..ecf2118d5 100644 --- a/src/zabapgit_object_iarp.prog.abap +++ b/src/zabapgit_object_iarp.prog.abap @@ -192,4 +192,4 @@ CLASS lcl_object_iarp IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_iarp IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_iarp IMPLEMENTATION diff --git a/src/zabapgit_object_iarp.prog.xml b/src/zabapgit_object_iarp.prog.xml index 46b112ef2..24b0a2fdf 100644 --- a/src/zabapgit_object_iarp.prog.xml +++ b/src/zabapgit_object_iarp.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_IARP A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_IARP 28 - diff --git a/src/zabapgit_object_iasp.prog.abap b/src/zabapgit_object_iasp.prog.abap index 30ee4e5f7..ae8338707 100644 --- a/src/zabapgit_object_iasp.prog.abap +++ b/src/zabapgit_object_iasp.prog.abap @@ -192,4 +192,4 @@ CLASS lcl_object_iasp IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_iasp IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_iasp IMPLEMENTATION diff --git a/src/zabapgit_object_iasp.prog.xml b/src/zabapgit_object_iasp.prog.xml index 6c4de26bb..5acfdf6dd 100644 --- a/src/zabapgit_object_iasp.prog.xml +++ b/src/zabapgit_object_iasp.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_IASP A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_IASP 28 - diff --git a/src/zabapgit_object_iatu.prog.abap b/src/zabapgit_object_iatu.prog.abap index 2373edf40..57321b2cb 100644 --- a/src/zabapgit_object_iatu.prog.abap +++ b/src/zabapgit_object_iatu.prog.abap @@ -209,4 +209,4 @@ CLASS lcl_object_iatu IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_iatu IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_iatu IMPLEMENTATION diff --git a/src/zabapgit_object_iatu.prog.xml b/src/zabapgit_object_iatu.prog.xml index 449360e3d..56705931a 100644 --- a/src/zabapgit_object_iatu.prog.xml +++ b/src/zabapgit_object_iatu.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_IATU A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_IATU 28 - diff --git a/src/zabapgit_object_intf.prog.abap b/src/zabapgit_object_intf.prog.abap new file mode 100644 index 000000000..968d3606d --- /dev/null +++ b/src/zabapgit_object_intf.prog.abap @@ -0,0 +1,318 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_OBJECT_INTF +*&---------------------------------------------------------------------* + +*----------------------------------------------------------------------* +* CLASS lcl_object_intf DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_intf DEFINITION FINAL INHERITING FROM lcl_objects_program. + PUBLIC SECTION. + INTERFACES lif_object. + ALIASES mo_files FOR lif_object~mo_files. + METHODS constructor + IMPORTING + is_item TYPE ty_item + iv_language TYPE spras. + PROTECTED SECTION. + METHODS deserialize_abap + IMPORTING io_xml TYPE REF TO lcl_xml_input + iv_package TYPE devclass + RAISING lcx_exception. + + METHODS deserialize_docu + IMPORTING io_xml TYPE REF TO lcl_xml_input + RAISING lcx_exception. + + PRIVATE SECTION. + DATA mo_object_oriented_object_fct TYPE REF TO lif_object_oriented_object_fnc. + + METHODS serialize_xml + IMPORTING io_xml TYPE REF TO lcl_xml_output + RAISING lcx_exception. +ENDCLASS. "lcl_object_intf DEFINITION +CLASS lcl_object_intf IMPLEMENTATION. + METHOD constructor. + super->constructor( + is_item = is_item + iv_language = iv_language ). + mo_object_oriented_object_fct = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ). + ENDMETHOD. + METHOD lif_object~deserialize. + deserialize_abap( io_xml = io_xml + iv_package = iv_package ). + + deserialize_docu( io_xml ). + ENDMETHOD. + METHOD deserialize_abap. + DATA: ls_vseointerf TYPE vseointerf, + lt_source TYPE seop_source_string, + lt_descriptions TYPE ty_seocompotx_tt, + ls_clskey TYPE seoclskey. + ls_clskey-clsname = ms_item-obj_name. + + lt_source = mo_files->read_abap( ). + + io_xml->read( EXPORTING iv_name = 'VSEOINTERF' + CHANGING cg_data = ls_vseointerf ). + + mo_object_oriented_object_fct->create( + EXPORTING + iv_package = iv_package + CHANGING + is_properties = ls_vseointerf ). + + mo_object_oriented_object_fct->deserialize_source( + is_key = ls_clskey + it_source = lt_source ). + + io_xml->read( EXPORTING iv_name = 'DESCRIPTIONS' + CHANGING cg_data = lt_descriptions ). + + mo_object_oriented_object_fct->update_descriptions( + is_key = ls_clskey + it_descriptions = lt_descriptions ). + + mo_object_oriented_object_fct->add_to_activation_list( is_item = ms_item ). + ENDMETHOD. + METHOD deserialize_docu. + + DATA: lt_lines TYPE tlinetab, + lv_object TYPE dokhl-object. + + io_xml->read( EXPORTING iv_name = 'LINES' + CHANGING cg_data = lt_lines ). + + IF lt_lines[] IS INITIAL. + RETURN. + ENDIF. + + lv_object = ms_item-obj_name. + + mo_object_oriented_object_fct->create_documentation( + it_lines = lt_lines + iv_object_name = lv_object + iv_language = mv_language ). + ENDMETHOD. + METHOD lif_object~has_changed_since. + DATA: + lv_program TYPE program, + lt_includes TYPE seoincl_t. + + lt_includes = mo_object_oriented_object_fct->get_includes( ms_item-obj_name ). + READ TABLE lt_includes INDEX 1 INTO lv_program. + "lv_program = cl_oo_classname_service=>get_interfacepool_name( lv_clsname ). + rv_changed = check_prog_changed_since( + iv_program = lv_program + iv_timestamp = iv_timestamp + iv_skip_gui = abap_true ). + ENDMETHOD. + + METHOD lif_object~serialize. + + DATA: lt_source TYPE seop_source_string, + ls_interface_key TYPE seoclskey. + + ls_interface_key-clsname = ms_item-obj_name. + + IF lif_object~exists( ) = abap_false. + RETURN. + ENDIF. + + CALL FUNCTION 'SEO_BUFFER_REFRESH' + EXPORTING + version = seoc_version_active + force = seox_true. + CALL FUNCTION 'SEO_BUFFER_REFRESH' + EXPORTING + version = seoc_version_inactive + force = seox_true. + + lt_source = mo_object_oriented_object_fct->serialize_abap( ls_interface_key ). + + mo_files->add_abap( lt_source ). + + serialize_xml( io_xml ). + ENDMETHOD. + + METHOD serialize_xml. + DATA: + lt_tpool TYPE textpool_table, + lv_object TYPE dokhl-object, + lv_state TYPE dokhl-dokstate, + lt_descriptions TYPE ty_seocompotx_tt, + ls_vseointerf TYPE vseointerf, + ls_clskey TYPE seoclskey, + lt_sotr TYPE ty_sotr_tt, + lt_lines TYPE tlinetab. + + + ls_clskey-clsname = ms_item-obj_name. + + ls_vseointerf = mo_object_oriented_object_fct->get_interface_properties( is_interface_key = ls_clskey ). + + CLEAR: ls_vseointerf-uuid, + ls_vseointerf-author, + ls_vseointerf-createdon, + ls_vseointerf-changedby, + ls_vseointerf-changedon, + ls_vseointerf-r3release. + + io_xml->add( iv_name = 'VSEOINTERF' + ig_data = ls_vseointerf ). + + lt_lines = mo_object_oriented_object_fct->read_documentation( + iv_class_name = ls_clskey-clsname + iv_language = mv_language ). + IF lines( lt_lines ) > 0. + io_xml->add( iv_name = 'LINES' + ig_data = lt_lines ). + ENDIF. + + lt_descriptions = mo_object_oriented_object_fct->read_descriptions( ls_clskey-clsname ). + IF lines( lt_descriptions ) > 0. + io_xml->add( iv_name = 'DESCRIPTIONS' + ig_data = lt_descriptions ). + ENDIF. + ENDMETHOD. + + METHOD lif_object~changed_by. + TYPES: BEGIN OF ty_includes, + programm TYPE programm, + END OF ty_includes. + + TYPES: BEGIN OF ty_reposrc, + unam TYPE reposrc-unam, + udat TYPE reposrc-udat, + utime TYPE reposrc-utime, + END OF ty_reposrc. + + DATA: lt_reposrc TYPE STANDARD TABLE OF ty_reposrc, + ls_reposrc LIKE LINE OF lt_reposrc, + lt_includes TYPE STANDARD TABLE OF ty_includes. + + lt_includes = mo_object_oriented_object_fct->get_includes( ms_item-obj_name ). + ASSERT lines( lt_includes ) > 0. + + SELECT unam udat utime FROM reposrc + INTO TABLE lt_reposrc + FOR ALL ENTRIES IN lt_includes + WHERE progname = lt_includes-programm + AND r3state = 'A'. + IF sy-subrc <> 0. + rv_user = c_user_unknown. + ELSE. + SORT lt_reposrc BY udat DESCENDING utime DESCENDING. + READ TABLE lt_reposrc INDEX 1 INTO ls_reposrc. + ASSERT sy-subrc = 0. + rv_user = ls_reposrc-unam. + ENDIF. + ENDMETHOD. + + METHOD lif_object~compare_to_remote_version. + CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. + ENDMETHOD. + + METHOD lif_object~delete. + DATA: ls_clskey TYPE seoclskey. + ls_clskey-clsname = ms_item-obj_name. + + mo_object_oriented_object_fct->delete( ls_clskey ). + ENDMETHOD. + + METHOD lif_object~exists. + DATA: ls_class_key TYPE seoclskey. + ls_class_key-clsname = ms_item-obj_name. + + rv_bool = mo_object_oriented_object_fct->exists( iv_object_name = ls_class_key ). + ENDMETHOD. + + METHOD lif_object~get_metadata. + rs_metadata = get_metadata( ). + ENDMETHOD. + + METHOD lif_object~jump. + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = 'INTF' + in_new_window = abap_true. + ENDMETHOD. + +ENDCLASS. + + + +CLASS lcl_object_oriented_interface DEFINITION + INHERITING FROM lcl_object_oriented_base. + PUBLIC SECTION. + METHODS: + lif_object_oriented_object_fnc~create REDEFINITION, + lif_object_oriented_object_fnc~get_includes REDEFINITION, + lif_object_oriented_object_fnc~get_interface_properties REDEFINITION, + lif_object_oriented_object_fnc~delete REDEFINITION. +ENDCLASS. + +CLASS lcl_object_oriented_interface IMPLEMENTATION. + METHOD lif_object_oriented_object_fnc~create. + CALL FUNCTION 'SEO_INTERFACE_CREATE_COMPLETE' + EXPORTING + devclass = iv_package + overwrite = iv_overwrite + CHANGING + interface = is_properties + EXCEPTIONS + existing = 1 + is_class = 2 + db_error = 3 + component_error = 4 + no_access = 5 + other = 6 + OTHERS = 7. + IF sy-subrc <> 0. + lcx_exception=>raise( 'Error from SEO_INTERFACE_CREATE_COMPLETE' ). + ENDIF. + ENDMETHOD. + METHOD lif_object_oriented_object_fnc~get_includes. + DATA lv_interface_name TYPE seoclsname. + lv_interface_name = iv_object_name. + APPEND cl_oo_classname_service=>get_interfacepool_name( lv_interface_name ) TO rt_includes. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~get_interface_properties. + CALL FUNCTION 'SEO_CLIF_GET' + EXPORTING + cifkey = is_interface_key + version = seoc_version_active + IMPORTING + interface = rs_interface_properties + EXCEPTIONS + not_existing = 1 + deleted = 2 + model_only = 3 + OTHERS = 4. + IF sy-subrc = 1. + RETURN. " in case only inactive version exists + ELSEIF sy-subrc <> 0. + lcx_exception=>raise( 'error from seo_clif_get' ). + ENDIF. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~delete. + CALL FUNCTION 'SEO_INTERFACE_DELETE_COMPLETE' + EXPORTING + intkey = is_deletion_key + EXCEPTIONS + not_existing = 1 + is_class = 2 + db_error = 3 + no_access = 4 + other = 5 + OTHERS = 6. + IF sy-subrc <> 0. + lcx_exception=>raise( 'Error from SEO_INTERFACE_DELETE_COMPLETE' ). + ENDIF. + ENDMETHOD. +ENDCLASS. diff --git a/src/zabapgit_object_intf.prog.xml b/src/zabapgit_object_intf.prog.xml new file mode 100644 index 000000000..8ddf78af4 --- /dev/null +++ b/src/zabapgit_object_intf.prog.xml @@ -0,0 +1,22 @@ + + + + + + ZABAPGIT_OBJECT_INTF + A + X + I + E + X + + + + R + Include ZABAPGIT_OBJECT_INTF + 28 + + + + + diff --git a/src/zabapgit_object_msag.prog.abap b/src/zabapgit_object_msag.prog.abap index bfb8d2837..447502686 100644 --- a/src/zabapgit_object_msag.prog.abap +++ b/src/zabapgit_object_msag.prog.abap @@ -300,4 +300,4 @@ CLASS lcl_object_msag IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_msag IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_msag IMPLEMENTATION diff --git a/src/zabapgit_object_msag.prog.xml b/src/zabapgit_object_msag.prog.xml index f2d00825d..6753f5137 100644 --- a/src/zabapgit_object_msag.prog.xml +++ b/src/zabapgit_object_msag.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_MSAG A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_MSAG 28 - diff --git a/src/zabapgit_object_nrob.prog.abap b/src/zabapgit_object_nrob.prog.abap index 47edb4254..62987cf57 100644 --- a/src/zabapgit_object_nrob.prog.abap +++ b/src/zabapgit_object_nrob.prog.abap @@ -272,4 +272,4 @@ CLASS lcl_object_nrob IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_nrob IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_nrob IMPLEMENTATION diff --git a/src/zabapgit_object_nrob.prog.xml b/src/zabapgit_object_nrob.prog.xml index 34309b7e4..77f8a3b7a 100644 --- a/src/zabapgit_object_nrob.prog.xml +++ b/src/zabapgit_object_nrob.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_NROB A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_NROB 28 - diff --git a/src/zabapgit_object_oo_factory.prog.abap b/src/zabapgit_object_oo_factory.prog.abap new file mode 100644 index 000000000..9668924b1 --- /dev/null +++ b/src/zabapgit_object_oo_factory.prog.abap @@ -0,0 +1,29 @@ +*&---------------------------------------------------------------------* +*& Include zabapgit_object_oo_factory +*&---------------------------------------------------------------------* +CLASS lcl_object_oriented_factory IMPLEMENTATION. + METHOD make. + IF go_object_oriented_object IS BOUND. + ro_object_oriented_object = go_object_oriented_object. + RETURN. + ENDIF. + IF iv_object_type = 'CLAS'. + CREATE OBJECT ro_object_oriented_object TYPE lcl_object_oriented_class. + ELSEIF iv_object_type = 'INTF'. + CREATE OBJECT ro_object_oriented_object TYPE lcl_object_oriented_interface. + ENDIF. + ENDMETHOD. +ENDCLASS. + +CLASS lth_oo_factory_injector DEFINITION FOR TESTING. + PUBLIC SECTION. + CLASS-METHODS: + inject + IMPORTING + io_object_oriented_object TYPE REF TO lif_object_oriented_object_fnc. +ENDCLASS. +CLASS lth_oo_factory_injector IMPLEMENTATION. + METHOD inject. + lcl_object_oriented_factory=>go_object_oriented_object = io_object_oriented_object. + ENDMETHOD. +ENDCLASS. diff --git a/src/zabapgit_object_oo_factory.prog.xml b/src/zabapgit_object_oo_factory.prog.xml new file mode 100644 index 000000000..a31593880 --- /dev/null +++ b/src/zabapgit_object_oo_factory.prog.xml @@ -0,0 +1,25 @@ + + + + + + ZABAPGIT_OBJECT_OO_FACTORY + A + X + S + D$ + I + X + D$S + X + + + + R + Include ZABAPGIT_OBJECT_OO_FACTORY + 34 + + + + + diff --git a/src/zabapgit_object_oo_functions.prog.abap b/src/zabapgit_object_oo_functions.prog.abap new file mode 100644 index 000000000..f6fe9be8f --- /dev/null +++ b/src/zabapgit_object_oo_functions.prog.abap @@ -0,0 +1,630 @@ +"This interface contains SAP object oriented functions that can't be put under test +"(i.e. creating a Class in the system) +INTERFACE lif_object_oriented_object_fnc. + TYPES: BEGIN OF ty_includes, + programm TYPE programm, + END OF ty_includes, + ty_includes_tt TYPE STANDARD TABLE OF ty_includes WITH DEFAULT KEY. + + METHODS: + create + IMPORTING + iv_package TYPE devclass + iv_overwrite TYPE seox_boolean DEFAULT seox_true + CHANGING + is_properties TYPE any + RAISING + lcx_exception, + generate_locals + IMPORTING + is_key TYPE seoclskey + iv_force TYPE seox_boolean DEFAULT seox_true + it_local_definitions TYPE seop_source_string OPTIONAL + it_local_implementations TYPE seop_source_string OPTIONAL + it_local_macros TYPE seop_source_string OPTIONAL + it_local_test_classes TYPE seop_source_string OPTIONAL + RAISING + lcx_exception, + deserialize_source + IMPORTING + is_key TYPE seoclskey + it_source TYPE ty_string_tt + RAISING + lcx_exception + cx_sy_dyn_call_error, + insert_text_pool + IMPORTING + iv_class_name TYPE seoclsname + it_text_pool TYPE textpool_table + iv_language TYPE spras + RAISING + lcx_exception, + update_descriptions + IMPORTING + is_key TYPE seoclskey + it_descriptions TYPE ty_seocompotx_tt, + add_to_activation_list + IMPORTING + is_item TYPE ty_item + RAISING + lcx_exception, + create_sotr + IMPORTING + iv_package TYPE devclass + it_sotr TYPE ty_sotr_tt + RAISING + lcx_exception, + create_documentation + IMPORTING + it_lines TYPE tlinetab + iv_object_name TYPE dokhl-object + iv_language TYPE spras + RAISING + lcx_exception, + get_includes + IMPORTING + iv_object_name TYPE sobj_name + RETURNING + VALUE(rt_includes) TYPE ty_includes_tt, + exists + IMPORTING + iv_object_name TYPE seoclskey + RETURNING + VALUE(rv_exists) TYPE abap_bool, + serialize_abap + IMPORTING + is_class_key TYPE seoclskey + iv_type TYPE seop_include_ext_app OPTIONAL + RETURNING + VALUE(rt_source) TYPE ty_string_tt + RAISING + lcx_exception + cx_sy_dyn_call_error, + get_skip_test_classes + RETURNING + VALUE(rv_skip) TYPE abap_bool, + get_class_properties + IMPORTING + is_class_key TYPE seoclskey + RETURNING + VALUE(rs_class_properties) TYPE vseoclass + RAISING + lcx_exception, + get_interface_properties + IMPORTING + is_interface_key TYPE seoclskey + RETURNING + VALUE(rs_interface_properties) TYPE vseointerf + RAISING + lcx_exception, + read_text_pool + IMPORTING + iv_class_name TYPE seoclsname + iv_language TYPE spras + RETURNING + VALUE(rt_text_pool) TYPE textpool_table, + read_documentation + IMPORTING + iv_class_name TYPE seoclsname + iv_language TYPE spras + RETURNING + VALUE(rt_lines) TYPE tlinetab, + read_sotr + IMPORTING + iv_object_name TYPE sobj_name + RETURNING + VALUE(rt_sotr) TYPE ty_sotr_tt + RAISING + lcx_exception, + read_descriptions + IMPORTING + iv_obejct_name TYPE seoclsname + RETURNING + VALUE(rt_descriptions) TYPE ty_seocompotx_tt, + delete + IMPORTING + is_deletion_key TYPE seoclskey + RAISING + lcx_exception. +ENDINTERFACE. + +CLASS lcl_oo_object_serializer DEFINITION. + PUBLIC SECTION. + + METHODS: + serialize_abap_clif_source + IMPORTING + is_class_key TYPE seoclskey + iv_type TYPE seop_include_ext_app OPTIONAL + RETURNING + VALUE(rt_source) TYPE ty_string_tt + RAISING + lcx_exception + cx_sy_dyn_call_error, + are_test_classes_skipped + RETURNING + VALUE(rv_return) TYPE abap_bool. + METHODS serialize_locals_imp + IMPORTING is_clskey TYPE seoclskey + RETURNING VALUE(rt_source) TYPE ty_string_tt + RAISING lcx_exception. + + METHODS serialize_locals_def + IMPORTING is_clskey TYPE seoclskey + RETURNING VALUE(rt_source) TYPE ty_string_tt + RAISING lcx_exception. + METHODS serialize_testclasses + IMPORTING + is_clskey TYPE seoclskey + RETURNING VALUE(rt_source) TYPE ty_string_tt + RAISING lcx_exception. + + METHODS serialize_macros + IMPORTING is_clskey TYPE seoclskey + RETURNING VALUE(rt_source) TYPE ty_string_tt + RAISING lcx_exception. + PRIVATE SECTION. + DATA mv_skip_testclass TYPE abap_bool. + METHODS serialize_abap_old + IMPORTING is_clskey TYPE seoclskey + RETURNING VALUE(rt_source) TYPE ty_string_tt + RAISING lcx_exception. + + METHODS serialize_abap_new + IMPORTING is_clskey TYPE seoclskey + RETURNING VALUE(rt_source) TYPE ty_string_tt + RAISING lcx_exception + cx_sy_dyn_call_error. + METHODS remove_signatures + CHANGING ct_source TYPE ty_string_tt. + + METHODS read_include + IMPORTING is_clskey TYPE seoclskey + iv_type TYPE seop_include_ext_app + RETURNING VALUE(rt_source) TYPE seop_source_string. + + + METHODS reduce + CHANGING ct_source TYPE ty_string_tt. +ENDCLASS. + +CLASS lcl_oo_object_serializer IMPLEMENTATION. + METHOD serialize_abap_clif_source. + TRY. + rt_source = serialize_abap_new( is_class_key ). + CATCH cx_sy_dyn_call_error. + rt_source = serialize_abap_old( is_class_key ). + ENDTRY. + ENDMETHOD. + METHOD serialize_abap_old. +* for old ABAP AS versions + DATA: lo_source TYPE REF TO cl_oo_source. + + CREATE OBJECT lo_source + EXPORTING + clskey = is_clskey + EXCEPTIONS + class_not_existing = 1 + OTHERS = 2. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from CL_OO_SOURCE' ). + ENDIF. + + lo_source->read( 'A' ). + rt_source = lo_source->get_old_source( ). + remove_signatures( CHANGING ct_source = rt_source ). + + ENDMETHOD. "serialize_abap + + METHOD serialize_abap_new. + + DATA: lo_source TYPE REF TO object, + lo_instance TYPE REF TO object. + +* do not call the class/methods statically, as it will +* give syntax errors on old versions + CALL METHOD ('CL_OO_FACTORY')=>('CREATE_INSTANCE') + RECEIVING + result = lo_instance. + + CALL METHOD lo_instance->('CREATE_CLIF_SOURCE') + EXPORTING + clif_name = is_clskey-clsname + version = 'A' + RECEIVING + result = lo_source. + + CALL METHOD lo_source->('GET_SOURCE') + IMPORTING + source = rt_source. + + ENDMETHOD. + + METHOD remove_signatures. + +* signatures messes up in CL_OO_SOURCE when deserializing and serializing +* within same session + + DATA: lv_begin TYPE string, + lv_end TYPE string, + lv_remove TYPE sap_bool, + lv_source LIKE LINE OF ct_source. + + "@TODO: Put under test + CONCATENATE '* ------------------------------------' + '---------------------------------------------------+' + INTO lv_begin. + + CONCATENATE '* +------------------------------------------------' + '--------------------------------------' + INTO lv_end. + + lv_remove = abap_false. + LOOP AT ct_source INTO lv_source. + IF lv_source = lv_begin. + lv_remove = abap_true. + ENDIF. + IF lv_remove = abap_true. + DELETE ct_source INDEX sy-tabix. + ENDIF. + IF lv_source = lv_end. + lv_remove = abap_false. + ENDIF. + ENDLOOP. + + ENDMETHOD. "remove_signatures + METHOD reduce. + + DATA: lv_source LIKE LINE OF ct_source, + lv_found TYPE sap_bool. + + +* skip files that only contain the standard comments + lv_found = abap_false. + LOOP AT ct_source INTO lv_source. + IF strlen( lv_source ) >= 3 AND lv_source(3) <> '*"*'. + lv_found = abap_true. + ENDIF. + ENDLOOP. + IF lv_found = abap_false. + CLEAR ct_source[]. + ENDIF. + + ENDMETHOD. "reduce + + METHOD serialize_locals_imp. + + rt_source = read_include( is_clskey = is_clskey + iv_type = seop_ext_class_locals_imp ). + + reduce( CHANGING ct_source = rt_source ). + + ENDMETHOD. "serialize_local + + METHOD serialize_locals_def. + + rt_source = read_include( is_clskey = is_clskey + iv_type = seop_ext_class_locals_def ). + + reduce( CHANGING ct_source = rt_source ). + + ENDMETHOD. "serialize_locals_def + + METHOD read_include. + + DATA: ls_include TYPE progstruc. + + + ASSERT iv_type = seop_ext_class_locals_def + OR iv_type = seop_ext_class_locals_imp + OR iv_type = seop_ext_class_macros + OR iv_type = seop_ext_class_testclasses. + + ls_include-rootname = is_clskey-clsname. + TRANSLATE ls_include-rootname USING ' ='. + ls_include-categorya = iv_type(1). + ls_include-codea = iv_type+1(4). + +* it looks like there is an issue in function module SEO_CLASS_GET_INCLUDE_SOURCE +* on 750 kernels, where the READ REPORT without STATE addition does not +* return the active version, this method is a workaround for this issue + READ REPORT ls_include INTO rt_source STATE 'A'. + + ENDMETHOD. + + METHOD serialize_testclasses. + + DATA: lv_line1 LIKE LINE OF rt_source, + lv_line2 LIKE LINE OF rt_source. + + + rt_source = read_include( is_clskey = is_clskey + iv_type = seop_ext_class_testclasses ). + +* when creating classes in Eclipse it automatically generates the +* testclass include, but it is not needed, so skip to avoid +* creating an extra file in the repository. +* Also remove it if the content is manually removed, but +* the class still thinks it contains tests + "@TODO: Put under test + mv_skip_testclass = abap_false. + IF lines( rt_source ) = 2. + READ TABLE rt_source INDEX 1 INTO lv_line1. + ASSERT sy-subrc = 0. + READ TABLE rt_source INDEX 2 INTO lv_line2. + ASSERT sy-subrc = 0. + IF lv_line1(3) = '*"*' AND lv_line2 IS INITIAL. + mv_skip_testclass = abap_true. + ENDIF. + ELSEIF lines( rt_source ) = 1. + READ TABLE rt_source INDEX 1 INTO lv_line1. + ASSERT sy-subrc = 0. + IF lv_line1 IS INITIAL + OR ( strlen( lv_line1 ) >= 3 AND lv_line1(3) = '*"*' ) + OR ( strlen( lv_line1 ) = 1 AND lv_line1(1) = '*' ). + mv_skip_testclass = abap_true. + ENDIF. + ELSEIF lines( rt_source ) = 0. + mv_skip_testclass = abap_true. + ENDIF. + + ENDMETHOD. "serialize_test + + METHOD serialize_macros. + + rt_source = read_include( is_clskey = is_clskey + iv_type = seop_ext_class_macros ). + + reduce( CHANGING ct_source = rt_source ). + + ENDMETHOD. "serialize_macro + METHOD are_test_classes_skipped. + rv_return = mv_skip_testclass. + ENDMETHOD. + +ENDCLASS. + +CLASS lcl_object_oriented_base DEFINITION ABSTRACT. + PUBLIC SECTION. + INTERFACES: lif_object_oriented_object_fnc. + PRIVATE SECTION. + DATA mv_skip_test_classes TYPE abap_bool. + METHODS deserialize_abap_source_old + IMPORTING is_clskey TYPE seoclskey + it_source TYPE ty_string_tt + RAISING lcx_exception. + + METHODS deserialize_abap_source_new + IMPORTING is_clskey TYPE seoclskey + it_source TYPE ty_string_tt + RAISING lcx_exception + cx_sy_dyn_call_error. +ENDCLASS. + +CLASS lcl_object_oriented_base IMPLEMENTATION. + + METHOD lif_object_oriented_object_fnc~create. + ASSERT 0 = 1. "Subclass responsibility + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~deserialize_source. + TRY. + deserialize_abap_source_new( + is_clskey = is_key + it_source = it_source ). + CATCH cx_sy_dyn_call_error. + deserialize_abap_source_old( + is_clskey = is_key + it_source = it_source ). + ENDTRY. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~generate_locals. + ASSERT 0 = 1. "Subclass responsibility + ENDMETHOD. + + METHOD deserialize_abap_source_old. + "for backwards compatability down to 702 + + DATA: lo_source TYPE REF TO cl_oo_source. + + CREATE OBJECT lo_source + EXPORTING + clskey = is_clskey + EXCEPTIONS + class_not_existing = 1 + OTHERS = 2. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from CL_OO_SOURCE' ). + ENDIF. + + TRY. + lo_source->access_permission( seok_access_modify ). + lo_source->set_source( it_source ). + lo_source->save( ). + lo_source->access_permission( seok_access_free ). + CATCH cx_oo_access_permission. + lcx_exception=>raise( 'permission error' ). + CATCH cx_oo_source_save_failure. + lcx_exception=>raise( 'save failure' ). + ENDTRY. + + ENDMETHOD. + + METHOD deserialize_abap_source_new. + DATA: lo_factory TYPE REF TO object, + lo_source TYPE REF TO object. + + CALL METHOD ('CL_OO_FACTORY')=>('CREATE_INSTANCE') + RECEIVING + result = lo_factory. + + CALL METHOD lo_factory->('CREATE_CLIF_SOURCE') + EXPORTING + clif_name = is_clskey-clsname + RECEIVING + result = lo_source. + + TRY. + CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~LOCK'). + CATCH cx_oo_access_permission. + lcx_exception=>raise( 'source_new, access permission exception' ). + ENDTRY. + + CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SET_SOURCE') + EXPORTING + source = it_source. + + CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SAVE'). + + CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~UNLOCK'). + + ENDMETHOD. + METHOD lif_object_oriented_object_fnc~add_to_activation_list. + lcl_objects_activation=>add_item( is_item ). + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~update_descriptions. + DELETE FROM seocompotx WHERE clsname = is_key-clsname. + INSERT seocompotx FROM TABLE it_descriptions. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~insert_text_pool. + ASSERT 0 = 1. "Subclass responsibility + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~create_sotr. + ASSERT 0 = 1. "Subclass responsibility + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~create_documentation. + CALL FUNCTION 'DOCU_UPD' + EXPORTING + id = 'CL' + langu = iv_language + object = iv_object_name + TABLES + line = it_lines + EXCEPTIONS + ret_code = 1 + OTHERS = 2. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from DOCU_UPD' ). + ENDIF. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~get_includes. + ASSERT 0 = 1. "Subclass responsibility + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~exists. + CALL FUNCTION 'SEO_CLASS_EXISTENCE_CHECK' + EXPORTING + clskey = iv_object_name + EXCEPTIONS + not_specified = 1 + not_existing = 2 + is_interface = 3 + no_text = 4 + inconsistent = 5 + OTHERS = 6. + rv_exists = boolc( sy-subrc <> 2 ). + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~serialize_abap. + DATA lo_oo_serializer TYPE REF TO lcl_oo_object_serializer. + CREATE OBJECT lo_oo_serializer. + CASE iv_type. + WHEN seop_ext_class_locals_def. + rt_source = lo_oo_serializer->serialize_locals_def( is_class_key ). + WHEN seop_ext_class_locals_imp. + rt_source = lo_oo_serializer->serialize_locals_imp( is_class_key ). + WHEN seop_ext_class_macros. + rt_source = lo_oo_serializer->serialize_macros( is_class_key ). + WHEN seop_ext_class_testclasses. + rt_source = lo_oo_serializer->serialize_testclasses( is_class_key ). + mv_skip_test_classes = lo_oo_serializer->are_test_classes_skipped( ). + WHEN OTHERS. + rt_source = lo_oo_serializer->serialize_abap_clif_source( is_class_key ). + ENDCASE. + ENDMETHOD. + METHOD lif_object_oriented_object_fnc~get_skip_test_classes. + rv_skip = mv_skip_test_classes. + ENDMETHOD. + METHOD lif_object_oriented_object_fnc~get_class_properties. + ASSERT 0 = 1. "Subclass responsibility + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~get_interface_properties. + ASSERT 0 = 1. "Subclass responsibility + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~read_text_pool. + ASSERT 0 = 1. "Subclass responsibility + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~read_sotr. + ASSERT 0 = 1. "Subclass responsibility + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~read_documentation. + DATA: + lv_state TYPE dokstate, + lv_object TYPE dokhl-object, + lt_lines TYPE tlinetab. + + lv_object = iv_class_name. + + CALL FUNCTION 'DOCU_GET' + EXPORTING + id = 'CL' + langu = iv_language + object = lv_object + IMPORTING + dokstate = lv_state + TABLES + line = lt_lines + EXCEPTIONS + no_docu_on_screen = 1 + no_docu_self_def = 2 + no_docu_temp = 3 + ret_code = 4 + OTHERS = 5. + IF sy-subrc = 0 AND lv_state = 'R'. + rt_lines = lt_lines. + ELSE. + CLEAR rt_lines. + ENDIF. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~read_descriptions. + SELECT * FROM seocompotx INTO TABLE rt_descriptions + WHERE clsname = iv_obejct_name. + DELETE rt_descriptions WHERE descript IS INITIAL. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~delete. + ASSERT 0 = 1. "Subclass responsibility + ENDMETHOD. + +ENDCLASS. + +"Backdoor injection for test purposes +CLASS lth_oo_factory_injector DEFINITION DEFERRED. + +CLASS lcl_object_oriented_factory DEFINITION + FRIENDS lth_oo_factory_injector. + PUBLIC SECTION. + CLASS-METHODS: + make + IMPORTING + iv_object_type TYPE tadir-object + RETURNING + VALUE(ro_object_oriented_object) TYPE REF TO lif_object_oriented_object_fnc. + PRIVATE SECTION. + CLASS-DATA: + go_object_oriented_object TYPE REF TO lif_object_oriented_object_fnc. +ENDCLASS. +"lcl_object_oriented_factory implementation is in include ZABAPGIT_OBJECT_OO_FACTORY. +"Reason: In this way, clas and intf specific OO functions implementations can be done +"at the own includes. diff --git a/src/zabapgit_object_oo_functions.prog.xml b/src/zabapgit_object_oo_functions.prog.xml new file mode 100644 index 000000000..7c6960137 --- /dev/null +++ b/src/zabapgit_object_oo_functions.prog.xml @@ -0,0 +1,25 @@ + + + + + + ZABAPGIT_OBJECT_OO_FUNCTIONS + A + X + S + D$ + I + X + D$S + X + + + + R + Include ZABAPGIT_OBJECT_OO_FUNCTIONS + 36 + + + + + diff --git a/src/zabapgit_object_para.prog.abap b/src/zabapgit_object_para.prog.abap index 585093d68..c3ad3e5b8 100644 --- a/src/zabapgit_object_para.prog.abap +++ b/src/zabapgit_object_para.prog.abap @@ -60,10 +60,7 @@ CLASS lcl_object_para IMPLEMENTATION. SELECT SINGLE * FROM tparat INTO ls_tparat WHERE paramid = ms_item-obj_name - AND sprache = mv_language. "#EC CI_GENBUFF - IF sy-subrc <> 0. - lcx_exception=>raise( 'PARA no english description' ). - ENDIF. + AND sprache = mv_language. "#EC CI_GENBUFF "#EC CI_SUBRC io_xml->add( iv_name = 'TPARA' ig_data = ls_tpara ). @@ -151,4 +148,4 @@ CLASS lcl_object_para IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_para IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_para IMPLEMENTATION diff --git a/src/zabapgit_object_para.prog.xml b/src/zabapgit_object_para.prog.xml index 60c2adcf0..6524a0404 100644 --- a/src/zabapgit_object_para.prog.xml +++ b/src/zabapgit_object_para.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_PARA A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_PARA 28 - diff --git a/src/zabapgit_object_pinf.prog.abap b/src/zabapgit_object_pinf.prog.abap index 727fd1fb1..887be21e3 100644 --- a/src/zabapgit_object_pinf.prog.abap +++ b/src/zabapgit_object_pinf.prog.abap @@ -67,13 +67,20 @@ CLASS lcl_object_pinf IMPLEMENTATION. METHOD lif_object~exists. - DATA: lv_intf_name TYPE intf-intf_name. + DATA: lv_pack_name TYPE intf-pack_name, + lv_main_pack TYPE tdevc-mainpack. - SELECT SINGLE intf_name FROM intf INTO lv_intf_name + SELECT SINGLE pack_name FROM intf INTO lv_pack_name WHERE intf_name = ms_item-obj_name. rv_bool = boolc( sy-subrc = 0 ). + IF rv_bool = abap_true. + SELECT SINGLE mainpack FROM tdevc INTO lv_main_pack + WHERE devclass = lv_pack_name. + rv_bool = boolc( sy-subrc = 0 ). + ENDIF. + ENDMETHOD. "lif_object~exists METHOD lif_object~serialize. @@ -352,4 +359,4 @@ CLASS lcl_object_pinf IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_PINF IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_PINF IMPLEMENTATION diff --git a/src/zabapgit_object_pinf.prog.xml b/src/zabapgit_object_pinf.prog.xml index b9cb78ec0..f670e1a2c 100644 --- a/src/zabapgit_object_pinf.prog.xml +++ b/src/zabapgit_object_pinf.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_PINF A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_PINF 28 - diff --git a/src/zabapgit_object_prog.prog.abap b/src/zabapgit_object_prog.prog.abap index c3a32baee..17700fa4a 100644 --- a/src/zabapgit_object_prog.prog.abap +++ b/src/zabapgit_object_prog.prog.abap @@ -140,4 +140,4 @@ CLASS lcl_object_prog IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_prog IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_prog IMPLEMENTATION diff --git a/src/zabapgit_object_prog.prog.xml b/src/zabapgit_object_prog.prog.xml index 508c79fd4..63cab6974 100644 --- a/src/zabapgit_object_prog.prog.xml +++ b/src/zabapgit_object_prog.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_PROG A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_PROG 28 - diff --git a/src/zabapgit_object_serializing.prog.abap b/src/zabapgit_object_serializing.prog.abap index 0536d687c..a15b14df5 100644 --- a/src/zabapgit_object_serializing.prog.abap +++ b/src/zabapgit_object_serializing.prog.abap @@ -6,6 +6,7 @@ INCLUDE zabapgit_object_acid. INCLUDE zabapgit_object_auth. +INCLUDE zabapgit_object_oo_functions. INCLUDE zabapgit_object_clas. INCLUDE zabapgit_object_doct. INCLUDE zabapgit_object_docv. @@ -19,6 +20,7 @@ INCLUDE zabapgit_object_fugr. INCLUDE zabapgit_object_iarp. INCLUDE zabapgit_object_iasp. INCLUDE zabapgit_object_iatu. +INCLUDE zabapgit_object_intf. INCLUDE zabapgit_object_msag. INCLUDE zabapgit_object_nrob. INCLUDE zabapgit_object_para. @@ -48,4 +50,5 @@ INCLUDE zabapgit_object_w3xx. INCLUDE zabapgit_object_wdya. INCLUDE zabapgit_object_wdyn. INCLUDE zabapgit_object_webi. -INCLUDE zabapgit_object_xslt. \ No newline at end of file +INCLUDE zabapgit_object_xslt. +INCLUDE zabapgit_object_oo_factory. diff --git a/src/zabapgit_object_serializing.prog.xml b/src/zabapgit_object_serializing.prog.xml index cfd9247d6..fde95641c 100644 --- a/src/zabapgit_object_serializing.prog.xml +++ b/src/zabapgit_object_serializing.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_SERIALIZING A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_SERIALIZATION 37 - diff --git a/src/zabapgit_object_sfbf.prog.abap b/src/zabapgit_object_sfbf.prog.abap index 5caaf627a..154582f2f 100644 --- a/src/zabapgit_object_sfbf.prog.abap +++ b/src/zabapgit_object_sfbf.prog.abap @@ -39,6 +39,7 @@ CLASS lcl_object_sfbf IMPLEMENTATION. METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). + rs_metadata-ddic = abap_true. ENDMETHOD. "lif_object~get_metadata METHOD lif_object~exists. @@ -237,4 +238,4 @@ CLASS lcl_object_sfbf IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_SFBF IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_SFBF IMPLEMENTATION diff --git a/src/zabapgit_object_sfbf.prog.xml b/src/zabapgit_object_sfbf.prog.xml index b4e34931a..76e5ac9d8 100644 --- a/src/zabapgit_object_sfbf.prog.xml +++ b/src/zabapgit_object_sfbf.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_SFBF A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_SFBF 28 - diff --git a/src/zabapgit_object_sfbs.prog.abap b/src/zabapgit_object_sfbs.prog.abap index 4bbd85222..78b76e509 100644 --- a/src/zabapgit_object_sfbs.prog.abap +++ b/src/zabapgit_object_sfbs.prog.abap @@ -56,6 +56,7 @@ CLASS lcl_object_sfbs IMPLEMENTATION. METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). + rs_metadata-ddic = abap_true. ENDMETHOD. "lif_object~get_metadata METHOD lif_object~exists. @@ -213,4 +214,4 @@ CLASS lcl_object_sfbs IMPLEMENTATION. -ENDCLASS. "lcl_object_SFBS IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_SFBS IMPLEMENTATION diff --git a/src/zabapgit_object_sfbs.prog.xml b/src/zabapgit_object_sfbs.prog.xml index d92d19c27..c4b4957d6 100644 --- a/src/zabapgit_object_sfbs.prog.xml +++ b/src/zabapgit_object_sfbs.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_SFBS A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_SFBS 28 - diff --git a/src/zabapgit_object_sfsw.prog.abap b/src/zabapgit_object_sfsw.prog.abap index 33e9c21ff..5f0d563c0 100644 --- a/src/zabapgit_object_sfsw.prog.abap +++ b/src/zabapgit_object_sfsw.prog.abap @@ -39,6 +39,7 @@ CLASS lcl_object_sfsw IMPLEMENTATION. METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). + rs_metadata-ddic = abap_true. ENDMETHOD. "lif_object~get_metadata METHOD lif_object~exists. @@ -205,4 +206,4 @@ CLASS lcl_object_sfsw IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_sfsw IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_sfsw IMPLEMENTATION diff --git a/src/zabapgit_object_sfsw.prog.xml b/src/zabapgit_object_sfsw.prog.xml index f21c9b800..6096a8269 100644 --- a/src/zabapgit_object_sfsw.prog.xml +++ b/src/zabapgit_object_sfsw.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_SFSW A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_SFSW 28 - diff --git a/src/zabapgit_object_shi3.prog.abap b/src/zabapgit_object_shi3.prog.abap index d7789e964..baf26fb0f 100644 --- a/src/zabapgit_object_shi3.prog.abap +++ b/src/zabapgit_object_shi3.prog.abap @@ -158,6 +158,7 @@ CLASS lcl_object_shi3 IMPLEMENTATION. lt_texts TYPE TABLE OF hier_texts, lt_refs TYPE TABLE OF hier_ref. + CALL FUNCTION 'STREE_STRUCTURE_READ' EXPORTING structure_id = mv_tree_id @@ -167,10 +168,6 @@ CLASS lcl_object_shi3 IMPLEMENTATION. TABLES description = lt_titles. - IF sy-subrc <> 0. - lcx_exception=>raise( 'Error from STREE_STRUCTURE_READ, SHI3' ). - ENDIF. - CALL FUNCTION 'STREE_HIERARCHY_READ' EXPORTING structure_id = mv_tree_id @@ -182,9 +179,6 @@ CLASS lcl_object_shi3 IMPLEMENTATION. list_of_nodes = lt_nodes list_of_references = lt_refs list_of_texts = lt_texts. - IF sy-subrc <> 0. - lcx_exception=>raise( 'Error from STREE_HIERARCHY_READ, SHI3' ). - ENDIF. strip_stamps( CHANGING cs_head = ls_head ct_nodes = lt_nodes ). @@ -334,4 +328,4 @@ CLASS lcl_object_shi3 IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_shi3 IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_shi3 IMPLEMENTATION diff --git a/src/zabapgit_object_shi3.prog.xml b/src/zabapgit_object_shi3.prog.xml index a6432c322..80b375e9d 100644 --- a/src/zabapgit_object_shi3.prog.xml +++ b/src/zabapgit_object_shi3.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_SHI3 A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_SHI3 28 - diff --git a/src/zabapgit_object_shlp.prog.abap b/src/zabapgit_object_shlp.prog.abap index 9d32eb6db..604d6f897 100644 --- a/src/zabapgit_object_shlp.prog.abap +++ b/src/zabapgit_object_shlp.prog.abap @@ -50,6 +50,7 @@ CLASS lcl_object_shlp IMPLEMENTATION. METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). + rs_metadata-ddic = abap_true. ENDMETHOD. "lif_object~get_metadata METHOD lif_object~exists. @@ -207,4 +208,4 @@ CLASS lcl_object_shlp IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_shlp IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_shlp IMPLEMENTATION diff --git a/src/zabapgit_object_shlp.prog.xml b/src/zabapgit_object_shlp.prog.xml index 9a694e7c3..9bd3083e4 100644 --- a/src/zabapgit_object_shlp.prog.xml +++ b/src/zabapgit_object_shlp.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_SHLP A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_SHLP 28 - diff --git a/src/zabapgit_object_sicf.prog.abap b/src/zabapgit_object_sicf.prog.abap index 3ff67774b..c495a443c 100644 --- a/src/zabapgit_object_sicf.prog.abap +++ b/src/zabapgit_object_sicf.prog.abap @@ -22,6 +22,7 @@ CLASS lcl_object_sicf DEFINITION INHERITING FROM lcl_objects_super FINAL. END OF ty_sicf_key. METHODS read + IMPORTING iv_clear TYPE abap_bool DEFAULT abap_true EXPORTING es_icfservice TYPE icfservice es_icfdocu TYPE icfdocu et_icfhandler TYPE ty_icfhandler_tt @@ -71,7 +72,8 @@ CLASS lcl_object_sicf IMPLEMENTATION. DATA: ls_icfservice TYPE icfservice. - read( IMPORTING es_icfservice = ls_icfservice ). + read( EXPORTING iv_clear = abap_false + IMPORTING es_icfservice = ls_icfservice ). rv_user = ls_icfservice-icf_muser. @@ -174,10 +176,12 @@ CLASS lcl_object_sicf IMPLEMENTATION. ASSERT sy-subrc = 0. MOVE-CORRESPONDING ls_serv_info-service TO es_icfservice. - CLEAR es_icfservice-icf_cuser. - CLEAR es_icfservice-icf_cdate. - CLEAR es_icfservice-icf_muser. - CLEAR es_icfservice-icf_mdate. + IF iv_clear = abap_true. + CLEAR es_icfservice-icf_cuser. + CLEAR es_icfservice-icf_cdate. + CLEAR es_icfservice-icf_muser. + CLEAR es_icfservice-icf_mdate. + ENDIF. CLEAR es_icfdocu-icfparguid. @@ -422,4 +426,4 @@ CLASS lcl_object_sicf IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_sicf IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_sicf IMPLEMENTATION diff --git a/src/zabapgit_object_sicf.prog.xml b/src/zabapgit_object_sicf.prog.xml index a11ae0758..0af1dfc8c 100644 --- a/src/zabapgit_object_sicf.prog.xml +++ b/src/zabapgit_object_sicf.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_SICF A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_SICF 28 - diff --git a/src/zabapgit_object_smim.prog.abap b/src/zabapgit_object_smim.prog.abap index b03edb856..ac30efc6b 100644 --- a/src/zabapgit_object_smim.prog.abap +++ b/src/zabapgit_object_smim.prog.abap @@ -191,7 +191,7 @@ CLASS lcl_object_smim IMPLEMENTATION. not_found = 3 permission_failure = 4 OTHERS = 5 ). - IF sy-subrc <> 0. + IF sy-subrc <> 0 AND sy-subrc <> 2 AND sy-subrc <> 3. lcx_exception=>raise( 'error from mime api->get:' && sy-msgv1 ). ENDIF. @@ -321,4 +321,4 @@ CLASS lcl_object_smim IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_smim IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_smim IMPLEMENTATION diff --git a/src/zabapgit_object_smim.prog.xml b/src/zabapgit_object_smim.prog.xml index 9bae0d613..ecdeb3942 100644 --- a/src/zabapgit_object_smim.prog.xml +++ b/src/zabapgit_object_smim.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_SMIM A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_SMIM 28 - diff --git a/src/zabapgit_object_splo.prog.abap b/src/zabapgit_object_splo.prog.abap index c8a958482..a056c1b38 100644 --- a/src/zabapgit_object_splo.prog.abap +++ b/src/zabapgit_object_splo.prog.abap @@ -131,4 +131,4 @@ CLASS lcl_object_splo IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_splo IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_splo IMPLEMENTATION diff --git a/src/zabapgit_object_splo.prog.xml b/src/zabapgit_object_splo.prog.xml index 90a46fbaf..af48a7774 100644 --- a/src/zabapgit_object_splo.prog.xml +++ b/src/zabapgit_object_splo.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_SPLO A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_SPLO 28 - diff --git a/src/zabapgit_object_ssfo.prog.abap b/src/zabapgit_object_ssfo.prog.abap index efef1e0c8..248443624 100644 --- a/src/zabapgit_object_ssfo.prog.abap +++ b/src/zabapgit_object_ssfo.prog.abap @@ -242,4 +242,4 @@ CLASS lcl_object_ssfo IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_ssfo IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_ssfo IMPLEMENTATION diff --git a/src/zabapgit_object_ssfo.prog.xml b/src/zabapgit_object_ssfo.prog.xml index 9545a6bce..c3a33beef 100644 --- a/src/zabapgit_object_ssfo.prog.xml +++ b/src/zabapgit_object_ssfo.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_SSFO A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_SSFO 28 - diff --git a/src/zabapgit_object_ssst.prog.abap b/src/zabapgit_object_ssst.prog.abap index 40dced694..def3c24af 100644 --- a/src/zabapgit_object_ssst.prog.abap +++ b/src/zabapgit_object_ssst.prog.abap @@ -207,4 +207,4 @@ CLASS lcl_object_ssst IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_ssst IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_ssst IMPLEMENTATION diff --git a/src/zabapgit_object_ssst.prog.xml b/src/zabapgit_object_ssst.prog.xml index a39f3f914..35653ad0f 100644 --- a/src/zabapgit_object_ssst.prog.xml +++ b/src/zabapgit_object_ssst.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_SSST A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_SSST 28 - diff --git a/src/zabapgit_object_susc.prog.abap b/src/zabapgit_object_susc.prog.abap index 5830bc7b4..e0a5be805 100644 --- a/src/zabapgit_object_susc.prog.abap +++ b/src/zabapgit_object_susc.prog.abap @@ -61,9 +61,9 @@ CLASS lcl_object_susc IMPLEMENTATION. SELECT SINGLE * FROM tobct INTO ls_tobct WHERE oclss = ms_item-obj_name AND langu = mv_language. - IF sy-subrc <> 0. - lcx_exception=>raise( 'TOBCT no english description' ). - ENDIF. +* IF sy-subrc <> 0. +* lcx_exception=>raise( 'TOBCT no english description' ). +* ENDIF. io_xml->add( iv_name = 'TOBC' ig_data = ls_tobc ). @@ -127,4 +127,4 @@ CLASS lcl_object_susc IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_susc IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_susc IMPLEMENTATION diff --git a/src/zabapgit_object_susc.prog.xml b/src/zabapgit_object_susc.prog.xml index 7a3199e11..ec145a928 100644 --- a/src/zabapgit_object_susc.prog.xml +++ b/src/zabapgit_object_susc.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_SUSC A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_SUSC 28 - diff --git a/src/zabapgit_object_suso.prog.abap b/src/zabapgit_object_suso.prog.abap index 09eace64a..ebd09188b 100644 --- a/src/zabapgit_object_suso.prog.abap +++ b/src/zabapgit_object_suso.prog.abap @@ -173,4 +173,4 @@ CLASS lcl_object_suso IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_suso IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_suso IMPLEMENTATION diff --git a/src/zabapgit_object_suso.prog.xml b/src/zabapgit_object_suso.prog.xml index 7630b96d1..6c50ceeb2 100644 --- a/src/zabapgit_object_suso.prog.xml +++ b/src/zabapgit_object_suso.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_SUSO A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_SUSO 28 - diff --git a/src/zabapgit_object_tabl.prog.abap b/src/zabapgit_object_tabl.prog.abap index 1875fa2c9..de2f10201 100644 --- a/src/zabapgit_object_tabl.prog.abap +++ b/src/zabapgit_object_tabl.prog.abap @@ -74,6 +74,7 @@ CLASS lcl_object_tabl IMPLEMENTATION. METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). + rs_metadata-ddic = abap_true. ENDMETHOD. "lif_object~get_metadata METHOD lif_object~exists. @@ -105,7 +106,7 @@ CLASS lcl_object_tabl IMPLEMENTATION. CALL FUNCTION 'RS_DD_DELETE_OBJ' EXPORTING - no_ask = abap_false + no_ask = abap_true objname = lv_objname objtype = 'T' EXCEPTIONS @@ -121,17 +122,18 @@ CLASS lcl_object_tabl IMPLEMENTATION. METHOD lif_object~serialize. - DATA: lv_name TYPE ddobjname, - ls_dd02v TYPE dd02v, - ls_dd09l TYPE dd09l, - lt_dd03p TYPE TABLE OF dd03p, - lt_dd05m TYPE TABLE OF dd05m, - lt_dd08v TYPE TABLE OF dd08v, - lt_dd12v TYPE dd12vtab, - lt_dd17v TYPE dd17vtab, - lt_dd35v TYPE TABLE OF dd35v, - lv_index LIKE sy-index, - lt_dd36m TYPE dd36mttyp. + DATA: lv_name TYPE ddobjname, + ls_dd02v TYPE dd02v, + ls_dd09l TYPE dd09l, + lt_dd03p TYPE TABLE OF dd03p, + lt_dd05m TYPE TABLE OF dd05m, + lt_dd08v TYPE TABLE OF dd08v, + lt_dd12v TYPE dd12vtab, + lt_dd17v TYPE dd17vtab, + lt_dd35v TYPE TABLE OF dd35v, + lv_index LIKE sy-index, + lv_masklen TYPE c LENGTH 4, + lt_dd36m TYPE dd36mttyp. FIELD-SYMBOLS: LIKE LINE OF lt_dd12v, LIKE LINE OF lt_dd05m, @@ -180,6 +182,9 @@ CLASS lcl_object_tabl IMPLEMENTATION. IF ls_dd02v-datmax = ''. CLEAR ls_dd02v-datmax. ENDIF. + IF ls_dd02v-datavg = ''. + CLEAR ls_dd02v-datavg. + ENDIF. CLEAR: ls_dd09l-as4user, ls_dd09l-as4date, @@ -206,7 +211,8 @@ CLASS lcl_object_tabl IMPLEMENTATION. -scrtext_m, -scrtext_l. - IF -masklen = '' OR NOT -masklen CO '0123456789'. + lv_masklen = -masklen. + IF lv_masklen = '' OR NOT lv_masklen CO '0123456789'. * make sure the field contains valid data, or the XML will dump CLEAR -masklen. ENDIF. @@ -229,7 +235,10 @@ CLASS lcl_object_tabl IMPLEMENTATION. -convexit, -entitytab, -dommaster, - -domname3l. + -domname3l, + -decimals, + -lowercase, + -signflag. ENDIF. IF -shlporigin = 'D'. @@ -424,4 +433,4 @@ CLASS lcl_object_tabl IMPLEMENTATION. ENDIF. ENDMETHOD. -ENDCLASS. "lcl_object_TABL IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_TABL IMPLEMENTATION diff --git a/src/zabapgit_object_tabl.prog.xml b/src/zabapgit_object_tabl.prog.xml index ca1c45f41..8f6de638d 100644 --- a/src/zabapgit_object_tabl.prog.xml +++ b/src/zabapgit_object_tabl.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_TABL A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_TABL 28 - diff --git a/src/zabapgit_object_tabl_valid.prog.abap b/src/zabapgit_object_tabl_valid.prog.abap index 58d0aa20a..6c33de4a5 100644 --- a/src/zabapgit_object_tabl_valid.prog.abap +++ b/src/zabapgit_object_tabl_valid.prog.abap @@ -187,9 +187,6 @@ CLASS lct_table_validation IMPLEMENTATION. ENDMETHOD. METHOD no_fields_no_message. - DATA: - ls_current_table_field LIKE LINE OF mt_current_table_fields. - create_xmls( ). mv_validation_message = mo_table_validator->validate( @@ -199,7 +196,6 @@ CLASS lct_table_validation IMPLEMENTATION. cl_abap_unit_assert=>assert_initial( mv_validation_message ). ENDMETHOD. - METHOD create_xmls. CREATE OBJECT mo_previous_version_out_xml. mo_previous_version_out_xml->add( @@ -220,6 +216,4 @@ CLASS lct_table_validation IMPLEMENTATION. iv_xml = mo_current_version_out_xml->render( ). ENDMETHOD. - - -ENDCLASS. \ No newline at end of file +ENDCLASS. diff --git a/src/zabapgit_object_tabl_valid.prog.xml b/src/zabapgit_object_tabl_valid.prog.xml index 0a56f24a3..5198ea961 100644 --- a/src/zabapgit_object_tabl_valid.prog.xml +++ b/src/zabapgit_object_tabl_valid.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_TABL_VALID A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_TABL_VALID 34 - diff --git a/src/zabapgit_object_tobj.prog.abap b/src/zabapgit_object_tobj.prog.abap index 3319bbee6..408c2dd6e 100644 --- a/src/zabapgit_object_tobj.prog.abap +++ b/src/zabapgit_object_tobj.prog.abap @@ -187,4 +187,4 @@ CLASS lcl_object_tobj IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_tobj IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_tobj IMPLEMENTATION diff --git a/src/zabapgit_object_tobj.prog.xml b/src/zabapgit_object_tobj.prog.xml index 3198d35a3..7a70a2b7a 100644 --- a/src/zabapgit_object_tobj.prog.xml +++ b/src/zabapgit_object_tobj.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_TOBJ A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_TOBJ 28 - diff --git a/src/zabapgit_object_tran.prog.abap b/src/zabapgit_object_tran.prog.abap index 9eba8a64a..18b030d4d 100644 --- a/src/zabapgit_object_tran.prog.abap +++ b/src/zabapgit_object_tran.prog.abap @@ -243,8 +243,7 @@ CLASS lcl_object_tran IMPLEMENTATION. communication_failure = 2 resource_failure = 3 OTHERS = 4 - ##fm_subrc_ok - . "#EC CI_SUBRC + ##fm_subrc_ok. "#EC CI_SUBRC ENDMETHOD. "jump @@ -288,6 +287,11 @@ CLASS lcl_object_tran IMPLEMENTATION. lt_param_values TYPE TABLE OF rsparam, ls_rsstcd TYPE rsstcd. + + IF lif_object~exists( ) = abap_true. + lif_object~delete( ). + ENDIF. + io_xml->read( EXPORTING iv_name = 'TSTC' CHANGING cg_data = ls_tstc ). io_xml->read( EXPORTING iv_name = 'TSTCC' @@ -414,4 +418,4 @@ CLASS lcl_object_tran IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_tran IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_tran IMPLEMENTATION diff --git a/src/zabapgit_object_tran.prog.xml b/src/zabapgit_object_tran.prog.xml index 0e52e4fbb..90022ad92 100644 --- a/src/zabapgit_object_tran.prog.xml +++ b/src/zabapgit_object_tran.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_TRAN A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_TRAN 28 - diff --git a/src/zabapgit_object_ttyp.prog.abap b/src/zabapgit_object_ttyp.prog.abap index b85104ebc..a621527ca 100644 --- a/src/zabapgit_object_ttyp.prog.abap +++ b/src/zabapgit_object_ttyp.prog.abap @@ -50,6 +50,7 @@ CLASS lcl_object_ttyp IMPLEMENTATION. METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). + rs_metadata-ddic = abap_true. ENDMETHOD. "lif_object~get_metadata METHOD lif_object~exists. @@ -186,4 +187,4 @@ CLASS lcl_object_ttyp IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_ttyp IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_ttyp IMPLEMENTATION diff --git a/src/zabapgit_object_ttyp.prog.xml b/src/zabapgit_object_ttyp.prog.xml index ffd8a5c56..8f41a7b2d 100644 --- a/src/zabapgit_object_ttyp.prog.xml +++ b/src/zabapgit_object_ttyp.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_TTYP A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_TTYP 28 - diff --git a/src/zabapgit_object_type.prog.abap b/src/zabapgit_object_type.prog.abap index 8c7273888..1908b94e0 100644 --- a/src/zabapgit_object_type.prog.abap +++ b/src/zabapgit_object_type.prog.abap @@ -52,7 +52,7 @@ CLASS lcl_object_type IMPLEMENTATION. TRY. read( ). rv_bool = abap_true. - CATCH lcx_not_found. + CATCH lcx_not_found lcx_exception. rv_bool = abap_false. ENDTRY. @@ -209,4 +209,4 @@ CLASS lcl_object_type IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_type IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_type IMPLEMENTATION diff --git a/src/zabapgit_object_type.prog.xml b/src/zabapgit_object_type.prog.xml index 6e2711cee..aeb879eb0 100644 --- a/src/zabapgit_object_type.prog.xml +++ b/src/zabapgit_object_type.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_TYPE A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_TYPE 28 - diff --git a/src/zabapgit_object_vcls.prog.abap b/src/zabapgit_object_vcls.prog.abap index 0fad2048b..4b4952620 100644 --- a/src/zabapgit_object_vcls.prog.abap +++ b/src/zabapgit_object_vcls.prog.abap @@ -39,13 +39,19 @@ CLASS lcl_object_vcls IMPLEMENTATION. ENDMETHOD. "lif_object~get_metadata METHOD lif_object~exists. - DATA lv_vclname TYPE vcl_name. - SELECT SINGLE vclname INTO lv_vclname FROM vcldir + DATA lv_changedate TYPE vcldir-changedate. + + SELECT SINGLE changedate INTO lv_changedate FROM vcldir WHERE vclname = ms_item-obj_name. rv_bool = boolc( sy-subrc = 0 ). + IF lv_changedate IS INITIAL. +* same logic as in function module VIEWCLUSTER_GET_DEFINITION + rv_bool = abap_false. + ENDIF. + ENDMETHOD. "lif_object~exists METHOD lif_object~serialize. @@ -193,4 +199,4 @@ CLASS lcl_object_vcls IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_vcls IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_vcls IMPLEMENTATION diff --git a/src/zabapgit_object_vcls.prog.xml b/src/zabapgit_object_vcls.prog.xml index 9d5c37372..43e48849b 100644 --- a/src/zabapgit_object_vcls.prog.xml +++ b/src/zabapgit_object_vcls.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_VCLS A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_VCLS 28 - diff --git a/src/zabapgit_object_view.prog.abap b/src/zabapgit_object_view.prog.abap index 31481e426..49632e13f 100644 --- a/src/zabapgit_object_view.prog.abap +++ b/src/zabapgit_object_view.prog.abap @@ -24,9 +24,9 @@ CLASS lcl_object_view IMPLEMENTATION. METHOD lif_object~has_changed_since. - DATA: lv_date TYPE dats, - lv_time TYPE tims, - lv_ts TYPE timestamp. + DATA: lv_date TYPE dats, + lv_time TYPE tims, + lv_ts TYPE timestamp. SELECT SINGLE as4date as4time FROM dd25l " View INTO (lv_date, lv_time) @@ -60,6 +60,7 @@ CLASS lcl_object_view IMPLEMENTATION. METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). + rs_metadata-ddic = abap_true. ENDMETHOD. "lif_object~get_metadata METHOD lif_object~exists. @@ -115,6 +116,8 @@ CLASS lcl_object_view IMPLEMENTATION. lt_dd28j TYPE TABLE OF dd28j, lt_dd28v TYPE TABLE OF dd28v. + FIELD-SYMBOLS: LIKE LINE OF lt_dd27p. + lv_name = ms_item-obj_name. @@ -149,6 +152,30 @@ CLASS lcl_object_view IMPLEMENTATION. ls_dd09l-as4date, ls_dd09l-as4time. + LOOP AT lt_dd27p ASSIGNING . + CLEAR: -ddtext, + -reptext, + -scrtext_s, + -scrtext_m, + -scrtext_l, + -outputlen, + -decimals, + -lowercase, + -convexit, + -signflag, + -flength, + -domname, + -datatype, + -entitytab, + -inttype, + -intlen, + -headlen, + -scrlen1, + -scrlen2, + -scrlen3, + -memoryid. + ENDLOOP. + io_xml->add( iv_name = 'DD25V' ig_data = ls_dd25v ). io_xml->add( iv_name = 'DD09L' @@ -221,4 +248,4 @@ CLASS lcl_object_view IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_view IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_view IMPLEMENTATION diff --git a/src/zabapgit_object_view.prog.xml b/src/zabapgit_object_view.prog.xml index b242baeb5..bd95ce1c0 100644 --- a/src/zabapgit_object_view.prog.xml +++ b/src/zabapgit_object_view.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_VIEW A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_VIEW 28 - diff --git a/src/zabapgit_object_w3xx.prog.abap b/src/zabapgit_object_w3xx.prog.abap index c14bdc062..26e19791b 100644 --- a/src/zabapgit_object_w3xx.prog.abap +++ b/src/zabapgit_object_w3xx.prog.abap @@ -443,4 +443,4 @@ ENDCLASS. "lcl_object_W3MI DEFINITION * Web Reporting/Internet Transaction Server MIME Types (html data) *----------------------------------------------------------------------* CLASS lcl_object_w3ht DEFINITION INHERITING FROM lcl_object_w3super FINAL. -ENDCLASS. "lcl_object_W3HT DEFINITION \ No newline at end of file +ENDCLASS. "lcl_object_W3HT DEFINITION diff --git a/src/zabapgit_object_w3xx.prog.xml b/src/zabapgit_object_w3xx.prog.xml index e5efdbbac..1f67e528b 100644 --- a/src/zabapgit_object_w3xx.prog.xml +++ b/src/zabapgit_object_w3xx.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_W3XX A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_W3XX 28 - diff --git a/src/zabapgit_object_wdya.prog.abap b/src/zabapgit_object_wdya.prog.abap index 3d1defc49..578d901cc 100644 --- a/src/zabapgit_object_wdya.prog.abap +++ b/src/zabapgit_object_wdya.prog.abap @@ -215,4 +215,4 @@ CLASS lcl_object_wdya IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_wdya IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_wdya IMPLEMENTATION diff --git a/src/zabapgit_object_wdya.prog.xml b/src/zabapgit_object_wdya.prog.xml index 4387af0e9..65ce6f1b2 100644 --- a/src/zabapgit_object_wdya.prog.xml +++ b/src/zabapgit_object_wdya.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_WDYA A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_WDYA 28 - diff --git a/src/zabapgit_object_wdyn.prog.abap b/src/zabapgit_object_wdyn.prog.abap index 9f2152da2..ba33a8a24 100644 --- a/src/zabapgit_object_wdyn.prog.abap +++ b/src/zabapgit_object_wdyn.prog.abap @@ -7,129 +7,129 @@ *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -class lcl_object_wdyn definition inheriting from lcl_objects_super final. +CLASS lcl_object_wdyn DEFINITION INHERITING FROM lcl_objects_super FINAL. - public section. - interfaces lif_object. - aliases mo_files for lif_object~mo_files. + PUBLIC SECTION. + INTERFACES lif_object. + ALIASES mo_files FOR lif_object~mo_files. - private section. + PRIVATE SECTION. - data: - mt_components type table of wdy_ctlr_compo_vrs, - mt_sources type table of wdy_ctlr_compo_source_vrs. + DATA: + mt_components TYPE TABLE OF wdy_ctlr_compo_vrs, + mt_sources TYPE TABLE OF wdy_ctlr_compo_source_vrs. - methods: + METHODS: get_limu_objects - returning value(rt_objects) type wdy_md_transport_keys, + RETURNING VALUE(rt_objects) TYPE wdy_md_transport_keys, read - returning value(rs_component) type wdy_component_metadata - raising lcx_exception, + RETURNING VALUE(rs_component) TYPE wdy_component_metadata + RAISING lcx_exception, read_controller - importing is_key type wdy_md_controller_key - returning value(rs_controller) type wdy_md_controller_meta_data - raising lcx_exception, + IMPORTING is_key TYPE wdy_md_controller_key + RETURNING VALUE(rs_controller) TYPE wdy_md_controller_meta_data + RAISING lcx_exception, read_definition - importing is_key type wdy_md_component_key - returning value(rs_definition) type wdy_md_component_meta_data - raising lcx_exception, + IMPORTING is_key TYPE wdy_md_component_key + RETURNING VALUE(rs_definition) TYPE wdy_md_component_meta_data + RAISING lcx_exception, read_view - importing is_key type wdy_md_view_key - returning value(rs_view) type wdy_md_view_meta_data - raising lcx_exception, + IMPORTING is_key TYPE wdy_md_view_key + RETURNING VALUE(rs_view) TYPE wdy_md_view_meta_data + RAISING lcx_exception, recover_controller - importing is_controller type wdy_md_controller_meta_data - raising lcx_exception, + IMPORTING is_controller TYPE wdy_md_controller_meta_data + RAISING lcx_exception, recover_definition - importing is_definition type wdy_md_component_meta_data - raising lcx_exception, + IMPORTING is_definition TYPE wdy_md_component_meta_data + RAISING lcx_exception, recover_view - importing is_view type wdy_md_view_meta_data - raising lcx_exception, + IMPORTING is_view TYPE wdy_md_view_meta_data + RAISING lcx_exception, delta_controller - importing is_controller type wdy_md_controller_meta_data - returning value(rs_delta) type svrs2_xversionable_object - raising lcx_exception, + IMPORTING is_controller TYPE wdy_md_controller_meta_data + RETURNING VALUE(rs_delta) TYPE svrs2_xversionable_object + RAISING lcx_exception, delta_definition - importing is_definition type wdy_md_component_meta_data - returning value(rs_delta) type svrs2_xversionable_object - raising lcx_exception, + IMPORTING is_definition TYPE wdy_md_component_meta_data + RETURNING VALUE(rs_delta) TYPE svrs2_xversionable_object + RAISING lcx_exception, delta_view - importing is_view type wdy_md_view_meta_data - returning value(rs_delta) type svrs2_xversionable_object - raising lcx_exception, + IMPORTING is_view TYPE wdy_md_view_meta_data + RETURNING VALUE(rs_delta) TYPE svrs2_xversionable_object + RAISING lcx_exception, add_fm_param_exporting - importing i_name type string - i_value type any - changing ct_param type abap_func_parmbind_tab, + IMPORTING i_name TYPE string + i_value TYPE any + CHANGING ct_param TYPE abap_func_parmbind_tab, add_fm_param_tables - importing i_name type string - changing ct_value type any table - ct_param type abap_func_parmbind_tab, + IMPORTING i_name TYPE string + CHANGING ct_value TYPE ANY TABLE + ct_param TYPE abap_func_parmbind_tab, add_fm_exception - importing i_name type string - i_value type i - changing ct_exception type abap_func_excpbind_tab. + IMPORTING i_name TYPE string + i_value TYPE i + CHANGING ct_exception TYPE abap_func_excpbind_tab. -endclass. "lcl_object_wdyn DEFINITION +ENDCLASS. "lcl_object_wdyn DEFINITION *----------------------------------------------------------------------* * CLASS lcl_object_wdyn IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -class lcl_object_wdyn implementation. +CLASS lcl_object_wdyn IMPLEMENTATION. - method lif_object~has_changed_since. + METHOD lif_object~has_changed_since. rv_changed = abap_true. - endmethod. "lif_object~has_changed_since + ENDMETHOD. "lif_object~has_changed_since - method lif_object~changed_by. + METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo - endmethod. "lif_object~changed_by + ENDMETHOD. "lif_object~changed_by - method lif_object~get_metadata. + METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). - endmethod. "lif_object~get_metadata + ENDMETHOD. "lif_object~get_metadata - method lif_object~exists. + METHOD lif_object~exists. - data: lv_component_name type wdy_component-component_name. + DATA: lv_component_name TYPE wdy_component-component_name. - select single component_name from wdy_component - into lv_component_name - where component_name = ms_item-obj_name - and version = 'A'. "#EC CI_GENBUFF + SELECT SINGLE component_name FROM wdy_component + INTO lv_component_name + WHERE component_name = ms_item-obj_name + AND version = 'A'. "#EC CI_GENBUFF rv_bool = boolc( sy-subrc = 0 ). - endmethod. "lif_object~exists + ENDMETHOD. "lif_object~exists - method delta_definition. + METHOD delta_definition. - data: ls_key type wdy_md_component_key, - lv_found type abap_bool, - ls_obj_new type svrs2_versionable_object, - li_component type ref to if_wdy_md_component, - ls_obj_old type svrs2_versionable_object. + DATA: ls_key TYPE wdy_md_component_key, + lv_found TYPE abap_bool, + ls_obj_new TYPE svrs2_versionable_object, + li_component TYPE REF TO if_wdy_md_component, + ls_obj_old TYPE svrs2_versionable_object. ls_key-component_name = is_definition-definition-component_name. lv_found = cl_wdy_md_component=>check_existency( ls_key-component_name ). - if lv_found = abap_false. - try. + IF lv_found = abap_false. + TRY. cl_wdy_md_component=>create_complete( - exporting + EXPORTING name = ls_key-component_name - importing + IMPORTING component = li_component ). li_component->save_to_database( ). li_component->unlock( ). - catch cx_wdy_md_exception. + CATCH cx_wdy_md_exception. lcx_exception=>raise( 'error creating dummy component' ). - endtry. - endif. + ENDTRY. + ENDIF. ls_obj_new-objtype = wdyn_limu_component_definition. ls_obj_new-objname = ls_key-component_name. @@ -137,7 +137,7 @@ class lcl_object_wdyn implementation. ls_obj_old-objtype = wdyn_limu_component_definition. ls_obj_old-objname = ls_key-component_name. - append is_definition-definition to ls_obj_old-wdyd-defin. + APPEND is_definition-definition TO ls_obj_old-wdyd-defin. ls_obj_old-wdyd-descr = is_definition-descriptions. ls_obj_old-wdyd-cusag = is_definition-component_usages. ls_obj_old-wdyd-intrf = is_definition-interface_implementings. @@ -145,34 +145,34 @@ class lcl_object_wdyn implementation. ls_obj_old-wdyd-ctuse = is_definition-ext_ctlr_usages. ls_obj_old-wdyd-ctmap = is_definition-ext_ctx_mappings. - call function 'SVRS_MAKE_OBJECT_DELTA' - exporting + CALL FUNCTION 'SVRS_MAKE_OBJECT_DELTA' + EXPORTING obj_old = ls_obj_new obj_new = ls_obj_old - changing + CHANGING delta = rs_delta - exceptions + EXCEPTIONS inconsistent_objects = 1. - if sy-subrc <> 0. + IF sy-subrc <> 0. lcx_exception=>raise( 'error from SVRS_MAKE_OBJECT_DELTA' ). - endif. + ENDIF. - endmethod. "delta_definition + ENDMETHOD. "delta_definition - method delta_controller. + METHOD delta_controller. - data: li_controller type ref to if_wdy_md_controller, - lv_found type abap_bool, - ls_key type wdy_md_controller_key, - ls_obj_new type svrs2_versionable_object, - ls_obj_old type svrs2_versionable_object. + DATA: li_controller TYPE REF TO if_wdy_md_controller, + lv_found TYPE abap_bool, + ls_key TYPE wdy_md_controller_key, + ls_obj_new TYPE svrs2_versionable_object, + ls_obj_old TYPE svrs2_versionable_object. - field-symbols: like line of mt_components, - like line of mt_sources, - type any table, - type any table, - type any table, - type any table. + FIELD-SYMBOLS: LIKE LINE OF mt_components, + LIKE LINE OF mt_sources, + TYPE ANY TABLE, + TYPE ANY TABLE, + TYPE ANY TABLE, + TYPE ANY TABLE. ls_key-component_name = is_controller-definition-component_name. @@ -181,18 +181,18 @@ class lcl_object_wdyn implementation. lv_found = cl_wdy_md_controller=>check_existency( component_name = ls_key-component_name controller_name = ls_key-controller_name ). - if lv_found = abap_false. - try. + IF lv_found = abap_false. + TRY. li_controller ?= cl_wdy_md_controller=>create_complete( component_name = ls_key-component_name controller_name = ls_key-controller_name controller_type = is_controller-definition-controller_type ). li_controller->save_to_database( ). li_controller->unlock( ). - catch cx_wdy_md_exception. + CATCH cx_wdy_md_exception. lcx_exception=>raise( 'error creating dummy controller' ). - endtry. - endif. + ENDTRY. + ENDIF. ls_obj_new-objtype = wdyn_limu_component_controller. ls_obj_new-objname = ls_key. @@ -200,18 +200,18 @@ class lcl_object_wdyn implementation. ls_obj_old-objtype = wdyn_limu_component_controller. ls_obj_old-objname = ls_key. - append is_controller-definition to ls_obj_old-wdyc-defin. + APPEND is_controller-definition TO ls_obj_old-wdyc-defin. - loop at mt_components assigning - where component_name = ls_key-component_name - and controller_name = ls_key-controller_name. - append to ls_obj_old-wdyc-ccomp. - endloop. - loop at mt_sources assigning - where component_name = ls_key-component_name - and controller_name = ls_key-controller_name. - append to ls_obj_old-wdyc-ccoms. - endloop. + LOOP AT mt_components ASSIGNING + WHERE component_name = ls_key-component_name + AND controller_name = ls_key-controller_name. + APPEND TO ls_obj_old-wdyc-ccomp. + ENDLOOP. + LOOP AT mt_sources ASSIGNING + WHERE component_name = ls_key-component_name + AND controller_name = ls_key-controller_name. + APPEND TO ls_obj_old-wdyc-ccoms. + ENDLOOP. ls_obj_old-wdyc-descr = is_controller-descriptions. ls_obj_old-wdyc-cusag = is_controller-controller_usages. @@ -223,45 +223,47 @@ class lcl_object_wdyn implementation. ls_obj_old-wdyc-cmapp = is_controller-context_mappings. * Version 702 doesn't have these two attributes so we * use them dynamically for downward compatibility - assign component 'CONTROLLER_EXCEPTIONS' of structure is_controller to . - if sy-subrc = 0. - assign component 'EXCP' of structure ls_obj_old-wdyc to . - if sy-subrc = 0. + ASSIGN COMPONENT 'CONTROLLER_EXCEPTIONS' OF STRUCTURE is_controller + TO . + IF sy-subrc = 0. + ASSIGN COMPONENT 'EXCP' OF STRUCTURE ls_obj_old-wdyc TO . + IF sy-subrc = 0. = . - endif. - endif. - assign component 'CONTROLLER_EXCEPTIONS_TEXTS' of structure is_controller to . - if sy-subrc = 0. - assign component 'EXCPT' of structure ls_obj_old-wdyc to . - if sy-subrc = 0. + ENDIF. + ENDIF. + ASSIGN COMPONENT 'CONTROLLER_EXCEPTIONS_TEXTS' OF STRUCTURE is_controller + TO . + IF sy-subrc = 0. + ASSIGN COMPONENT 'EXCPT' OF STRUCTURE ls_obj_old-wdyc TO . + IF sy-subrc = 0. = . - endif. - endif. + ENDIF. + ENDIF. ls_obj_old-wdyc-fgrps = is_controller-fieldgroups. - call function 'SVRS_MAKE_OBJECT_DELTA' - exporting + CALL FUNCTION 'SVRS_MAKE_OBJECT_DELTA' + EXPORTING obj_old = ls_obj_new obj_new = ls_obj_old - changing + CHANGING delta = rs_delta - exceptions + EXCEPTIONS inconsistent_objects = 1. - if sy-subrc <> 0. + IF sy-subrc <> 0. lcx_exception=>raise( 'error from SVRS_MAKE_OBJECT_DELTA' ). - endif. + ENDIF. - endmethod. "delta_controller + ENDMETHOD. "delta_controller - method delta_view. + METHOD delta_view. - data: ls_key type wdy_md_view_key, - ls_obj_new type svrs2_versionable_object, - ls_obj_old type svrs2_versionable_object, - lv_found type abap_bool, - li_view type ref to if_wdy_md_abstract_view. + DATA: ls_key TYPE wdy_md_view_key, + ls_obj_new TYPE svrs2_versionable_object, + ls_obj_old TYPE svrs2_versionable_object, + lv_found TYPE abap_bool, + li_view TYPE REF TO if_wdy_md_abstract_view. - field-symbols: like line of ls_obj_old-wdyv-defin. + FIELD-SYMBOLS: LIKE LINE OF ls_obj_old-wdyv-defin. ls_key-component_name = is_view-definition-component_name. @@ -270,18 +272,18 @@ class lcl_object_wdyn implementation. lv_found = cl_wdy_md_abstract_view=>check_existency( component_name = ls_key-component_name name = ls_key-view_name ). - if lv_found = abap_false. - try. + IF lv_found = abap_false. + TRY. li_view = cl_wdy_md_abstract_view=>create( component_name = is_view-definition-component_name view_name = is_view-definition-view_name type = is_view-definition-type ). li_view->save_to_database( ). li_view->unlock( ). - catch cx_wdy_md_exception. + CATCH cx_wdy_md_exception. lcx_exception=>raise( 'error creating dummy view' ). - endtry. - endif. + ENDTRY. + ENDIF. ls_obj_new-objtype = wdyn_limu_component_view. ls_obj_new-objname = ls_key. @@ -289,8 +291,8 @@ class lcl_object_wdyn implementation. ls_obj_old-objtype = wdyn_limu_component_view. ls_obj_old-objname = ls_key. - append initial line to ls_obj_old-wdyv-defin assigning . - move-corresponding is_view-definition to . + APPEND INITIAL LINE TO ls_obj_old-wdyv-defin ASSIGNING . + MOVE-CORRESPONDING is_view-definition TO . ls_obj_old-wdyv-descr = is_view-descriptions. ls_obj_old-wdyv-vcont = is_view-view_containers. @@ -310,44 +312,44 @@ class lcl_object_wdyn implementation. ls_obj_old-wdyv-vshpl = is_view-vsh_placeholders. ls_obj_old-wdyv-views = is_view-viewset_properties. - call function 'SVRS_MAKE_OBJECT_DELTA' - exporting + CALL FUNCTION 'SVRS_MAKE_OBJECT_DELTA' + EXPORTING obj_old = ls_obj_new obj_new = ls_obj_old - changing + CHANGING delta = rs_delta - exceptions + EXCEPTIONS inconsistent_objects = 1. - if sy-subrc <> 0. + IF sy-subrc <> 0. lcx_exception=>raise( 'error from SVRS_MAKE_OBJECT_DELTA' ). - endif. + ENDIF. - endmethod. "delta_view + ENDMETHOD. "delta_view - method recover_definition. + METHOD recover_definition. - data: ls_key type wdy_md_component_key, - lv_corrnr type trkorr, - ls_delta type svrs2_xversionable_object. + DATA: ls_key TYPE wdy_md_component_key, + lv_corrnr TYPE trkorr, + ls_delta TYPE svrs2_xversionable_object. ls_delta = delta_definition( is_definition ). ls_key-component_name = is_definition-definition-component_name. cl_wdy_md_component=>recover_version( - exporting + EXPORTING component_key = ls_key delta = ls_delta-wdyd - changing + CHANGING corrnr = lv_corrnr ). - endmethod. "recover_definition + ENDMETHOD. "recover_definition - method recover_controller. + METHOD recover_controller. - data: ls_key type wdy_controller_key, - lv_corrnr type trkorr, - ls_delta type svrs2_xversionable_object. + DATA: ls_key TYPE wdy_controller_key, + lv_corrnr TYPE trkorr, + ls_delta TYPE svrs2_xversionable_object. ls_delta = delta_controller( is_controller ). @@ -355,19 +357,19 @@ class lcl_object_wdyn implementation. ls_key-controller_name = is_controller-definition-controller_name. cl_wdy_md_controller=>recover_version( - exporting + EXPORTING controller_key = ls_key delta = ls_delta-wdyc - changing + CHANGING corrnr = lv_corrnr ). - endmethod. "recover_controller + ENDMETHOD. "recover_controller - method recover_view. + METHOD recover_view. - data: ls_key type wdy_md_view_key, - lv_corrnr type trkorr, - ls_delta type svrs2_xversionable_object. + DATA: ls_key TYPE wdy_md_view_key, + lv_corrnr TYPE trkorr, + ls_delta TYPE svrs2_xversionable_object. ls_delta = delta_view( is_view ). @@ -375,137 +377,137 @@ class lcl_object_wdyn implementation. ls_key-view_name = is_view-definition-view_name. cl_wdy_md_abstract_view=>recover_version( - exporting + EXPORTING view_key = ls_key delta = ls_delta-wdyv - changing + CHANGING corrnr = lv_corrnr ). - endmethod. "recover_view + ENDMETHOD. "recover_view - method read_controller. + METHOD read_controller. - data: lt_components type table of wdy_ctlr_compo_vrs, - lt_sources type table of wdy_ctlr_compo_source_vrs, - lt_definition type table of wdy_controller, - lt_psmodilog type table of smodilog, - lt_psmodisrc type table of smodisrc, - lt_fm_param type abap_func_parmbind_tab, - lt_fm_exception type abap_func_excpbind_tab. + DATA: lt_components TYPE TABLE OF wdy_ctlr_compo_vrs, + lt_sources TYPE TABLE OF wdy_ctlr_compo_source_vrs, + lt_definition TYPE TABLE OF wdy_controller, + lt_psmodilog TYPE TABLE OF smodilog, + lt_psmodisrc TYPE TABLE OF smodisrc, + lt_fm_param TYPE abap_func_parmbind_tab, + lt_fm_exception TYPE abap_func_excpbind_tab. - field-symbols: type any table, - type any table. + FIELD-SYMBOLS: TYPE ANY TABLE, + TYPE ANY TABLE. * Calling FM dynamically because version 702 has less parameters * FM parameters - add_fm_param_exporting( exporting i_name = 'CONTROLLER_KEY' + add_fm_param_exporting( EXPORTING i_name = 'CONTROLLER_KEY' i_value = is_key - changing ct_param = lt_fm_param ). - add_fm_param_exporting( exporting i_name = 'GET_ALL_TRANSLATIONS' + CHANGING ct_param = lt_fm_param ). + add_fm_param_exporting( EXPORTING i_name = 'GET_ALL_TRANSLATIONS' i_value = abap_false - changing ct_param = lt_fm_param ). - add_fm_param_tables( exporting i_name = 'DEFINITION' - changing ct_value = lt_definition + CHANGING ct_param = lt_fm_param ). + add_fm_param_tables( EXPORTING i_name = 'DEFINITION' + CHANGING ct_value = lt_definition ct_param = lt_fm_param ). - add_fm_param_tables( exporting i_name = 'DESCRIPTIONS' - changing ct_value = rs_controller-descriptions + add_fm_param_tables( EXPORTING i_name = 'DESCRIPTIONS' + CHANGING ct_value = rs_controller-descriptions ct_param = lt_fm_param ). - add_fm_param_tables( exporting i_name = 'CONTROLLER_USAGES' - changing ct_value = rs_controller-controller_usages + add_fm_param_tables( EXPORTING i_name = 'CONTROLLER_USAGES' + CHANGING ct_value = rs_controller-controller_usages ct_param = lt_fm_param ). - add_fm_param_tables( exporting i_name = 'CONTROLLER_COMPONENTS' - changing ct_value = lt_components + add_fm_param_tables( EXPORTING i_name = 'CONTROLLER_COMPONENTS' + CHANGING ct_value = lt_components ct_param = lt_fm_param ). - add_fm_param_tables( exporting i_name = 'CONTROLLER_COMPONENT_SOURCES' - changing ct_value = lt_sources + add_fm_param_tables( EXPORTING i_name = 'CONTROLLER_COMPONENT_SOURCES' + CHANGING ct_value = lt_sources ct_param = lt_fm_param ). - add_fm_param_tables( exporting i_name = 'CONTROLLER_COMPONENT_TEXTS' - changing ct_value = rs_controller-controller_component_texts + add_fm_param_tables( EXPORTING i_name = 'CONTROLLER_COMPONENT_TEXTS' + CHANGING ct_value = rs_controller-controller_component_texts ct_param = lt_fm_param ). - add_fm_param_tables( exporting i_name = 'CONTROLLER_PARAMETERS' - changing ct_value = rs_controller-controller_parameters + add_fm_param_tables( EXPORTING i_name = 'CONTROLLER_PARAMETERS' + CHANGING ct_value = rs_controller-controller_parameters ct_param = lt_fm_param ). - add_fm_param_tables( exporting i_name = 'CONTROLLER_PARAMETER_TEXTS' - changing ct_value = rs_controller-controller_parameter_texts + add_fm_param_tables( EXPORTING i_name = 'CONTROLLER_PARAMETER_TEXTS' + CHANGING ct_value = rs_controller-controller_parameter_texts ct_param = lt_fm_param ). - add_fm_param_tables( exporting i_name = 'CONTEXT_NODES' - changing ct_value = rs_controller-context_nodes + add_fm_param_tables( EXPORTING i_name = 'CONTEXT_NODES' + CHANGING ct_value = rs_controller-context_nodes ct_param = lt_fm_param ). - add_fm_param_tables( exporting i_name = 'CONTEXT_ATTRIBUTES' - changing ct_value = rs_controller-context_attributes + add_fm_param_tables( EXPORTING i_name = 'CONTEXT_ATTRIBUTES' + CHANGING ct_value = rs_controller-context_attributes ct_param = lt_fm_param ). - add_fm_param_tables( exporting i_name = 'CONTEXT_MAPPINGS' - changing ct_value = rs_controller-context_mappings + add_fm_param_tables( EXPORTING i_name = 'CONTEXT_MAPPINGS' + CHANGING ct_value = rs_controller-context_mappings ct_param = lt_fm_param ). - add_fm_param_tables( exporting i_name = 'FIELDGROUPS' - changing ct_value = rs_controller-fieldgroups + add_fm_param_tables( EXPORTING i_name = 'FIELDGROUPS' + CHANGING ct_value = rs_controller-fieldgroups ct_param = lt_fm_param ). * Version 702 doesn't have these two attributes so we * use them dynamically for downward compatibility - assign component 'CONTROLLER_EXCEPTIONS' of structure rs_controller to . - if sy-subrc = 0. - add_fm_param_tables( exporting i_name = 'CONTROLLER_EXCEPTIONS' - changing ct_value = + ASSIGN COMPONENT 'CONTROLLER_EXCEPTIONS' OF STRUCTURE rs_controller TO . + IF sy-subrc = 0. + add_fm_param_tables( EXPORTING i_name = 'CONTROLLER_EXCEPTIONS' + CHANGING ct_value = ct_param = lt_fm_param ). - endif. - assign component 'CONTROLLER_EXCEPTION_TEXTS' of structure rs_controller to . - if sy-subrc = 0. - add_fm_param_tables( exporting i_name = 'CONTROLLER_EXCEPTION_TEXTS' - changing ct_value = + ENDIF. + ASSIGN COMPONENT 'CONTROLLER_EXCEPTION_TEXTS' OF STRUCTURE rs_controller TO . + IF sy-subrc = 0. + add_fm_param_tables( EXPORTING i_name = 'CONTROLLER_EXCEPTION_TEXTS' + CHANGING ct_value = ct_param = lt_fm_param ). - endif. - add_fm_param_tables( exporting i_name = 'PSMODILOG' - changing ct_value = lt_psmodilog + ENDIF. + add_fm_param_tables( EXPORTING i_name = 'PSMODILOG' + CHANGING ct_value = lt_psmodilog ct_param = lt_fm_param ). - add_fm_param_tables( exporting i_name = 'PSMODISRC' - changing ct_value = lt_psmodisrc + add_fm_param_tables( EXPORTING i_name = 'PSMODISRC' + CHANGING ct_value = lt_psmodisrc ct_param = lt_fm_param ). * FM exceptions - add_fm_exception( exporting i_name = 'NOT_EXISTING' + add_fm_exception( EXPORTING i_name = 'NOT_EXISTING' i_value = 1 - changing ct_exception = lt_fm_exception ). - add_fm_exception( exporting i_name = 'OTHERS' + CHANGING ct_exception = lt_fm_exception ). + add_fm_exception( EXPORTING i_name = 'OTHERS' i_value = 2 - changing ct_exception = lt_fm_exception ). + CHANGING ct_exception = lt_fm_exception ). - call function 'WDYC_GET_OBJECT' - parameter-table + CALL FUNCTION 'WDYC_GET_OBJECT' + PARAMETER-TABLE lt_fm_param - exception-table + EXCEPTION-TABLE lt_fm_exception. - if sy-subrc <> 0. + IF sy-subrc <> 0. lcx_exception=>raise( 'error from WDYC_GET_OBJECT' ). - endif. + ENDIF. - append lines of lt_components to mt_components. - append lines of lt_sources to mt_sources. + APPEND LINES OF lt_components TO mt_components. + APPEND LINES OF lt_sources TO mt_sources. - read table lt_definition index 1 into rs_controller-definition. - if sy-subrc <> 0. + READ TABLE lt_definition INDEX 1 INTO rs_controller-definition. + IF sy-subrc <> 0. lcx_exception=>raise( 'WDYC, definition not found' ). - endif. + ENDIF. - clear: rs_controller-definition-author, + CLEAR: rs_controller-definition-author, rs_controller-definition-createdon, rs_controller-definition-changedby, rs_controller-definition-changedon. - endmethod. "read_controller + ENDMETHOD. "read_controller - method read_definition. + METHOD read_definition. - data: lt_definition type table of wdy_component, - lt_psmodilog type table of smodilog, - lt_psmodisrc type table of smodisrc. + DATA: lt_definition TYPE TABLE OF wdy_component, + lt_psmodilog TYPE TABLE OF smodilog, + lt_psmodisrc TYPE TABLE OF smodisrc. - call function 'WDYD_GET_OBJECT' - exporting + CALL FUNCTION 'WDYD_GET_OBJECT' + EXPORTING component_key = is_key get_all_translations = abap_false - tables + TABLES definition = lt_definition descriptions = rs_definition-descriptions component_usages = rs_definition-component_usages @@ -515,43 +517,43 @@ class lcl_object_wdyn implementation. ext_ctx_mappings = rs_definition-ext_ctx_mappings psmodilog = lt_psmodilog " not optional in all versions psmodisrc = lt_psmodisrc " not optional in all versions - exceptions + EXCEPTIONS not_existing = 1 - others = 2. - if sy-subrc = 1. - return. - elseif sy-subrc <> 0. + OTHERS = 2. + IF sy-subrc = 1. + RETURN. + ELSEIF sy-subrc <> 0. lcx_exception=>raise( 'error from WDYD_GET_OBJECT' ). - endif. + ENDIF. - read table lt_definition index 1 into rs_definition-definition. - if sy-subrc <> 0. + READ TABLE lt_definition INDEX 1 INTO rs_definition-definition. + IF sy-subrc <> 0. lcx_exception=>raise( 'WDYD, definition not found' ). - endif. + ENDIF. - clear: rs_definition-definition-author, + CLEAR: rs_definition-definition-author, rs_definition-definition-createdon, rs_definition-definition-changedby, rs_definition-definition-changedon, rs_definition-definition-gendate, rs_definition-definition-gentime. - endmethod. "read_definition + ENDMETHOD. "read_definition - method read_view. + METHOD read_view. - data: lt_definition type table of wdy_view_vrs, - lt_psmodilog type table of smodilog, - lt_psmodisrc type table of smodisrc. + DATA: lt_definition TYPE TABLE OF wdy_view_vrs, + lt_psmodilog TYPE TABLE OF smodilog, + lt_psmodisrc TYPE TABLE OF smodisrc. - field-symbols: like line of lt_definition. + FIELD-SYMBOLS: LIKE LINE OF lt_definition. - call function 'WDYV_GET_OBJECT' - exporting + CALL FUNCTION 'WDYV_GET_OBJECT' + EXPORTING view_key = is_key get_all_translations = abap_false - tables + TABLES definition = lt_definition descriptions = rs_view-descriptions view_containers = rs_view-view_containers @@ -572,149 +574,149 @@ class lcl_object_wdyn implementation. viewset_properties = rs_view-viewset_properties psmodilog = lt_psmodilog psmodisrc = lt_psmodisrc - exceptions + EXCEPTIONS not_existing = 1 - others = 2. - if sy-subrc <> 0. + OTHERS = 2. + IF sy-subrc <> 0. lcx_exception=>raise( 'error from WDYV_GET_OBJECT' ). - endif. + ENDIF. - read table lt_definition index 1 assigning . - assert sy-subrc = 0. - move-corresponding to rs_view-definition. + READ TABLE lt_definition INDEX 1 ASSIGNING . + ASSERT sy-subrc = 0. + MOVE-CORRESPONDING TO rs_view-definition. - clear: rs_view-definition-author, + CLEAR: rs_view-definition-author, rs_view-definition-createdon, rs_view-definition-changedby, rs_view-definition-changedon. - endmethod. "read_view + ENDMETHOD. "read_view - method get_limu_objects. + METHOD get_limu_objects. - data: lv_name type wdy_component_name. + DATA: lv_name TYPE wdy_component_name. lv_name = ms_item-obj_name. - call function 'WDYN_GET_LIMU_OBJECTS' - exporting + CALL FUNCTION 'WDYN_GET_LIMU_OBJECTS' + EXPORTING component_name = lv_name - importing + IMPORTING limu_objects = rt_objects. - endmethod. "get_limu_objects + ENDMETHOD. "get_limu_objects - method read. + METHOD read. - data: lt_objects type wdy_md_transport_keys, - ls_controller_key type wdy_md_controller_key, - ls_component_key type wdy_md_component_key, - ls_view_key type wdy_md_view_key. + DATA: lt_objects TYPE wdy_md_transport_keys, + ls_controller_key TYPE wdy_md_controller_key, + ls_component_key TYPE wdy_md_component_key, + ls_view_key TYPE wdy_md_view_key. - field-symbols: like line of lt_objects, - like line of rs_component-ctlr_metadata, - type any table, - type any table. + FIELD-SYMBOLS: LIKE LINE OF lt_objects, + LIKE LINE OF rs_component-ctlr_metadata, + TYPE ANY TABLE, + TYPE ANY TABLE. - clear mt_components. - clear mt_sources. + CLEAR mt_components. + CLEAR mt_sources. lt_objects = get_limu_objects( ). - loop at lt_objects assigning . - case -sub_type. - when wdyn_limu_component_controller. + LOOP AT lt_objects ASSIGNING . + CASE -sub_type. + WHEN wdyn_limu_component_controller. ls_controller_key = -sub_name. - append read_controller( ls_controller_key ) to rs_component-ctlr_metadata. - when wdyn_limu_component_definition. + APPEND read_controller( ls_controller_key ) TO rs_component-ctlr_metadata. + WHEN wdyn_limu_component_definition. ls_component_key = -sub_name. rs_component-comp_metadata = read_definition( ls_component_key ). - when wdyn_limu_component_view. + WHEN wdyn_limu_component_view. ls_view_key = -sub_name. - append read_view( ls_view_key ) to rs_component-view_metadata. - when others. - assert 0 = 1. - endcase. - endloop. + APPEND read_view( ls_view_key ) TO rs_component-view_metadata. + WHEN OTHERS. + ASSERT 0 = 1. + ENDCASE. + ENDLOOP. - sort rs_component-ctlr_metadata by - definition-component_name ascending - definition-controller_name ascending. + SORT rs_component-ctlr_metadata BY + definition-component_name ASCENDING + definition-controller_name ASCENDING. - loop at rs_component-ctlr_metadata assigning . - sort -descriptions. - sort -controller_usages. - sort -controller_components. - sort -controller_component_texts. - sort -controller_parameters. - sort -controller_parameter_texts. - sort -context_nodes. - sort -context_attributes. - sort -context_mappings. - sort -fieldgroups. + LOOP AT rs_component-ctlr_metadata ASSIGNING . + SORT -descriptions. + SORT -controller_usages. + SORT -controller_components. + SORT -controller_component_texts. + SORT -controller_parameters. + SORT -controller_parameter_texts. + SORT -context_nodes. + SORT -context_attributes. + SORT -context_mappings. + SORT -fieldgroups. * Version 702 doesn't have these two attributes so we * use them dynamically for downward compatibility - assign component 'CONTROLLER_EXCEPTIONS' of structure to . - if sy-subrc = 0. - sort . - endif. - assign component 'CONTROLLER_EXCEPTION_TEXTS' of structure to . - if sy-subrc = 0. - sort . - endif. - endloop. + ASSIGN COMPONENT 'CONTROLLER_EXCEPTIONS' OF STRUCTURE TO . + IF sy-subrc = 0. + SORT . + ENDIF. + ASSIGN COMPONENT 'CONTROLLER_EXCEPTION_TEXTS' OF STRUCTURE TO . + IF sy-subrc = 0. + SORT . + ENDIF. + ENDLOOP. - sort mt_components by - component_name ascending - controller_name ascending - cmpname ascending. + SORT mt_components BY + component_name ASCENDING + controller_name ASCENDING + cmpname ASCENDING. - sort mt_sources by - component_name ascending - controller_name ascending - cmpname ascending - line_number ascending. + SORT mt_sources BY + component_name ASCENDING + controller_name ASCENDING + cmpname ASCENDING + line_number ASCENDING. - endmethod. "read + ENDMETHOD. "read - method add_fm_param_exporting. + METHOD add_fm_param_exporting. - data: ls_param like line of ct_param. + DATA: ls_param LIKE LINE OF ct_param. ls_param-kind = abap_func_exporting. ls_param-name = i_name. - get reference of i_value into ls_param-value. + GET REFERENCE OF i_value INTO ls_param-value. - insert ls_param into table ct_param. + INSERT ls_param INTO TABLE ct_param. - endmethod. "add_fm_param_exporting + ENDMETHOD. "add_fm_param_exporting - method add_fm_param_tables. + METHOD add_fm_param_tables. - data: ls_param like line of ct_param. + DATA: ls_param LIKE LINE OF ct_param. ls_param-kind = abap_func_tables. ls_param-name = i_name. - get reference of ct_value into ls_param-value. + GET REFERENCE OF ct_value INTO ls_param-value. - insert ls_param into table ct_param. + INSERT ls_param INTO TABLE ct_param. - endmethod. "add_fm_param_tables + ENDMETHOD. "add_fm_param_tables - method add_fm_exception. + METHOD add_fm_exception. - data: ls_exception like line of ct_exception. + DATA: ls_exception LIKE LINE OF ct_exception. ls_exception-name = i_name. ls_exception-value = i_value. - insert ls_exception into table ct_exception. + INSERT ls_exception INTO TABLE ct_exception. - endmethod. "add_fm_exception + ENDMETHOD. "add_fm_exception - method lif_object~serialize. + METHOD lif_object~serialize. - data: ls_component type wdy_component_metadata. + DATA: ls_component TYPE wdy_component_metadata. ls_component = read( ). @@ -726,55 +728,55 @@ class lcl_object_wdyn implementation. io_xml->add( ig_data = mt_sources iv_name = 'SOURCES' ). - endmethod. "serialize + ENDMETHOD. "serialize - method lif_object~deserialize. + METHOD lif_object~deserialize. - data: ls_component type wdy_component_metadata. + DATA: ls_component TYPE wdy_component_metadata. - field-symbols: like line of ls_component-view_metadata, - like line of ls_component-ctlr_metadata. + FIELD-SYMBOLS: LIKE LINE OF ls_component-view_metadata, + LIKE LINE OF ls_component-ctlr_metadata. - io_xml->read( exporting iv_name = 'COMPONENT' - changing cg_data = ls_component ). - io_xml->read( exporting iv_name = 'COMPONENTS' - changing cg_data = mt_components ). - io_xml->read( exporting iv_name = 'SOURCES' - changing cg_data = mt_sources ). + io_xml->read( EXPORTING iv_name = 'COMPONENT' + CHANGING cg_data = ls_component ). + io_xml->read( EXPORTING iv_name = 'COMPONENTS' + CHANGING cg_data = mt_components ). + io_xml->read( EXPORTING iv_name = 'SOURCES' + CHANGING cg_data = mt_sources ). ls_component-comp_metadata-definition-author = sy-uname. ls_component-comp_metadata-definition-createdon = sy-datum. recover_definition( ls_component-comp_metadata ). - loop at ls_component-ctlr_metadata assigning . + LOOP AT ls_component-ctlr_metadata ASSIGNING . -definition-author = sy-uname. -definition-createdon = sy-datum. recover_controller( ). - endloop. - loop at ls_component-view_metadata assigning . + ENDLOOP. + LOOP AT ls_component-view_metadata ASSIGNING . -definition-author = sy-uname. -definition-createdon = sy-datum. recover_view( ). - endloop. + ENDLOOP. lcl_objects_activation=>add_item( ms_item ). - endmethod. "deserialize + ENDMETHOD. "deserialize - method lif_object~delete. + METHOD lif_object~delete. - data: lo_component type ref to cl_wdy_wb_component, - lo_request type ref to cl_wb_request, - li_state type ref to if_wb_program_state, - lv_object_name type seu_objkey. + DATA: lo_component TYPE REF TO cl_wdy_wb_component, + lo_request TYPE REF TO cl_wb_request, + li_state TYPE REF TO if_wb_program_state, + lv_object_name TYPE seu_objkey. - create object lo_component. + CREATE OBJECT lo_component. lv_object_name = ms_item-obj_name. - create object lo_request - exporting + CREATE OBJECT lo_request + EXPORTING p_object_type = 'YC' p_object_name = lv_object_name p_operation = swbm_c_op_delete_no_dialog. @@ -783,21 +785,21 @@ class lcl_object_wdyn implementation. p_wb_request = lo_request p_wb_program_state = li_state ). - endmethod. "delete + ENDMETHOD. "delete - method lif_object~jump. + METHOD lif_object~jump. - call function 'RS_TOOL_ACCESS' - exporting + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING operation = 'SHOW' object_name = ms_item-obj_name object_type = ms_item-obj_type in_new_window = abap_true. - endmethod. "jump + ENDMETHOD. "jump - method lif_object~compare_to_remote_version. - create object ro_comparison_result type lcl_null_comparison_result. - endmethod. "lif_object~compare_to_remote_version + METHOD lif_object~compare_to_remote_version. + CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. + ENDMETHOD. "lif_object~compare_to_remote_version -endclass. "lcl_object_wdyn IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_wdyn IMPLEMENTATION diff --git a/src/zabapgit_object_wdyn.prog.xml b/src/zabapgit_object_wdyn.prog.xml index 8439027ce..119f8e2d2 100644 --- a/src/zabapgit_object_wdyn.prog.xml +++ b/src/zabapgit_object_wdyn.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_WDYN A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_WDYN 28 - diff --git a/src/zabapgit_object_webi.prog.abap b/src/zabapgit_object_webi.prog.abap index e3a690dbb..d2c5a9110 100644 --- a/src/zabapgit_object_webi.prog.abap +++ b/src/zabapgit_object_webi.prog.abap @@ -447,4 +447,4 @@ CLASS lcl_object_webi IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_webi IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_webi IMPLEMENTATION diff --git a/src/zabapgit_object_webi.prog.xml b/src/zabapgit_object_webi.prog.xml index db71c561c..3d7cd0b72 100644 --- a/src/zabapgit_object_webi.prog.xml +++ b/src/zabapgit_object_webi.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_WEBI A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_WEBI 28 - diff --git a/src/zabapgit_object_xslt.prog.abap b/src/zabapgit_object_xslt.prog.abap index dc359b965..6fb2babf5 100644 --- a/src/zabapgit_object_xslt.prog.abap +++ b/src/zabapgit_object_xslt.prog.abap @@ -94,6 +94,10 @@ CLASS lcl_object_xslt IMPLEMENTATION. ls_attributes TYPE o2xsltattr. + IF lif_object~exists( ) = abap_true. + lif_object~delete( ). + ENDIF. + io_xml->read( EXPORTING iv_name = 'ATTRIBUTES' CHANGING cg_data = ls_attributes ). @@ -192,4 +196,4 @@ CLASS lcl_object_xslt IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_xslt IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_xslt IMPLEMENTATION diff --git a/src/zabapgit_object_xslt.prog.xml b/src/zabapgit_object_xslt.prog.xml index 37eee2114..200b754aa 100644 --- a/src/zabapgit_object_xslt.prog.xml +++ b/src/zabapgit_object_xslt.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECT_XSLT A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT_XSLT 28 - diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap index 6ac06cf57..2bd281a13 100644 --- a/src/zabapgit_objects.prog.abap +++ b/src/zabapgit_objects.prog.abap @@ -20,7 +20,8 @@ CLASS lcl_objects_activation DEFINITION FINAL. RAISING lcx_exception. CLASS-METHODS activate - RAISING lcx_exception. + IMPORTING iv_ddic TYPE abap_bool DEFAULT abap_false + RAISING lcx_exception. CLASS-METHODS clear. @@ -29,8 +30,7 @@ CLASS lcl_objects_activation DEFINITION FINAL. IMPORTING iv_obj_name TYPE trobj_name CHANGING ct_objects TYPE dwinactiv_tab. - CLASS-DATA: gt_ddic TYPE TABLE OF dwinactiv, - gt_programs TYPE TABLE OF dwinactiv. + CLASS-DATA: gt_objects TYPE TABLE OF dwinactiv. ENDCLASS. "lcl_objects_activation DEFINITION @@ -47,38 +47,18 @@ CLASS lcl_objects_activation IMPLEMENTATION. ENDMETHOD. "add_item METHOD clear. - CLEAR: gt_ddic, - gt_programs. + CLEAR gt_objects. ENDMETHOD. "clear METHOD activate. -* ddic - IF NOT gt_ddic IS INITIAL. + IF NOT gt_objects IS INITIAL. CALL FUNCTION 'RS_WORKING_OBJECTS_ACTIVATE' EXPORTING - activate_ddic_objects = abap_true + activate_ddic_objects = iv_ddic with_popup = abap_true TABLES - objects = gt_ddic - EXCEPTIONS - excecution_error = 1 - cancelled = 2 - insert_into_corr_error = 3 - OTHERS = 4. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from RS_WORKING_OBJECTS_ACTIVATE' ). - ENDIF. - ENDIF. - -* programs - IF NOT gt_programs IS INITIAL. - CALL FUNCTION 'RS_WORKING_OBJECTS_ACTIVATE' - EXPORTING - activate_ddic_objects = abap_false - with_popup = abap_true - TABLES - objects = gt_programs + objects = gt_objects EXCEPTIONS excecution_error = 1 cancelled = 2 @@ -139,9 +119,9 @@ CLASS lcl_objects_activation IMPLEMENTATION. lv_obj_name = iv_name. -* todo, refactoring CASE iv_type. WHEN 'CLAS' OR 'WDYN'. +* todo, move this to the object type include instead CALL FUNCTION 'RS_INACTIVE_OBJECTS_IN_OBJECT' EXPORTING obj_name = lv_obj_name @@ -160,22 +140,11 @@ CLASS lcl_objects_activation IMPLEMENTATION. CHANGING ct_objects = lt_objects ). ENDIF. - APPEND LINES OF lt_objects TO gt_programs. - WHEN 'DOMA' OR 'DTEL' OR 'TABL' OR 'INDX' OR 'TTYP' - OR 'VIEW' OR 'SHLP' OR 'ENQU' - OR 'SFSW' OR 'SFBF' OR 'SFBS'. -* todo also insert_into_working_area? - APPEND INITIAL LINE TO gt_ddic ASSIGNING . - -object = iv_type. - -obj_name = lv_obj_name. - WHEN 'REPS' OR 'DYNP' OR 'CUAD' OR 'REPT' OR 'INTF' - OR 'FUNC' OR 'ENHO' OR 'TYPE' OR 'XSLT' OR 'WEBI'. -* these seem to go into the workarea automatically - APPEND INITIAL LINE TO gt_programs ASSIGNING . - -object = iv_type. - -obj_name = lv_obj_name. + APPEND LINES OF lt_objects TO gt_objects. WHEN OTHERS. - lcx_exception=>raise( 'activate, unknown type' ). + APPEND INITIAL LINE TO gt_objects ASSIGNING . + -object = iv_type. + -obj_name = lv_obj_name. ENDCASE. ENDMETHOD. "activate @@ -187,7 +156,7 @@ ENDCLASS. "lcl_objects_activation IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -CLASS lcl_objects_files DEFINITION . +CLASS lcl_objects_files DEFINITION. PUBLIC SECTION. METHODS: @@ -404,6 +373,9 @@ CLASS lcl_objects_files IMPLEMENTATION. CONCATENATE LINES OF it_abap INTO lv_source SEPARATED BY gc_newline. +* when editing files via eg. GitHub web interface it adds a newline at end of file + lv_source = lv_source && gc_newline. + ls_file-path = '/'. ls_file-filename = filename( iv_extra = iv_extra iv_ext = 'abap' ). "#EC NOTEXT @@ -483,8 +455,7 @@ CLASS lcl_objects_files IMPLEMENTATION. ELSE. lv_obj_name = ms_item-obj_name. ENDIF. -* handle namespaces - REPLACE ALL OCCURRENCES OF '/' IN lv_obj_name WITH '#'. + IF iv_extra IS INITIAL. CONCATENATE lv_obj_name '.' ms_item-obj_type '.' iv_ext @@ -493,6 +464,9 @@ CLASS lcl_objects_files IMPLEMENTATION. CONCATENATE lv_obj_name '.' ms_item-obj_type '.' iv_extra '.' iv_ext INTO rv_filename. "#EC NOTEXT ENDIF. + +* handle namespaces + REPLACE ALL OCCURRENCES OF '/' IN rv_filename WITH '#'. TRANSLATE rv_filename TO LOWER CASE. ENDMETHOD. "filename @@ -1132,12 +1106,28 @@ CLASS lcl_objects_program IMPLEMENTATION. ELSE. * function module RPY_PROGRAM_INSERT cannot handle function group includes - INSERT REPORT is_progdir-name - FROM it_source - STATE 'I' - PROGRAM TYPE is_progdir-subc. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from INSERT REPORT' ). + IF strlen( is_progdir-name ) > 30. + " special treatment for extenstions + " if the program name exceeds 30 characters it is not a usual + " ABAP program but might be some extension, which requires the internal + " addition EXTENSION TYPE, see + " http://help.sap.com/abapdocu_751/en/abapinsert_report_internal.htm#!ABAP_ADDITION_1@1@ + " This e.g. occurs in case of transportable Code Inspector variants (ending with ===VC) + INSERT REPORT is_progdir-name + FROM it_source + STATE 'I' + EXTENSION TYPE is_progdir-name+30. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from INSERT REPORT .. EXTENSION TYPE' ). + ENDIF. + ELSE. + INSERT REPORT is_progdir-name + FROM it_source + STATE 'I' + PROGRAM TYPE is_progdir-subc. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from INSERT REPORT' ). + ENDIF. ENDIF. IF NOT it_tpool[] IS INITIAL. @@ -1656,11 +1646,14 @@ CLASS lcl_objects DEFINITION FINAL. PUBLIC SECTION. TYPES: ty_types_tt TYPE STANDARD TABLE OF tadir-object WITH DEFAULT KEY. - TYPES: BEGIN OF ty_late, + TYPES: BEGIN OF ty_deserialization, obj TYPE REF TO lif_object, xml TYPE REF TO lcl_xml_input, package TYPE devclass, - END OF ty_late. + item TYPE ty_item, + END OF ty_deserialization. + + TYPES: ty_deserialization_tt TYPE STANDARD TABLE OF ty_deserialization WITH DEFAULT KEY. CLASS-METHODS serialize IMPORTING is_item TYPE ty_item @@ -1705,10 +1698,6 @@ CLASS lcl_objects DEFINITION FINAL. CLASS-METHODS supported_list RETURNING VALUE(rt_types) TYPE ty_types_tt. - CLASS-METHODS is_language_installed - IMPORTING iv_language TYPE langu - RETURNING VALUE(rv_yes) TYPE abap_bool. - PRIVATE SECTION. CLASS-DATA: mv_langs_installed TYPE scplangs. @@ -1747,9 +1736,8 @@ CLASS lcl_objects DEFINITION FINAL. RAISING lcx_exception. CLASS-METHODS warning_overwrite - IMPORTING io_repo TYPE REF TO lcl_repo - CHANGING ct_results TYPE ty_results_tt - RAISING lcx_exception. + CHANGING ct_results TYPE ty_results_tt + RAISING lcx_exception. CLASS-METHODS warning_package IMPORTING is_item TYPE ty_item @@ -1772,4 +1760,11 @@ CLASS lcl_objects DEFINITION FINAL. RAISING lcx_exception. -ENDCLASS. "lcl_object DEFINITION \ No newline at end of file + CLASS-METHODS deserialize_objects + IMPORTING it_objects TYPE ty_deserialization_tt + iv_ddic TYPE abap_bool DEFAULT abap_false + iv_descr TYPE string + CHANGING ct_files TYPE ty_file_signatures_tt + RAISING lcx_exception. + +ENDCLASS. "lcl_object DEFINITION diff --git a/src/zabapgit_objects.prog.xml b/src/zabapgit_objects.prog.xml index a849c4fa4..48776da05 100644 --- a/src/zabapgit_objects.prog.xml +++ b/src/zabapgit_objects.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECTS A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECTS 24 - diff --git a/src/zabapgit_objects_impl.prog.abap b/src/zabapgit_objects_impl.prog.abap index c90be83ba..a37f4f419 100644 --- a/src/zabapgit_objects_impl.prog.abap +++ b/src/zabapgit_objects_impl.prog.abap @@ -207,18 +207,6 @@ CLASS lcl_objects IMPLEMENTATION. ENDMETHOD. "supported_list - METHOD is_language_installed. - - IF mv_langs_installed IS INITIAL. - CALL FUNCTION 'RSAQ_READ_INSTALLED_LANGUAGES' - IMPORTING - inst_languages = mv_langs_installed. - ENDIF. - - rv_yes = boolc( mv_langs_installed CA iv_language ). - - ENDMETHOD. "is_language_installed - METHOD exists. DATA: li_obj TYPE REF TO lif_object. @@ -238,26 +226,29 @@ CLASS lcl_objects IMPLEMENTATION. METHOD path_to_package. DATA: lv_length TYPE i, + lv_parent TYPE devclass, + lv_new TYPE string, lv_path TYPE string. - lv_length = strlen( iv_start ) - 1. + lv_length = strlen( iv_start ). lv_path = iv_path+lv_length. + lv_parent = iv_top. + rv_package = iv_top. - CONCATENATE iv_top lv_path INTO rv_package. + WHILE lv_path CA '/'. + SPLIT lv_path AT '/' INTO lv_new lv_path. - TRANSLATE rv_package USING '/_'. + CONCATENATE rv_package '_' lv_new INTO rv_package. + TRANSLATE rv_package TO UPPER CASE. - lv_length = strlen( rv_package ) - 1. + IF lcl_sap_package=>exists( rv_package ) = abap_false. + lcl_sap_package=>create_child( iv_parent = lv_parent + iv_child = rv_package ). + ENDIF. - rv_package = rv_package(lv_length). - - TRANSLATE rv_package TO UPPER CASE. - - IF lcl_sap_package=>exists( rv_package ) = abap_false. - lcl_sap_package=>create_child( iv_parent = iv_top - iv_child = rv_package ). - ENDIF. + lv_parent = rv_package. + ENDWHILE. ENDMETHOD. @@ -589,18 +580,20 @@ CLASS lcl_objects IMPLEMENTATION. METHOD deserialize. - DATA: ls_item TYPE ty_item, - lv_cancel TYPE abap_bool, - li_obj TYPE REF TO lif_object, - lt_remote TYPE ty_files_tt, - lv_package TYPE devclass, - lo_files TYPE REF TO lcl_objects_files, - lo_xml TYPE REF TO lcl_xml_input, - lt_results TYPE ty_results_tt, - lt_late TYPE TABLE OF ty_late. + DATA: ls_item TYPE ty_item, + lv_cancel TYPE abap_bool, + li_obj TYPE REF TO lif_object, + lt_remote TYPE ty_files_tt, + lv_package TYPE devclass, + lo_files TYPE REF TO lcl_objects_files, + lo_xml TYPE REF TO lcl_xml_input, + lt_results TYPE ty_results_tt, + lt_ddic TYPE TABLE OF ty_deserialization, + lt_rest TYPE TABLE OF ty_deserialization, + lt_late TYPE TABLE OF ty_deserialization. FIELD-SYMBOLS: TYPE ty_result, - LIKE LINE OF lt_late. + LIKE LINE OF lt_late. lcl_objects_activation=>clear( ). @@ -616,8 +609,7 @@ CLASS lcl_objects IMPLEMENTATION. lt_results = prioritize_deser( lt_results ). - warning_overwrite( EXPORTING io_repo = io_repo - CHANGING ct_results = lt_results ). + warning_overwrite( CHANGING ct_results = lt_results ). LOOP AT lt_results ASSIGNING WHERE obj_type IS NOT INITIAL AND NOT ( lstate = gc_state-added AND rstate IS INITIAL ). @@ -656,34 +648,38 @@ CLASS lcl_objects IMPLEMENTATION. is_metadata = lo_xml->get_metadata( ) ). compare_remote_to_local( - io_object = li_obj - it_remote = lt_remote - is_result = ). + io_object = li_obj + it_remote = lt_remote + is_result = ). li_obj->mo_files = lo_files. IF li_obj->get_metadata( )-late_deser = abap_true. - APPEND INITIAL LINE TO lt_late ASSIGNING . - -obj = li_obj. - -xml = lo_xml. - -package = lv_package. - CONTINUE. + APPEND INITIAL LINE TO lt_late ASSIGNING . + ELSEIF li_obj->get_metadata( )-ddic = abap_true. + APPEND INITIAL LINE TO lt_ddic ASSIGNING . + ELSE. + APPEND INITIAL LINE TO lt_rest ASSIGNING . ENDIF. + -item = ls_item. + -obj = li_obj. + -xml = lo_xml. + -package = lv_package. - - li_obj->deserialize( iv_package = lv_package - io_xml = lo_xml ). - - " Remember accessed files - APPEND LINES OF lo_files->get_accessed_files( ) TO rt_accessed_files. ENDLOOP. - lcl_objects_activation=>activate( ). + deserialize_objects( EXPORTING it_objects = lt_ddic + iv_ddic = abap_true + iv_descr = 'DDIC' + CHANGING ct_files = rt_accessed_files ). - LOOP AT lt_late ASSIGNING . - -obj->deserialize( iv_package = -package - io_xml = -xml ). - ENDLOOP. + deserialize_objects( EXPORTING it_objects = lt_rest + iv_descr = 'Objects' + CHANGING ct_files = rt_accessed_files ). + + deserialize_objects( EXPORTING it_objects = lt_late + iv_descr = 'Late' + CHANGING ct_files = rt_accessed_files ). update_package_tree( io_repo->get_package( ) ). @@ -692,6 +688,27 @@ CLASS lcl_objects IMPLEMENTATION. ENDMETHOD. "deserialize + METHOD deserialize_objects. + + FIELD-SYMBOLS: LIKE LINE OF it_objects. + + + lcl_objects_activation=>clear( ). + + LOOP AT it_objects ASSIGNING . + lcl_progress=>show( iv_key = |Deserialize { iv_descr }| + iv_current = sy-tabix + iv_total = lines( it_objects ) + iv_text = -item-obj_name ) ##NO_TEXT. + + -obj->deserialize( iv_package = -package + io_xml = -xml ). + APPEND LINES OF -obj->mo_files->get_accessed_files( ) TO ct_files. + ENDLOOP. + + lcl_objects_activation=>activate( iv_ddic ). + + ENDMETHOD. METHOD compare_remote_to_local. @@ -725,4 +742,4 @@ CLASS lcl_objects IMPLEMENTATION. ENDMETHOD. -ENDCLASS. "lcl_objects IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_objects IMPLEMENTATION diff --git a/src/zabapgit_objects_impl.prog.xml b/src/zabapgit_objects_impl.prog.xml index f426626b7..8fd2077d7 100644 --- a/src/zabapgit_objects_impl.prog.xml +++ b/src/zabapgit_objects_impl.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_OBJECTS_IMPL A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_OBJECT 23 - diff --git a/src/zabapgit_page.prog.abap b/src/zabapgit_page.prog.abap index 0f5d31f6f..c61eb0a0f 100644 --- a/src/zabapgit_page.prog.abap +++ b/src/zabapgit_page.prog.abap @@ -17,241 +17,90 @@ INTERFACE lif_gui_page. RAISING lcx_exception lcx_cancel. METHODS render - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + RETURNING VALUE(ro_html) TYPE REF TO lcl_html RAISING lcx_exception. ENDINTERFACE. -CLASS lcl_gui_page_super DEFINITION ABSTRACT. +CLASS lcl_gui_page DEFINITION ABSTRACT. PUBLIC SECTION. - INTERFACES lif_gui_page ABSTRACT METHODS render. - - CLASS-METHODS render_error - IMPORTING ix_error TYPE REF TO lcx_exception - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + INTERFACES lif_gui_page. PROTECTED SECTION. - METHODS render_repo_top - IMPORTING io_repo TYPE REF TO lcl_repo - iv_show_package TYPE abap_bool DEFAULT abap_true - iv_show_branch TYPE abap_bool DEFAULT abap_true - iv_interactive_branch TYPE abap_bool DEFAULT abap_false - iv_branch TYPE string OPTIONAL - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + + TYPES: BEGIN OF ty_control, + redirect_url TYPE string, + page_title TYPE string, + page_menu TYPE REF TO lcl_html_toolbar, + END OF ty_control. + + DATA: ms_control TYPE ty_control. + + METHODS render_content ABSTRACT + RETURNING VALUE(ro_html) TYPE REF TO lcl_html RAISING lcx_exception. - METHODS render_item_state - IMPORTING iv1 TYPE char1 - iv2 TYPE char1 - RETURNING VALUE(rv_html) TYPE string. - - METHODS render_branch_span - IMPORTING iv_branch TYPE string - io_repo TYPE REF TO lcl_repo_online - iv_interactive TYPE abap_bool - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + METHODS scripts + RETURNING VALUE(ro_html) TYPE REF TO lcl_html RAISING lcx_exception. - METHODS header - IMPORTING io_include_style TYPE REF TO lcl_html_helper OPTIONAL - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + PRIVATE SECTION. - METHODS footer - IMPORTING io_include_script TYPE REF TO lcl_html_helper OPTIONAL - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + METHODS html_head + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. METHODS title - IMPORTING iv_title TYPE string - io_menu TYPE REF TO lcl_html_toolbar OPTIONAL - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. + + + METHODS footer + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. METHODS redirect - IMPORTING iv_url TYPE string - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. -ENDCLASS. +ENDCLASS. "lcl_gui_page -CLASS lcl_gui_page_super IMPLEMENTATION. +CLASS lcl_gui_page IMPLEMENTATION. - METHOD render_repo_top. - - DATA: lo_repo_online TYPE REF TO lcl_repo_online, - lo_pback TYPE REF TO lcl_persistence_background, - lv_icon TYPE string. - - - CREATE OBJECT ro_html. - CREATE OBJECT lo_pback. - - IF io_repo->is_offline( ) = abap_true. - lv_icon = 'img/repo_offline' ##NO_TEXT. - ELSE. - lv_icon = 'img/repo_online' ##NO_TEXT. - ENDIF. - - ro_html->add( || ). - ro_html->add( '' ). - - ro_html->add( '' ). - - ro_html->add( '' ). - ro_html->add( '
' ). - ro_html->add( || ). - ro_html->add( |{ io_repo->get_name( ) }| ). - IF io_repo->is_offline( ) = abap_false. - lo_repo_online ?= io_repo. - ro_html->add( |{ lo_repo_online->get_url( ) }| ). - ENDIF. - ro_html->add( '' ). - - IF abap_true = lcl_app=>user( )->is_favorite_repo( io_repo->get_key( ) ). - lv_icon = 'img/star' ##NO_TEXT. - ELSE. - lv_icon = 'img/star-grey' ##NO_TEXT. - ENDIF. - lv_icon = ||. - ro_html->add_anchor( iv_act = |{ gc_action-repo_toggle_fav }?{ io_repo->get_key( ) }| - iv_txt = lv_icon ). - - IF lo_pback->exists( io_repo->get_key( ) ) = abap_true. - ro_html->add( 'BG' ). - ENDIF. - - IF io_repo->is_write_protected( ) = abap_true. - ro_html->add( '' ). - ENDIF. - - IF io_repo->is_offline( ) = abap_false. - lo_repo_online ?= io_repo. - IF iv_show_branch = abap_true. - IF iv_branch IS INITIAL. - ro_html->add( render_branch_span( iv_branch = lo_repo_online->get_branch_name( ) - io_repo = lo_repo_online - iv_interactive = iv_interactive_branch ) ). - ELSE. - ro_html->add( render_branch_span( iv_branch = iv_branch - io_repo = lo_repo_online - iv_interactive = iv_interactive_branch ) ). - ENDIF. - ENDIF. - ENDIF. - - IF iv_show_package = abap_true. - ro_html->add( '' ). - ro_html->add( '' ). - ro_html->add_anchor( iv_txt = io_repo->get_package( ) - iv_act = |{ gc_action-jump_pkg }?{ io_repo->get_package( ) }| ). - ro_html->add( '' ). - ENDIF. - - ro_html->add( '
' ). - - ENDMETHOD. - - METHOD render_item_state. - - DATA: lv_system TYPE string. - - FIELD-SYMBOLS TYPE char1. - - - rv_html = ''. - - DO 2 TIMES. - CASE sy-index. - WHEN 1. - ASSIGN iv1 TO . - lv_system = 'Local:'. - WHEN 2. - ASSIGN iv2 TO . - lv_system = 'Remote:'. - ENDCASE. - - CASE . - WHEN gc_state-unchanged. "None or unchanged - IF iv1 = gc_state-added OR iv2 = gc_state-added. - rv_html = rv_html && |X|. - ELSE. - rv_html = rv_html && | |. - ENDIF. - WHEN gc_state-modified. "Changed - rv_html = rv_html && |M|. - WHEN gc_state-added. "Added new - rv_html = rv_html && |A|. - WHEN gc_state-mixed. "Multiple changes (multifile) - rv_html = rv_html && ||. - WHEN gc_state-deleted. "Deleted - rv_html = rv_html && |D|. - ENDCASE. - ENDDO. - - rv_html = rv_html && ''. - - ENDMETHOD. "render_item_state - - METHOD render_branch_span. - DATA: lv_text TYPE string, - lv_class TYPE string. - - lv_text = lcl_git_branch_list=>get_display_name( iv_branch ). - - IF iv_branch = io_repo->get_head_branch_name( ) OR iv_branch = lcl_git_branch_list=>head_name. - lv_class = 'branch branch_head'. - ELSEIF lcl_git_branch_list=>get_type( iv_branch ) = lcl_git_branch_list=>c_type-branch. - lv_class = 'branch branch_branch'. - ELSE. - lv_class = 'branch'. - ENDIF. - - CREATE OBJECT ro_html. - ro_html->add( || ). - ro_html->add( '' ). - IF iv_interactive = abap_true. - ro_html->add_anchor( iv_act = |{ gc_action-git_branch_switch }?{ io_repo->get_key( ) }| - iv_txt = lv_text ). - ELSE. - ro_html->add( lv_text ). - ENDIF. - ro_html->add( '' ). - - ENDMETHOD. "render_branch_span - - METHOD header. + METHOD html_head. CREATE OBJECT ro_html. - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT + + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( 'abapGit' ). "#EC NOTEXT ro_html->add( '' ). - ro_html->add( '' ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ENDMETHOD. "render html header + ro_html->add( lcl_gui_asset_manager=>get_webfont_link( ) ). " Web fonts + + ro_html->add( '' ). "#EC NOTEXT + + ENDMETHOD. "html_head METHOD title. CREATE OBJECT ro_html. ro_html->add( '' ). "#EC NOTEXT + + ENDMETHOD. "footer + + METHOD redirect. + + CREATE OBJECT ro_html. + + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( || ). "#EC NOTEXT + ro_html->add( ''). "#EC NOTEXT + ro_html->add( ''). "#EC NOTEXT + + ENDMETHOD. + + METHOD scripts. + ASSERT 1 = 1. " Dummy + ENDMETHOD. "scripts + + METHOD lif_gui_page~on_event. + ev_state = gc_event_state-not_handled. + ENDMETHOD. "lif_gui_page~on_event + + METHOD lif_gui_page~render. + + DATA lo_script TYPE REF TO lcl_html. + + " Redirect + IF ms_control-redirect_url IS NOT INITIAL. + ro_html = redirect( ). + RETURN. + ENDIF. + + " Real page + CREATE OBJECT ro_html. + + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( html_head( ) ). + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( title( ) ). + ro_html->add( render_content( ) ). + ro_html->add( footer( ) ). ro_html->add( '' ). "#EC NOTEXT - IF io_include_script IS BOUND. + lo_script = scripts( ). + + IF lo_script IS BOUND AND lo_script->is_empty( ) = abap_false. ro_html->add( '' ). ENDIF. ro_html->add( ''). "#EC NOTEXT - ENDMETHOD. "render html footer & logo + ENDMETHOD. " lif_gui_page~render. - METHOD render_error. - - CREATE OBJECT ro_html. - - ro_html->add( '
' ). - ro_html->add( |Error: { ix_error->mv_text }| ). - ro_html->add( '
' ). - - ENDMETHOD. "render_error - - METHOD redirect. - - CREATE OBJECT ro_html. - - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( || ). "#EC NOTEXT - ro_html->add( ''). "#EC NOTEXT - - ENDMETHOD. - - METHOD lif_gui_page~on_event. - ev_state = gc_event_state-not_handled. - ENDMETHOD. "lif_gui_page~on_event - -ENDCLASS. \ No newline at end of file +ENDCLASS. "lcl_gui_page diff --git a/src/zabapgit_page.prog.xml b/src/zabapgit_page.prog.xml index e834a5280..be0c12979 100644 --- a/src/zabapgit_page.prog.xml +++ b/src/zabapgit_page.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_PAGE A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_PAGE 21 - diff --git a/src/zabapgit_page_background.prog.abap b/src/zabapgit_page_background.prog.abap index 56e9fd0c0..1ffa6cc60 100644 --- a/src/zabapgit_page_background.prog.abap +++ b/src/zabapgit_page_background.prog.abap @@ -3,12 +3,14 @@ *&---------------------------------------------------------------------* CLASS lcl_gui_page_background_run DEFINITION FINAL - INHERITING FROM lcl_gui_page_super. + INHERITING FROM lcl_gui_page. PUBLIC SECTION. - METHODS: - lif_gui_page~on_event REDEFINITION, - lif_gui_page~render REDEFINITION. + METHODS constructor. + METHODS lif_gui_page~on_event REDEFINITION. + + PROTECTED SECTION. + METHODS render_content REDEFINITION. PRIVATE SECTION. DATA: mt_text TYPE TABLE OF string. @@ -19,6 +21,11 @@ ENDCLASS. CLASS lcl_gui_page_background_run IMPLEMENTATION. + METHOD constructor. + super->constructor( ). + ms_control-page_title = 'BACKGROUND_RUN'. + ENDMETHOD. " constructor. + METHOD lif_gui_page~on_event. RETURN. ENDMETHOD. @@ -47,46 +54,44 @@ CLASS lcl_gui_page_background_run IMPLEMENTATION. ENDMETHOD. - METHOD lif_gui_page~render. + METHOD render_content. DATA: lv_text LIKE LINE OF mt_text. - run( ). CREATE OBJECT ro_html. - ro_html->add( header( ) ). - ro_html->add( title( 'BACKGROUND_RUN' ) ). ro_html->add( '
' ). LOOP AT mt_text INTO lv_text. ro_html->add( '
' && lv_text && '

' ). ENDLOOP. ro_html->add( '
' ). - ro_html->add( footer( ) ). - ENDMETHOD. + ENDMETHOD. "render_content ENDCLASS. CLASS lcl_gui_page_background DEFINITION FINAL - INHERITING FROM lcl_gui_page_super. + INHERITING FROM lcl_gui_page. PUBLIC SECTION. METHODS: - constructor - IMPORTING - iv_key TYPE lcl_persistence_repo=>ty_repo-key, - lif_gui_page~on_event REDEFINITION, - lif_gui_page~render REDEFINITION. + constructor IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key, + lif_gui_page~on_event REDEFINITION. + + PROTECTED SECTION. + METHODS render_content REDEFINITION. PRIVATE SECTION. DATA: mv_key TYPE lcl_persistence_repo=>ty_repo-key. METHODS: + build_menu + RETURNING VALUE(ro_menu) TYPE REF TO lcl_html_toolbar, render_data - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + RETURNING VALUE(ro_html) TYPE REF TO lcl_html RAISING lcx_exception. ENDCLASS. @@ -94,10 +99,21 @@ ENDCLASS. CLASS lcl_gui_page_background IMPLEMENTATION. METHOD constructor. + super->constructor( ). + mv_key = iv_key. + ms_control-page_title = 'BACKGROUND'. + ms_control-page_menu = build_menu( ). + ENDMETHOD. + METHOD build_menu. + CREATE OBJECT ro_menu. + ro_menu->add( iv_txt = 'Run background logic' + iv_act = gc_action-go_background_run ) ##NO_TEXT. + ENDMETHOD. "build_menu + METHOD lif_gui_page~on_event. DATA ls_bg_task TYPE lcl_persistence_background=>ty_background. @@ -162,7 +178,7 @@ CLASS lcl_gui_page_background IMPLEMENTATION. lv_afixed = ' checked' ##NO_TEXT. ENDCASE. - ro_html->add( render_repo_top( lo_repo ) ). + ro_html->add( lcl_gui_chunk_lib=>render_repo_top( lo_repo ) ). ro_html->add( '
' ). ro_html->add( 'Method
' ) ##NO_TEXT. @@ -222,22 +238,12 @@ CLASS lcl_gui_page_background IMPLEMENTATION. ENDMETHOD. - METHOD lif_gui_page~render. + METHOD render_content. - DATA lo_toolbar TYPE REF TO lcl_html_toolbar. - - - CREATE OBJECT lo_toolbar. CREATE OBJECT ro_html. - lo_toolbar->add( iv_txt = 'Run background logic' - iv_act = gc_action-go_background_run ) ##NO_TEXT. - - ro_html->add( header( ) ). - ro_html->add( title( iv_title = 'BACKGROUND' io_menu = lo_toolbar ) ). ro_html->add( render_data( ) ). - ro_html->add( footer( ) ). - ENDMETHOD. + ENDMETHOD. "render_content -ENDCLASS. \ No newline at end of file +ENDCLASS. diff --git a/src/zabapgit_page_background.prog.xml b/src/zabapgit_page_background.prog.xml index 8edbac35e..f2855627a 100644 --- a/src/zabapgit_page_background.prog.xml +++ b/src/zabapgit_page_background.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_PAGE_BACKGROUND A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_PAGE_BACKGROUND 32 - diff --git a/src/zabapgit_page_branch_overview.prog.abap b/src/zabapgit_page_branch_overview.prog.abap index 0873eea5c..e67b5d96e 100644 --- a/src/zabapgit_page_branch_overview.prog.abap +++ b/src/zabapgit_page_branch_overview.prog.abap @@ -302,15 +302,17 @@ ENDCLASS. *********************** -CLASS lcl_gui_page_branch_overview DEFINITION FINAL INHERITING FROM lcl_gui_page_super. +CLASS lcl_gui_page_branch_overview DEFINITION FINAL INHERITING FROM lcl_gui_page. PUBLIC SECTION. METHODS: constructor IMPORTING io_repo TYPE REF TO lcl_repo_online RAISING lcx_exception, - lif_gui_page~on_event REDEFINITION, - lif_gui_page~render REDEFINITION. + lif_gui_page~on_event REDEFINITION. + + PROTECTED SECTION. + METHODS render_content REDEFINITION. PRIVATE SECTION. DATA: mo_repo TYPE REF TO lcl_repo_online, @@ -333,13 +335,13 @@ CLASS lcl_gui_page_branch_overview DEFINITION FINAL INHERITING FROM lcl_gui_page refresh RAISING lcx_exception, body - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + RETURNING VALUE(ro_html) TYPE REF TO lcl_html RAISING lcx_exception, form_select IMPORTING iv_name TYPE string - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper, + RETURNING VALUE(ro_html) TYPE REF TO lcl_html, render_merge - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + RETURNING VALUE(ro_html) TYPE REF TO lcl_html RAISING lcx_exception, decode_merge IMPORTING it_postdata TYPE cnht_post_data_tab @@ -360,6 +362,7 @@ CLASS lcl_gui_page_branch_overview IMPLEMENTATION. METHOD constructor. super->constructor( ). + ms_control-page_title = 'BRANCH_OVERVIEW'. mo_repo = io_repo. refresh( ). ENDMETHOD. @@ -416,7 +419,7 @@ CLASS lcl_gui_page_branch_overview IMPLEMENTATION. CREATE OBJECT ro_html. - ro_html->add( render_repo_top( + ro_html->add( lcl_gui_chunk_lib=>render_repo_top( io_repo = mo_repo iv_show_package = abap_false iv_show_branch = abap_false ) ). @@ -425,6 +428,9 @@ CLASS lcl_gui_page_branch_overview IMPLEMENTATION. ro_html->add( render_merge( ) ). + ro_html->add( '
' ). + ro_html->add( build_menu( )->render( ) ). + * see http://stackoverflow.com/questions/6081483/maximum-size-of-a-canvas-element _add ''. @@ -577,17 +583,14 @@ CLASS lcl_gui_page_branch_overview IMPLEMENTATION. ENDMETHOD. - METHOD lif_gui_page~render. + METHOD render_content. CREATE OBJECT ro_html. - ro_html->add( header( ) ). - ro_html->add( title( iv_title = 'BRANCH_OVERVIEW' io_menu = build_menu( ) ) ). ro_html->add( '
' ). ro_html->add( body( ) ). ro_html->add( '
' ). - ro_html->add( footer( ) ). - ENDMETHOD. + ENDMETHOD. "render_content -ENDCLASS. \ No newline at end of file +ENDCLASS. diff --git a/src/zabapgit_page_branch_overview.prog.xml b/src/zabapgit_page_branch_overview.prog.xml index f9bc1a592..ee044f1f4 100644 --- a/src/zabapgit_page_branch_overview.prog.xml +++ b/src/zabapgit_page_branch_overview.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_PAGE_BRANCH_OVERVIEW A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_PAGE_BRANCH_OVERVIEW 37 - diff --git a/src/zabapgit_page_commit.prog.abap b/src/zabapgit_page_commit.prog.abap index 434b154c1..c9550a045 100644 --- a/src/zabapgit_page_commit.prog.abap +++ b/src/zabapgit_page_commit.prog.abap @@ -2,7 +2,7 @@ *& Include ZABAPGIT_PAGE_COMMIT *&---------------------------------------------------------------------* -CLASS lcl_gui_page_commit DEFINITION FINAL INHERITING FROM lcl_gui_page_super. +CLASS lcl_gui_page_commit DEFINITION FINAL INHERITING FROM lcl_gui_page. PUBLIC SECTION. @@ -16,24 +16,26 @@ CLASS lcl_gui_page_commit DEFINITION FINAL INHERITING FROM lcl_gui_page_super. IMPORTING io_repo TYPE REF TO lcl_repo_online io_stage TYPE REF TO lcl_stage RAISING lcx_exception, - lif_gui_page~render REDEFINITION, lif_gui_page~on_event REDEFINITION. + PROTECTED SECTION. + METHODS: + render_content REDEFINITION, + scripts REDEFINITION. + PRIVATE SECTION. DATA: mo_repo TYPE REF TO lcl_repo_online, mo_stage TYPE REF TO lcl_stage. METHODS: render_menu - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper, + RETURNING VALUE(ro_html) TYPE REF TO lcl_html, render_stage - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + RETURNING VALUE(ro_html) TYPE REF TO lcl_html RAISING lcx_exception, render_form - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper - RAISING lcx_exception, - scripts - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html + RAISING lcx_exception. ENDCLASS. @@ -44,6 +46,8 @@ CLASS lcl_gui_page_commit IMPLEMENTATION. mo_repo = io_repo. mo_stage = io_stage. + + ms_control-page_title = 'COMMIT'. ENDMETHOD. METHOD lif_gui_page~on_event. @@ -68,15 +72,12 @@ CLASS lcl_gui_page_commit IMPLEMENTATION. ENDMETHOD. - METHOD lif_gui_page~render. + METHOD render_content. CREATE OBJECT ro_html. - ro_html->add( header( ) ). - ro_html->add( title( 'COMMIT' ) ). - ro_html->add( '
' ). - ro_html->add( render_repo_top( + ro_html->add( lcl_gui_chunk_lib=>render_repo_top( io_repo = mo_repo iv_show_package = abap_false iv_branch = mo_stage->get_branch_name( ) ) ). @@ -86,9 +87,7 @@ CLASS lcl_gui_page_commit IMPLEMENTATION. ro_html->add( render_stage( ) ). ro_html->add( '
' ). - ro_html->add( footer( io_include_script = scripts( ) ) ). - - ENDMETHOD. "lif_gui_page~render + ENDMETHOD. "render_content METHOD render_stage. @@ -201,7 +200,7 @@ CLASS lcl_gui_page_commit IMPLEMENTATION. lo_toolbar->add( iv_act = 'submitFormById(''commit_form'');' iv_txt = 'Commit' iv_typ = gc_action_type-onclick - iv_opt = gc_html_opt-emphas ) ##NO_TEXT. + iv_opt = gc_html_opt-strong ) ##NO_TEXT. lo_toolbar->add( iv_act = 'commit_cancel' iv_txt = 'Cancel' @@ -220,4 +219,4 @@ CLASS lcl_gui_page_commit IMPLEMENTATION. ENDMETHOD. "scripts -ENDCLASS. "lcl_gui_page_commit \ No newline at end of file +ENDCLASS. "lcl_gui_page_commit diff --git a/src/zabapgit_page_commit.prog.xml b/src/zabapgit_page_commit.prog.xml index 902f3a12b..6090e4cd1 100644 --- a/src/zabapgit_page_commit.prog.xml +++ b/src/zabapgit_page_commit.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_PAGE_COMMIT A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_PAGE_COMMIT 28 - diff --git a/src/zabapgit_page_db.prog.abap b/src/zabapgit_page_db.prog.abap index 6f8ccf02c..677330be4 100644 --- a/src/zabapgit_page_db.prog.abap +++ b/src/zabapgit_page_db.prog.abap @@ -2,14 +2,15 @@ *& Include ZABAPGIT_PAGE_DB *&---------------------------------------------------------------------* -CLASS lcl_gui_page_db_display DEFINITION FINAL INHERITING FROM lcl_gui_page_super. +CLASS lcl_gui_page_db_display DEFINITION FINAL INHERITING FROM lcl_gui_page. PUBLIC SECTION. - METHODS lif_gui_page~render REDEFINITION. - METHODS: constructor IMPORTING is_key TYPE lcl_persistence_db=>ty_content. + PROTECTED SECTION. + METHODS render_content REDEFINITION. + PRIVATE SECTION. DATA: ms_key TYPE lcl_persistence_db=>ty_content. @@ -20,13 +21,16 @@ CLASS lcl_gui_page_db_display IMPLEMENTATION. METHOD constructor. super->constructor( ). ms_key = is_key. + ms_control-page_title = 'CONFIG DISPLAY'. ENDMETHOD. - METHOD lif_gui_page~render. + METHOD render_content. - DATA: lv_data TYPE lcl_persistence_db=>ty_content-data_str, - ls_action TYPE lcl_persistence_db=>ty_content, - lv_action TYPE string. + DATA: + lo_highlighter TYPE REF TO lcl_syntax_highlighter, + lv_data TYPE lcl_persistence_db=>ty_content-data_str, + ls_action TYPE lcl_persistence_db=>ty_content, + lv_action TYPE string. TRY. lv_data = lcl_app=>db( )->read( @@ -35,17 +39,15 @@ CLASS lcl_gui_page_db_display IMPLEMENTATION. CATCH lcx_not_found ##NO_HANDLER. ENDTRY. + " Create syntax highlighter + lo_highlighter = lcl_syntax_highlighter=>create( '*.xml' ). + ls_action-type = ms_key-type. ls_action-value = ms_key-value. lv_action = lcl_html_action_utils=>dbkey_encode( ls_action ). - - lv_data = lcl_xml_pretty=>print( lv_data ). - lv_data = escape( val = lv_data - format = cl_abap_format=>e_html_attr ). + lv_data = lo_highlighter->process_line( lcl_xml_pretty=>print( lv_data ) ). CREATE OBJECT ro_html. - ro_html->add( header( ) ). - ro_html->add( title( 'CONFIG DISPLAY' ) ). ro_html->add( '
' ). ro_html->add( '
' ). @@ -56,26 +58,25 @@ CLASS lcl_gui_page_db_display IMPLEMENTATION. | { ms_key-value }
| ). ro_html->add( '' ). - ro_html->add_anchor( iv_txt = 'Edit' iv_act = |{ gc_action-db_edit }?{ lv_action }| ). + ro_html->add_a( iv_txt = 'Edit' iv_act = |{ gc_action-db_edit }?{ lv_action }| ). ro_html->add( '' ). - ro_html->add( |
{ lv_data }
| ). + ro_html->add( |
{ lv_data }
| ). ro_html->add( '
' ). - ro_html->add( footer( ) ). - - ENDMETHOD. + ENDMETHOD. "render_content ENDCLASS. -CLASS lcl_gui_page_db_edit DEFINITION FINAL INHERITING FROM lcl_gui_page_super. +CLASS lcl_gui_page_db_edit DEFINITION FINAL INHERITING FROM lcl_gui_page. PUBLIC SECTION. - METHODS lif_gui_page~render REDEFINITION. - METHODS: constructor IMPORTING is_key TYPE lcl_persistence_db=>ty_content. + PROTECTED SECTION. + METHODS render_content REDEFINITION. + PRIVATE SECTION. DATA: ms_key TYPE lcl_persistence_db=>ty_content. @@ -86,9 +87,10 @@ CLASS lcl_gui_page_db_edit IMPLEMENTATION. METHOD constructor. super->constructor( ). ms_key = is_key. + ms_control-page_title = 'CONFIG EDIT'. ENDMETHOD. - METHOD lif_gui_page~render. + METHOD render_content. DATA: lv_data TYPE lcl_persistence_db=>ty_content-data_str, lo_toolbar TYPE REF TO lcl_html_toolbar. @@ -104,17 +106,12 @@ CLASS lcl_gui_page_db_edit IMPLEMENTATION. iv_type = ms_key-type iv_value = ms_key-value ). - lv_data = lcl_xml_pretty=>print( lv_data ). - - lv_data = escape( val = lv_data + lv_data = escape( val = lcl_xml_pretty=>print( lv_data ) format = cl_abap_format=>e_html_attr ). CREATE OBJECT ro_html. CREATE OBJECT lo_toolbar. - ro_html->add( header( ) ). - ro_html->add( title( 'CONFIG EDIT' ) ). - ro_html->add( '
' ). " Banners @@ -135,7 +132,7 @@ CLASS lcl_gui_page_db_edit IMPLEMENTATION. lo_toolbar->add( iv_act = 'submitFormById(''db_form'');' iv_txt = 'Save' iv_typ = gc_action_type-onclick - iv_opt = gc_html_opt-emphas ) ##NO_TEXT. + iv_opt = gc_html_opt-strong ) ##NO_TEXT. ro_html->add( '
' ). ro_html->add( lo_toolbar->render( ) ). @@ -143,16 +140,17 @@ CLASS lcl_gui_page_db_edit IMPLEMENTATION. ro_html->add( '
' ). "db_entry - ro_html->add( footer( ) ). - - ENDMETHOD. + ENDMETHOD. "render_content ENDCLASS. -CLASS lcl_gui_page_db DEFINITION FINAL INHERITING FROM lcl_gui_page_super. +CLASS lcl_gui_page_db DEFINITION FINAL INHERITING FROM lcl_gui_page. PUBLIC SECTION. - METHODS lif_gui_page~render REDEFINITION. + METHODS constructor. + + PROTECTED SECTION. + METHODS render_content REDEFINITION. PRIVATE SECTION. METHODS explain_content @@ -160,12 +158,16 @@ CLASS lcl_gui_page_db DEFINITION FINAL INHERITING FROM lcl_gui_page_super. RETURNING VALUE(rv_text) TYPE string RAISING lcx_exception. - ENDCLASS. CLASS lcl_gui_page_db IMPLEMENTATION. - METHOD lif_gui_page~render. + METHOD constructor. + super->constructor( ). + ms_control-page_title = 'DATABASE PERSISTENCY'. + ENDMETHOD. " constructor. + + METHOD render_content. DATA: lt_data TYPE lcl_persistence_db=>tt_content, lv_action TYPE string, @@ -179,19 +181,19 @@ CLASS lcl_gui_page_db IMPLEMENTATION. CREATE OBJECT ro_html. - ro_html->add( header( ) ). - ro_html->add( title( 'DATABASE PERSISTENCY' ) ). - ro_html->add( '
' ). ro_html->add( '' ). " Header + ro_html->add( '' ). ro_html->add( '' ). ro_html->add( '' ). ro_html->add( '' ). ro_html->add( '' ). ro_html->add( '' ). ro_html->add( '' ). + ro_html->add( '' ). + ro_html->add( '' ). " Lines LOOP AT lt_data ASSIGNING . @@ -217,12 +219,11 @@ CLASS lcl_gui_page_db IMPLEMENTATION. ro_html->add( '' ). ENDLOOP. + ro_html->add( '' ). ro_html->add( '
TypeKeyData
' ). ro_html->add( '
' ). - ro_html->add( footer( ) ). - - ENDMETHOD. "lif_gui_page~render + ENDMETHOD. "render_content METHOD explain_content. DATA: lv_result TYPE match_result, @@ -241,9 +242,10 @@ CLASS lcl_gui_page_db IMPLEMENTATION. FIND FIRST OCCURRENCE OF REGEX '' IN is_data-data_str IGNORING CASE MATCH COUNT lv_cnt. IF lv_cnt > 0. - rv_text = |On-line, Name: { lcl_url=>name( rv_text ) }|. + rv_text = |On-line, Name: { + lcl_url=>name( rv_text ) }|. ELSE. - rv_text = |Off-line, Name: { rv_text }|. + rv_text = |Off-line, Name: { rv_text }|. ENDIF. WHEN 'BACKGROUND'. @@ -270,4 +272,4 @@ CLASS lcl_gui_page_db IMPLEMENTATION. ENDCASE. ENDMETHOD. "explain_content -ENDCLASS. \ No newline at end of file +ENDCLASS. diff --git a/src/zabapgit_page_db.prog.xml b/src/zabapgit_page_db.prog.xml index 440928dc0..89c5081a0 100644 --- a/src/zabapgit_page_db.prog.xml +++ b/src/zabapgit_page_db.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_PAGE_DB A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_PAGE_DB 24 - diff --git a/src/zabapgit_page_debug.prog.abap b/src/zabapgit_page_debug.prog.abap index e7bd0446a..263c22cdb 100644 --- a/src/zabapgit_page_debug.prog.abap +++ b/src/zabapgit_page_debug.prog.abap @@ -2,37 +2,41 @@ *& Include ZABAPGIT_PAGE_DEBUG *&---------------------------------------------------------------------* -CLASS lcl_gui_page_debuginfo DEFINITION FINAL INHERITING FROM lcl_gui_page_super. +CLASS lcl_gui_page_debuginfo DEFINITION FINAL INHERITING FROM lcl_gui_page. PUBLIC SECTION. - METHODS lif_gui_page~render REDEFINITION. + METHODS constructor. + + PROTECTED SECTION. + METHODS: + render_content REDEFINITION, + scripts REDEFINITION. PRIVATE SECTION. - METHODS scripts - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. METHODS render_debug_info - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html + RAISING lcx_exception. METHODS render_supported_object_types - RETURNING VALUE(rv_html) TYPE string. + RETURNING VALUE(rv_html) TYPE string. ENDCLASS. "lcl_gui_page_debuginfo CLASS lcl_gui_page_debuginfo IMPLEMENTATION. - METHOD lif_gui_page~render. + METHOD constructor. + super->constructor( ). + ms_control-page_title = 'DEBUG INFO'. + ENDMETHOD. " constructor. + + METHOD render_content. CREATE OBJECT ro_html. - ro_html->add( header( ) ). - ro_html->add( title( 'DEBUG INFO' ) ). - ro_html->add( '
' ). ro_html->add( render_debug_info( ) ). ro_html->add( render_supported_object_types( ) ). ro_html->add( '
' ). - ro_html->add( footer( io_include_script = scripts( ) ) ). - - ENDMETHOD. + ENDMETHOD. "render_content METHOD render_debug_info. @@ -54,6 +58,8 @@ CLASS lcl_gui_page_debuginfo IMPLEMENTATION. ro_html->add( |

abapGit version: { gc_abap_version }

| ). ro_html->add( |

XML version: { gc_xml_version }

| ). ro_html->add( |

GUI version: { lv_gui_version }

| ). + ro_html->add( |

LCL_TIME: { lcl_time=>get( ) }

| ). + ro_html->add( |

SY time: { sy-datum } { sy-uzeit } { sy-tzone }

| ). ENDMETHOD. "render_debug_info @@ -69,7 +75,7 @@ CLASS lcl_gui_page_debuginfo IMPLEMENTATION. TABLES wt_object_text = lt_objects EXCEPTIONS - OTHERS = 1. + OTHERS = 1 ##FM_SUBRC_OK. LOOP AT lt_objects ASSIGNING WHERE pgmid = 'R3TR'. ls_item-obj_type = -object. @@ -82,7 +88,7 @@ CLASS lcl_gui_page_debuginfo IMPLEMENTATION. ENDIF. ENDLOOP. - rv_html = |

Supported objects: { lv_list }

|. + rv_html = |

Supported objects: { lv_list }

|. ENDMETHOD. " render_supported_object_types @@ -90,8 +96,9 @@ CLASS lcl_gui_page_debuginfo IMPLEMENTATION. CREATE OBJECT ro_html. - ro_html->add( 'debugOutput("Browser: " + navigator.userAgent, "debug_info");' ). + ro_html->add( 'debugOutput("Browser: " + navigator.userAgent + ' && + '"
Frontend time: " + new Date(), "debug_info");' ). ENDMETHOD. "scripts -ENDCLASS. "lcl_gui_page_debuginfo \ No newline at end of file +ENDCLASS. "lcl_gui_page_debuginfo diff --git a/src/zabapgit_page_debug.prog.xml b/src/zabapgit_page_debug.prog.xml index 3a6595916..fd99ac7c5 100644 --- a/src/zabapgit_page_debug.prog.xml +++ b/src/zabapgit_page_debug.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_PAGE_DEBUG A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_PAGE_DEBUG 27 - diff --git a/src/zabapgit_page_diff.prog.abap b/src/zabapgit_page_diff.prog.abap index 79ed392c0..29e79a0a1 100644 --- a/src/zabapgit_page_diff.prog.abap +++ b/src/zabapgit_page_diff.prog.abap @@ -2,62 +2,75 @@ *& Include ZABAPGIT_PAGE_DIFF *&---------------------------------------------------------------------* -CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page_super. +CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page. PUBLIC SECTION. CONSTANTS: - BEGIN OF c_mod, + BEGIN OF c_fstate, local TYPE char1 VALUE 'L', remote TYPE char1 VALUE 'R', both TYPE char1 VALUE 'B', - END OF c_mod. + END OF c_fstate. TYPES: BEGIN OF ty_file_diff, filename TYPE string, lstate TYPE char1, rstate TYPE char1, - mod TYPE char1, " Abstraction for shorter ifs + fstate TYPE char1, " FILE state - Abstraction for shorter ifs o_diff TYPE REF TO lcl_diff, END OF ty_file_diff, tt_file_diff TYPE STANDARD TABLE OF ty_file_diff. - METHODS: constructor - IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key - is_file TYPE ty_file OPTIONAL - is_object TYPE ty_item OPTIONAL - RAISING lcx_exception. + METHODS: + constructor + IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key + is_file TYPE ty_file OPTIONAL + is_object TYPE ty_item OPTIONAL + RAISING lcx_exception, + lif_gui_page~on_event REDEFINITION. - METHODS lif_gui_page~render REDEFINITION. + PROTECTED SECTION. + METHODS render_content REDEFINITION. PRIVATE SECTION. - DATA: mt_diff_files TYPE tt_file_diff. + CONSTANTS: BEGIN OF c_actions, + toggle_unified TYPE string VALUE 'toggle_unified', + END OF c_actions. + + DATA: mt_diff_files TYPE tt_file_diff, + mt_delayed_lines TYPE lcl_diff=>ty_diffs_tt, + mv_unified TYPE abap_bool VALUE abap_true. METHODS render_diff IMPORTING is_diff TYPE ty_file_diff - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. METHODS render_diff_head IMPORTING is_diff TYPE ty_file_diff - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. METHODS render_table_head - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. METHODS render_lines IMPORTING is_diff TYPE ty_file_diff - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. METHODS render_beacon IMPORTING is_diff_line TYPE lcl_diff=>ty_diff is_diff TYPE ty_file_diff - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. - METHODS get_line_hl - IMPORTING iv_mod TYPE char1 - iv_result TYPE lcl_diff=>ty_diff-result - EXPORTING ev_lattr TYPE string - ev_rattr TYPE string. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. + METHODS render_line_split + IMPORTING is_diff_line TYPE lcl_diff=>ty_diff + iv_fstate TYPE char1 + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. + METHODS render_line_unified + IMPORTING is_diff_line TYPE lcl_diff=>ty_diff OPTIONAL + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. METHODS append_diff IMPORTING it_remote TYPE ty_files_tt it_local TYPE ty_files_item_tt is_status TYPE ty_result RAISING lcx_exception. + METHODS build_menu + RETURNING VALUE(ro_menu) TYPE REF TO lcl_html_toolbar. ENDCLASS. "lcl_gui_page_diff @@ -73,6 +86,9 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF lt_status. super->constructor( ). + ms_control-page_title = 'DIFF'. + ms_control-page_menu = build_menu( ). + mv_unified = lcl_app=>user( )->get_diff_unified( ). ASSERT is_file IS INITIAL OR is_object IS INITIAL. " just one passed @@ -93,10 +109,9 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. ELSEIF is_object IS NOT INITIAL. " Diff for whole object LOOP AT lt_status ASSIGNING - WHERE obj_type = is_object-obj_type - AND obj_name = is_object-obj_name - AND match IS INITIAL. - + WHERE obj_type = is_object-obj_type + AND obj_name = is_object-obj_name + AND match IS INITIAL. append_diff( it_remote = lt_remote it_local = lt_local is_status = ). @@ -153,14 +168,14 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. -rstate = is_status-rstate. IF -lstate IS NOT INITIAL AND -rstate IS NOT INITIAL. - -mod = c_mod-both. + -fstate = c_fstate-both. ELSEIF -lstate IS NOT INITIAL. - -mod = c_mod-local. + -fstate = c_fstate-local. ELSE. "rstate IS NOT INITIAL, lstate = empty. - -mod = c_mod-remote. + -fstate = c_fstate-remote. ENDIF. - IF -mod = c_mod-remote. " Remote file leading changes + IF -fstate = c_fstate-remote. " Remote file leading changes CREATE OBJECT -o_diff EXPORTING iv_new = -data @@ -174,44 +189,46 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. ENDMETHOD. "append_diff - METHOD render_diff_head. - DATA: lo_html TYPE REF TO lcl_html_helper, - ls_stats TYPE lcl_diff=>ty_count. + METHOD build_menu. + CREATE OBJECT ro_menu. + ro_menu->add( iv_txt = 'Split/Unified view' + iv_act = c_actions-toggle_unified ) ##NO_TEXT. + ENDMETHOD. " build_menu. - CREATE OBJECT lo_html. +********************************************************************** +* EVENT HANDLING +********************************************************************** - ls_stats = is_diff-o_diff->stats( ). + METHOD lif_gui_page~on_event. - IF is_diff-mod = c_mod-both. " Merge stats into 'update' if both were changed - ls_stats-update = ls_stats-update + ls_stats-insert + ls_stats-delete. - CLEAR: ls_stats-insert, ls_stats-delete. - ENDIF. + CASE iv_action. + WHEN c_actions-toggle_unified. " Toggle file diplay + mv_unified = lcl_app=>user( )->toggle_diff_unified( ). + ev_state = gc_event_state-re_render. + ENDCASE. - lo_html->add( '
' ). "#EC NOTEXT - lo_html->add( |+ { ls_stats-insert }| ). - lo_html->add( |- { ls_stats-delete }| ). - lo_html->add( |~ { ls_stats-update }| ). - lo_html->add( |{ is_diff-filename }| ). "#EC NOTEXT - lo_html->add( render_item_state( iv1 = is_diff-lstate iv2 = is_diff-rstate ) ). - lo_html->add( '
' ). "#EC NOTEXT + ENDMETHOD. "lif_gui_page~on_event - ro_html = lo_html. - ENDMETHOD. +********************************************************************** +* RENDER LOGIC +********************************************************************** - METHOD render_table_head. + METHOD render_content. + + DATA ls_diff_file LIKE LINE OF mt_diff_files. CREATE OBJECT ro_html. - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( 'LOCAL' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( 'REMOTE' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT + LOOP AT mt_diff_files INTO ls_diff_file. + lcl_progress=>show( iv_key = 'Diff' + iv_current = sy-tabix + iv_total = lines( mt_diff_files ) + iv_text = |Render Diff - { ls_diff_file-filename }| ). - ENDMETHOD. " render_table_head. + ro_html->add( render_diff( ls_diff_file ) ). + ENDLOOP. + + ENDMETHOD. "render_content METHOD render_diff. @@ -222,7 +239,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. " Content ro_html->add( '
' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '
' ). "#EC NOTEXT ro_html->add( render_table_head( ) ). ro_html->add( render_lines( is_diff ) ). ro_html->add( '
' ). "#EC NOTEXT @@ -230,11 +247,70 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. ro_html->add( '
' ). "#EC NOTEXT + ENDMETHOD. " render_diff + +********************************************************************** +* CHUNKS +********************************************************************** + + METHOD render_diff_head. + + DATA: ls_stats TYPE lcl_diff=>ty_count. + + CREATE OBJECT ro_html. + ls_stats = is_diff-o_diff->stats( ). + + IF is_diff-fstate = c_fstate-both. " Merge stats into 'update' if both were changed + ls_stats-update = ls_stats-update + ls_stats-insert + ls_stats-delete. + CLEAR: ls_stats-insert, ls_stats-delete. + ENDIF. + + ro_html->add( '
' ). "#EC NOTEXT + + ro_html->add( |+ { ls_stats-insert }| ). + ro_html->add( |- { ls_stats-delete }| ). + ro_html->add( |~ { ls_stats-update }| ). + ro_html->add( |{ is_diff-filename }| ). "#EC NOTEXT + ro_html->add( lcl_gui_chunk_lib=>render_item_state( iv1 = is_diff-lstate + iv2 = is_diff-rstate ) ). + + IF is_diff-fstate = c_fstate-both AND mv_unified = abap_true. + ro_html->add( 'Attention: Unified mode' + && ' highlighting for MM assumes local file is newer ! ' ). "#EC NOTEXT + ENDIF. + + ro_html->add( '
' ). "#EC NOTEXT + ENDMETHOD. + METHOD render_table_head. + + CREATE OBJECT ro_html. + + IF mv_unified = abap_true. + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( 'old' ). "#EC NOTEXT + ro_html->add( 'new' ). "#EC NOTEXT + ro_html->add( 'code' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ELSE. + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( 'LOCAL' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( 'REMOTE' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ENDIF. + + ENDMETHOD. " render_table_head. + METHOD render_beacon. - DATA: lv_beacon TYPE string. + DATA: lv_beacon TYPE string. CREATE OBJECT ro_html. @@ -244,10 +320,19 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. lv_beacon = '---'. ENDIF. + ro_html->add( '' ). ro_html->add( '' ). - ro_html->add( '' ). - ro_html->add( |@@ { is_diff_line-new_line } @@ { lv_beacon }| ). + + IF mv_unified = abap_true. + ro_html->add( '' ). + ro_html->add( '' ). + ro_html->add( |@@ { is_diff_line-new_num } @@ { lv_beacon }| ). + ELSE. + ro_html->add( '' ). + ro_html->add( |@@ { is_diff_line-new_num } @@ { lv_beacon }| ). + ENDIF. + ro_html->add( '' ). ro_html->add( '' ). @@ -257,10 +342,6 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. DATA: lo_highlighter TYPE REF TO lcl_syntax_highlighter, lt_diffs TYPE lcl_diff=>ty_diffs_tt, - lv_local TYPE string, - lv_remote TYPE string, - lv_lattr TYPE string, - lv_rattr TYPE string, lv_insert_nav TYPE abap_bool. FIELD-SYMBOLS LIKE LINE OF lt_diffs. @@ -281,88 +362,125 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. lv_insert_nav = abap_false. ENDIF. - IF is_diff-mod = c_mod-remote. " Remote file leading changes - lv_local = -old. - lv_remote = -new. - ELSE. " Local leading changes or both were modified - lv_local = -new. - lv_remote = -old. - ENDIF. - IF lo_highlighter IS BOUND. - lv_local = lo_highlighter->process_line( lv_local ). - lv_remote = lo_highlighter->process_line( lv_remote ). + -new = lo_highlighter->process_line( -new ). + -old = lo_highlighter->process_line( -old ). ELSE. - lv_local = escape( val = lv_local format = cl_abap_format=>e_html_attr ). - lv_remote = escape( val = lv_remote format = cl_abap_format=>e_html_attr ). + -new = escape( val = -new format = cl_abap_format=>e_html_attr ). + -old = escape( val = -old format = cl_abap_format=>e_html_attr ). ENDIF. - get_line_hl( EXPORTING iv_mod = is_diff-mod - iv_result = -result - IMPORTING ev_lattr = lv_lattr - ev_rattr = lv_rattr ). + CONDENSE -new_num. "get rid of leading spaces + CONDENSE -old_num. - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( |{ -new_line }| ). "#EC NOTEXT - ro_html->add( |{ lv_local }| ). "#EC NOTEXT - ro_html->add( |{ -old_line }| ). "#EC NOTEXT - ro_html->add( |{ lv_remote }| ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT + IF mv_unified = abap_true. + ro_html->add( render_line_unified( is_diff_line = ) ). + ELSE. + ro_html->add( render_line_split( is_diff_line = + iv_fstate = is_diff-fstate ) ). + ENDIF. ENDLOOP. - ENDMETHOD. - - METHOD get_line_hl. - - CLEAR: ev_lattr, ev_rattr. " Class for changed lines - - IF iv_result IS INITIAL. - RETURN. + IF mv_unified = abap_true. + ro_html->add( render_line_unified( ) ). " Release delayed lines ENDIF. - " Both file changed ? Or line updated ? - All yellow - IF iv_mod = c_mod-both OR iv_result = lcl_diff=>c_diff-update. - ev_lattr = ' class="diff_upd"'. "#EC NOTEXT - ev_rattr = ' class="diff_upd"'. "#EC NOTEXT - ELSEIF iv_mod = c_mod-local. " Changed locally - CASE iv_result. - WHEN lcl_diff=>c_diff-insert. - ev_lattr = ' class="diff_ins"'. "#EC NOTEXT - WHEN lcl_diff=>c_diff-delete. - ev_rattr = ' class="diff_del"'. "#EC NOTEXT - ENDCASE. - ELSEIF iv_mod = c_mod-remote. " Changed remotely - invert sides - CASE iv_result. - WHEN lcl_diff=>c_diff-insert. - ev_rattr = ' class="diff_ins"'. "#EC NOTEXT - WHEN lcl_diff=>c_diff-delete. - ev_lattr = ' class="diff_del"'. "#EC NOTEXT - ENDCASE. - ENDIF. + ENDMETHOD. "render_lines - ENDMETHOD. " get_line_hl. + METHOD render_line_split. - METHOD lif_gui_page~render. - - DATA ls_diff_file LIKE LINE OF mt_diff_files. + DATA: lv_new TYPE string, + lv_old TYPE string, + lv_mark TYPE string, + lv_bg TYPE string. CREATE OBJECT ro_html. - ro_html->add( header( ) ). - ro_html->add( title( 'DIFF' ) ). + " New line + lv_mark = ` `. + IF iv_fstate = c_fstate-both OR is_diff_line-result = lcl_diff=>c_diff-update. + lv_bg = ' diff_upd'. + lv_mark = `~`. + ELSEIF is_diff_line-result = lcl_diff=>c_diff-insert. + lv_bg = ' diff_ins'. + lv_mark = `+`. + ENDIF. + lv_new = || + && |{ lv_mark }{ is_diff_line-new }|. - LOOP AT mt_diff_files INTO ls_diff_file. - lcl_progress=>show( iv_key = 'Diff' - iv_current = sy-tabix - iv_total = lines( mt_diff_files ) - iv_text = |Render Diff - { ls_diff_file-filename }| ). + " Old line + CLEAR lv_bg. + lv_mark = ` `. + IF iv_fstate = c_fstate-both OR is_diff_line-result = lcl_diff=>c_diff-update. + lv_bg = ' diff_upd'. + lv_mark = `~`. + ELSEIF is_diff_line-result = lcl_diff=>c_diff-delete. + lv_bg = ' diff_del'. + lv_mark = `-`. + ENDIF. + lv_old = || + && |{ lv_mark }{ is_diff_line-old }|. - ro_html->add( render_diff( ls_diff_file ) ). - ENDLOOP. + " render line, inverse sides if remote is newer + ro_html->add( '' ). "#EC NOTEXT + IF iv_fstate = c_fstate-remote. " Remote file leading changes + ro_html->add( lv_old ). " local + ro_html->add( lv_new ). " remote + ELSE. " Local leading changes or both were modified + ro_html->add( lv_new ). " local + ro_html->add( lv_old ). " remote + ENDIF. + ro_html->add( '' ). "#EC NOTEXT - ro_html->add( footer( ) ). + ENDMETHOD. "render_line_split - ENDMETHOD. + METHOD render_line_unified. -ENDCLASS. "lcl_gui_page_diff \ No newline at end of file + DATA lv_line TYPE string. + + FIELD-SYMBOLS LIKE LINE OF mt_delayed_lines. + + CREATE OBJECT ro_html. + + " Release delayed subsequent update lines + IF is_diff_line-result <> lcl_diff=>c_diff-update. + LOOP AT mt_delayed_lines ASSIGNING . + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( || + && || + && |-{ -old }| ). + ro_html->add( '' ). "#EC NOTEXT + ENDLOOP. + LOOP AT mt_delayed_lines ASSIGNING . + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( || + && || + && |+{ -new }| ). + ro_html->add( '' ). "#EC NOTEXT + ENDLOOP. + CLEAR mt_delayed_lines. + ENDIF. + + ro_html->add( '' ). "#EC NOTEXT + CASE is_diff_line-result. + WHEN lcl_diff=>c_diff-update. + APPEND is_diff_line TO mt_delayed_lines. " Delay output of subsequent updates + WHEN lcl_diff=>c_diff-insert. + ro_html->add( || + && || + && |+{ is_diff_line-new }| ). + WHEN lcl_diff=>c_diff-delete. + ro_html->add( || + && || + && |-{ is_diff_line-old }| ). + WHEN OTHERS. "none + ro_html->add( || + && || + && | { is_diff_line-old }| ). + ENDCASE. + ro_html->add( '' ). "#EC NOTEXT + + ENDMETHOD. "render_line_unified + +ENDCLASS. "lcl_gui_page_diff diff --git a/src/zabapgit_page_diff.prog.xml b/src/zabapgit_page_diff.prog.xml index c4a21410c..ddcc8fbd9 100644 --- a/src/zabapgit_page_diff.prog.xml +++ b/src/zabapgit_page_diff.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_PAGE_DIFF A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_PAGE_DIFF 26 - diff --git a/src/zabapgit_page_explore.prog.abap b/src/zabapgit_page_explore.prog.abap index eab5b0c95..ea5e75bcd 100644 --- a/src/zabapgit_page_explore.prog.abap +++ b/src/zabapgit_page_explore.prog.abap @@ -2,19 +2,28 @@ *& Include ZABAPGIT_PAGE_EXPLORE *&---------------------------------------------------------------------* -CLASS lcl_gui_page_explore DEFINITION FINAL INHERITING FROM lcl_gui_page_super. +CLASS lcl_gui_page_explore DEFINITION FINAL INHERITING FROM lcl_gui_page. PUBLIC SECTION. - METHODS lif_gui_page~render REDEFINITION. + + CONSTANTS c_explore_url TYPE string + VALUE 'http://larshp.github.io/abapGit/explore.html'. + + METHODS constructor. + + PROTECTED SECTION. + METHODS render_content REDEFINITION. ENDCLASS. "lcl_gui_page_explore DEFINITION CLASS lcl_gui_page_explore IMPLEMENTATION. - METHOD lif_gui_page~render. + METHOD constructor. + super->constructor( ). + ms_control-redirect_url = c_explore_url. + ENDMETHOD. "constructor - CREATE OBJECT ro_html. - ro_html->add( redirect( 'http://larshp.github.io/abapGit/explore.html' ) ). + METHOD render_content. + ASSERT 1 = 1. " Dummy + ENDMETHOD. "render_content. - ENDMETHOD. - -ENDCLASS. "lcl_gui_page_explore IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_gui_page_explore IMPLEMENTATION diff --git a/src/zabapgit_page_explore.prog.xml b/src/zabapgit_page_explore.prog.xml index e1a90a7d3..cfedbf9a9 100644 --- a/src/zabapgit_page_explore.prog.xml +++ b/src/zabapgit_page_explore.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_PAGE_EXPLORE A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_PAGE_EXPLORE 29 - diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index 7ab201350..63adfaad4 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -2,15 +2,17 @@ *& Include ZABAPGIT_PAGE_MAIN *&---------------------------------------------------------------------* -CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super. +CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page. PUBLIC SECTION. METHODS: constructor RAISING lcx_exception, - lif_gui_page~render REDEFINITION, lif_gui_page~on_event REDEFINITION. + PROTECTED SECTION. + METHODS render_content REDEFINITION. + PRIVATE SECTION. CONSTANTS: BEGIN OF c_actions, show TYPE string VALUE 'show' ##NO_TEXT, @@ -27,16 +29,13 @@ CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super. RAISING lcx_exception, render_toc IMPORTING it_repo_list TYPE lcl_repo_srv=>ty_repo_tt - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + RETURNING VALUE(ro_html) TYPE REF TO lcl_html RAISING lcx_exception, build_main_menu RETURNING VALUE(ro_menu) TYPE REF TO lcl_html_toolbar, - render_explore - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper - RAISING lcx_exception, render_repo IMPORTING io_repo TYPE REF TO lcl_repo - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + RETURNING VALUE(ro_html) TYPE REF TO lcl_html RAISING lcx_exception. ENDCLASS. @@ -46,6 +45,8 @@ CLASS lcl_gui_page_main IMPLEMENTATION. METHOD constructor. super->constructor( ). + ms_control-page_title = 'HOME'. + ms_control-page_menu = build_main_menu( ). ENDMETHOD. " constructor METHOD lif_gui_page~on_event. @@ -112,7 +113,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. * RENDERING ********************************************************************** - METHOD lif_gui_page~render. + METHOD render_content. DATA: lt_repos TYPE lcl_repo_srv=>ty_repo_tt, lx_error TYPE REF TO lcx_exception, @@ -123,33 +124,24 @@ CLASS lcl_gui_page_main IMPLEMENTATION. CREATE OBJECT ro_html. - ro_html->add( header( ) ). - ro_html->add( title( iv_title = 'HOME' - io_menu = build_main_menu( ) ) ). - TRY. lt_repos = lcl_app=>repo_srv( )->list( ). CATCH lcx_exception INTO lx_error. - ro_html->add( render_error( lx_error ) ). + ro_html->add( lcl_gui_chunk_lib=>render_error( ix_error = lx_error ) ). + RETURN. ENDTRY. ro_html->add( render_toc( lt_repos ) ). - IF lines( lt_repos ) = 0 AND lx_error IS INITIAL. - ro_html->add( render_explore( ) ). + IF mv_show IS INITIAL OR lines( lt_repos ) = 0. + CREATE OBJECT lo_tutorial. + ro_html->add( lo_tutorial->render( ) ). ELSE. - IF mv_show IS INITIAL. - CREATE OBJECT lo_tutorial. - ro_html->add( lo_tutorial->lif_gui_page~render( ) ). - ELSE. - lo_repo = lcl_app=>repo_srv( )->get( mv_show ). - ro_html->add( render_repo( lo_repo ) ). - ENDIF. + lo_repo = lcl_app=>repo_srv( )->get( mv_show ). + ro_html->add( render_repo( lo_repo ) ). ENDIF. - ro_html->add( footer( ) ). - - ENDMETHOD. "render + ENDMETHOD. "render_content METHOD retrieve_active_repo. @@ -237,7 +229,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. LOOP AT it_repo_list INTO lo_repo. lv_key = lo_repo->get_key( ). IF lv_key = mv_show. - lv_opt = gc_html_opt-emphas. + lv_opt = gc_html_opt-strong. ELSE. CLEAR lv_opt. ENDIF. @@ -258,9 +250,9 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ENDIF. IF lo_repo->is_offline( ) = abap_true. - lv_icon = ''. + lv_icon = 'plug/darkgrey'. ELSE. - lv_icon = ''. + lv_icon = 'cloud-upload/blue'. ENDIF. lo_allbar->add( iv_txt = lv_repo_title @@ -281,22 +273,24 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ********************************************************************** - ro_html->add( '' ). - ro_html->add( '' ). + ro_html->add( '
' ). + ro_html->add( || ). - ro_html->add( '' ). ro_html->add( '
{ + lcl_html=>icon( iv_name = 'star/blue' iv_alt = 'Favs' iv_hint = 'Favorites' ) + }' ). " Maximize width + ro_html->add( '' ). " Maximize width IF lo_favbar->count( ) > 0. ro_html->add( lo_favbar->render( iv_sort = abap_true ) ). ELSE. - ro_html->add( `No favorites so far. For more info please check ` ). - ro_html->add_anchor( iv_txt = 'tutorial' iv_act = gc_action-go_tutorial ). - ro_html->add( '' ). + ro_html->add( |No favorites so far. For more info please check { + lcl_html=>a( iv_txt = 'tutorial' iv_act = gc_action-go_tutorial ) + }| ). ENDIF. ro_html->add( '' ). ro_html->add( lo_allbar->render( - iv_as_droplist_with_label = '' + iv_as_droplist_with_label = lcl_html=>icon( iv_name = 'three-bars/blue' iv_class = 'pad4px' ) iv_sort = abap_true iv_with_icons = abap_true iv_add_minizone = abap_true ) ). @@ -311,31 +305,16 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ENDMETHOD. "render_toc - METHOD render_explore. - - DATA lo_toolbar TYPE REF TO lcl_html_toolbar. - - CREATE OBJECT ro_html. - CREATE OBJECT lo_toolbar. - - lo_toolbar->add( iv_txt = 'Explore new projects' - iv_act = gc_action-go_explore ) ##NO_TEXT. - - ro_html->add( '
' ). - ro_html->add( lo_toolbar->render( ) ). - ro_html->add( '
' ). - - ENDMETHOD. "render_explore - METHOD render_repo. CREATE OBJECT ro_html. ro_html->add( |
| ). - ro_html->add( render_repo_top( io_repo = io_repo iv_interactive_branch = abap_true ) ). - ro_html->add( mo_repo_content->lif_gui_page~render( ) ). + ro_html->add( lcl_gui_chunk_lib=>render_repo_top( io_repo = io_repo + iv_interactive_branch = abap_true ) ). + ro_html->add( mo_repo_content->render( ) ). ro_html->add( '
' ). ENDMETHOD. "render_repo -ENDCLASS. \ No newline at end of file +ENDCLASS. diff --git a/src/zabapgit_page_main.prog.xml b/src/zabapgit_page_main.prog.xml index 3ac53fc8d..f677a3ae3 100644 --- a/src/zabapgit_page_main.prog.xml +++ b/src/zabapgit_page_main.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_PAGE_MAIN A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_PAGE_MAIN 26 - diff --git a/src/zabapgit_page_merge.prog.abap b/src/zabapgit_page_merge.prog.abap index c415d02eb..f55542f18 100644 --- a/src/zabapgit_page_merge.prog.abap +++ b/src/zabapgit_page_merge.prog.abap @@ -315,7 +315,7 @@ ENDCLASS. ********************************* -CLASS lcl_gui_page_merge DEFINITION FINAL INHERITING FROM lcl_gui_page_super. +CLASS lcl_gui_page_merge DEFINITION FINAL INHERITING FROM lcl_gui_page. PUBLIC SECTION. METHODS: @@ -324,8 +324,10 @@ CLASS lcl_gui_page_merge DEFINITION FINAL INHERITING FROM lcl_gui_page_super. iv_source TYPE string iv_target TYPE string RAISING lcx_exception, - lif_gui_page~on_event REDEFINITION, - lif_gui_page~render REDEFINITION. + lif_gui_page~on_event REDEFINITION. + + PROTECTED SECTION. + METHODS render_content REDEFINITION. PRIVATE SECTION. DATA: mo_repo TYPE REF TO lcl_repo_online, @@ -346,6 +348,8 @@ CLASS lcl_gui_page_merge IMPLEMENTATION. METHOD constructor. super->constructor( ). + ms_control-page_title = 'MERGE'. + ms_control-page_menu = build_menu( ). mo_repo = io_repo. @@ -381,7 +385,7 @@ CLASS lcl_gui_page_merge IMPLEMENTATION. ENDMETHOD. - METHOD lif_gui_page~render. + METHOD render_content. DEFINE _show_file. READ TABLE &1 ASSIGNING @@ -410,10 +414,8 @@ CLASS lcl_gui_page_merge IMPLEMENTATION. CREATE OBJECT ro_html. - ro_html->add( header( ) ). - ro_html->add( title( iv_title = 'MERGE' io_menu = build_menu( ) ) ). ro_html->add( '
' ). - ro_html->add( render_repo_top( + ro_html->add( lcl_gui_chunk_lib=>render_repo_top( io_repo = mo_repo iv_show_package = abap_false iv_show_branch = abap_false ) ). @@ -473,8 +475,7 @@ CLASS lcl_gui_page_merge IMPLEMENTATION. ro_html->add( ms_merge-conflict ). ro_html->add( '' ). ro_html->add( '
' ). - ro_html->add( footer( ) ). - ENDMETHOD. + ENDMETHOD. "render_content -ENDCLASS. \ No newline at end of file +ENDCLASS. diff --git a/src/zabapgit_page_merge.prog.xml b/src/zabapgit_page_merge.prog.xml index 8643e362b..a08ecbcba 100644 --- a/src/zabapgit_page_merge.prog.xml +++ b/src/zabapgit_page_merge.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_PAGE_MERGE A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_PAGE_MERGE 27 - diff --git a/src/zabapgit_page_settings.prog.abap b/src/zabapgit_page_settings.prog.abap index 4f11a9d5c..075ecedc6 100644 --- a/src/zabapgit_page_settings.prog.abap +++ b/src/zabapgit_page_settings.prog.abap @@ -2,17 +2,20 @@ *& Include ZABAPGIT_PAGE_SETTINGS *&---------------------------------------------------------------------* -CLASS lcl_gui_page_settings DEFINITION FINAL INHERITING FROM lcl_gui_page_super. +CLASS lcl_gui_page_settings DEFINITION FINAL INHERITING FROM lcl_gui_page. PUBLIC SECTION. - - METHODS lif_gui_page~render REDEFINITION. - METHODS lif_gui_page~on_event REDEFINITION. CONSTANTS: BEGIN OF c_action, save_settings TYPE string VALUE 'save_settings', END OF c_action. + METHODS constructor. + METHODS lif_gui_page~on_event REDEFINITION. + + PROTECTED SECTION. + METHODS render_content REDEFINITION. + PRIVATE SECTION. DATA: @@ -20,13 +23,15 @@ CLASS lcl_gui_page_settings DEFINITION FINAL INHERITING FROM lcl_gui_page_super. mv_error TYPE abap_bool. METHODS render_proxy - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. METHODS render_development_internals - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. METHODS render_form_begin - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. METHODS render_form_end - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. + METHODS render_max_lines + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. METHODS build_settings IMPORTING it_post_fields TYPE tihttpnvp. @@ -45,24 +50,26 @@ ENDCLASS. CLASS lcl_gui_page_settings IMPLEMENTATION. - METHOD lif_gui_page~render. + METHOD constructor. + super->constructor( ). + ms_control-page_title = 'SETTINGS'. + ENDMETHOD. " constructor. + + METHOD render_content. CREATE OBJECT ro_html. read_settings( ). - ro_html->add( header( ) ). - ro_html->add( title( 'Settings' ) ). - ro_html->add( render_form_begin( ) ). ro_html->add( render_proxy( ) ). ro_html->add( |
| ). ro_html->add( render_development_internals( ) ). + ro_html->add( |
| ). + ro_html->add( render_max_lines( ) ). ro_html->add( render_form_end( ) ). - ro_html->add( footer( ) ). - - ENDMETHOD. + ENDMETHOD. "render_content METHOD render_proxy. @@ -107,7 +114,8 @@ CLASS lcl_gui_page_settings IMPLEMENTATION. METHOD build_settings. - DATA ls_post_field TYPE ihttpnvp. + DATA: ls_post_field TYPE ihttpnvp, + lv_max_lines_as_integer TYPE i. CREATE OBJECT mo_settings. READ TABLE it_post_fields INTO ls_post_field WITH KEY name = 'proxy_url'. @@ -129,6 +137,14 @@ CLASS lcl_gui_page_settings IMPLEMENTATION. mo_settings->set_run_critical_tests( abap_false ). ENDIF. + READ TABLE it_post_fields INTO ls_post_field WITH KEY name = 'max_lines'. + IF sy-subrc = 0. + lv_max_lines_as_integer = ls_post_field-value. + mo_settings->set_max_lines( lv_max_lines_as_integer ). + ELSE. + mo_settings->set_max_lines( 0 ). + ENDIF. + ENDMETHOD. @@ -206,4 +222,15 @@ CLASS lcl_gui_page_settings IMPLEMENTATION. ENDMETHOD. -ENDCLASS. \ No newline at end of file + METHOD render_max_lines. + CREATE OBJECT ro_html. + + ro_html->add( |

List size

| ). + ro_html->add( || ). + ro_html->add( |
| ). + ro_html->add( `` ). + ro_html->add( |
| ). + ro_html->add( |
| ). + ENDMETHOD. + +ENDCLASS. diff --git a/src/zabapgit_page_settings.prog.xml b/src/zabapgit_page_settings.prog.xml index 8506d80c5..31a798767 100644 --- a/src/zabapgit_page_settings.prog.xml +++ b/src/zabapgit_page_settings.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_PAGE_SETTINGS A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_PAGE_SETTINGS 30 - diff --git a/src/zabapgit_page_stage.prog.abap b/src/zabapgit_page_stage.prog.abap index 9c1893be2..60b221c70 100644 --- a/src/zabapgit_page_stage.prog.abap +++ b/src/zabapgit_page_stage.prog.abap @@ -2,7 +2,7 @@ *& Include ZABAPGIT_PAGE_STAGE *&---------------------------------------------------------------------* -CLASS lcl_gui_page_stage DEFINITION FINAL INHERITING FROM lcl_gui_page_super. +CLASS lcl_gui_page_stage DEFINITION FINAL INHERITING FROM lcl_gui_page. PUBLIC SECTION. CONSTANTS: BEGIN OF c_action, @@ -12,11 +12,16 @@ CLASS lcl_gui_page_stage DEFINITION FINAL INHERITING FROM lcl_gui_page_super. METHODS: constructor - IMPORTING io_repo TYPE REF TO lcl_repo_online + IMPORTING + io_repo TYPE REF TO lcl_repo_online RAISING lcx_exception, - lif_gui_page~render REDEFINITION, lif_gui_page~on_event REDEFINITION. + PROTECTED SECTION. + METHODS: + render_content REDEFINITION, + scripts REDEFINITION. + PRIVATE SECTION. DATA: mo_repo TYPE REF TO lcl_repo_online, ms_files TYPE ty_stage_files, @@ -25,15 +30,16 @@ CLASS lcl_gui_page_stage DEFINITION FINAL INHERITING FROM lcl_gui_page_super. METHODS: render_list - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper, + RETURNING VALUE(ro_html) TYPE REF TO lcl_html, render_file IMPORTING is_file TYPE ty_file iv_context TYPE string - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper, + RETURNING VALUE(ro_html) TYPE REF TO lcl_html, render_menu - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper, - scripts - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html, + read_last_changed_by + IMPORTING is_file TYPE ty_file + RETURNING VALUE(rv_user) TYPE xubname. METHODS process_stage_list IMPORTING it_postdata TYPE cnht_post_data_tab @@ -46,6 +52,7 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. METHOD constructor. super->constructor( ). + ms_control-page_title = 'STAGE'. mo_repo = io_repo. ms_files = lcl_stage_logic=>get( mo_repo ). @@ -63,7 +70,6 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF ms_files-local. - CASE iv_action. WHEN c_action-stage_all. mo_stage->reset_all( ). @@ -109,7 +115,6 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. lcl_path=>split_file_location( EXPORTING iv_fullpath = -name IMPORTING ev_path = ls_file-path ev_filename = ls_file-filename ). - CASE -value. WHEN lcl_stage=>c_method-add. READ TABLE ms_files-local ASSIGNING @@ -139,7 +144,6 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF ms_files-remote, LIKE LINE OF ms_files-local. - CREATE OBJECT ro_html. ro_html->add( '' ). @@ -148,12 +152,15 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. LOOP AT ms_files-local ASSIGNING . AT FIRST. ro_html->add(''). - ro_html->add('' ). + ro_html->add(''). + ro_html->add(''). + ro_html->add(''). + ro_html->add(''). ro_html->add(''). ENDAT. @@ -186,7 +193,8 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. METHOD render_file. - DATA lv_param TYPE string. + DATA: lv_param TYPE string, + lv_user TYPE xubname. CREATE OBJECT ro_html. @@ -200,8 +208,11 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. ig_file = is_file ). ro_html->add( '' ). ro_html->add( '' ). + + lv_user = read_last_changed_by( is_file ). + ro_html->add( | | ). WHEN 'remote'. ro_html->add( '' ). ro_html->add( || ). @@ -211,38 +222,33 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. ENDMETHOD. "render_file - METHOD lif_gui_page~render. + METHOD render_content. CREATE OBJECT ro_html. - ro_html->add( header( ) ). - ro_html->add( title( 'STAGE' ) ). - ro_html->add( '
' ). - ro_html->add( render_repo_top( mo_repo ) ). + ro_html->add( lcl_gui_chunk_lib=>render_repo_top( mo_repo ) ). ro_html->add( render_menu( ) ). ro_html->add( render_list( ) ). ro_html->add( '
' ). - ro_html->add( footer( scripts( ) ) ). - - ENDMETHOD. "lif_gui_page~render + ENDMETHOD. "render_content METHOD render_menu. CREATE OBJECT ro_html. ro_html->add( '
' ). - ro_html->add_anchor( iv_act = 'gHelper.submit();' - iv_typ = gc_action_type-onclick - iv_id = 'act_commit' - iv_style = 'display: none' - iv_txt = 'Commit' - iv_opt = gc_html_opt-emphas ) ##NO_TEXT. + ro_html->add_a( iv_act = 'gHelper.submit();' + iv_typ = gc_action_type-onclick + iv_id = 'act_commit' + iv_style = 'display: none' + iv_txt = 'Commit' + iv_opt = gc_html_opt-strong ) ##NO_TEXT. IF lines( ms_files-local ) > 0. - ro_html->add_anchor( iv_act = |{ c_action-stage_all }| - iv_id = 'act_commit_all' - iv_txt = 'Add all and commit') ##NO_TEXT. + ro_html->add_a( iv_act = |{ c_action-stage_all }| + iv_id = 'act_commit_all' + iv_txt = 'Add all and commit') ##NO_TEXT. ENDIF. ro_html->add( '
' ). @@ -263,4 +269,16 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. ENDMETHOD. "scripts -ENDCLASS. \ No newline at end of file + METHOD read_last_changed_by. + DATA: ls_local_file TYPE ty_file_item. + TRY. + READ TABLE mo_repo->get_files_local( ) INTO ls_local_file WITH KEY file = is_file. + IF sy-subrc = 0. + rv_user = lcl_objects=>changed_by( ls_local_file-item ). + ENDIF. + CATCH lcx_exception. + CLEAR rv_user. "Should not raise errors if user last changed by was not found + ENDTRY. + ENDMETHOD. + +ENDCLASS. diff --git a/src/zabapgit_page_stage.prog.xml b/src/zabapgit_page_stage.prog.xml index 4c5081d0c..39f1bd3dc 100644 --- a/src/zabapgit_page_stage.prog.xml +++ b/src/zabapgit_page_stage.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_PAGE_STAGE A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_PAGE_STAGE 27 - diff --git a/src/zabapgit_password_dialog.prog.abap b/src/zabapgit_password_dialog.prog.abap index 896d94e0a..354f0d44d 100644 --- a/src/zabapgit_password_dialog.prog.abap +++ b/src/zabapgit_password_dialog.prog.abap @@ -128,4 +128,4 @@ CLASS lcl_password_dialog IMPLEMENTATION. ENDMETHOD. "on_screen_event -ENDCLASS. " lcl_password_dialog IMPLEMENTATION \ No newline at end of file +ENDCLASS. " lcl_password_dialog IMPLEMENTATION diff --git a/src/zabapgit_password_dialog.prog.xml b/src/zabapgit_password_dialog.prog.xml index bbc81505b..6792ff817 100644 --- a/src/zabapgit_password_dialog.prog.xml +++ b/src/zabapgit_password_dialog.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_PASSWORD_DIALOG A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Password dialog and selection screen 36 - diff --git a/src/zabapgit_persistence.prog.abap b/src/zabapgit_persistence.prog.abap index dfd246b72..18e27bca7 100644 --- a/src/zabapgit_persistence.prog.abap +++ b/src/zabapgit_persistence.prog.abap @@ -1,4 +1,4 @@ -*&---------------------------- +*&---------------------------------------------------------------------* *& Include ZABAPGIT_PERSISTENCE *&---------------------------------------------------------------------* @@ -81,8 +81,9 @@ CLASS lcl_persistence_db DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. RAISING lcx_exception. PRIVATE SECTION. - METHODS: validate_xml - IMPORTING iv_xml TYPE string + METHODS: validate_and_unprettify_xml + IMPORTING iv_xml TYPE string + RETURNING VALUE(rv_xml) TYPE string RAISING lcx_exception. ENDCLASS. @@ -98,20 +99,21 @@ CLASS lcl_persistence_repo DEFINITION FINAL. TYPES: ty_local_checksum_tt TYPE STANDARD TABLE OF ty_local_checksum WITH DEFAULT KEY. TYPES: BEGIN OF ty_repo_xml, - url TYPE string, - branch_name TYPE string, - sha1 TYPE ty_sha1, - package TYPE devclass, - offline TYPE sap_bool, - local_checksums TYPE ty_local_checksum_tt, - master_language TYPE spras, - head_branch TYPE string, " HEAD symref of the repo, master branch - write_protect TYPE sap_bool, " Deny destructive ops: pull, switch branch ... + url TYPE string, + branch_name TYPE string, + sha1 TYPE ty_sha1, + package TYPE devclass, + offline TYPE sap_bool, + local_checksums TYPE ty_local_checksum_tt, + master_language TYPE spras, + head_branch TYPE string, " HEAD symref of the repo, master branch + write_protect TYPE sap_bool, " Deny destructive ops: pull, switch branch ... + ignore_subpackages TYPE sap_bool, END OF ty_repo_xml. TYPES: BEGIN OF ty_repo, key TYPE lcl_persistence_db=>ty_value. - INCLUDE TYPE ty_repo_xml. + INCLUDE TYPE ty_repo_xml. TYPES: END OF ty_repo. TYPES: tt_repo TYPE STANDARD TABLE OF ty_repo WITH DEFAULT KEY. TYPES: tt_repo_keys TYPE STANDARD TABLE OF ty_repo-key WITH DEFAULT KEY. @@ -222,7 +224,7 @@ CLASS lcl_persistence_background DEFINITION FINAL. TYPES: BEGIN OF ty_background, key TYPE lcl_persistence_db=>ty_value. - INCLUDE TYPE ty_xml. + INCLUDE TYPE ty_xml. TYPES: END OF ty_background. TYPES: tt_background TYPE STANDARD TABLE OF ty_background WITH DEFAULT KEY. @@ -422,6 +424,14 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. RETURNING VALUE(rv_changes_only) TYPE abap_bool RAISING lcx_exception. + METHODS toggle_diff_unified + RETURNING VALUE(rv_diff_unified) TYPE abap_bool + RAISING lcx_exception. + + METHODS get_diff_unified + RETURNING VALUE(rv_diff_unified) TYPE abap_bool + RAISING lcx_exception. + METHODS get_favorites RETURNING VALUE(rt_favorites) TYPE tt_favorites RAISING lcx_exception. @@ -454,6 +464,7 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. repo_config TYPE ty_repo_config_tt, hide_files TYPE abap_bool, changes_only TYPE abap_bool, + diff_unified TYPE abap_bool, favorites TYPE tt_favorites, END OF ty_user. @@ -698,6 +709,24 @@ CLASS lcl_persistence_user IMPLEMENTATION. ENDMETHOD. "get_changes_only + METHOD toggle_diff_unified. + + DATA ls_user TYPE ty_user. + + ls_user = read( ). + ls_user-diff_unified = boolc( ls_user-diff_unified = abap_false ). + update( ls_user ). + + rv_diff_unified = ls_user-diff_unified. + + ENDMETHOD. "toggle_diff_unified + + METHOD get_diff_unified. + + rv_diff_unified = read( )-diff_unified. + + ENDMETHOD. "get_diff_unified + METHOD get_favorites. rt_favorites = read( )-favorites. @@ -804,29 +833,32 @@ CLASS lcl_persistence_db IMPLEMENTATION. ENDMETHOD. - METHOD validate_xml. + METHOD validate_and_unprettify_xml. - lcl_xml_pretty=>print( + rv_xml = lcl_xml_pretty=>print( iv_xml = iv_xml + iv_unpretty = abap_true iv_ignore_errors = abap_false ). - ENDMETHOD. + ENDMETHOD. " validate_and_unprettify_xml METHOD update. - validate_xml( iv_data ). + DATA lv_data LIKE iv_data. + + lv_data = validate_and_unprettify_xml( iv_data ). lock( iv_type = iv_type iv_value = iv_value ). - UPDATE (c_tabname) SET data_str = iv_data - WHERE type = iv_type - AND value = iv_value. + UPDATE (c_tabname) SET data_str = lv_data + WHERE type = iv_type + AND value = iv_value. IF sy-subrc <> 0. lcx_exception=>raise( 'DB update failed' ). ENDIF. - ENDMETHOD. + ENDMETHOD. "update METHOD modify. @@ -1321,7 +1353,8 @@ CLASS lcl_persistence_migrate IMPLEMENTATION. METHOD table_create. - DATA: lv_obj_name TYPE tadir-obj_name, + DATA: lv_rc LIKE sy-subrc, + lv_obj_name TYPE tadir-obj_name, ls_dd02v TYPE dd02v, ls_dd09l TYPE dd09l, lt_dd03p TYPE STANDARD TABLE OF dd03p WITH DEFAULT KEY. @@ -1399,11 +1432,14 @@ CLASS lcl_persistence_migrate IMPLEMENTATION. CALL FUNCTION 'DDIF_TABL_ACTIVATE' EXPORTING name = lcl_persistence_db=>c_tabname + auth_chk = abap_false + IMPORTING + rc = lv_rc EXCEPTIONS not_found = 1 put_failure = 2 OTHERS = 3. - IF sy-subrc <> 0. + IF sy-subrc <> 0 OR lv_rc <> 0. lcx_exception=>raise( 'migrate, error from DDIF_TABL_ACTIVATE' ). ENDIF. @@ -1432,13 +1468,17 @@ CLASS lcl_settings DEFINITION FINAL. METHODS get_run_critical_tests RETURNING VALUE(rv_run) TYPE abap_bool. - PROTECTED SECTION. + METHODS set_max_lines + IMPORTING iv_lines TYPE i. + METHODS get_max_lines + RETURNING + VALUE(rv_lines) TYPE i. PRIVATE SECTION. DATA mv_proxy_url TYPE string. DATA mv_proxy_port TYPE string. DATA mv_run_critical_tests TYPE abap_bool. - + DATA mv_lines TYPE i. ENDCLASS. @@ -1469,6 +1509,14 @@ CLASS lcl_settings IMPLEMENTATION. rv_run = mv_run_critical_tests. ENDMETHOD. + METHOD get_max_lines. + rv_lines = mv_lines. + ENDMETHOD. + + METHOD set_max_lines. + mv_lines = iv_lines. + ENDMETHOD. + ENDCLASS. @@ -1484,10 +1532,6 @@ CLASS lcl_persistence_settings DEFINITION FINAL. RETURNING VALUE(ro_settings) TYPE REF TO lcl_settings. - PROTECTED SECTION. - - PRIVATE SECTION. - ENDCLASS. CLASS lcl_persistence_settings IMPLEMENTATION. @@ -1508,20 +1552,27 @@ CLASS lcl_persistence_settings IMPLEMENTATION. iv_type = 'SETTINGS' iv_value = 'CRIT_TESTS' iv_data = io_settings->get_run_critical_tests( ) ). + + lcl_app=>db( )->modify( + iv_type = 'SETTINGS' + iv_value = 'MAX_LINES' + iv_data = |{ io_settings->get_max_lines( ) }| ). + ENDMETHOD. METHOD read. DATA: lv_critical_tests_as_string TYPE string, - lv_critical_tests_as_boolean TYPE abap_bool. + lv_critical_tests_as_boolean TYPE abap_bool, + lv_max_lines_as_string TYPE string, + lv_max_lines_as_integer TYPE i. CREATE OBJECT ro_settings. TRY. ro_settings->set_proxy_url( lcl_app=>db( )->read( iv_type = 'SETTINGS' - iv_value = 'PROXY_URL' - ) ). + iv_value = 'PROXY_URL' ) ). CATCH lcx_not_found. ro_settings->set_proxy_url( '' ). ENDTRY. @@ -1529,8 +1580,7 @@ CLASS lcl_persistence_settings IMPLEMENTATION. ro_settings->set_proxy_port( lcl_app=>db( )->read( iv_type = 'SETTINGS' - iv_value = 'PROXY_PORT' - ) ). + iv_value = 'PROXY_PORT' ) ). CATCH lcx_not_found. ro_settings->set_proxy_port( '' ). ENDTRY. @@ -1543,6 +1593,15 @@ CLASS lcl_persistence_settings IMPLEMENTATION. CATCH lcx_not_found. ro_settings->set_run_critical_tests( abap_false ). ENDTRY. + TRY. + lv_max_lines_as_string = lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'MAX_LINES' ). + lv_max_lines_as_integer = lv_max_lines_as_string. + ro_settings->set_max_lines( lv_max_lines_as_integer ). + CATCH lcx_not_found. + ro_settings->set_max_lines( 500 ). " default + ENDTRY. ENDMETHOD. -ENDCLASS. \ No newline at end of file +ENDCLASS. diff --git a/src/zabapgit_persistence.prog.xml b/src/zabapgit_persistence.prog.xml index 49f6b180a..9f6f980ea 100644 --- a/src/zabapgit_persistence.prog.xml +++ b/src/zabapgit_persistence.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_PERSISTENCE A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_PERSISTENCE 28 - diff --git a/src/zabapgit_persistence_old.prog.abap b/src/zabapgit_persistence_old.prog.abap index 78b900f2e..a30b6ae36 100644 --- a/src/zabapgit_persistence_old.prog.abap +++ b/src/zabapgit_persistence_old.prog.abap @@ -566,4 +566,4 @@ CLASS lcl_user IMPLEMENTATION. ENDMETHOD. "get_email -ENDCLASS. "lcl_user IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_user IMPLEMENTATION diff --git a/src/zabapgit_persistence_old.prog.xml b/src/zabapgit_persistence_old.prog.xml index 5204f19c3..670887559 100644 --- a/src/zabapgit_persistence_old.prog.xml +++ b/src/zabapgit_persistence_old.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_PERSISTENCE_OLD A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_PERSISTENCE_OLD 32 - diff --git a/src/zabapgit_popups.prog.abap b/src/zabapgit_popups.prog.abap index 6ee6af2f0..acf62a0b3 100644 --- a/src/zabapgit_popups.prog.abap +++ b/src/zabapgit_popups.prog.abap @@ -61,12 +61,14 @@ CLASS lcl_popups DEFINITION FINAL. RETURNING VALUE(rv_answer) TYPE char1 RAISING lcx_exception, popup_to_inform - IMPORTING - titlebar TYPE clike - text_message TYPE clike - RAISING lcx_exception. - - + IMPORTING + titlebar TYPE clike + text_message TYPE clike + RAISING lcx_exception, + popup_to_create_package + EXPORTING es_package_data TYPE scompkdtln + ev_create TYPE boolean + RAISING lcx_exception. ENDCLASS. CLASS lcl_popups IMPLEMENTATION. @@ -174,7 +176,7 @@ CLASS lcl_popups IMPLEMENTATION. CLEAR: ev_name, ev_cancel. * TAB FLD LABEL DEF ATTR - _add_dialog_fld 'TEXTL' 'LINE' 'Name' 'new_branch_name' ''. + _add_dialog_fld 'TEXTL' 'LINE' 'Name' 'new-branch-name' ''. CALL FUNCTION 'POPUP_GET_VALUES' EXPORTING @@ -195,7 +197,8 @@ CLASS lcl_popups IMPLEMENTATION. ELSE. READ TABLE lt_fields INDEX 1 ASSIGNING . ASSERT sy-subrc = 0. - ev_name = lcl_git_branch_list=>complete_heads_branch_name( -value ). + ev_name = lcl_git_branch_list=>complete_heads_branch_name( + lcl_git_branch_list=>normalize_branch_name( -value ) ). ENDIF. ENDMETHOD. @@ -240,7 +243,10 @@ CLASS lcl_popups IMPLEMENTATION. METHOD repo_new_offline. DATA: lv_returncode TYPE c, - lt_fields TYPE TABLE OF sval. + lt_fields TYPE TABLE OF sval, + lv_icon_ok TYPE icon-name, + lv_button1 TYPE svalbutton-buttontext, + lv_icon1 TYPE icon-name. FIELD-SYMBOLS: LIKE LINE OF lt_fields. @@ -249,17 +255,28 @@ CLASS lcl_popups IMPLEMENTATION. _add_dialog_fld 'ABAPTXT255' 'LINE' 'Name' '' ''. _add_dialog_fld 'TDEVC' 'DEVCLASS' 'Package' '' ''. - CALL FUNCTION 'POPUP_GET_VALUES' + lv_icon_ok = icon_okay. + lv_button1 = 'Create package' ##NO_TEXT. + lv_icon1 = icon_folder. + + CALL FUNCTION 'POPUP_GET_VALUES_USER_BUTTONS' EXPORTING - no_value_check = abap_true - popup_title = 'New Offline Project' "#EC NOTEXT + popup_title = 'New Offline Project' + programname = sy-repid + formname = 'PACKAGE_POPUP' + ok_pushbuttontext = '' + icon_ok_push = lv_icon_ok + first_pushbutton = lv_button1 + icon_button_1 = lv_icon1 + second_pushbutton = '' + icon_button_2 = '' IMPORTING - returncode = lv_returncode + returncode = lv_returncode TABLES - fields = lt_fields + fields = lt_fields EXCEPTIONS - error_in_fields = 1 - OTHERS = 2. + error_in_fields = 1 + OTHERS = 2. IF sy-subrc <> 0. lcx_exception=>raise( 'Error from POPUP_GET_VALUES' ). ENDIF. @@ -282,26 +299,58 @@ CLASS lcl_popups IMPLEMENTATION. METHOD branch_list_popup. - DATA: lo_branches TYPE REF TO lcl_git_branch_list, - lt_branches TYPE lcl_git_branch_list=>ty_git_branch_list_tt, - lv_answer TYPE c LENGTH 1, - lv_default TYPE i VALUE 1, "Default cursor position - lt_selection TYPE TABLE OF spopli. + DATA: lo_branches TYPE REF TO lcl_git_branch_list, + lt_branches TYPE lcl_git_branch_list=>ty_git_branch_list_tt, + lv_answer TYPE c LENGTH 1, + lv_default TYPE i, + lv_head_suffix TYPE string, + lv_head_symref TYPE string, + lt_selection TYPE TABLE OF spopli. FIELD-SYMBOLS: LIKE LINE OF lt_selection, LIKE LINE OF lt_branches. - lo_branches = lcl_git_transport=>branches( iv_url ). + lo_branches = lcl_git_transport=>branches( iv_url ). + lt_branches = lo_branches->get_branches_only( ). + lv_head_suffix = | ({ lcl_git_branch_list=>c_head_name })|. + lv_head_symref = lo_branches->get_head_symref( ). - lt_branches = lo_branches->get_branches_only( ). LOOP AT lt_branches ASSIGNING . - APPEND INITIAL LINE TO lt_selection ASSIGNING . - -varoption = -name. - IF iv_default_branch IS NOT INITIAL AND iv_default_branch = -name. - lv_default = sy-tabix. + CHECK -name IS NOT INITIAL. " To ensure some below ifs + + IF -is_head = abap_true. + + IF -name = lcl_git_branch_list=>c_head_name. " HEAD + IF -name <> lv_head_symref AND lv_head_symref IS NOT INITIAL. + " HEAD but other HEAD symref exists - ignore + CONTINUE. + ELSE. + INSERT INITIAL LINE INTO lt_selection INDEX 1 ASSIGNING . + -varoption = -name. + ENDIF. + ELSE. + INSERT INITIAL LINE INTO lt_selection INDEX 1 ASSIGNING . + -varoption = -display_name && lv_head_suffix. + ENDIF. + + IF lv_default > 0. " Shift down default if set + lv_default = lv_default + 1. + ENDIF. + ELSE. + APPEND INITIAL LINE TO lt_selection ASSIGNING . + -varoption = -display_name. ENDIF. + + IF -name = iv_default_branch. + IF -is_head = abap_true. + lv_default = 1. + ELSE. + lv_default = sy-tabix. + ENDIF. + ENDIF. + ENDLOOP. IF iv_show_new_option = abap_true. @@ -339,10 +388,12 @@ CLASS lcl_popups IMPLEMENTATION. IF iv_show_new_option = abap_true AND -varoption = c_new_branch_label. rs_branch-name = c_new_branch_label. ELSE. - rs_branch = lo_branches->find_by_name( -varoption ). + REPLACE FIRST OCCURRENCE OF lv_head_suffix IN -varoption WITH ''. + READ TABLE lt_branches WITH KEY display_name = -varoption ASSIGNING . + ASSERT sy-subrc = 0. + rs_branch = lo_branches->find_by_name( -name ). ENDIF. - ENDMETHOD. METHOD repo_popup. @@ -462,4 +513,29 @@ CLASS lcl_popups IMPLEMENTATION. ENDMETHOD. " popup_to_inform. -ENDCLASS. \ No newline at end of file + METHOD popup_to_create_package. + CALL FUNCTION 'FUNCTION_EXISTS' + EXPORTING + funcname = 'PB_POPUP_PACKAGE_CREATE' + EXCEPTIONS + function_not_exist = 1 + OTHERS = 2. + IF sy-subrc = 1. +* looks like the function module used does not exist on all +* versions since 702, so show an error + lcx_exception=>raise( 'Function module PB_POPUP_PACKAGE_CREATE does not exist' ). + ENDIF. + + CALL FUNCTION 'PB_POPUP_PACKAGE_CREATE' + CHANGING + p_object_data = es_package_data + EXCEPTIONS + action_cancelled = 1. + IF sy-subrc = 0. + ev_create = abap_true. + ELSE. + ev_create = abap_false. + ENDIF. + ENDMETHOD. " popup_to_create_package + +ENDCLASS. diff --git a/src/zabapgit_popups.prog.xml b/src/zabapgit_popups.prog.xml index ff7fba395..bb223be13 100644 --- a/src/zabapgit_popups.prog.xml +++ b/src/zabapgit_popups.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_POPUPS A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_POPUPS 23 - diff --git a/src/zabapgit_repo.prog.abap b/src/zabapgit_repo.prog.abap index 6d6eb40b5..a64183b00 100644 --- a/src/zabapgit_repo.prog.abap +++ b/src/zabapgit_repo.prog.abap @@ -18,6 +18,7 @@ CLASS lcl_repo DEFINITION ABSTRACT FRIENDS lcl_repo_srv. RAISING lcx_exception, get_files_local IMPORTING io_log TYPE REF TO lcl_log OPTIONAL + it_filter TYPE scts_tadir OPTIONAL RETURNING VALUE(rt_files) TYPE ty_files_item_tt RAISING lcx_exception, get_local_checksums @@ -33,6 +34,8 @@ CLASS lcl_repo DEFINITION ABSTRACT FRIENDS lcl_repo_srv. RETURNING VALUE(rv_language) TYPE spras, is_write_protected RETURNING VALUE(rv_yes) TYPE sap_bool, + ignore_subpackages + RETURNING VALUE(rv_yes) TYPE sap_bool, delete RAISING lcx_exception, get_dot_abapgit @@ -223,4 +226,4 @@ CLASS lcl_repo_srv DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. IMPORTING iv_package TYPE devclass RAISING lcx_exception. -ENDCLASS. "lcl_repo_srv DEFINITION \ No newline at end of file +ENDCLASS. "lcl_repo_srv DEFINITION diff --git a/src/zabapgit_repo.prog.xml b/src/zabapgit_repo.prog.xml index ee25763d5..928e7e911 100644 --- a/src/zabapgit_repo.prog.xml +++ b/src/zabapgit_repo.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_REPO A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_REPO 21 - diff --git a/src/zabapgit_repo_browser_util.prog.abap b/src/zabapgit_repo_browser_util.prog.abap index cfee28bed..7cab7d7e7 100644 --- a/src/zabapgit_repo_browser_util.prog.abap +++ b/src/zabapgit_repo_browser_util.prog.abap @@ -240,4 +240,4 @@ CLASS lcl_repo_content_browser IMPLEMENTATION. ENDMETHOD. "build_repo_items_online -ENDCLASS. "lcl_repo_content_browser \ No newline at end of file +ENDCLASS. "lcl_repo_content_browser diff --git a/src/zabapgit_repo_browser_util.prog.xml b/src/zabapgit_repo_browser_util.prog.xml index 53f8f567b..d70b73f28 100644 --- a/src/zabapgit_repo_browser_util.prog.xml +++ b/src/zabapgit_repo_browser_util.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_REPO_BROWSER_UTIL A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_REPO_BROWSER_UTIL 34 - diff --git a/src/zabapgit_repo_impl.prog.abap b/src/zabapgit_repo_impl.prog.abap index 4953a8fa1..292f18924 100644 --- a/src/zabapgit_repo_impl.prog.abap +++ b/src/zabapgit_repo_impl.prog.abap @@ -504,10 +504,13 @@ CLASS lcl_repo IMPLEMENTATION. DATA: lt_tadir TYPE ty_tadir_tt, ls_item TYPE ty_item, - lt_files TYPE ty_files_tt. + lt_files TYPE ty_files_tt, + lt_cache TYPE SORTED TABLE OF ty_file_item + WITH NON-UNIQUE KEY item. - DATA: lt_cache TYPE SORTED TABLE OF ty_file_item - WITH NON-UNIQUE KEY item. + DATA: lt_filter TYPE SORTED TABLE OF tadir + WITH NON-UNIQUE KEY object obj_name, + lv_filter_exist TYPE abap_bool. FIELD-SYMBOLS: LIKE LINE OF lt_files, LIKE LINE OF rt_files, @@ -532,8 +535,22 @@ CLASS lcl_repo IMPLEMENTATION. iv_data = -file-data ). lt_cache = mt_local. - lt_tadir = lcl_tadir=>read( get_package( ) ). + lt_tadir = lcl_tadir=>read( + iv_package = get_package( ) + iv_ignore_subpackages = ignore_subpackages( ) ). + + lt_filter = it_filter. + lv_filter_exist = boolc( lines( lt_filter ) > 0 ) . + LOOP AT lt_tadir ASSIGNING . + IF lv_filter_exist = abap_true. + READ TABLE lt_filter TRANSPORTING NO FIELDS WITH KEY object = -object + obj_name = -obj_name + BINARY SEARCH. + IF sy-subrc <> 0. + CONTINUE. + ENDIF. + ENDIF. lcl_progress=>show( iv_key = 'Serialize' iv_current = sy-tabix @@ -549,8 +566,9 @@ CLASS lcl_repo IMPLEMENTATION. WITH KEY item = ls_item. " type+name+package key " There is something in cache and the object is unchanged IF sy-subrc = 0 - AND abap_false = lcl_objects=>has_changed_since( is_item = ls_item - iv_timestamp = mv_last_serialization ). + AND abap_false = lcl_objects=>has_changed_since( + is_item = ls_item + iv_timestamp = mv_last_serialization ). LOOP AT lt_cache ASSIGNING WHERE item = ls_item. APPEND TO rt_files. ENDLOOP. @@ -639,17 +657,22 @@ CLASS lcl_repo IMPLEMENTATION. rv_yes = ms_data-write_protect. ENDMETHOD. "is_write_protected + METHOD ignore_subpackages. + rv_yes = ms_data-ignore_subpackages. + ENDMETHOD. + METHOD rebuild_local_checksums. "LOCAL (BASE) - DATA: lt_local TYPE ty_files_item_tt, - ls_last_item TYPE ty_item, - lt_checksums TYPE lcl_persistence_repo=>ty_local_checksum_tt. + DATA: lt_local TYPE ty_files_item_tt, + ls_last_item TYPE ty_item, + lt_checksums TYPE lcl_persistence_repo=>ty_local_checksum_tt. FIELD-SYMBOLS: LIKE LINE OF lt_checksums, LIKE LINE OF -files, LIKE LINE OF lt_local. - lt_local = get_files_local( ). + + lt_local = get_files_local( ). DELETE lt_local " Remove non-code related files except .abapgit WHERE item IS INITIAL @@ -922,4 +945,4 @@ CLASS lcl_repo_srv IMPLEMENTATION. ENDMETHOD. "switch_repo_type -ENDCLASS. "lcl_repo_srv IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_repo_srv IMPLEMENTATION diff --git a/src/zabapgit_repo_impl.prog.xml b/src/zabapgit_repo_impl.prog.xml index a1b4b53bc..eb737a7ba 100644 --- a/src/zabapgit_repo_impl.prog.xml +++ b/src/zabapgit_repo_impl.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_REPO_IMPL A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_REPO_IMPL 26 - diff --git a/src/zabapgit_sap_package.prog.abap b/src/zabapgit_sap_package.prog.abap index f9c214669..632941449 100644 --- a/src/zabapgit_sap_package.prog.abap +++ b/src/zabapgit_sap_package.prog.abap @@ -117,7 +117,8 @@ CLASS lcl_sap_package IMPLEMENTATION. SORT lt_res_sort BY obj_type ASCENDING obj_name ASCENDING. LOOP AT it_results ASSIGNING WHERE NOT obj_type IS INITIAL. - IF NOT ( -obj_type = ls_item-obj_type AND -obj_name = ls_item-obj_name ). + IF NOT ( -obj_type = ls_item-obj_type + AND -obj_name = ls_item-obj_name ). APPEND INITIAL LINE TO lt_item_idx ASSIGNING . -obj_type = -obj_type. -obj_name = -obj_name. @@ -362,4 +363,4 @@ CLASS lcl_sap_package IMPLEMENTATION. ENDMETHOD. "create -ENDCLASS. "lcl_package IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_package IMPLEMENTATION diff --git a/src/zabapgit_sap_package.prog.xml b/src/zabapgit_sap_package.prog.xml index 8b7003d0c..4cb21c124 100644 --- a/src/zabapgit_sap_package.prog.xml +++ b/src/zabapgit_sap_package.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_SAP_PACKAGE A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_SAP_PACKAGE 28 - diff --git a/src/zabapgit_services.prog.abap b/src/zabapgit_services.prog.abap index 88e26e99b..801ffd6d7 100644 --- a/src/zabapgit_services.prog.abap +++ b/src/zabapgit_services.prog.abap @@ -6,4 +6,4 @@ INCLUDE zabapgit_services_repo. INCLUDE zabapgit_services_abapgit. INCLUDE zabapgit_services_git. INCLUDE zabapgit_services_db. -INCLUDE zabapgit_services_background. \ No newline at end of file +INCLUDE zabapgit_services_background. diff --git a/src/zabapgit_services.prog.xml b/src/zabapgit_services.prog.xml index 94fd322ab..e21ee1f24 100644 --- a/src/zabapgit_services.prog.xml +++ b/src/zabapgit_services.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_SERVICES A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_SERVICES 25 - diff --git a/src/zabapgit_services_abapgit.prog.abap b/src/zabapgit_services_abapgit.prog.abap index 00e8dd053..58ecbbe21 100644 --- a/src/zabapgit_services_abapgit.prog.abap +++ b/src/zabapgit_services_abapgit.prog.abap @@ -5,12 +5,18 @@ CLASS lcl_services_abapgit DEFINITION FINAL. PUBLIC SECTION. - CONSTANTS c_abapgit_homepage TYPE string VALUE 'http://www.abapgit.org' ##NO_TEXT. - CONSTANTS c_abapgit_wikipage TYPE string VALUE 'https://github.com/larshp/abapGit/wiki'. - CONSTANTS c_package_abapgit TYPE devclass VALUE '$ABAPGIT'. - CONSTANTS c_package_plugins TYPE devclass VALUE '$ABAPGIT_PLUGINS'. - CONSTANTS c_abapgit_url TYPE string VALUE 'https://github.com/larshp/abapGit.git'. - CONSTANTS c_plugins_url TYPE string VALUE 'https://github.com/larshp/abapGit-plugins.git'. + CONSTANTS c_abapgit_homepage TYPE string + VALUE 'http://www.abapgit.org' ##NO_TEXT. + CONSTANTS c_abapgit_wikipage TYPE string + VALUE 'https://github.com/larshp/abapGit/wiki'. + CONSTANTS c_package_abapgit TYPE devclass + VALUE '$ABAPGIT'. + CONSTANTS c_package_plugins TYPE devclass + VALUE '$ABAPGIT_PLUGINS'. + CONSTANTS c_abapgit_url TYPE string + VALUE 'https://github.com/larshp/abapGit.git'. + CONSTANTS c_plugins_url TYPE string + VALUE 'https://github.com/larshp/abapGit-plugins.git'. CLASS-METHODS open_abapgit_homepage RAISING lcx_exception. @@ -172,4 +178,4 @@ CLASS lcl_services_abapgit IMPLEMENTATION. ENDMETHOD. "is_installed_pi -ENDCLASS. "lcl_services_abapgit \ No newline at end of file +ENDCLASS. "lcl_services_abapgit diff --git a/src/zabapgit_services_abapgit.prog.xml b/src/zabapgit_services_abapgit.prog.xml index 4db10411f..70ac94319 100644 --- a/src/zabapgit_services_abapgit.prog.xml +++ b/src/zabapgit_services_abapgit.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_SERVICES_ABAPGIT A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_SERVICES_ABAPGIT 33 - diff --git a/src/zabapgit_services_background.prog.abap b/src/zabapgit_services_background.prog.abap index 701f36538..4e372ddc2 100644 --- a/src/zabapgit_services_background.prog.abap +++ b/src/zabapgit_services_background.prog.abap @@ -32,4 +32,4 @@ CLASS lcl_services_background IMPLEMENTATION. ENDMETHOD. "update_task -ENDCLASS. "lcl_services_background \ No newline at end of file +ENDCLASS. "lcl_services_background diff --git a/src/zabapgit_services_background.prog.xml b/src/zabapgit_services_background.prog.xml index ac4f12b1d..1a6276ed2 100644 --- a/src/zabapgit_services_background.prog.xml +++ b/src/zabapgit_services_background.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_SERVICES_BACKGROUND A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_SERVICES_BACKGROUND 36 - diff --git a/src/zabapgit_services_db.prog.abap b/src/zabapgit_services_db.prog.abap index 502afec72..4bd7d8e24 100644 --- a/src/zabapgit_services_db.prog.abap +++ b/src/zabapgit_services_db.prog.abap @@ -32,8 +32,7 @@ CLASS lcl_services_db IMPLEMENTATION. text_button_2 = 'Cancel' icon_button_2 = 'ICON_CANCEL' default_button = '2' - display_cancel_button = abap_false - ). "#EC NOTEXT + display_cancel_button = abap_false ). "#EC NOTEXT IF lv_answer = '2'. RAISE EXCEPTION TYPE lcx_cancel. @@ -61,4 +60,4 @@ CLASS lcl_services_db IMPLEMENTATION. ENDMETHOD. "update -ENDCLASS. "lcl_services_db \ No newline at end of file +ENDCLASS. "lcl_services_db diff --git a/src/zabapgit_services_db.prog.xml b/src/zabapgit_services_db.prog.xml index 98309e91c..0ad2b046a 100644 --- a/src/zabapgit_services_db.prog.xml +++ b/src/zabapgit_services_db.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_SERVICES_DB A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_SERVICES_DB 28 - diff --git a/src/zabapgit_services_git.prog.abap b/src/zabapgit_services_git.prog.abap index cc24467b2..f64216d36 100644 --- a/src/zabapgit_services_git.prog.abap +++ b/src/zabapgit_services_git.prog.abap @@ -34,9 +34,9 @@ CLASS lcl_services_git DEFINITION FINAL. RAISING lcx_exception lcx_cancel. CLASS-METHODS commit - IMPORTING io_repo TYPE REF TO lcl_repo_online - is_commit TYPE ty_commit_fields - io_stage TYPE REF TO lcl_stage + IMPORTING io_repo TYPE REF TO lcl_repo_online + is_commit TYPE ty_commit_fields + io_stage TYPE REF TO lcl_stage RAISING lcx_exception lcx_cancel. ENDCLASS. " lcl_services_git @@ -63,8 +63,7 @@ CLASS lcl_services_git IMPLEMENTATION. text_button_2 = 'Cancel' icon_button_2 = 'ICON_CANCEL' default_button = '2' - display_cancel_button = abap_false - ). "#EC NOTEXT + display_cancel_button = abap_false ). "#EC NOTEXT IF lv_answer = '2'. RAISE EXCEPTION TYPE lcx_cancel. @@ -124,7 +123,7 @@ CLASS lcl_services_git IMPLEMENTATION. METHOD switch_branch. - DATA: lo_repo TYPE REF TO lcl_repo_online, + DATA: lo_repo TYPE REF TO lcl_repo_online, ls_branch TYPE lcl_git_branch_list=>ty_git_branch. @@ -202,7 +201,7 @@ CLASS lcl_services_git IMPLEMENTATION. ls_comment-comment = is_commit-comment. IF NOT is_commit-body IS INITIAL. - CONCATENATE ls_comment-comment is_commit-body + CONCATENATE ls_comment-comment '' is_commit-body INTO ls_comment-comment SEPARATED BY gc_newline. ENDIF. @@ -213,4 +212,4 @@ CLASS lcl_services_git IMPLEMENTATION. ENDMETHOD. "commit -ENDCLASS. " lcl_services_git \ No newline at end of file +ENDCLASS. " lcl_services_git diff --git a/src/zabapgit_services_git.prog.xml b/src/zabapgit_services_git.prog.xml index 8e5e125f7..5357b8a80 100644 --- a/src/zabapgit_services_git.prog.xml +++ b/src/zabapgit_services_git.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_SERVICES_GIT A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_SERVICES_GIT 29 - diff --git a/src/zabapgit_services_repo.prog.abap b/src/zabapgit_services_repo.prog.abap index 2c9863854..90f052424 100644 --- a/src/zabapgit_services_repo.prog.abap +++ b/src/zabapgit_services_repo.prog.abap @@ -21,7 +21,7 @@ CLASS lcl_services_repo DEFINITION FINAL. RAISING lcx_exception lcx_cancel. CLASS-METHODS new_offline - RAISING lcx_exception lcx_cancel. + RAISING lcx_exception lcx_cancel. CLASS-METHODS remote_attach IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key @@ -53,7 +53,7 @@ CLASS lcl_services_repo IMPLEMENTATION. METHOD clone. - DATA: lo_repo TYPE REF TO lcl_repo_online, + DATA: lo_repo TYPE REF TO lcl_repo_online, ls_popup TYPE lcl_popups=>ty_popup. @@ -105,8 +105,7 @@ CLASS lcl_services_repo IMPLEMENTATION. text_button_2 = 'Cancel' icon_button_2 = 'ICON_CANCEL' default_button = '2' - display_cancel_button = abap_false - ). "#EC NOTEXT + display_cancel_button = abap_false ). "#EC NOTEXT IF lv_answer = '2'. RAISE EXCEPTION TYPE lcx_cancel. @@ -149,8 +148,7 @@ CLASS lcl_services_repo IMPLEMENTATION. text_button_2 = 'Cancel' icon_button_2 = 'ICON_CANCEL' default_button = '2' - display_cancel_button = abap_false - ). "#EC NOTEXT + display_cancel_button = abap_false ). "#EC NOTEXT IF lv_answer = '2'. RAISE EXCEPTION TYPE lcx_cancel. @@ -199,8 +197,7 @@ CLASS lcl_services_repo IMPLEMENTATION. text_button_2 = 'Cancel' icon_button_2 = 'ICON_CANCEL' default_button = '2' - display_cancel_button = abap_false - ). "#EC NOTEXT + display_cancel_button = abap_false ). "#EC NOTEXT IF lv_answer = '2'. RAISE EXCEPTION TYPE lcx_cancel. @@ -215,8 +212,8 @@ CLASS lcl_services_repo IMPLEMENTATION. METHOD remote_attach. - DATA: ls_popup TYPE lcl_popups=>ty_popup, - lo_repo TYPE REF TO lcl_repo_online. + DATA: ls_popup TYPE lcl_popups=>ty_popup, + lo_repo TYPE REF TO lcl_repo_online. ls_popup = lcl_popups=>repo_popup( iv_title = 'Attach repo to remote ...' @@ -239,8 +236,8 @@ CLASS lcl_services_repo IMPLEMENTATION. METHOD remote_change. - DATA: ls_popup TYPE lcl_popups=>ty_popup, - lo_repo TYPE REF TO lcl_repo_online. + DATA: ls_popup TYPE lcl_popups=>ty_popup, + lo_repo TYPE REF TO lcl_repo_online. lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ). @@ -267,7 +264,8 @@ CLASS lcl_services_repo IMPLEMENTATION. lv_question TYPE string, lo_repo TYPE REF TO lcl_repo. - lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ). + + lo_repo = lcl_app=>repo_srv( )->get( iv_key ). lv_question = 'This will rebuild and overwrite local repo checksums.'. @@ -288,7 +286,7 @@ CLASS lcl_services_repo IMPLEMENTATION. text_button_2 = 'Cancel' icon_button_2 = 'ICON_CANCEL' default_button = '2' - display_cancel_button = abap_false ). "#EC NOTEXT + display_cancel_button = abap_false ). "#EC NOTEXT IF lv_answer = '2'. RAISE EXCEPTION TYPE lcx_cancel. @@ -308,12 +306,12 @@ CLASS lcl_services_repo IMPLEMENTATION. CALL FUNCTION 'RS_TOOL_ACCESS' EXPORTING - OPERATION = 'SHOW' - IN_NEW_WINDOW = 'X' - OBJECT_NAME = iv_package - OBJECT_TYPE = 'DEVC' - WITH_OBJECTLIST = 'X'. + operation = 'SHOW' + in_new_window = 'X' + object_name = iv_package + object_type = 'DEVC' + with_objectlist = 'X'. ENDMETHOD. " open_se80. -ENDCLASS. "lcl_services_repo \ No newline at end of file +ENDCLASS. "lcl_services_repo diff --git a/src/zabapgit_services_repo.prog.xml b/src/zabapgit_services_repo.prog.xml index 8e628a2f6..12c63c2b5 100644 --- a/src/zabapgit_services_repo.prog.xml +++ b/src/zabapgit_services_repo.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_SERVICES_REPO A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_SERVICES_REPO 30 - diff --git a/src/zabapgit_stage.prog.abap b/src/zabapgit_stage.prog.abap index 958a136cc..2567a3178 100644 --- a/src/zabapgit_stage.prog.abap +++ b/src/zabapgit_stage.prog.abap @@ -193,4 +193,4 @@ CLASS lcl_stage IMPLEMENTATION. rv_count = lines( mt_stage ). ENDMETHOD. "count -ENDCLASS. \ No newline at end of file +ENDCLASS. diff --git a/src/zabapgit_stage.prog.xml b/src/zabapgit_stage.prog.xml index 7dc0d55d1..454bc358e 100644 --- a/src/zabapgit_stage.prog.xml +++ b/src/zabapgit_stage.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_STAGE A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_STAGE 22 - diff --git a/src/zabapgit_stage_logic.prog.abap b/src/zabapgit_stage_logic.prog.abap index 2857381aa..14e05763d 100644 --- a/src/zabapgit_stage_logic.prog.abap +++ b/src/zabapgit_stage_logic.prog.abap @@ -30,11 +30,13 @@ ENDCLASS. CLASS lcl_stage_logic IMPLEMENTATION. METHOD get. + rs_files-local = io_repo->get_files_local( ). rs_files-remote = io_repo->get_files_remote( ). remove_identical( CHANGING cs_files = rs_files ). - remove_ignored( EXPORTING io_repo = io_repo - CHANGING cs_files = rs_files ). + remove_ignored( EXPORTING io_repo = io_repo + CHANGING cs_files = rs_files ). + ENDMETHOD. METHOD count. @@ -58,10 +60,14 @@ CLASS lcl_stage_logic IMPLEMENTATION. lv_index = sy-tabix. IF io_repo->get_dot_abapgit( )->is_ignored( - iv_path = -path + iv_path = -path iv_filename = -filename ) = abap_true. DELETE cs_files-remote INDEX lv_index. + ELSEIF -path = gc_root_dir AND -filename = gc_dot_abapgit. + " Remove .abapgit from remotes - it cannot be removed or ignored + DELETE cs_files-remote INDEX lv_index. ENDIF. + ENDLOOP. ENDMETHOD. @@ -91,4 +97,4 @@ CLASS lcl_stage_logic IMPLEMENTATION. ENDMETHOD. -ENDCLASS. \ No newline at end of file +ENDCLASS. diff --git a/src/zabapgit_stage_logic.prog.xml b/src/zabapgit_stage_logic.prog.xml index feb6d4f0c..a39f3eb56 100644 --- a/src/zabapgit_stage_logic.prog.xml +++ b/src/zabapgit_stage_logic.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_STAGE_LOGIC A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_STAGE_LOGIC 28 - diff --git a/src/zabapgit_syntax_highlighter.prog.abap b/src/zabapgit_syntax_highlighter.prog.abap index c80816ab0..cb1e391d3 100644 --- a/src/zabapgit_syntax_highlighter.prog.abap +++ b/src/zabapgit_syntax_highlighter.prog.abap @@ -197,8 +197,7 @@ CLASS lcl_syntax_highlighter IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF mt_rules, - TYPE match_result, - TYPE ty_match. + TYPE match_result. CLEAR et_matches. @@ -651,8 +650,7 @@ CLASS ltcl_syntax_cases DEFINITION FINAL METHODS: do_test IMPORTING iv_line TYPE string - iv_filename TYPE string - RETURNING VALUE(ro_instance) TYPE REF TO lcl_syntax_highlighter, + iv_filename TYPE string, test_abap_01 FOR TESTING, test_abap_02 FOR TESTING, test_abap_03 FOR TESTING, @@ -702,7 +700,7 @@ CLASS ltcl_syntax_cases IMPLEMENTATION. lo TYPE REF TO lcl_syntax_highlighter. - lo = lcl_syntax_highlighter=>create( iv_filename ). + lo = lcl_syntax_highlighter=>create( iv_filename ). lo->parse_line( EXPORTING iv_line = iv_line IMPORTING et_matches = lt_matches_act ). @@ -1238,4 +1236,4 @@ CLASS ltcl_syntax_basic_logic IMPLEMENTATION. ENDMETHOD. " process_line -ENDCLASS. " ltcl_syntax_highlighter \ No newline at end of file +ENDCLASS. " ltcl_syntax_highlighter diff --git a/src/zabapgit_syntax_highlighter.prog.xml b/src/zabapgit_syntax_highlighter.prog.xml index 6e2f1cb34..4f1a01c95 100644 --- a/src/zabapgit_syntax_highlighter.prog.xml +++ b/src/zabapgit_syntax_highlighter.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_SYNTAX_HIGHLIGHTER A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_SYNTAX_HIGHLIGHTER 35 - diff --git a/src/zabapgit_tadir.prog.abap b/src/zabapgit_tadir.prog.abap index 42ca99fcd..660c64914 100644 --- a/src/zabapgit_tadir.prog.abap +++ b/src/zabapgit_tadir.prog.abap @@ -12,8 +12,9 @@ CLASS lcl_tadir DEFINITION FINAL. PUBLIC SECTION. CLASS-METHODS: read - IMPORTING iv_package TYPE tadir-devclass - RETURNING VALUE(rt_tadir) TYPE ty_tadir_tt + IMPORTING iv_package TYPE tadir-devclass + iv_ignore_subpackages TYPE abap_bool DEFAULT abap_false + RETURNING VALUE(rt_tadir) TYPE ty_tadir_tt RAISING lcx_exception, read_single IMPORTING iv_pgmid TYPE tadir-pgmid DEFAULT 'R3TR' @@ -33,9 +34,10 @@ CLASS lcl_tadir DEFINITION FINAL. RETURNING VALUE(rt_tadir) TYPE ty_tadir_tt RAISING lcx_exception, build - IMPORTING iv_package TYPE tadir-devclass - iv_path TYPE string - RETURNING VALUE(rt_tadir) TYPE ty_tadir_tt + IMPORTING iv_package TYPE tadir-devclass + iv_path TYPE string + iv_ignore_subpackages TYPE abap_bool DEFAULT abap_false + RETURNING VALUE(rt_tadir) TYPE ty_tadir_tt RAISING lcx_exception. ENDCLASS. "lcl_tadir DEFINITION @@ -110,8 +112,9 @@ CLASS lcl_tadir IMPLEMENTATION. METHOD read. * start recursion - rt_tadir = build( iv_package = iv_package - iv_path = '' ). + rt_tadir = build( iv_package = iv_package + iv_path = '' + iv_ignore_subpackages = iv_ignore_subpackages ). rt_tadir = check_exists( rt_tadir ). @@ -161,9 +164,12 @@ CLASS lcl_tadir IMPLEMENTATION. ENDLOOP. * look for subpackages - SELECT * FROM tdevc INTO TABLE lt_tdevc - WHERE parentcl = iv_package - ORDER BY PRIMARY KEY. "#EC CI_SUBRC "#EC CI_GENBUFF + IF iv_ignore_subpackages = abap_false. + SELECT * FROM tdevc INTO TABLE lt_tdevc + WHERE parentcl = iv_package + ORDER BY PRIMARY KEY. "#EC CI_SUBRC "#EC CI_GENBUFF + ENDIF. + LOOP AT lt_tdevc ASSIGNING . lv_len = strlen( iv_package ). IF -devclass(lv_len) <> iv_package. @@ -190,4 +196,4 @@ CLASS lcl_tadir IMPLEMENTATION. ENDMETHOD. "build -ENDCLASS. "lcl_tadir IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_tadir IMPLEMENTATION diff --git a/src/zabapgit_tadir.prog.xml b/src/zabapgit_tadir.prog.xml index 16942b0ac..54f70dd51 100644 --- a/src/zabapgit_tadir.prog.xml +++ b/src/zabapgit_tadir.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_TADIR A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_TADIR 22 - diff --git a/src/zabapgit_transport.prog.abap b/src/zabapgit_transport.prog.abap index 055a4ef63..d654b1d53 100644 --- a/src/zabapgit_transport.prog.abap +++ b/src/zabapgit_transport.prog.abap @@ -11,9 +11,9 @@ CLASS lcl_transport DEFINITION FINAL. PRIVATE SECTION. CLASS-METHODS: popup - RETURNING VALUE(rv_trkorr) TYPE e070-trkorr, + RETURNING VALUE(rt_trkorr) TYPE trwbo_request_headers, read_requests - IMPORTING iv_trkorr TYPE e070-trkorr + IMPORTING it_trkorr TYPE trwbo_request_headers RETURNING VALUE(rt_requests) TYPE trwbo_requests RAISING lcx_exception, find_top_package @@ -30,20 +30,19 @@ CLASS lcl_transport IMPLEMENTATION. METHOD zip. - DATA: lt_requests TYPE trwbo_requests, - lt_tadir TYPE scts_tadir, - lv_package TYPE devclass, - ls_data TYPE lcl_persistence_repo=>ty_repo, - lo_repo TYPE REF TO lcl_repo_offline, - lv_trkorr TYPE e070-trkorr. + DATA: lt_requests TYPE trwbo_requests, + lt_tadir TYPE scts_tadir, + lv_package TYPE devclass, + ls_data TYPE lcl_persistence_repo=>ty_repo, + lo_repo TYPE REF TO lcl_repo_offline, + lt_trkorr TYPE trwbo_request_headers. - - lv_trkorr = popup( ). - IF lv_trkorr IS INITIAL. + lt_trkorr = popup( ). + IF lines( lt_trkorr ) = 0. RETURN. ENDIF. - lt_requests = read_requests( lv_trkorr ). + lt_requests = read_requests( lt_trkorr ). lt_tadir = resolve( lt_requests ). IF lines( lt_tadir ) = 0. lcx_exception=>raise( 'empty transport' ). @@ -101,31 +100,60 @@ CLASS lcl_transport IMPLEMENTATION. ENDMETHOD. METHOD popup. + DATA: lrs_trfunction TYPE trsel_trs_function, + lv_types TYPE string, + ls_ranges TYPE trsel_ts_ranges. - CALL FUNCTION 'TR_F4_REQUESTS' + " Fill all request types + lv_types = 'KWTCOEMPDRSXQFG'. + lrs_trfunction-sign = 'I'. + lrs_trfunction-option = 'EQ'. + WHILE lv_types NE space. + lrs_trfunction-low = lv_types(1). + APPEND lrs_trfunction TO ls_ranges-request_funcs. + SHIFT lv_types. + ENDWHILE. + + CALL FUNCTION 'TRINT_SELECT_REQUESTS' EXPORTING - iv_username = sy-uname - iv_trkorr_pattern = rv_trkorr - iv_trfunctions = sctsc_types_all - iv_trstatus = sctsc_states_changeable + iv_username_pattern = sy-uname + iv_via_selscreen = 'X' + iv_complete_projects = '' +* is_popup = + iv_title = 'abapGit: Transport Request Selection' IMPORTING - ev_selected_request = rv_trkorr. + et_requests = rt_trkorr + CHANGING + cs_ranges = ls_ranges + EXCEPTIONS + action_aborted_by_user = 1 + OTHERS = 2. + IF sy-subrc <> 0. + RETURN. + ENDIF. ENDMETHOD. METHOD read_requests. - CALL FUNCTION 'TR_READ_REQUEST_WITH_TASKS' - EXPORTING - iv_trkorr = iv_trkorr - IMPORTING - et_requests = rt_requests - EXCEPTIONS - invalid_input = 1 - OTHERS = 2. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from TR_READ_REQUEST_WITH_TASKS' ). - ENDIF. + DATA lt_requests LIKE rt_requests. + FIELD-SYMBOLS LIKE LINE OF it_trkorr. + + LOOP AT it_trkorr ASSIGNING . + CALL FUNCTION 'TR_READ_REQUEST_WITH_TASKS' + EXPORTING + iv_trkorr = -trkorr + IMPORTING + et_requests = lt_requests + EXCEPTIONS + invalid_input = 1 + OTHERS = 2. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from TR_READ_REQUEST_WITH_TASKS' ). + ENDIF. + + APPEND LINES OF lt_requests TO rt_requests. + ENDLOOP. ENDMETHOD. @@ -172,7 +200,7 @@ CLASS lcl_transport IMPLEMENTATION. SORT rt_tadir BY object ASCENDING obj_name ASCENDING. DELETE ADJACENT DUPLICATES FROM rt_tadir COMPARING object obj_name. - + DELETE rt_tadir WHERE table_line IS INITIAL. ENDMETHOD. -ENDCLASS. \ No newline at end of file +ENDCLASS. diff --git a/src/zabapgit_transport.prog.xml b/src/zabapgit_transport.prog.xml index b31498d76..d27b57809 100644 --- a/src/zabapgit_transport.prog.xml +++ b/src/zabapgit_transport.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_TRANSPORT A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_TRANSPORT 26 - diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index a65998076..510f5f481 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -242,11 +242,11 @@ CLASS ltcl_diff IMPLEMENTATION. DEFINE _expected. CLEAR ms_expected. - ms_expected-new_line = &1. - ms_expected-new = &2. - ms_expected-result = &3. - ms_expected-old_line = &4. - ms_expected-old = &5. + ms_expected-new_num = &1. + ms_expected-new = &2. + ms_expected-result = &3. + ms_expected-old_num = &4. + ms_expected-old = &5. APPEND ms_expected TO mt_expected. END-OF-DEFINITION. @@ -1234,10 +1234,10 @@ CLASS ltcl_git_pack IMPLEMENTATION. ENDCLASS. "lcl_abap_unit IMPLEMENTATION -CLASS ltcl_html_helper DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. +CLASS ltcl_html DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. PRIVATE SECTION. - DATA: mo_html TYPE REF TO lcl_html_helper. + DATA: mo_html TYPE REF TO lcl_html. METHODS: indent1 FOR TESTING RAISING lcx_exception, @@ -1251,9 +1251,9 @@ CLASS ltcl_html_helper DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT last_line RETURNING VALUE(rv_line) TYPE string. -ENDCLASS. +ENDCLASS. "ltcl_html -CLASS ltcl_html_helper IMPLEMENTATION. +CLASS ltcl_html IMPLEMENTATION. METHOD setup. CREATE OBJECT mo_html. @@ -1261,49 +1261,73 @@ CLASS ltcl_html_helper IMPLEMENTATION. METHOD indent1. + DATA lv_exp TYPE string. + mo_html->add( '' ). + lv_exp = ''. + cl_abap_unit_assert=>assert_equals( - act = last_line( ) - exp = '' ). + act = mo_html->render( ) + exp = lv_exp ). ENDMETHOD. METHOD indent2. + DATA lv_exp TYPE string. + mo_html->add( '' ). + lv_exp = ''. + cl_abap_unit_assert=>assert_equals( - act = last_line( ) - exp = '' ). + act = mo_html->render( ) + exp = lv_exp ). ENDMETHOD. METHOD indent3. + DATA lv_exp TYPE string. + mo_html->add( '' ). + lv_exp = ''. + cl_abap_unit_assert=>assert_equals( - act = last_line( ) - exp = '' ). + act = mo_html->render( ) + exp = lv_exp ). ENDMETHOD. METHOD indent4. + DATA lv_exp TYPE string. + mo_html->add( '' ). + lv_exp = ''. + cl_abap_unit_assert=>assert_equals( - act = last_line( ) - exp = '' ). + act = mo_html->render( ) + exp = lv_exp ). ENDMETHOD. @@ -1311,33 +1335,37 @@ CLASS ltcl_html_helper IMPLEMENTATION. DATA: lt_strings TYPE STANDARD TABLE OF string WITH DEFAULT KEY. - SPLIT mo_html->mv_html AT gc_newline INTO TABLE lt_strings. - + SPLIT mo_html->render( ) AT gc_newline INTO TABLE lt_strings. READ TABLE lt_strings INDEX lines( lt_strings ) INTO rv_line. ENDMETHOD. METHOD style1. + DATA lv_exp TYPE string. + mo_html->add( '' ). - cl_abap_unit_assert=>assert_equals( act = last_line( ) exp = '' ). + lv_exp = ''. + + cl_abap_unit_assert=>assert_equals( + act = mo_html->render( ) + exp = lv_exp ). ENDMETHOD. -ENDCLASS. +ENDCLASS. "ltcl_html *----------------------------------------------------------------------* * CLASS ltcl_serialize DEFINITION @@ -1819,6 +1847,10 @@ CLASS ltcl_path IMPLEMENTATION. lv_filename = lcl_path=>get_filename_from_syspath( '\\server$\file.txt' ). assert_equals( act = lv_filename exp = 'file.txt' ). + lv_filename = lcl_path=>get_filename_from_syspath( + 'C:\foo\bar\moo.boo\dev\qas\_blah\goog\muuh\sap\hello\world\lorem\ipsum\s_foo.gif' ). + assert_equals( act = lv_filename exp = 's_foo.gif' ). + ENDMETHOD. " get_filename_from_syspath. ENDCLASS. "ltcl_path @@ -1839,7 +1871,6 @@ CLASS ltcl_file_status IMPLEMENTATION. DATA: lt_local TYPE ty_files_item_tt, lt_remote TYPE ty_files_tt, lt_state TYPE ty_file_signatures_tt, - lt_tadir TYPE ty_tadir_tt, lt_results TYPE ty_results_tt, lt_results_exp TYPE ty_results_tt. @@ -1914,6 +1945,7 @@ CLASS ltcl_file_status IMPLEMENTATION. lt_results_exp = lt_results. lt_results = lcl_file_status=>calculate_status( + iv_devclass = '$Z$' it_local = lt_local it_remote = lt_remote it_cur_state = lt_state ). @@ -2185,21 +2217,21 @@ CLASS ltcl_persistence_settings IMPLEMENTATION. lcl_app=>db( )->delete( iv_type = 'SETTINGS' iv_value = 'PROXY_URL' ). - CATCH cx_static_check. + CATCH cx_static_check ##NO_HANDLER. "If entry didn't exist, that's okay ENDTRY. TRY. lcl_app=>db( )->delete( iv_type = 'SETTINGS' iv_value = 'PROXY_PORT' ). - CATCH cx_static_check. + CATCH cx_static_check ##NO_HANDLER. "If entry didn't exist, that's okay ENDTRY. TRY. lcl_app=>db( )->delete( iv_type = 'SETTINGS' iv_value = 'CRIT_TESTS' ). - CATCH cx_static_check. + CATCH cx_static_check ##NO_HANDLER. "If entry didn't exist, that's okay ENDTRY. @@ -2207,548 +2239,4 @@ CLASS ltcl_persistence_settings IMPLEMENTATION. ENDCLASS. - -CLASS ltd_spy_oo_object DEFINITION FOR TESTING. - PUBLIC SECTION. - INTERFACES: lif_object_oriented_object. - DATA: - mv_package TYPE devclass, - mv_overwrite TYPE seox_boolean, - ms_interface_properties TYPE vseointerf, - ms_class_properties TYPE vseoclass, - ms_locals_key TYPE seoclskey, - mt_local_definitions TYPE rswsourcet, - mt_local_implementations TYPE rswsourcet, - mt_local_macros TYPE rswsourcet, - mt_local_test_classes TYPE rswsourcet, - mv_force TYPE seoflag, - ms_deserialize_key TYPE seoclskey, - mt_source TYPE ty_string_tt, - ms_item_to_activate TYPE ty_item, - mt_descriptions TYPE ty_seocompotx_tt, - ms_description_key TYPE seoclskey, - mv_text_pool_class_name TYPE seoclsname, - mt_text_pool TYPE textpool_table, - mv_text_pool_inserted TYPE abap_bool, - mt_sotr TYPE ty_sotr_tt, - mt_sotr_package TYPE devclass, - mv_docu_object_name TYPE dokhl-object, - mv_docu_language TYPE spras, - mt_docu_lines TYPE tlinetab. - -ENDCLASS. -CLASS ltd_spy_oo_object IMPLEMENTATION. - METHOD lif_object_oriented_object~create. - DATA lv_properties_structure_name TYPE string. - lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( is_properties )->absolute_name. - IF lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( ms_interface_properties )->absolute_name. - ms_interface_properties = is_properties. - ELSE. - ms_class_properties = is_properties. - ENDIF. - mv_package = iv_package. - mv_overwrite = iv_overwrite. - ENDMETHOD. - METHOD lif_object_oriented_object~generate_locals. - ms_locals_key = is_key. - mt_local_definitions = it_local_definitions. - mt_local_implementations = it_local_implementations. - mt_local_macros = it_local_macros. - mt_local_test_classes = it_local_test_classes. - mv_force = iv_force. - ENDMETHOD. - - METHOD lif_object_oriented_object~deserialize_source. - ms_deserialize_key = is_key. - mt_source = it_source. - ENDMETHOD. - - METHOD lif_object_oriented_object~add_to_activation_list. - ms_item_to_activate = is_item. - ENDMETHOD. - - METHOD lif_object_oriented_object~update_descriptions. - ms_description_key = is_key. - mt_descriptions = it_descriptions. - ENDMETHOD. - - METHOD lif_object_oriented_object~insert_text_pool. - mv_text_pool_inserted = abap_true. - mv_text_pool_class_name = iv_class_name. - mt_text_pool = it_text_pool. - cl_abap_unit_assert=>assert_equals( - act = iv_language - exp = sy-langu ). - ENDMETHOD. - - METHOD lif_object_oriented_object~create_sotr. - mt_sotr = it_sotr. - mt_sotr_package = iv_package. - ENDMETHOD. - - METHOD lif_object_oriented_object~create_documentation. - mv_docu_object_name = iv_object_name. - mv_docu_language = iv_language. - mt_docu_lines = it_lines. - ENDMETHOD. - -ENDCLASS. - -CLASS ltd_fake_object_files DEFINITION FOR TESTING - INHERITING FROM lcl_objects_files. - PUBLIC SECTION. - METHODS constructor. - METHODS read_abap REDEFINITION. - DATA: - mt_sources TYPE seop_source_string, - mt_local_definitions TYPE seop_source_string, - mt_local_implementations TYPE seop_source_string, - mt_local_macros TYPE seop_source_string, - mt_local_test_classes TYPE seop_source_string. -ENDCLASS. -CLASS ltd_fake_object_files IMPLEMENTATION. - METHOD read_abap. - CASE iv_extra. - WHEN 'locals_def'. - rt_abap = mt_local_definitions. - WHEN 'locals_imp'. - rt_abap = mt_local_implementations. - WHEN 'macros'. - rt_abap = mt_local_macros. - WHEN 'testclasses'. - rt_abap = mt_local_test_classes. - WHEN OTHERS. - rt_abap = mt_sources. - RETURN. - ENDCASE. - - cl_abap_unit_assert=>assert_equals( act = iv_error - exp = abap_false ). - ENDMETHOD. - METHOD constructor. - DATA ls_empty_item TYPE ty_item. - super->constructor( ls_empty_item ). - APPEND 'source' TO me->mt_sources. - APPEND 'definition' TO me->mt_local_definitions. - APPEND 'implementation' TO me->mt_local_implementations. - APPEND 'macro' TO me->mt_local_macros. - APPEND 'test' TO me->mt_local_test_classes. - ENDMETHOD. - -ENDCLASS. - -CLASS ltc_oo_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT . - PROTECTED SECTION. - DATA: - mo_spy_oo_object TYPE REF TO ltd_spy_oo_object, - mo_fake_object_files TYPE REF TO ltd_fake_object_files, - mo_xml_input TYPE REF TO lcl_xml_input, - mo_xml_out TYPE REF TO lcl_xml_output, - mo_oo_object TYPE REF TO lif_object, - ms_item TYPE ty_item. - METHODS: when_deserializing - RAISING - lcx_exception, - then_should_deserialize_source, - given_the_descriptions - IMPORTING - it_descriptions TYPE ty_seocompotx_tt - RAISING - lcx_exception, - then_shuld_update_descriptions - IMPORTING - it_descriptions TYPE ty_seocompotx_tt, - then_it_should_add_activation, - given_documentation_in_xml_as - IMPORTING - it_lines TYPE tlinetab - RAISING - lcx_exception, - then_docu_should_be_created - IMPORTING - it_lines TYPE tlinetab. - -ENDCLASS. -CLASS ltc_oo_test IMPLEMENTATION. - - METHOD then_docu_should_be_created. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_docu_lines - exp = it_lines ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_docu_object_name - exp = ms_item-obj_name ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_docu_language - exp = sy-langu ). - ENDMETHOD. - - METHOD given_documentation_in_xml_as. - mo_xml_out->add( - iv_name = 'LINES' - ig_data = it_lines ). - ENDMETHOD. - - METHOD then_it_should_add_activation. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_item_to_activate - exp = ms_item ). - ENDMETHOD. - - METHOD then_shuld_update_descriptions. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_descriptions - exp = it_descriptions ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_description_key - exp = ms_item-obj_name ). - ENDMETHOD. - - METHOD given_the_descriptions. - mo_xml_out->add( - iv_name = 'DESCRIPTIONS' - ig_data = it_descriptions ). - ENDMETHOD. - - METHOD then_should_deserialize_source. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_source - exp = mo_fake_object_files->mt_sources ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_deserialize_key - exp = ms_item-obj_name ). - ENDMETHOD. - - METHOD when_deserializing. - CREATE OBJECT mo_xml_input - EXPORTING - iv_xml = mo_xml_out->render( ). - mo_oo_object->deserialize( - iv_package = 'package_name' - io_xml = mo_xml_input ). - ENDMETHOD. -ENDCLASS. - -CLASS ltcl_class_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT -INHERITING FROM ltc_oo_test. - PRIVATE SECTION. - METHODS: - setup, - given_a_class_properties - RAISING - lcx_exception, - then_should_create_class, - then_it_should_generate_locals, - should_create_class FOR TESTING RAISING cx_static_check, - should_generate_locals FOR TESTING RAISING cx_static_check, - should_deserialize_source FOR TESTING RAISING cx_static_check, - should_update_descriptions FOR TESTING RAISING cx_static_check, - should_add_to_activation FOR TESTING RAISING cx_static_check, - no_text_pool_no_insert FOR TESTING RAISING cx_static_check, - insert_text_pool FOR TESTING RAISING cx_static_check, - create_stor_from_xml FOR TESTING RAISING cx_static_check, - create_documentation FOR TESTING RAISING cx_static_check. - DATA: - ms_class_properties TYPE vseoclass. -ENDCLASS. - -CLASS ltcl_class_deserialization IMPLEMENTATION. - METHOD setup. - CREATE OBJECT mo_fake_object_files. - CREATE OBJECT mo_spy_oo_object. - CREATE OBJECT mo_xml_out. - lth_oo_factory_injector=>inject( mo_spy_oo_object ). - - ms_item-devclass = 'package_name'. - ms_item-obj_name = 'zcl_class'. - ms_item-obj_type = 'CLAS'. - - CREATE OBJECT mo_oo_object TYPE lcl_object_clas - EXPORTING - is_item = ms_item - iv_language = sy-langu. - mo_oo_object->mo_files = mo_fake_object_files. - ENDMETHOD. - - METHOD should_create_class. - ms_class_properties-clsname = ms_item-obj_name. - - given_a_class_properties( ). - - when_deserializing( ). - - then_should_create_class( ). - ENDMETHOD. - - METHOD should_generate_locals. - given_a_class_properties( ). - - when_deserializing( ). - - then_it_should_generate_locals( ). - ENDMETHOD. - - METHOD should_deserialize_source. - given_a_class_properties( ). - - when_deserializing( ). - - then_should_deserialize_source( ). - ENDMETHOD. - - METHOD should_update_descriptions. - DATA: - ls_description TYPE seocompotx, - lt_descriptions TYPE ty_seocompotx_tt. - - given_a_class_properties( ). - - ls_description-clsname = ms_item-obj_name. - ls_description-cmpname = 'a_method'. - APPEND ls_description TO lt_descriptions. - given_the_descriptions( lt_descriptions ). - - when_deserializing( ). - - then_shuld_update_descriptions( lt_descriptions ). - ENDMETHOD. - - METHOD should_add_to_activation. - given_a_class_properties( ). - - when_deserializing( ). - - then_it_should_add_activation( ). - ENDMETHOD. - - METHOD given_a_class_properties. - mo_xml_out->add( - iv_name = 'VSEOCLASS' - ig_data = ms_class_properties ). - ENDMETHOD. - - METHOD then_should_create_class. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_class_properties - exp = ms_class_properties ). - - cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_overwrite - exp = abap_true ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_package - exp = 'package_name' ). - ENDMETHOD. - - - METHOD then_it_should_generate_locals. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_locals_key - exp = ms_item-obj_name ). - - cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_force - exp = abap_true ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_local_definitions - exp = mo_fake_object_files->mt_local_definitions ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_local_implementations - exp = mo_fake_object_files->mt_local_implementations ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_local_macros - exp = mo_fake_object_files->mt_local_macros ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_local_test_classes - exp = mo_fake_object_files->mt_local_test_classes ). - ENDMETHOD. - METHOD no_text_pool_no_insert. - given_a_class_properties( ). - - when_deserializing( ). - - cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_text_pool_inserted - exp = abap_false ). - ENDMETHOD. - - METHOD insert_text_pool. - DATA: lt_pool_external TYPE textpool_table, - ls_pool_external TYPE ty_tpool. - ls_pool_external-id = 'ID'. - ls_pool_external-key = 'KEY'. - APPEND ls_pool_external TO lt_pool_external. - - given_a_class_properties( ). - - mo_xml_out->add( - iv_name = 'TPOOL' - ig_data = lt_pool_external ). - - when_deserializing( ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_text_pool - exp = lt_pool_external ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_text_pool_class_name - exp = 'zcl_class' ). - ENDMETHOD. - - METHOD create_stor_from_xml. - DATA: - lt_sotr TYPE ty_sotr_tt, - ls_sotr LIKE LINE OF lt_sotr. - - given_a_class_properties( ). - - ls_sotr-header-concept = 'HEADER'. - APPEND ls_sotr TO lt_sotr. - mo_xml_out->add( - iv_name = 'SOTR' - ig_data = lt_sotr ). - - when_deserializing( ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_sotr - exp = lt_sotr ). - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_sotr_package - exp = 'package_name' ). - ENDMETHOD. - - METHOD create_documentation. - DATA: lt_lines TYPE tlinetab, - ls_line TYPE LINE OF tlinetab. - ls_line-tdline = 'Class Line Doc'. - APPEND ls_line TO lt_lines. - - given_a_class_properties( ). - - given_documentation_in_xml_as( lt_lines ). - - when_deserializing( ). - - then_docu_should_be_created( lt_lines ). - ENDMETHOD. -ENDCLASS. - -CLASS ltcl_interface_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT -INHERITING FROM ltc_oo_test. - PRIVATE SECTION. - METHODS: - setup, - given_an_interface_properties - RAISING - lcx_exception, - then_should_create_interface, - create_interface FOR TESTING RAISING cx_static_check, - update_descriptions FOR TESTING RAISING cx_static_check, - add_to_activation FOR TESTING RAISING cx_static_check, - deserialize_source FOR TESTING RAISING cx_static_check, - create_documentation FOR TESTING RAISING cx_static_check. - DATA: - ms_interface_properties TYPE vseointerf. -ENDCLASS. -CLASS ltcl_interface_deserialization IMPLEMENTATION. - METHOD setup. - CREATE OBJECT mo_fake_object_files. - CREATE OBJECT mo_spy_oo_object. - CREATE OBJECT mo_xml_out. - lth_oo_factory_injector=>inject( mo_spy_oo_object ). - - ms_item-devclass = 'package_name'. - ms_item-obj_name = 'zif_interface'. - ms_item-obj_type = 'INTF'. - - CREATE OBJECT mo_oo_object TYPE lcl_object_intf - EXPORTING - is_item = ms_item - iv_language = sy-langu. - mo_oo_object->mo_files = mo_fake_object_files. - ENDMETHOD. - - METHOD create_interface. - ms_interface_properties-clsname = ms_item-obj_name. - given_an_interface_properties( ). - - when_deserializing( ). - - then_should_create_interface( ). - ENDMETHOD. - - METHOD update_descriptions. - DATA: - ls_description TYPE seocompotx, - lt_descriptions TYPE ty_seocompotx_tt. - - given_an_interface_properties( ). - - ls_description-clsname = ms_item-obj_name. - ls_description-cmpname = 'a_method'. - APPEND ls_description TO lt_descriptions. - given_the_descriptions( lt_descriptions ). - - when_deserializing( ). - - then_shuld_update_descriptions( lt_descriptions ). - ENDMETHOD. - - METHOD add_to_activation. - given_an_interface_properties( ). - - when_deserializing( ). - - then_it_should_add_activation( ). - ENDMETHOD. - - METHOD deserialize_source. - given_an_interface_properties( ). - - when_deserializing( ). - - then_should_deserialize_source( ). - ENDMETHOD. - - METHOD given_an_interface_properties. - mo_xml_out->add( - iv_name = 'VSEOINTERF' - ig_data = ms_interface_properties ). - ENDMETHOD. - - METHOD then_should_create_interface. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_interface_properties - exp = ms_interface_properties ). - - cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_overwrite - exp = abap_true ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_package - exp = 'package_name' ). - ENDMETHOD. - - METHOD create_documentation. - DATA: lt_lines TYPE tlinetab, - ls_line TYPE LINE OF tlinetab. - ls_line-tdline = 'Interface Line Doc'. - APPEND ls_line TO lt_lines. - - given_an_interface_properties( ). - - given_documentation_in_xml_as( lt_lines ). - - when_deserializing( ). - - then_docu_should_be_created( lt_lines ). - ENDMETHOD. -ENDCLASS. \ No newline at end of file +INCLUDE ZABAPGIT_UNIT_TEST_CLAS_INTF. diff --git a/src/zabapgit_unit_test.prog.xml b/src/zabapgit_unit_test.prog.xml index 57d4937b5..4a8363652 100644 --- a/src/zabapgit_unit_test.prog.xml +++ b/src/zabapgit_unit_test.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_UNIT_TEST A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Program ZABAPGIT_UNIT_TEST 26 - diff --git a/src/zabapgit_unit_test_clas_intf.prog.abap b/src/zabapgit_unit_test_clas_intf.prog.abap new file mode 100644 index 000000000..3f424b432 --- /dev/null +++ b/src/zabapgit_unit_test_clas_intf.prog.abap @@ -0,0 +1,1318 @@ + +CLASS ltd_spy_oo_object DEFINITION FOR TESTING. + PUBLIC SECTION. + INTERFACES: lif_object_oriented_object_fnc. + DATA: + mv_package TYPE devclass, + mv_overwrite TYPE seox_boolean, + ms_interface_properties TYPE vseointerf, + ms_class_properties TYPE vseoclass, + ms_locals_key TYPE seoclskey, + mt_local_definitions TYPE rswsourcet, + mt_local_implementations TYPE rswsourcet, + mt_local_macros TYPE rswsourcet, + mt_local_test_classes TYPE rswsourcet, + mv_force TYPE seoflag, + ms_deserialize_key TYPE seoclskey, + mt_source TYPE ty_string_tt, + ms_item_to_activate TYPE ty_item, + mt_descriptions TYPE ty_seocompotx_tt, + ms_description_key TYPE seoclskey, + mv_text_pool_class_name TYPE seoclsname, + mt_text_pool TYPE textpool_table, + mv_text_pool_inserted TYPE abap_bool, + mt_sotr TYPE ty_sotr_tt, + mt_sotr_package TYPE devclass, + mv_docu_object_name TYPE dokhl-object, + mv_docu_language TYPE spras, + mt_docu_lines TYPE tlinetab, + mv_get_includes_called TYPE abap_bool, + mv_exists TYPE abap_bool, + mv_exists_called TYPE abap_bool, + ms_serialize_key TYPE seoclskey, + ms_delete_key TYPE seoclskey, + mv_skip_test_classes TYPE abap_bool. + PRIVATE SECTION. + + +ENDCLASS. +CLASS ltd_spy_oo_object IMPLEMENTATION. + METHOD lif_object_oriented_object_fnc~create. + DATA lv_properties_structure_name TYPE string. + lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( is_properties )->absolute_name. + IF lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( ms_interface_properties )->absolute_name. + ms_interface_properties = is_properties. + ELSE. + ms_class_properties = is_properties. + ENDIF. + mv_package = iv_package. + mv_overwrite = iv_overwrite. + ENDMETHOD. + METHOD lif_object_oriented_object_fnc~generate_locals. + ms_locals_key = is_key. + mt_local_definitions = it_local_definitions. + mt_local_implementations = it_local_implementations. + mt_local_macros = it_local_macros. + mt_local_test_classes = it_local_test_classes. + mv_force = iv_force. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~deserialize_source. + ms_deserialize_key = is_key. + mt_source = it_source. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~add_to_activation_list. + ms_item_to_activate = is_item. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~update_descriptions. + ms_description_key = is_key. + mt_descriptions = it_descriptions. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~insert_text_pool. + mv_text_pool_inserted = abap_true. + mv_text_pool_class_name = iv_class_name. + mt_text_pool = it_text_pool. + cl_abap_unit_assert=>assert_equals( + act = iv_language + exp = sy-langu ). + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~create_sotr. + mt_sotr = it_sotr. + mt_sotr_package = iv_package. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~create_documentation. + mv_docu_object_name = iv_object_name. + mv_docu_language = iv_language. + mt_docu_lines = it_lines. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~get_includes. + APPEND 'dummy' TO rt_includes. + mv_get_includes_called = abap_true. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~exists. + mv_exists_called = abap_true. + rv_exists = mv_exists. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~serialize_abap. + ms_serialize_key = is_class_key. + CASE iv_type. + WHEN seop_ext_class_locals_def. + rt_source = mt_local_definitions. + WHEN seop_ext_class_locals_imp. + rt_source = mt_local_implementations. + WHEN seop_ext_class_macros. + rt_source = mt_local_macros. + WHEN seop_ext_class_testclasses. + rt_source = mt_local_test_classes. + WHEN OTHERS. + rt_source = mt_source. + ENDCASE. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~get_class_properties. + rs_class_properties = ms_class_properties. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~get_interface_properties. + rs_interface_properties = ms_interface_properties. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~read_text_pool. + rt_text_pool = mt_text_pool. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~read_sotr. + rt_sotr = mt_sotr. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~read_documentation. + rt_lines = mt_docu_lines. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~read_descriptions. + rt_descriptions = mt_descriptions. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~get_skip_test_classes. + rv_skip = mv_skip_test_classes. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~delete. + ms_delete_key = is_deletion_key. + ENDMETHOD. + +ENDCLASS. + +CLASS ltd_fake_object_files DEFINITION FOR TESTING + INHERITING FROM lcl_objects_files. + PUBLIC SECTION. + METHODS constructor. + METHODS add_abap REDEFINITION. + METHODS read_abap REDEFINITION. + DATA: + mt_sources TYPE seop_source_string, + mt_local_definitions TYPE seop_source_string, + mt_local_implementations TYPE seop_source_string, + mt_local_macros TYPE seop_source_string, + mt_local_test_classes TYPE seop_source_string. +ENDCLASS. +CLASS ltd_fake_object_files IMPLEMENTATION. + METHOD read_abap. + CASE iv_extra. + WHEN 'locals_def'. + rt_abap = mt_local_definitions. + WHEN 'locals_imp'. + rt_abap = mt_local_implementations. + WHEN 'macros'. + rt_abap = mt_local_macros. + WHEN 'testclasses'. + rt_abap = mt_local_test_classes. + WHEN OTHERS. + rt_abap = mt_sources. + RETURN. + ENDCASE. + + cl_abap_unit_assert=>assert_equals( act = iv_error + exp = abap_false ). + ENDMETHOD. + METHOD constructor. + DATA ls_empty_item TYPE ty_item. + super->constructor( ls_empty_item ). + APPEND 'source' TO me->mt_sources. + APPEND 'definition' TO me->mt_local_definitions. + APPEND 'implementation' TO me->mt_local_implementations. + APPEND 'macro' TO me->mt_local_macros. + APPEND 'test' TO me->mt_local_test_classes. + ENDMETHOD. + METHOD add_abap. + CASE iv_extra. + WHEN 'locals_def'. + mt_local_definitions = it_abap. + WHEN 'locals_imp'. + mt_local_implementations = it_abap. + WHEN 'macros'. + mt_local_macros = it_abap. + WHEN 'testclasses'. + mt_local_test_classes = it_abap. + WHEN OTHERS. + mt_sources = it_abap. + RETURN. + ENDCASE. + ENDMETHOD. +ENDCLASS. + +CLASS ltc_oo_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PROTECTED SECTION. + DATA: + mo_spy_oo_object_functions TYPE REF TO ltd_spy_oo_object, + mo_fake_object_files TYPE REF TO ltd_fake_object_files, + mo_xml_input TYPE REF TO lcl_xml_input, + mo_xml_out TYPE REF TO lcl_xml_output, + mo_oo_object TYPE REF TO lif_object, + ms_item TYPE ty_item. + METHODS: when_deserializing + RAISING + lcx_exception, + then_should_deserialize_source, + given_the_descriptions + IMPORTING + it_descriptions TYPE ty_seocompotx_tt + RAISING + lcx_exception, + then_shuld_update_descriptions + IMPORTING + it_descriptions TYPE ty_seocompotx_tt, + then_it_should_add_activation, + given_documentation_in_xml_as + IMPORTING + it_lines TYPE tlinetab + RAISING + lcx_exception, + then_docu_should_be_created + IMPORTING + it_lines TYPE tlinetab, + should_serialize_with_obj_key. + +ENDCLASS. +CLASS ltc_oo_test IMPLEMENTATION. + + METHOD should_serialize_with_obj_key. + + cl_abap_unit_assert=>assert_equals( + act = me->mo_spy_oo_object_functions->ms_serialize_key + exp = ms_item-obj_name ). + + ENDMETHOD. + + METHOD then_docu_should_be_created. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mt_docu_lines + exp = it_lines ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mv_docu_object_name + exp = ms_item-obj_name ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mv_docu_language + exp = sy-langu ). + ENDMETHOD. + + METHOD given_documentation_in_xml_as. + mo_xml_out->add( + iv_name = 'LINES' + ig_data = it_lines ). + ENDMETHOD. + + METHOD then_it_should_add_activation. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->ms_item_to_activate + exp = ms_item ). + ENDMETHOD. + + METHOD then_shuld_update_descriptions. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mt_descriptions + exp = it_descriptions ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->ms_description_key + exp = ms_item-obj_name ). + ENDMETHOD. + + METHOD given_the_descriptions. + mo_xml_out->add( + iv_name = 'DESCRIPTIONS' + ig_data = it_descriptions ). + ENDMETHOD. + + METHOD then_should_deserialize_source. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mt_source + exp = mo_fake_object_files->mt_sources ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->ms_deserialize_key + exp = ms_item-obj_name ). + ENDMETHOD. + + METHOD when_deserializing. + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + mo_oo_object->deserialize( + iv_package = 'package_name' + io_xml = mo_xml_input ). + ENDMETHOD. +ENDCLASS. + +CLASS ltcl_class_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + given_a_class_properties + RAISING + lcx_exception, + then_should_create_class, + then_it_should_generate_locals, + should_create_class FOR TESTING RAISING cx_static_check, + should_generate_locals FOR TESTING RAISING cx_static_check, + should_deserialize_source FOR TESTING RAISING cx_static_check, + should_update_descriptions FOR TESTING RAISING cx_static_check, + should_add_to_activation FOR TESTING RAISING cx_static_check, + no_text_pool_no_insert FOR TESTING RAISING cx_static_check, + insert_text_pool FOR TESTING RAISING cx_static_check, + create_stor_from_xml FOR TESTING RAISING cx_static_check, + create_documentation FOR TESTING RAISING cx_static_check. + DATA: + ms_class_properties TYPE vseoclass. +ENDCLASS. + +CLASS ltcl_class_deserialization IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_fake_object_files. + CREATE OBJECT mo_spy_oo_object_functions. + CREATE OBJECT mo_xml_out. + lth_oo_factory_injector=>inject( mo_spy_oo_object_functions ). + + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zcl_class'. + ms_item-obj_type = 'CLAS'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_clas + EXPORTING + is_item = ms_item + iv_language = sy-langu. + mo_oo_object->mo_files = mo_fake_object_files. + ENDMETHOD. + + METHOD should_create_class. + ms_class_properties-clsname = ms_item-obj_name. + + given_a_class_properties( ). + + when_deserializing( ). + + then_should_create_class( ). + ENDMETHOD. + + METHOD should_generate_locals. + given_a_class_properties( ). + + when_deserializing( ). + + then_it_should_generate_locals( ). + ENDMETHOD. + + METHOD should_deserialize_source. + given_a_class_properties( ). + + when_deserializing( ). + + then_should_deserialize_source( ). + ENDMETHOD. + + METHOD should_update_descriptions. + DATA: + ls_description TYPE seocompotx, + lt_descriptions TYPE ty_seocompotx_tt. + + given_a_class_properties( ). + + ls_description-clsname = ms_item-obj_name. + ls_description-cmpname = 'a_method'. + APPEND ls_description TO lt_descriptions. + given_the_descriptions( lt_descriptions ). + + when_deserializing( ). + + then_shuld_update_descriptions( lt_descriptions ). + ENDMETHOD. + + METHOD should_add_to_activation. + given_a_class_properties( ). + + when_deserializing( ). + + then_it_should_add_activation( ). + ENDMETHOD. + + METHOD given_a_class_properties. + mo_xml_out->add( + iv_name = 'VSEOCLASS' + ig_data = ms_class_properties ). + ENDMETHOD. + + METHOD then_should_create_class. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->ms_class_properties + exp = ms_class_properties ). + + cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object_functions->mv_overwrite + exp = abap_true ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mv_package + exp = 'package_name' ). + ENDMETHOD. + + + METHOD then_it_should_generate_locals. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->ms_locals_key + exp = ms_item-obj_name ). + + cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object_functions->mv_force + exp = abap_true ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mt_local_definitions + exp = mo_fake_object_files->mt_local_definitions ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mt_local_implementations + exp = mo_fake_object_files->mt_local_implementations ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mt_local_macros + exp = mo_fake_object_files->mt_local_macros ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mt_local_test_classes + exp = mo_fake_object_files->mt_local_test_classes ). + ENDMETHOD. + METHOD no_text_pool_no_insert. + given_a_class_properties( ). + + when_deserializing( ). + + cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object_functions->mv_text_pool_inserted + exp = abap_false ). + ENDMETHOD. + + METHOD insert_text_pool. + DATA: lt_pool_external TYPE textpool_table, + ls_pool_external TYPE ty_tpool. + ls_pool_external-id = 'ID'. + ls_pool_external-key = 'KEY'. + APPEND ls_pool_external TO lt_pool_external. + + given_a_class_properties( ). + + mo_xml_out->add( + iv_name = 'TPOOL' + ig_data = lt_pool_external ). + + when_deserializing( ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mt_text_pool + exp = lt_pool_external ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mv_text_pool_class_name + exp = 'zcl_class' ). + ENDMETHOD. + + METHOD create_stor_from_xml. + DATA: + lt_sotr TYPE ty_sotr_tt, + ls_sotr LIKE LINE OF lt_sotr. + + given_a_class_properties( ). + + ls_sotr-header-concept = 'HEADER'. + APPEND ls_sotr TO lt_sotr. + mo_xml_out->add( + iv_name = 'SOTR' + ig_data = lt_sotr ). + + when_deserializing( ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mt_sotr + exp = lt_sotr ). + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mt_sotr_package + exp = 'package_name' ). + ENDMETHOD. + + METHOD create_documentation. + DATA: lt_lines TYPE tlinetab, + ls_line TYPE LINE OF tlinetab. + ls_line-tdline = 'Class Line Doc'. + APPEND ls_line TO lt_lines. + + given_a_class_properties( ). + + given_documentation_in_xml_as( lt_lines ). + + when_deserializing( ). + + then_docu_should_be_created( lt_lines ). + ENDMETHOD. +ENDCLASS. + +CLASS ltcl_interface_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + given_an_interface_properties + RAISING + lcx_exception, + then_should_create_interface, + create_interface FOR TESTING RAISING cx_static_check, + update_descriptions FOR TESTING RAISING cx_static_check, + add_to_activation FOR TESTING RAISING cx_static_check, + deserialize_source FOR TESTING RAISING cx_static_check, + create_documentation FOR TESTING RAISING cx_static_check. + DATA: + ms_interface_properties TYPE vseointerf. +ENDCLASS. +CLASS ltcl_interface_deserialization IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_fake_object_files. + CREATE OBJECT mo_spy_oo_object_functions. + CREATE OBJECT mo_xml_out. + lth_oo_factory_injector=>inject( mo_spy_oo_object_functions ). + + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zif_interface'. + ms_item-obj_type = 'INTF'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_intf + EXPORTING + is_item = ms_item + iv_language = sy-langu. + mo_oo_object->mo_files = mo_fake_object_files. + ENDMETHOD. + + METHOD create_interface. + ms_interface_properties-clsname = ms_item-obj_name. + given_an_interface_properties( ). + + when_deserializing( ). + + then_should_create_interface( ). + ENDMETHOD. + + METHOD update_descriptions. + DATA: + ls_description TYPE seocompotx, + lt_descriptions TYPE ty_seocompotx_tt. + + given_an_interface_properties( ). + + ls_description-clsname = ms_item-obj_name. + ls_description-cmpname = 'a_method'. + APPEND ls_description TO lt_descriptions. + given_the_descriptions( lt_descriptions ). + + when_deserializing( ). + + then_shuld_update_descriptions( lt_descriptions ). + ENDMETHOD. + + METHOD add_to_activation. + given_an_interface_properties( ). + + when_deserializing( ). + + then_it_should_add_activation( ). + ENDMETHOD. + + METHOD deserialize_source. + given_an_interface_properties( ). + + when_deserializing( ). + + then_should_deserialize_source( ). + ENDMETHOD. + + METHOD given_an_interface_properties. + mo_xml_out->add( + iv_name = 'VSEOINTERF' + ig_data = ms_interface_properties ). + ENDMETHOD. + + METHOD then_should_create_interface. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->ms_interface_properties + exp = ms_interface_properties ). + + cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object_functions->mv_overwrite + exp = abap_true ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mv_package + exp = 'package_name' ). + ENDMETHOD. + + METHOD create_documentation. + DATA: lt_lines TYPE tlinetab, + ls_line TYPE LINE OF tlinetab. + ls_line-tdline = 'Interface Line Doc'. + APPEND ls_line TO lt_lines. + + given_an_interface_properties( ). + + given_documentation_in_xml_as( lt_lines ). + + when_deserializing( ). + + then_docu_should_be_created( lt_lines ). + ENDMETHOD. +ENDCLASS. + +CLASS ltcl_class_changed DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + changed_by_call_get_includes FOR TESTING RAISING cx_static_check, + changed_since_call_get_include FOR TESTING RAISING cx_static_check. + +ENDCLASS. +CLASS ltcl_class_changed IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_fake_object_files. + CREATE OBJECT mo_spy_oo_object_functions. + CREATE OBJECT mo_xml_out. + lth_oo_factory_injector=>inject( mo_spy_oo_object_functions ). + + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zcl_class'. + ms_item-obj_type = 'CLAS'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_clas + EXPORTING + is_item = ms_item + iv_language = sy-langu. + mo_oo_object->mo_files = mo_fake_object_files. + ENDMETHOD. + METHOD changed_by_call_get_includes. + DATA lv_username TYPE xubname. + lv_username = mo_oo_object->changed_by( ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mv_get_includes_called + exp = abap_true ). + + cl_abap_unit_assert=>assert_equals( + act = lv_username + exp = lcl_objects_super=>c_user_unknown ). + ENDMETHOD. + METHOD changed_since_call_get_include. + DATA lv_timestamp TYPE timestamp. + GET TIME STAMP FIELD lv_timestamp. + mo_oo_object->has_changed_since( lv_timestamp ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mv_get_includes_called + exp = abap_true ). + ENDMETHOD. +ENDCLASS. +CLASS ltcl_interface_changed DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + changed_by_call_get_includes FOR TESTING RAISING cx_static_check, + changed_since_call_get_include FOR TESTING RAISING cx_static_check. +ENDCLASS. +CLASS ltcl_interface_changed IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_fake_object_files. + CREATE OBJECT mo_spy_oo_object_functions. + CREATE OBJECT mo_xml_out. + lth_oo_factory_injector=>inject( mo_spy_oo_object_functions ). + + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zif_interface'. + ms_item-obj_type = 'INTF'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_intf + EXPORTING + is_item = ms_item + iv_language = sy-langu. + mo_oo_object->mo_files = mo_fake_object_files. + ENDMETHOD. + METHOD changed_by_call_get_includes. + DATA lv_username TYPE xubname. + lv_username = mo_oo_object->changed_by( ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mv_get_includes_called + exp = abap_true ). + + cl_abap_unit_assert=>assert_equals( + act = lv_username + exp = lcl_objects_super=>c_user_unknown ). + ENDMETHOD. + METHOD changed_since_call_get_include. + DATA lv_timestamp TYPE timestamp. + GET TIME STAMP FIELD lv_timestamp. + mo_oo_object->has_changed_since( lv_timestamp ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mv_get_includes_called + exp = abap_true ). + ENDMETHOD. +ENDCLASS. + +CLASS ltcl_exists_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + class_exists FOR TESTING RAISING cx_static_check, + interface_exists FOR TESTING RAISING cx_static_check. +ENDCLASS. + +CLASS ltcl_exists_test IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_spy_oo_object_functions. + me->mo_spy_oo_object_functions->mv_exists = abap_true. + lth_oo_factory_injector=>inject( mo_spy_oo_object_functions ). + ENDMETHOD. + + METHOD class_exists. + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zcl_class'. + ms_item-obj_type = 'CLAS'. + CREATE OBJECT mo_oo_object TYPE lcl_object_clas + EXPORTING + is_item = ms_item + iv_language = sy-langu. + + cl_abap_unit_assert=>assert_equals( + act = mo_oo_object->exists( ) + exp = abap_true ). + cl_abap_unit_assert=>assert_equals( + act = me->mo_spy_oo_object_functions->mv_exists_called + exp = abap_true ). + ENDMETHOD. + + METHOD interface_exists. + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zif_interface'. + ms_item-obj_type = 'INTF'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_intf + EXPORTING + is_item = ms_item + iv_language = sy-langu. + + cl_abap_unit_assert=>assert_equals( + act = mo_oo_object->exists( ) + exp = abap_true ). + cl_abap_unit_assert=>assert_equals( + act = me->mo_spy_oo_object_functions->mv_exists_called + exp = abap_true ). + ENDMETHOD. +ENDCLASS. + +CLASS ltcl_serialize_class DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + teardown, + serialize_abap FOR TESTING RAISING cx_static_check, + no_existing_no_serialize FOR TESTING RAISING cx_static_check, + serialize_local_definitions FOR TESTING RAISING cx_static_check, + serialize_local_implementation FOR TESTING RAISING cx_static_check, + serialize_local_macros FOR TESTING RAISING cx_static_check, + serialize_test_classes FOR TESTING RAISING cx_static_check, + serialize_properties_to_xml FOR TESTING RAISING cx_static_check, + serialize_skipping_tests_xml FOR TESTING RAISING cx_static_check, + serialize_textpool FOR TESTING RAISING cx_static_check, + read_sotr_if_exception_class FOR TESTING RAISING cx_static_check, + do_not_read_sotr_regular_class FOR TESTING RAISING cx_static_check, + should_serialize_documentation FOR TESTING RAISING cx_static_check, + should_serialize_descriptions FOR TESTING RAISING cx_static_check. +ENDCLASS. + +CLASS ltcl_serialize_class IMPLEMENTATION. + + METHOD setup. + CREATE OBJECT mo_fake_object_files. + CREATE OBJECT mo_spy_oo_object_functions. + me->mo_spy_oo_object_functions->mv_exists = abap_true. + lth_oo_factory_injector=>inject( mo_spy_oo_object_functions ). + + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zcl_class'. + ms_item-obj_type = 'CLAS'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_clas + EXPORTING + is_item = ms_item + iv_language = sy-langu. + CREATE OBJECT mo_xml_out. + mo_oo_object->mo_files = mo_fake_object_files. + ENDMETHOD. + + METHOD serialize_abap. + DATA lt_abap_source TYPE ty_string_tt. + + APPEND 'a_source_line' TO me->mo_spy_oo_object_functions->mt_source. + + mo_oo_object->serialize( mo_xml_out ). + + should_serialize_with_obj_key( ). + + lt_abap_source = mo_fake_object_files->read_abap( ). + cl_abap_unit_assert=>assert_equals( + act = lt_abap_source + exp = me->mo_spy_oo_object_functions->mt_source ). + ENDMETHOD. + + METHOD serialize_local_definitions. + DATA lt_abap_source TYPE ty_string_tt. + + APPEND 'a_local_definition' TO me->mo_spy_oo_object_functions->mt_local_definitions. + + mo_oo_object->serialize( mo_xml_out ). + + should_serialize_with_obj_key( ). + + lt_abap_source = mo_fake_object_files->read_abap( iv_extra = 'locals_def' iv_error = abap_false ). + + cl_abap_unit_assert=>assert_equals( + act = lt_abap_source + exp = me->mo_spy_oo_object_functions->mt_local_definitions ). + ENDMETHOD. + + METHOD serialize_local_implementation. + DATA lt_abap_source TYPE ty_string_tt. + + APPEND 'a_local_implementation' TO me->mo_spy_oo_object_functions->mt_local_implementations. + + mo_oo_object->serialize( mo_xml_out ). + + should_serialize_with_obj_key( ). + + lt_abap_source = mo_fake_object_files->read_abap( iv_extra = 'locals_imp' iv_error = abap_false ). + + cl_abap_unit_assert=>assert_equals( + act = lt_abap_source + exp = me->mo_spy_oo_object_functions->mt_local_implementations ). + ENDMETHOD. + + METHOD serialize_local_macros. + DATA lt_abap_source TYPE ty_string_tt. + APPEND 'a_local_macro' TO me->mo_spy_oo_object_functions->mt_local_macros. + + mo_oo_object->serialize( mo_xml_out ). + + should_serialize_with_obj_key( ). + + lt_abap_source = mo_fake_object_files->read_abap( iv_extra = 'macros' iv_error = abap_false ). + + cl_abap_unit_assert=>assert_equals( + act = lt_abap_source + exp = me->mo_spy_oo_object_functions->mt_local_macros ). + ENDMETHOD. + + METHOD serialize_test_classes. + DATA lt_abap_source TYPE ty_string_tt. + APPEND 'a_local_test' TO me->mo_spy_oo_object_functions->mt_local_test_classes. + + mo_oo_object->serialize( mo_xml_out ). + + should_serialize_with_obj_key( ). + + lt_abap_source = mo_fake_object_files->read_abap( iv_extra = 'testclasses' iv_error = abap_false ). + + cl_abap_unit_assert=>assert_equals( + act = lt_abap_source + exp = me->mo_spy_oo_object_functions->mt_local_test_classes ). + ENDMETHOD. + + METHOD no_existing_no_serialize. + me->mo_spy_oo_object_functions->mv_exists = abap_false. + mo_oo_object->serialize( mo_xml_out ). + ENDMETHOD. + + + METHOD serialize_properties_to_xml. + DATA: + ls_expected_properties LIKE me->mo_spy_oo_object_functions->ms_class_properties, + ls_actual_properties LIKE me->mo_spy_oo_object_functions->ms_class_properties. + + me->mo_spy_oo_object_functions->ms_class_properties-clsname = ms_item-obj_name. + me->mo_spy_oo_object_functions->ms_class_properties-uuid = '123'. + me->mo_spy_oo_object_functions->ms_class_properties-author = 'author'. + me->mo_spy_oo_object_functions->ms_class_properties-createdon = '2016'. + me->mo_spy_oo_object_functions->ms_class_properties-changedby = 'other'. + me->mo_spy_oo_object_functions->ms_class_properties-changedon = '2017'. + me->mo_spy_oo_object_functions->ms_class_properties-r3release = '1'. + me->mo_spy_oo_object_functions->ms_class_properties-chgdanyby = 'other'. + me->mo_spy_oo_object_functions->ms_class_properties-chgdanyon = '2017'. + + mo_oo_object->serialize( mo_xml_out ). + + ls_expected_properties = me->mo_spy_oo_object_functions->ms_class_properties. + CLEAR: + ls_expected_properties-uuid, + ls_expected_properties-author, + ls_expected_properties-createdon, + ls_expected_properties-changedby, + ls_expected_properties-changedon, + ls_expected_properties-r3release, + ls_expected_properties-chgdanyby, + ls_expected_properties-chgdanyon. + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'VSEOCLASS' + CHANGING + cg_data = ls_actual_properties ). + cl_abap_unit_assert=>assert_equals( + act = ls_actual_properties + exp = ls_expected_properties ). + ENDMETHOD. + + METHOD serialize_skipping_tests_xml. + DATA: + ls_actual_properties LIKE me->mo_spy_oo_object_functions->ms_class_properties. + APPEND 'a_local_test' TO me->mo_spy_oo_object_functions->mt_local_test_classes. + me->mo_spy_oo_object_functions->mv_skip_test_classes = abap_true. + + me->mo_spy_oo_object_functions->ms_class_properties-clsname = ms_item-obj_name. + me->mo_spy_oo_object_functions->ms_class_properties-with_unit_tests = abap_true. + + mo_oo_object->serialize( mo_xml_out ). + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'VSEOCLASS' + CHANGING + cg_data = ls_actual_properties ). + cl_abap_unit_assert=>assert_equals( + act = ls_actual_properties-with_unit_tests + exp = abap_false ). + ENDMETHOD. + + METHOD serialize_textpool. + DATA: + ls_textpool TYPE textpool, + lt_actual_text_pool TYPE textpool_table. + ls_textpool-id = '1'. + ls_textpool-key = '1'. + APPEND ls_textpool TO mo_spy_oo_object_functions->mt_text_pool. + + mo_oo_object->serialize( mo_xml_out ). + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'TPOOL' + CHANGING + cg_data = lt_actual_text_pool ). + cl_abap_unit_assert=>assert_equals( + act = lt_actual_text_pool + exp = mo_spy_oo_object_functions->mt_text_pool ). + ENDMETHOD. + + METHOD read_sotr_if_exception_class. + DATA: + lt_sotr TYPE ty_sotr_tt, + lt_actual_sotr TYPE ty_sotr_tt, + ls_sotr LIKE LINE OF lt_sotr. + + me->mo_spy_oo_object_functions->ms_class_properties-category = seoc_category_exception. + + ls_sotr-header-concept = 'HEADER'. + APPEND ls_sotr TO lt_sotr. + + me->mo_spy_oo_object_functions->mt_sotr = lt_sotr. + + mo_oo_object->serialize( mo_xml_out ). + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'SOTR' + CHANGING + cg_data = lt_actual_sotr ). + cl_abap_unit_assert=>assert_equals( + act = lt_actual_sotr + exp = mo_spy_oo_object_functions->mt_sotr ). + ENDMETHOD. + + METHOD do_not_read_sotr_regular_class. + DATA: + lt_actual_sotr TYPE ty_sotr_tt. + + CLEAR: me->mo_spy_oo_object_functions->ms_class_properties-category. + + mo_oo_object->serialize( mo_xml_out ). + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'SOTR' + CHANGING + cg_data = lt_actual_sotr ). + cl_abap_unit_assert=>assert_initial( lt_actual_sotr ). + ENDMETHOD. + + METHOD should_serialize_documentation. + DATA: + lt_lines TYPE tlinetab, + lt_actual_lines TYPE tlinetab, + ls_line LIKE LINE OF lt_lines. + + ls_line-tdline = 'a_line'. + APPEND ls_line TO lt_lines. + + me->mo_spy_oo_object_functions->mt_docu_lines = lt_lines. + + mo_oo_object->serialize( mo_xml_out ). + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'LINES' + CHANGING + cg_data = lt_actual_lines ). + cl_abap_unit_assert=>assert_equals( + act = lt_actual_lines + exp = me->mo_spy_oo_object_functions->mt_docu_lines ). + ENDMETHOD. + + METHOD should_serialize_descriptions. + DATA: + lt_descriptions TYPE ty_seocompotx_tt, + lt_actual_descriptions TYPE ty_seocompotx_tt, + ls_description TYPE LINE OF ty_seocompotx_tt. + + ls_description-clsname = 'class'. + APPEND ls_description TO lt_descriptions. + + + me->mo_spy_oo_object_functions->mt_descriptions = lt_descriptions. + + mo_oo_object->serialize( mo_xml_out ). + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'DESCRIPTIONS' + CHANGING + cg_data = lt_actual_descriptions ). + cl_abap_unit_assert=>assert_equals( + act = lt_actual_descriptions + exp = me->mo_spy_oo_object_functions->mt_descriptions ). + ENDMETHOD. + + METHOD teardown. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mv_exists_called + exp = abap_true ). + ENDMETHOD. +ENDCLASS. + +CLASS ltcl_serialize_interface DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + teardown, + serialize_abap FOR TESTING RAISING cx_static_check, + no_existing_no_serialize FOR TESTING RAISING cx_static_check, + serialize_properties_to_xml FOR TESTING RAISING cx_static_check, + should_serialize_documentation FOR TESTING RAISING cx_static_check, + should_serialize_descriptions FOR TESTING RAISING cx_static_check. +ENDCLASS. + +CLASS ltcl_serialize_interface IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_fake_object_files. + CREATE OBJECT mo_spy_oo_object_functions. + me->mo_spy_oo_object_functions->mv_exists = abap_true. + lth_oo_factory_injector=>inject( mo_spy_oo_object_functions ). + + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zif_interface'. + ms_item-obj_type = 'INTF'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_intf + EXPORTING + is_item = ms_item + iv_language = sy-langu. + CREATE OBJECT mo_xml_out. + mo_oo_object->mo_files = mo_fake_object_files. + ENDMETHOD. + + METHOD serialize_abap. + DATA lt_abap_source TYPE ty_string_tt. + + APPEND 'a_source_line' TO me->mo_spy_oo_object_functions->mt_source. + + mo_oo_object->serialize( mo_xml_out ). + + should_serialize_with_obj_key( ). + + lt_abap_source = mo_fake_object_files->read_abap( ). + cl_abap_unit_assert=>assert_equals( + act = lt_abap_source + exp = me->mo_spy_oo_object_functions->mt_source ). + ENDMETHOD. + + METHOD no_existing_no_serialize. + me->mo_spy_oo_object_functions->mv_exists = abap_false. + mo_oo_object->serialize( mo_xml_out ). + ENDMETHOD. + + + METHOD serialize_properties_to_xml. + DATA: + ls_expected_properties LIKE me->mo_spy_oo_object_functions->ms_interface_properties, + ls_actual_properties LIKE me->mo_spy_oo_object_functions->ms_interface_properties. + + me->mo_spy_oo_object_functions->ms_interface_properties-clsname = ms_item-obj_name. + me->mo_spy_oo_object_functions->ms_interface_properties-uuid = '123'. + me->mo_spy_oo_object_functions->ms_interface_properties-author = 'author'. + me->mo_spy_oo_object_functions->ms_interface_properties-createdon = '2016'. + me->mo_spy_oo_object_functions->ms_interface_properties-changedby = 'other'. + me->mo_spy_oo_object_functions->ms_interface_properties-changedon = '2017'. + me->mo_spy_oo_object_functions->ms_interface_properties-r3release = '1'. + + mo_oo_object->serialize( mo_xml_out ). + + ls_expected_properties = me->mo_spy_oo_object_functions->ms_interface_properties. + CLEAR: + ls_expected_properties-uuid, + ls_expected_properties-author, + ls_expected_properties-createdon, + ls_expected_properties-changedby, + ls_expected_properties-changedon, + ls_expected_properties-r3release. + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'VSEOINTERF' + CHANGING + cg_data = ls_actual_properties ). + cl_abap_unit_assert=>assert_equals( + act = ls_actual_properties + exp = ls_expected_properties ). + ENDMETHOD. + METHOD should_serialize_documentation. + DATA: + lt_lines TYPE tlinetab, + lt_actual_lines TYPE tlinetab, + ls_line LIKE LINE OF lt_lines. + + ls_line-tdline = 'a_line'. + APPEND ls_line TO lt_lines. + + me->mo_spy_oo_object_functions->mt_docu_lines = lt_lines. + + mo_oo_object->serialize( mo_xml_out ). + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'LINES' + CHANGING + cg_data = lt_actual_lines ). + cl_abap_unit_assert=>assert_equals( + act = lt_actual_lines + exp = me->mo_spy_oo_object_functions->mt_docu_lines ). + ENDMETHOD. + + METHOD should_serialize_descriptions. + DATA: + lt_descriptions TYPE ty_seocompotx_tt, + lt_actual_descriptions TYPE ty_seocompotx_tt, + ls_description TYPE LINE OF ty_seocompotx_tt. + + ls_description-clsname = 'class'. + APPEND ls_description TO lt_descriptions. + + + me->mo_spy_oo_object_functions->mt_descriptions = lt_descriptions. + + mo_oo_object->serialize( mo_xml_out ). + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'DESCRIPTIONS' + CHANGING + cg_data = lt_actual_descriptions ). + cl_abap_unit_assert=>assert_equals( + act = lt_actual_descriptions + exp = me->mo_spy_oo_object_functions->mt_descriptions ). + ENDMETHOD. + METHOD teardown. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mv_exists_called + exp = abap_true ). + ENDMETHOD. +ENDCLASS. + +CLASS ltcl_delete_oo_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + class_delete FOR TESTING RAISING cx_static_check, + interface_delete FOR TESTING RAISING cx_static_check. +ENDCLASS. + +CLASS ltcl_delete_oo_test IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_spy_oo_object_functions. + me->mo_spy_oo_object_functions->mv_exists = abap_true. + lth_oo_factory_injector=>inject( mo_spy_oo_object_functions ). + ENDMETHOD. + + METHOD class_delete. + DATA ls_expected_delete_key TYPE seoclskey. + + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zcl_class'. + ms_item-obj_type = 'CLAS'. + CREATE OBJECT mo_oo_object TYPE lcl_object_clas + EXPORTING + is_item = ms_item + iv_language = sy-langu. + + mo_oo_object->delete( ). + + ls_expected_delete_key-clsname = ms_item-obj_name. + + cl_abap_unit_assert=>assert_equals( + act = me->mo_spy_oo_object_functions->ms_delete_key + exp = ls_expected_delete_key ). + ENDMETHOD. + + METHOD interface_delete. + DATA ls_expected_delete_key TYPE seoclskey. + + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zif_interface'. + ms_item-obj_type = 'INTF'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_intf + EXPORTING + is_item = ms_item + iv_language = sy-langu. + + mo_oo_object->delete( ). + + ls_expected_delete_key-clsname = ms_item-obj_name. + + cl_abap_unit_assert=>assert_equals( + act = me->mo_spy_oo_object_functions->ms_delete_key + exp = ls_expected_delete_key ). + ENDMETHOD. +ENDCLASS. diff --git a/src/zabapgit_unit_test_clas_intf.prog.xml b/src/zabapgit_unit_test_clas_intf.prog.xml new file mode 100644 index 000000000..b5b051403 --- /dev/null +++ b/src/zabapgit_unit_test_clas_intf.prog.xml @@ -0,0 +1,25 @@ + + + + + + ZABAPGIT_UNIT_TEST_CLAS_INTF + A + X + S + D$ + I + X + D$S + X + + + + R + Unit tests for classes and interfaces objecst + 45 + + + + + diff --git a/src/zabapgit_util.prog.abap b/src/zabapgit_util.prog.abap index 282848d42..55a455651 100644 --- a/src/zabapgit_util.prog.abap +++ b/src/zabapgit_util.prog.abap @@ -440,10 +440,22 @@ CLASS lcl_path IMPLEMENTATION. METHOD get_filename_from_syspath. - " filename | c:\filename | /dir/filename | \\server\filename - FIND FIRST OCCURRENCE OF REGEX '^(?:/(?:.+/)*|(?:\w:|\\)\\(?:.+\\)*)?([^\\/]+)$' - IN iv_path - SUBMATCHES rv_filename. + DATA: lv_split TYPE c LENGTH 1, + lv_index TYPE i, + lt_split TYPE TABLE OF string. + +" filename | c:\filename | /dir/filename | \\server\filename + IF iv_path CA '/'. + lv_split = '/'. + ELSE. + lv_split = '\'. + ENDIF. + + SPLIT iv_path AT lv_split INTO TABLE lt_split. + + lv_index = lines( lt_split ). + + READ TABLE lt_split INDEX lv_index INTO rv_filename. ENDMETHOD. " get_filename_from_syspath. @@ -535,13 +547,13 @@ CLASS lcl_diff DEFINITION FINAL. END OF c_diff. TYPES: BEGIN OF ty_diff, - new_line TYPE c LENGTH 6, - new TYPE string, - result TYPE c LENGTH 1, - old_line TYPE c LENGTH 6, - old TYPE string, - short TYPE abap_bool, - beacon TYPE i, + new_num TYPE c LENGTH 6, + new TYPE string, + result TYPE c LENGTH 1, + old_num TYPE c LENGTH 6, + old TYPE string, + short TYPE abap_bool, + beacon TYPE i, END OF ty_diff. TYPES: ty_diffs_tt TYPE STANDARD TABLE OF ty_diff WITH DEFAULT KEY. @@ -685,16 +697,16 @@ CLASS lcl_diff IMPLEMENTATION. LOOP AT mt_diff ASSIGNING . - -new_line = lv_new. - -old_line = lv_old. + -new_num = lv_new. + -old_num = lv_old. CASE -result. " Line nums WHEN c_diff-delete. lv_old = lv_old + 1. - CLEAR -new_line. + CLEAR -new_num. WHEN c_diff-insert. lv_new = lv_new + 1. - CLEAR -old_line. + CLEAR -old_num. WHEN OTHERS. lv_new = lv_new + 1. lv_old = lv_old + 1. @@ -760,9 +772,9 @@ CLASS lcl_diff IMPLEMENTATION. METHOD constructor. - DATA: lt_delta TYPE vxabapt255_tab, - lt_new TYPE abaptxt255_tab, - lt_old TYPE abaptxt255_tab. + DATA: lt_delta TYPE vxabapt255_tab, + lt_new TYPE abaptxt255_tab, + lt_old TYPE abaptxt255_tab. unpack( EXPORTING iv_new = iv_new @@ -828,10 +840,10 @@ CLASS lcl_diff IMPLEMENTATION. ENDCASE. ELSE. CLEAR ls_new. - READ TABLE it_new INTO ls_new INDEX lv_nindex. "#EC CI_SUBRC + READ TABLE it_new INTO ls_new INDEX lv_nindex. "#EC CI_SUBRC lv_nindex = lv_nindex + 1. CLEAR ls_old. - READ TABLE it_old INTO ls_old INDEX lv_oindex. "#EC CI_SUBRC + READ TABLE it_old INTO ls_old INDEX lv_oindex. "#EC CI_SUBRC lv_oindex = lv_oindex + 1. _append ls_new '' ls_old. ENDIF. @@ -1031,7 +1043,7 @@ CLASS lcl_log DEFINITION FINAL. count RETURNING VALUE(rv_count) TYPE i, to_html - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper, + RETURNING VALUE(ro_html) TYPE REF TO lcl_html, clear, has_rc "For unit tests mainly IMPORTING iv_rc TYPE balsort @@ -1057,16 +1069,14 @@ CLASS lcl_log IMPLEMENTATION. RETURN. ENDIF. - ro_html->add( '
' ). LOOP AT mt_log ASSIGNING . - CONCATENATE -msgv1 - -msgv2 - -msgv3 - -msgv4 INTO lv_string SEPARATED BY space. + CONCATENATE -msgv1 -msgv2 -msgv3 -msgv4 + INTO lv_string SEPARATED BY space. + ro_html->add( '' ). + ro_html->add_icon( iv_name = 'alert' iv_class = 'error' ). " warning CSS exists too ro_html->add( lv_string ). - ro_html->add( '
' ). + ro_html->add( '
' ). ENDLOOP. - ro_html->add( '
' ). ENDMETHOD. @@ -1110,4 +1120,4 @@ CLASS lcl_log IMPLEMENTATION. rv_yes = boolc( sy-subrc = 0 ). ENDMETHOD. "has_rc -ENDCLASS. \ No newline at end of file +ENDCLASS. diff --git a/src/zabapgit_util.prog.xml b/src/zabapgit_util.prog.xml index 8fc89ca26..c7068cc40 100644 --- a/src/zabapgit_util.prog.xml +++ b/src/zabapgit_util.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_UTIL A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_UTIL 21 - diff --git a/src/zabapgit_view_repo.prog.abap b/src/zabapgit_view_repo.prog.abap index e71d0064a..2a4a128be 100644 --- a/src/zabapgit_view_repo.prog.abap +++ b/src/zabapgit_view_repo.prog.abap @@ -2,8 +2,10 @@ *& Include ZABAPGIT_VIEW_REPO *&---------------------------------------------------------------------* -CLASS lcl_gui_view_repo_content DEFINITION FINAL INHERITING FROM lcl_gui_page_super. +CLASS lcl_gui_view_repo_content DEFINITION FINAL. PUBLIC SECTION. + INTERFACES lif_gui_page. + ALIASES render FOR lif_gui_page~render. CONSTANTS: BEGIN OF c_actions, change_dir TYPE string VALUE 'change_dir' ##NO_TEXT, @@ -12,9 +14,6 @@ CLASS lcl_gui_view_repo_content DEFINITION FINAL INHERITING FROM lcl_gui_page_su toggle_changes TYPE string VALUE 'toggle_changes' ##NO_TEXT, END OF c_actions. - METHODS: lif_gui_page~render REDEFINITION, - lif_gui_page~on_event REDEFINITION. - METHODS constructor IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key RAISING lcx_exception. @@ -31,21 +30,21 @@ CLASS lcl_gui_view_repo_content DEFINITION FINAL INHERITING FROM lcl_gui_page_su render_head_menu IMPORTING iv_lstate TYPE char1 iv_rstate TYPE char1 - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + RETURNING VALUE(ro_html) TYPE REF TO lcl_html RAISING lcx_exception, render_grid_menu - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + RETURNING VALUE(ro_html) TYPE REF TO lcl_html RAISING lcx_exception, render_item IMPORTING is_item TYPE lcl_repo_content_browser=>ty_repo_item - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + RETURNING VALUE(ro_html) TYPE REF TO lcl_html RAISING lcx_exception, render_item_files IMPORTING is_item TYPE lcl_repo_content_browser=>ty_repo_item - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper, + RETURNING VALUE(ro_html) TYPE REF TO lcl_html, render_item_command IMPORTING is_item TYPE lcl_repo_content_browser=>ty_repo_item - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper, + RETURNING VALUE(ro_html) TYPE REF TO lcl_html, get_item_class IMPORTING is_item TYPE lcl_repo_content_browser=>ty_repo_item RETURNING VALUE(rv_html) TYPE string, @@ -55,7 +54,7 @@ CLASS lcl_gui_view_repo_content DEFINITION FINAL INHERITING FROM lcl_gui_page_su render_empty_package RETURNING VALUE(rv_html) TYPE string, render_parent_dir - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + RETURNING VALUE(ro_html) TYPE REF TO lcl_html RAISING lcx_exception. METHODS: @@ -111,10 +110,16 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. lx_error TYPE REF TO lcx_exception, lv_lstate TYPE char1, lv_rstate TYPE char1, - lo_log TYPE REF TO lcl_log. + lv_max TYPE abap_bool, + lo_log TYPE REF TO lcl_log, + lo_settings TYPE REF TO lcl_settings, + lv_max_lines TYPE i. FIELD-SYMBOLS LIKE LINE OF lt_repo_items. + " Read global settings to get max # of objects to be listed + lo_settings = lcl_app=>settings( )->read( ). + lv_max_lines = lo_settings->get_max_lines( ). " Reinit, for the case of type change mo_repo = lcl_app=>repo_srv( )->get( mo_repo->get_key( ) ). @@ -141,7 +146,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. lo_log = lo_browser->get_log( ). IF mo_repo->is_offline( ) = abap_false AND lo_log->count( ) > 0. - ro_html->add( '
' ). + ro_html->add( '
' ). ro_html->add( lo_log->to_html( ) ). " shows eg. list of unsupported objects ro_html->add( '
' ). ENDIF. @@ -150,7 +155,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ro_html->add( render_grid_menu( ) ). " Repo content table - ro_html->add( '
LOCAL' ). + ro_html->add('LOCAL' ). IF lines( ms_files-local ) > 1. - ro_html->add_anchor( iv_txt = |{ lines( ms_files-local ) } diffs| - iv_act = |{ gc_action-go_diff }?key={ mo_repo->get_key( ) }| ). + ro_html->add_a( iv_txt = |{ lines( ms_files-local ) } diffs| + iv_act = |{ gc_action-go_diff }?key={ mo_repo->get_key( ) }| ). ENDIF. - ro_html->add('
Last changed by
add' ). - ro_html->add_anchor( iv_txt = 'diff' iv_act = |{ gc_action-go_diff }?{ lv_param }| ). + ro_html->add_a( iv_txt = 'diff' iv_act = |{ gc_action-go_diff }?{ lv_param }| ). ro_html->add( '{ lv_user }ignoreremove- ' ). mo_html->add( 'hello world' ). mo_html->add( '' && gc_newline && + ' hello world' && gc_newline && + '' ). mo_html->add( '' ). mo_html->add( '' && gc_newline && + ' ' && gc_newline && + '' ). mo_html->add( '' ). mo_html->add( '' && gc_newline && + ' ' && gc_newline && + '' ). mo_html->add( 'foo
bar' ). mo_html->add( '
' && gc_newline && + ' foo
bar' && gc_newline && + '
' ). + ro_html->add( '
' ). IF lcl_path=>is_root( mv_cur_dir ) = abap_false. ro_html->add( render_parent_dir( ) ). @@ -160,16 +165,29 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ro_html->add( render_empty_package( ) ). ELSE. LOOP AT lt_repo_items ASSIGNING . + IF lv_max_lines > 0 AND sy-tabix > lv_max_lines. + lv_max = abap_true. + EXIT. " current loop + ENDIF. ro_html->add( render_item( ) ). ENDLOOP. ENDIF. ro_html->add( '
' ). + + IF lv_max = abap_true. + IF lv_max_lines = 1. + ro_html->add( |Only 1 object shown in list (Set in Advanced > Settings )| ). + ELSE. + ro_html->add( |Only first { lv_max_lines } objects shown in list (Set in Advanced > Settings )| ). + ENDIF. + ENDIF. + ro_html->add( '' ). CATCH lcx_exception INTO lx_error. ro_html->add( render_head_menu( iv_lstate = lv_lstate iv_rstate = lv_rstate ) ). - ro_html->add( lcl_gui_page_super=>render_error( lx_error ) ). + ro_html->add( lcl_gui_chunk_lib=>render_error( ix_error = lx_error ) ). ENDTRY. ENDMETHOD. "lif_gui_page~render @@ -233,7 +251,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. lv_wp_opt = gc_html_opt-crossout. lv_pull_opt = gc_html_opt-crossout. ELSE. - lv_pull_opt = gc_html_opt-emphas. + lv_pull_opt = gc_html_opt-strong. ENDIF. " Build branch drop-down ======================== @@ -260,6 +278,10 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. iv_act = |{ gc_action-repo_remote_change }?{ lv_key }| ). lo_tb_advanced->add( iv_txt = 'Make off-line' iv_act = |{ gc_action-repo_remote_detach }?{ lv_key }| ). + IF iv_rstate IS INITIAL AND iv_lstate IS INITIAL. + lo_tb_advanced->add( iv_txt = 'Force stage' + iv_act = |{ gc_action-go_stage }?{ lv_key }| ). + ENDIF. ELSE. lo_tb_advanced->add( iv_txt = 'Make on-line' iv_act = |{ gc_action-repo_remote_attach }?{ lv_key }| ). @@ -283,12 +305,12 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. IF iv_lstate IS NOT INITIAL. " Something new at local lo_toolbar->add( iv_txt = 'Stage' iv_act = |{ gc_action-go_stage }?{ lv_key }| - iv_opt = gc_html_opt-emphas ). + iv_opt = gc_html_opt-strong ). ENDIF. IF iv_rstate IS NOT INITIAL OR iv_lstate IS NOT INITIAL. " Any changes lo_toolbar->add( iv_txt = 'Show diff' iv_act = |{ gc_action-go_diff }?key={ lv_key }| - iv_opt = gc_html_opt-emphas ). + iv_opt = gc_html_opt-strong ). ENDIF. CATCH lcx_exception ##NO_HANDLER. " authorization error or repository does not exist @@ -299,10 +321,10 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ELSE. lo_toolbar->add( iv_txt = 'Import ZIP' iv_act = |{ gc_action-zip_import }?{ lv_key }| - iv_opt = gc_html_opt-emphas ). + iv_opt = gc_html_opt-strong ). lo_toolbar->add( iv_txt = 'Export ZIP' iv_act = |{ gc_action-zip_export }?{ lv_key }| - iv_opt = gc_html_opt-emphas ). + iv_opt = gc_html_opt-strong ). ENDIF. lo_toolbar->add( iv_txt = 'Advanced' @@ -312,7 +334,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. " Render ========================================== ro_html->add( '
' ). - ro_html->add( '' ). + ro_html->add( '
' ). IF mv_show_folders = abap_true. ro_html->add( || ). @@ -321,7 +343,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ro_html->add( '' ). - ro_html->add( '
{ mv_cur_dir }' ). ro_html->add( lo_toolbar->render( ) ). ro_html->add( '
' ). + ro_html->add( '
' ). ro_html->add( '' ). @@ -349,17 +371,17 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. CASE is_item-obj_type. WHEN 'PROG' OR 'CLAS' OR 'FUGR'. - rv_html = ||. + rv_html = lcl_html=>icon( 'file-code/darkgrey' ). WHEN 'W3MI' OR 'W3HT'. - rv_html = ||. + rv_html = lcl_html=>icon( 'file-binary/darkgrey' ). WHEN ''. rv_html = space. " no icon WHEN OTHERS. - rv_html = ||. + rv_html = lcl_html=>icon( 'file/darkgrey' ). ENDCASE. IF is_item-is_dir = abap_true. - rv_html = ||. + rv_html = lcl_html=>icon( 'file-directory/darkgrey' ). ENDIF. ENDMETHOD. "get_item_icon @@ -436,7 +458,8 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ro_html->add( '
' ). ro_html->add( |{ is_item-changes } changes| ). - ro_html->add( render_item_state( iv1 = is_item-lstate iv2 = is_item-rstate ) ). + ro_html->add( lcl_gui_chunk_lib=>render_item_state( iv1 = is_item-lstate + iv2 = is_item-rstate ) ). ro_html->add( '
' ). ELSEIF is_item-changes > 0. @@ -448,9 +471,10 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ig_object = is_item ). ro_html->add( '
' ). - ro_html->add_anchor( iv_txt = |view diff ({ is_item-changes })| - iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ). - ro_html->add( render_item_state( iv1 = is_item-lstate iv2 = is_item-rstate ) ). + ro_html->add_a( iv_txt = |view diff ({ is_item-changes })| + iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ). + ro_html->add( lcl_gui_chunk_lib=>render_item_state( iv1 = is_item-lstate + iv2 = is_item-rstate ) ). ro_html->add( '
' ). ELSE. @@ -461,10 +485,10 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. lv_difflink = lcl_html_action_utils=>file_encode( iv_key = mo_repo->get_key( ) ig_file = ls_file ). - ro_html->add_anchor( - iv_txt = 'view diff' - iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ). - ro_html->add( render_item_state( iv1 = ls_file-lstate iv2 = ls_file-rstate ) ). + ro_html->add_a( iv_txt = 'view diff' + iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ). + ro_html->add( lcl_gui_chunk_lib=>render_item_state( iv1 = ls_file-lstate + iv2 = ls_file-rstate ) ). ELSE. ro_html->add( ' ' ). ENDIF. @@ -490,7 +514,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. CREATE OBJECT ro_html. ro_html->add( '' ). - ro_html->add( || ). + ro_html->add( |{ lcl_html=>icon( 'dir' ) }| ). ro_html->add( |{ build_dir_jump_link( '..' ) }| ). IF mo_repo->is_offline( ) = abap_false. ro_html->add( || ). " Dummy for online @@ -502,32 +526,27 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. METHOD build_dir_jump_link. DATA: lv_path TYPE string, - lv_encode TYPE string, - lo_html TYPE REF TO lcl_html_helper. + lv_encode TYPE string. lv_path = iv_path. REPLACE FIRST OCCURRENCE OF mv_cur_dir IN lv_path WITH ''. lv_encode = lcl_html_action_utils=>dir_encode( lv_path ). - CREATE OBJECT lo_html. - lo_html->add_anchor( iv_txt = lv_path iv_act = |{ c_actions-change_dir }?{ lv_encode }| ). - rv_html = lo_html->mv_html. + rv_html = lcl_html=>a( iv_txt = lv_path + iv_act = |{ c_actions-change_dir }?{ lv_encode }| ). ENDMETHOD. "build_dir_jump_link METHOD build_obj_jump_link. - DATA: lv_encode TYPE string, - lo_html TYPE REF TO lcl_html_helper. + DATA: lv_encode TYPE string. lv_encode = lcl_html_action_utils=>jump_encode( iv_obj_type = is_item-obj_type iv_obj_name = is_item-obj_name ). - CREATE OBJECT lo_html. - lo_html->add_anchor( iv_txt = |{ is_item-obj_name }| - iv_act = |{ gc_action-jump }?{ lv_encode }| ). - rv_html = lo_html->mv_html. + rv_html = lcl_html=>a( iv_txt = |{ is_item-obj_name }| + iv_act = |{ gc_action-jump }?{ lv_encode }| ). ENDMETHOD. "build_obj_jump_link -ENDCLASS. "lcl_gui_view_repo_content \ No newline at end of file +ENDCLASS. "lcl_gui_view_repo_content diff --git a/src/zabapgit_view_repo.prog.xml b/src/zabapgit_view_repo.prog.xml index 6da1c7449..2bf307e7f 100644 --- a/src/zabapgit_view_repo.prog.xml +++ b/src/zabapgit_view_repo.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_VIEW_REPO A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_VIEW_REPO 26 - diff --git a/src/zabapgit_view_tutorial.prog.abap b/src/zabapgit_view_tutorial.prog.abap index d7ea7f729..a73ca6806 100644 --- a/src/zabapgit_view_tutorial.prog.abap +++ b/src/zabapgit_view_tutorial.prog.abap @@ -2,18 +2,23 @@ *& Include ZABAPGIT_PAGE_TUTORIAL *&---------------------------------------------------------------------* -CLASS lcl_gui_view_tutorial DEFINITION FINAL INHERITING FROM lcl_gui_page_super. +CLASS lcl_gui_view_tutorial DEFINITION FINAL. PUBLIC SECTION. - METHODS lif_gui_page~render REDEFINITION. + INTERFACES lif_gui_page. + ALIASES render FOR lif_gui_page~render. PRIVATE SECTION. METHODS render_content - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. ENDCLASS. "lcl_gui_view_tutorial CLASS lcl_gui_view_tutorial IMPLEMENTATION. + METHOD lif_gui_page~on_event. + ev_state = gc_event_state-not_handled. + ENDMETHOD. " lif_gui_page~on_event. + METHOD lif_gui_page~render. CREATE OBJECT ro_html. @@ -33,33 +38,54 @@ CLASS lcl_gui_view_tutorial IMPLEMENTATION. _add '

Adding and cloning repos

'. _add '

    '. + _add `
  • To clone a remote repo (e.g. from github) click `. - ro_html->add_anchor( iv_txt = '+ Clone' iv_act = gc_action-repo_clone ). + ro_html->add_a( iv_txt = '+ Clone' iv_act = gc_action-repo_clone ). _add ' from the top menu. This will copy a remote repo to your system.
  • '. + _add `
  • To add a local package as a repo click `. - ro_html->add_anchor( iv_txt = '+ Offline' iv_act = gc_action-repo_newoffline ). + ro_html->add_a( iv_txt = '+ Offline' iv_act = gc_action-repo_newoffline ). _add ' from the top menu. This will track a repo which already exist in'. _add ' the system with abapGit. You''ll be able to attach it to remote origin'. _add ' or just serialize as a zip file
  • '. + + _add `
  • Go `. + ro_html->add_a( iv_txt = 'Explore' iv_act = gc_action-go_explore ). + _add ' to find projects using abapGit
  • '. + _add '

'. _add '

Repository list and favorites

'. _add '

    '. - _add '
  • To choose a repo press at the favorite bar.
  • '. - _add '
  • To favorite a repo click icon at repo toolbar.
  • '. + ro_html->add( |
  • To choose a repo press { + lcl_html=>icon( 'three-bars/blue' ) } at the favorite bar.
  • | ). + ro_html->add( |
  • To favorite a repo click { + lcl_html=>icon( 'star/darkgrey' ) } icon at repo toolbar.
  • | ). _add '

'. _add '

abapGit related repositories

'. _add '

    '. _add '
  • '. - ro_html->add_anchor( iv_txt = 'install abapGit repo' iv_act = gc_action-abapgit_install ). - _add ' - To keep abapGit up-to-date (or also to contribute) you need to'. - _add 'install it as a repository.
  • '. + IF lcl_services_abapgit=>is_installed( ) = abap_true. + _add 'abapGit installed in package '. + _add lcl_services_abapgit=>c_package_abapgit. + ELSE. + ro_html->add_a( iv_txt = 'install abapGit repo' iv_act = gc_action-abapgit_install ). + _add ' - To keep abapGit up-to-date (or also to contribute) you need to'. + _add 'install it as a repository.'. + ENDIF. + _add ''. _add '
  • '. - ro_html->add_anchor( iv_txt = 'install abapGit plugins' iv_act = gc_action-abapgit_install_pi ). - _add ' - you can also install plugins to extend supported object types
  • '. + IF lcl_services_abapgit=>is_installed_pi( ) = abap_true. + _add 'abapGit plugins installed in package '. + _add lcl_services_abapgit=>c_package_plugins. + ELSE. + ro_html->add_a( iv_txt = 'install abapGit plugins' iv_act = gc_action-abapgit_install_pi ). + _add ' - you can also install plugins to extend supported object types'. + ENDIF. + _add ''. _add '

'. ENDMETHOD. " render_content. -ENDCLASS. "lcl_gui_view_tutorial \ No newline at end of file +ENDCLASS. "lcl_gui_view_tutorial diff --git a/src/zabapgit_view_tutorial.prog.xml b/src/zabapgit_view_tutorial.prog.xml index d7ba73043..232ea0b98 100644 --- a/src/zabapgit_view_tutorial.prog.xml +++ b/src/zabapgit_view_tutorial.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_VIEW_TUTORIAL A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_PAGE_TUTORIAL 30 - diff --git a/src/zabapgit_xml.prog.abap b/src/zabapgit_xml.prog.abap index 824505338..9bf5db1dd 100644 --- a/src/zabapgit_xml.prog.abap +++ b/src/zabapgit_xml.prog.abap @@ -180,6 +180,9 @@ CLASS lcl_xml_output DEFINITION FINAL INHERITING FROM lcl_xml CREATE PUBLIC. RAISING lcx_exception, set_raw IMPORTING ii_raw TYPE REF TO if_ixml_element, + add_xml + IMPORTING iv_name TYPE clike + ii_xml TYPE REF TO if_ixml_element, render IMPORTING iv_normalize TYPE sap_bool DEFAULT abap_true is_metadata TYPE ty_metadata OPTIONAL @@ -219,6 +222,7 @@ CLASS lcl_xml_output IMPLEMENTATION. li_doc = cl_ixml=>create( )->create_document( ). CALL TRANSFORMATION id + OPTIONS initial_components = 'suppress' SOURCE (lt_stab) RESULT XML li_doc. @@ -230,7 +234,18 @@ CLASS lcl_xml_output IMPLEMENTATION. mi_xml_doc->get_root( )->append_child( li_doc->get_root( )->get_first_child( ) ). ENDIF. - ENDMETHOD. "add + ENDMETHOD. + + METHOD add_xml. + + DATA: li_element TYPE REF TO if_ixml_element. + + li_element = mi_xml_doc->create_element( iv_name ). + li_element->append_child( ii_xml ). + + mi_xml_doc->get_root( )->get_first_child( )->get_first_child( )->append_child( li_element ). + + ENDMETHOD. METHOD render. @@ -280,6 +295,7 @@ CLASS lcl_xml_input DEFINITION FINAL INHERITING FROM lcl_xml CREATE PUBLIC. RAISING lcx_exception, get_raw RETURNING VALUE(ri_raw) TYPE REF TO if_ixml_node, +* todo, add read_xml to match add_xml in lcl_xml_output get_metadata RETURNING VALUE(rs_metadata) TYPE ty_metadata. @@ -358,6 +374,7 @@ CLASS lcl_xml_pretty DEFINITION FINAL. CLASS-METHODS: print IMPORTING iv_xml TYPE string iv_ignore_errors TYPE abap_bool DEFAULT abap_true + iv_unpretty TYPE abap_bool DEFAULT abap_false RETURNING VALUE(rv_xml) TYPE string RAISING lcx_exception. @@ -378,14 +395,14 @@ CLASS lcl_xml_pretty IMPLEMENTATION. ASSERT NOT iv_xml IS INITIAL. - li_ixml = cl_ixml=>create( ). + li_ixml = cl_ixml=>create( ). li_xml_doc = li_ixml->create_document( ). li_stream_factory = li_ixml->create_stream_factory( ). - li_istream = li_stream_factory->create_istream_string( iv_xml ). - li_parser = li_ixml->create_parser( stream_factory = li_stream_factory - istream = li_istream - document = li_xml_doc ). + li_istream = li_stream_factory->create_istream_string( iv_xml ). + li_parser = li_ixml->create_parser( stream_factory = li_stream_factory + istream = li_istream + document = li_xml_doc ). li_parser->set_normalizing( abap_true ). IF li_parser->parse( ) <> 0. IF iv_ignore_errors = abap_true. @@ -398,15 +415,15 @@ CLASS lcl_xml_pretty IMPLEMENTATION. li_istream->close( ). - li_ostream = li_stream_factory->create_ostream_cstring( rv_xml ). + li_ostream = li_stream_factory->create_ostream_cstring( rv_xml ). li_renderer = li_ixml->create_renderer( ostream = li_ostream document = li_xml_doc ). - li_renderer->set_normalizing( abap_true ). + li_renderer->set_normalizing( boolc( iv_unpretty = abap_false ) ). li_renderer->render( ). ENDMETHOD. -ENDCLASS. \ No newline at end of file +ENDCLASS. diff --git a/src/zabapgit_xml.prog.xml b/src/zabapgit_xml.prog.xml index 3a2acf6a0..1d7df9bac 100644 --- a/src/zabapgit_xml.prog.xml +++ b/src/zabapgit_xml.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_XML A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_XML 20 - diff --git a/src/zabapgit_zip.prog.abap b/src/zabapgit_zip.prog.abap index 45667324e..b27607ed9 100644 --- a/src/zabapgit_zip.prog.abap +++ b/src/zabapgit_zip.prog.abap @@ -27,12 +27,12 @@ CLASS lcl_zip DEFINITION FINAL. PRIVATE SECTION. CLASS-METHODS file_upload - RETURNING value(rv_xstr) TYPE xstring + RETURNING VALUE(rv_xstr) TYPE xstring RAISING lcx_exception. CLASS-METHODS unzip_file IMPORTING iv_xstr TYPE xstring - RETURNING value(rt_files) TYPE ty_files_tt + RETURNING VALUE(rt_files) TYPE ty_files_tt RAISING lcx_exception. CLASS-METHODS normalize_path @@ -52,11 +52,11 @@ CLASS lcl_zip DEFINITION FINAL. CLASS-METHODS encode_files IMPORTING it_files TYPE ty_files_item_tt - RETURNING value(rv_xstr) TYPE xstring + RETURNING VALUE(rv_xstr) TYPE xstring RAISING lcx_exception. CLASS-METHODS get_message - RETURNING value(rv_message) TYPE string + RETURNING VALUE(rv_message) TYPE string RAISING lcx_exception. ENDCLASS. "lcl_zip DEFINITION @@ -341,12 +341,11 @@ CLASS lcl_zip IMPLEMENTATION. METHOD unzip_file. - DATA: lo_zip TYPE REF TO cl_abap_zip, - lv_xstr TYPE xstring, - lt_splice TYPE cl_abap_zip=>t_splice_entries. + DATA: lo_zip TYPE REF TO cl_abap_zip, + lv_data TYPE xstring. - FIELD-SYMBOLS: LIKE LINE OF lt_splice, - LIKE LINE OF rt_files. + FIELD-SYMBOLS: TYPE cl_abap_zip=>t_file, + LIKE LINE OF rt_files. CREATE OBJECT lo_zip. @@ -359,14 +358,13 @@ CLASS lcl_zip IMPLEMENTATION. lcx_exception=>raise( 'error from zip' ). ENDIF. - lt_splice = cl_abap_zip=>splice( iv_xstr ). + LOOP AT lo_zip->files ASSIGNING . - LOOP AT lt_splice ASSIGNING . lo_zip->get( EXPORTING - name = -name + name = -name IMPORTING - content = lv_xstr + content = lv_data EXCEPTIONS zip_index_error = 1 zip_decompression_error = 2 @@ -379,12 +377,12 @@ CLASS lcl_zip IMPLEMENTATION. filename( EXPORTING - iv_str = -name + iv_str = -name IMPORTING ev_path = -path ev_filename = -filename ). - -data = lv_xstr. + -data = lv_data. -sha1 = lcl_hash=>sha1( iv_type = gc_type-blob iv_data = -data ). @@ -406,25 +404,13 @@ CLASS lcl_zip IMPLEMENTATION. CREATE OBJECT lo_log. - lt_zip = io_repo->get_files_local( lo_log ). + lt_zip = io_repo->get_files_local( io_log = lo_log + it_filter = it_filter ). IF lo_log->count( ) > 0. lo_log->show( ). ENDIF. - IF lines( it_filter ) > 0. - LOOP AT lt_zip ASSIGNING . - lv_index = sy-tabix. - READ TABLE it_filter WITH KEY - object = -item-obj_type - obj_name = -item-obj_name - TRANSPORTING NO FIELDS. - IF sy-subrc <> 0. - DELETE lt_zip INDEX lv_index. - ENDIF. - ENDLOOP. - ENDIF. - file_download( iv_package = io_repo->get_package( ) iv_xstr = encode_files( lt_zip ) ). @@ -553,4 +539,4 @@ CLASS lcl_zip IMPLEMENTATION. ENDMETHOD. "export_package -ENDCLASS. "lcl_zip IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_zip IMPLEMENTATION diff --git a/src/zabapgit_zip.prog.xml b/src/zabapgit_zip.prog.xml index 8fea0a06e..6c9ce7fbe 100644 --- a/src/zabapgit_zip.prog.xml +++ b/src/zabapgit_zip.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_ZIP A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_ZIP 20 - diff --git a/src/zabapgit_zlib.prog.abap b/src/zabapgit_zlib.prog.abap index c22d67822..b0b128435 100644 --- a/src/zabapgit_zlib.prog.abap +++ b/src/zabapgit_zlib.prog.abap @@ -707,4 +707,4 @@ CLASS lcl_zlib IMPLEMENTATION. ENDMETHOD. "decompress -ENDCLASS. "lcl_zlib IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_zlib IMPLEMENTATION diff --git a/src/zabapgit_zlib.prog.xml b/src/zabapgit_zlib.prog.xml index a5e41f38d..fe4ce5f27 100644 --- a/src/zabapgit_zlib.prog.xml +++ b/src/zabapgit_zlib.prog.xml @@ -5,42 +5,16 @@ ZABAPGIT_ZLIB A - - X - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - E - - - 0000-00-00 - - 0000-00-00 - - X R - Include ZABAPGIT_ZLIB 21 -