Merge remote-tracking branch 'refs/remotes/larshp/master'

This commit is contained in:
Nuno Godinho 2017-02-07 15:16:50 +00:00
commit 63a938ffb2
228 changed files with 7385 additions and 6597 deletions

View File

@ -8,6 +8,19 @@ Legend
+ : added + : added
- : removed - : 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 2016-12-01 v1.24.0
------------------ ------------------
+ abap syntax highlighting + abap syntax highlighting

View File

@ -3,7 +3,7 @@ REPORT zabapgit LINE-SIZE 100.
* See http://www.abapgit.org * See http://www.abapgit.org
CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT 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) * The MIT License (MIT)
@ -53,6 +53,7 @@ INCLUDE zabapgit_stage.
INCLUDE zabapgit_git_helpers. INCLUDE zabapgit_git_helpers.
INCLUDE zabapgit_repo. INCLUDE zabapgit_repo.
INCLUDE zabapgit_stage_logic. INCLUDE zabapgit_stage_logic.
INCLUDE zabapgit_2fa.
INCLUDE zabapgit_http. INCLUDE zabapgit_http.
INCLUDE zabapgit_git. INCLUDE zabapgit_git.
INCLUDE zabapgit_objects. INCLUDE zabapgit_objects.

View File

@ -5,32 +5,10 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT</NAME> <NAME>ZABAPGIT</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL>S</DBAPL> <DBAPL>S</DBAPL>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>1</SUBC> <SUBC>1</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD/>
<FIXPT>X</FIXPT> <FIXPT>X</FIXPT>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME>D$S</LDBNAME> <LDBNAME>D$S</LDBNAME>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
@ -38,10 +16,8 @@
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>abapGit</ENTRY> <ENTRY>abapGit</ENTRY>
<LENGTH>7</LENGTH> <LENGTH>7</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -6,20 +6,13 @@
<TCODE>ZABAPGIT</TCODE> <TCODE>ZABAPGIT</TCODE>
<PGMNA>ZABAPGIT</PGMNA> <PGMNA>ZABAPGIT</PGMNA>
<DYPNO>1000</DYPNO> <DYPNO>1000</DYPNO>
<MENUE/>
<CINFO>gA==</CINFO> <CINFO>gA==</CINFO>
<ARBGB/>
</TSTC> </TSTC>
<TSTCC> <TSTCC>
<TCODE>ZABAPGIT</TCODE> <TCODE>ZABAPGIT</TCODE>
<S_WEBGUI>1</S_WEBGUI> <S_WEBGUI>1</S_WEBGUI>
<S_WIN32>X</S_WIN32> <S_WIN32>X</S_WIN32>
<S_PLATIN>X</S_PLATIN> <S_PLATIN>X</S_PLATIN>
<S_SERVICE/>
<S_PERVAS/>
<S_DUMMY/>
<S_DUMMY1/>
<S_DUMMY2/>
</TSTCC> </TSTCC>
<TSTCT> <TSTCT>
<SPRSL>E</SPRSL> <SPRSL>E</SPRSL>

792
src/zabapgit_2fa.prog.abap Normal file
View File

@ -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
"! <p>
"! 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.
"! </p>
"! <p>
"! <em>LCL_2FA_AUTHENTICATOR_REGISTRY</em> can be used to find a suitable implementation for a given
"! repository.
"! </p>
"! <p>
"! Using the <em>begin</em> and <em>end</em> 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 <em>authenticate</em> and
"! <em>delete_access_tokens</em>.
"! </p>
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 <em>LIF_2FA-AUTHENTICATOR</em> 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
"! <em>SUPPORTS_URL</em>
constructor IMPORTING iv_supported_url_regex TYPE clike.
PROTECTED SECTION.
CLASS-METHODS:
"! Helper method to raise class based exception after traditional exception was raised
"! <p>
"! <em>sy-msg...</em> must be set right before calling!
"! </p>
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: <lv_id> 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 <lv_id> WHERE table_line IS NOT INITIAL.
set_del_token_request( ii_request = li_http_client->request
iv_token_id = <lv_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_id> }': | &&
|{ 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 <em>LIF_2FA_AUTHENTICATOR</em> 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
"! <p>
"! 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.
"! </p>
"! @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: <lo_authenticator> LIKE LINE OF gt_registered_authenticators.
LOOP AT gt_registered_authenticators ASSIGNING <lo_authenticator>.
IF <lo_authenticator>->supports_url( iv_url ) = abap_true.
ro_authenticator = <lo_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.

25
src/zabapgit_2fa.prog.xml Normal file
View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_2FA</NAME>
<STATE>A</STATE>
<VARCL>X</VARCL>
<DBAPL>S</DBAPL>
<DBNA>D$</DBNA>
<SUBC>I</SUBC>
<FIXPT>X</FIXPT>
<LDBNAME>D$S</LDBNAME>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>ZABAPGIT_2FA</ENTRY>
<LENGTH>12</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_APP</NAME> <NAME>ZABAPGIT_APP</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_APP</ENTRY> <ENTRY>Include ZABAPGIT_APP</ENTRY>
<LENGTH>20</LENGTH> <LENGTH>20</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_APP_IMPL</NAME> <NAME>ZABAPGIT_APP_IMPL</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_APP_IMPL</ENTRY> <ENTRY>Include ZABAPGIT_APP_IMPL</ENTRY>
<LENGTH>25</LENGTH> <LENGTH>25</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -97,6 +97,9 @@ CLASS lcl_background IMPLEMENTATION.
APPEND lv_str TO lt_objects. APPEND lv_str TO lt_objects.
ENDLOOP. ENDLOOP.
SORT lt_objects AS TEXT.
DELETE ADJACENT DUPLICATES FROM lt_objects.
IF lines( lt_objects ) = 1. IF lines( lt_objects ) = 1.
rv_comment = |BG: { lv_str }|. rv_comment = |BG: { lv_str }|.
ELSE. ELSE.
@ -166,6 +169,8 @@ CLASS lcl_background IMPLEMENTATION.
METHOD run. METHOD run.
CONSTANTS: c_enq_type TYPE c LENGTH 12 VALUE 'BACKGROUND'.
DATA: lo_per TYPE REF TO lcl_persistence_background, DATA: lo_per TYPE REF TO lcl_persistence_background,
lo_repo TYPE REF TO lcl_repo_online, lo_repo TYPE REF TO lcl_repo_online,
lt_list TYPE lcl_persistence_background=>tt_background, lt_list TYPE lcl_persistence_background=>tt_background,
@ -174,6 +179,20 @@ CLASS lcl_background IMPLEMENTATION.
FIELD-SYMBOLS: <ls_list> LIKE LINE OF lt_list. FIELD-SYMBOLS: <ls_list> 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. CREATE OBJECT lo_per.
lt_list = lo_per->list( ). lt_list = lo_per->list( ).
@ -204,6 +223,10 @@ CLASS lcl_background IMPLEMENTATION.
WRITE: / 'Nothing configured' ##NO_TEXT. WRITE: / 'Nothing configured' ##NO_TEXT.
ENDIF. ENDIF.
CALL FUNCTION 'DEQUEUE_EZABAPGIT'
EXPORTING
type = c_enq_type.
ENDMETHOD. ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_BACKGROUND</NAME> <NAME>ZABAPGIT_BACKGROUND</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_BACKGROUND</ENTRY> <ENTRY>Include ZABAPGIT_BACKGROUND</ENTRY>
<LENGTH>27</LENGTH> <LENGTH>27</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -33,15 +33,24 @@ form input:focus, textarea:focus {
border: 1px solid #8cadd9; border: 1px solid #8cadd9;
} }
/* MODIFIERS */ /* COLOR PALETTE */
.grey { color: lightgrey !important; } .grey { color: lightgrey !important; }
.emphasis { font-weight: bold !important; } .darkgrey { color: #808080 !important; }
.attention { color: red !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; } .crossout { text-decoration: line-through !important; }
.right { text-align:right; } .right { text-align:right; }
.paddings { padding: 0.5em 0.5em; } .paddings { padding: 0.5em 0.5em; }
.pad-sides { padding: 0 0.3em; } .pad-sides { padding: 0 0.3em; }
.pad4px { padding: 4px; } .pad4px { padding: 4px; }
.w100 { width: 100%; }
.w40 { width: 40%; }
/* STRUCTURE DIVS, HEADER & FOOTER */ /* STRUCTURE DIVS, HEADER & FOOTER */
td.headpad { padding-top: 11px; } td.headpad { padding-top: 11px; }
@ -98,15 +107,41 @@ span.page_title {
padding-left: 0.4em; 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 */ /* MENU */
div.menu { display: inline; } div.menu { display: inline; }
div.menu .menu_end { border-right: 0px !important; } div.menu .menu_end { border-right: 0px !important; }
div.menu a { div.menu a {
padding-left: 0.5em; padding-left: 0.5em;
padding-right: 0.5em; padding-right: 0.5em;
border-right: 1px solid lightgrey;
font-size: 12pt; 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 { display: inline; }
div.menu_vertical a { div.menu_vertical a {
display: block; display: block;
@ -172,6 +207,7 @@ div.menu_vertical a {
.dropdown_content td { text-align: left; padding: 2px; } .dropdown_content td { text-align: left; padding: 2px; }
.dropdown_content td a { padding: 0em 0.2em; } .dropdown_content td a { padding: 0em 0.2em; }
.dropdown_content td.icon { padding: 0 3px 0 6px; } .dropdown_content td.icon { padding: 0 3px 0 6px; }
.dropdown_content td.text { width: 100%; }
.dropdown_content a:hover { background-color: #f1f1f1 } .dropdown_content a:hover { background-color: #f1f1f1 }
.dropdown:hover .dropbtn { color: #79a0d2; } .dropdown:hover .dropbtn { color: #79a0d2; }
@ -248,11 +284,12 @@ div.repo {
div.repo_container { div.repo_container {
position: relative; position: relative;
} }
.repo_tab { table.repo_tab {
border: 1px solid #DDD; border: 1px solid #DDD;
border-radius: 3px; border-radius: 3px;
background: #fff; background: #fff;
margin-top: 0.5em; margin-top: 0.5em;
width: 100%;
} }
.repo_tab td { .repo_tab td {
border-top: 1px solid #eee; border-top: 1px solid #eee;
@ -406,8 +443,8 @@ span.diff_banner {
padding-right: 0.3em; padding-right: 0.3em;
} }
.diff_ins { .diff_ins {
border-color: #7bea7b; border-color: #abf2ab;
background-color: #d3f8d3; background-color: #e0ffe0;
} }
.diff_del { .diff_del {
border-color: #ff667d; border-color: #ff667d;
@ -463,6 +500,7 @@ div.diff_head span.state-block span.none {
table.diff_tab { table.diff_tab {
font-family: Consolas, Courier, monospace; font-family: Consolas, Courier, monospace;
font-size: 10pt; font-size: 10pt;
width: 100%;
} }
table.diff_tab td,th { table.diff_tab td,th {
color: #444; color: #444;
@ -490,26 +528,41 @@ table.diff_tab thead.nav_line th {
color: #bbb; color: #bbb;
} }
table.diff_tab td.num, th.num { 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; color: #ccc;
border-left: 1px solid #eee; border-left: 1px solid #eee;
border-right: 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 { table.diff_tab code {
font-family: inherit; font-family: inherit;
white-space: pre; white-space: pre;
} }
table.diff_tab td.code {
table.diff_tab code span.keyword { color: #0a69ce; } word-wrap: break-word;
table.diff_tab code span.text { color: #48ce4f; } white-space: pre-wrap;
table.diff_tab code span.comment { color: #808080; font-style: italic; } overflow: visible;
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 tbody tr:first-child td { padding-top: 0.5em; } table.diff_tab tbody tr:first-child td { padding-top: 0.5em; }
table.diff_tab tbody tr:last-child td { padding-bottom: 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 */ /* DEBUG INFO STYLES */
div.debug_container { div.debug_container {
padding: 0.5em; padding: 0.5em;
@ -517,15 +570,17 @@ div.debug_container {
color: #444; color: #444;
font-family: Consolas, Courier, monospace; font-family: Consolas, Courier, monospace;
} }
div.debug_container p { div.debug_container p {
margin: 0px; margin: 0px;
} }
/* DB ENTRIES */ /* DB ENTRIES */
div.db_list { div.db_list {
background-color: #f2f2f2; background-color: #fff;
padding: 0.5em; padding: 0.5em;
} }
table.db_tab pre { table.db_tab pre {
display: inline-block; display: inline-block;
overflow: hidden; overflow: hidden;
@ -534,10 +589,11 @@ table.db_tab pre {
margin: 0px; margin: 0px;
width: 30em; width: 30em;
} }
table.db_tab tr.firstrow td { padding-top: 0.5em; } table.db_tab tr.firstrow td { padding-top: 0.5em; }
table.db_tab th { table.db_tab th {
color: #888888;
text-align: left; text-align: left;
color: #888;
padding: 0.5em; padding: 0.5em;
border-bottom: 1px #ddd solid; border-bottom: 1px #ddd solid;
} }
@ -551,24 +607,34 @@ table.db_tab td.data {
font-style: italic; font-style: italic;
} }
table.db_tab tbody tr:hover, tr:active {
background-color: #f4f4f4;
}
/* DB ENTRY DISPLAY */ /* DB ENTRY DISPLAY */
div.db_entry { div.db_entry {
background-color: #f2f2f2; background-color: #f2f2f2;
padding: 0.5em; padding: 0.5em;
} }
div.db_entry pre { div.db_entry pre {
display: block; display: block;
font-size: 10pt;
overflow: hidden; overflow: hidden;
word-wrap:break-word; word-wrap:break-word;
white-space: pre-wrap; white-space: pre-wrap;
background-color: #eaeaea; background-color: #fcfcfc;
border: 1px #eaeaea solid;
border-radius: 3px;
padding: 0.5em; padding: 0.5em;
margin: 0.5em 0em; margin: 0.5em 0em;
width: 50em; width: 60em;
} }
div.db_entry table.toolbar { div.db_entry table.toolbar {
width: 50em; width: 50em;
} }
table.tag { table.tag {
display: inline-block; display: inline-block;
border: 1px #b3c1cc solid; border: 1px #b3c1cc solid;

View File

@ -3,7 +3,7 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values> <asx:values>
<NAME>ZABAPGIT_CSS_COMMON</NAME> <NAME>ZABAPGIT_CSS_COMMON</NAME>
<TEXT>AbapGit common styles</TEXT> <TEXT>Abapgit common CSS</TEXT>
<PARAMS> <PARAMS>
<WWWPARAMS> <WWWPARAMS>
<RELID>MI</RELID> <RELID>MI</RELID>
@ -15,7 +15,7 @@
<RELID>MI</RELID> <RELID>MI</RELID>
<OBJID>ZABAPGIT_CSS_COMMON</OBJID> <OBJID>ZABAPGIT_CSS_COMMON</OBJID>
<NAME>filename</NAME> <NAME>filename</NAME>
<VALUE>~wwwtmp.css</VALUE> <VALUE>common.css</VALUE>
</WWWPARAMS> </WWWPARAMS>
<WWWPARAMS> <WWWPARAMS>
<RELID>MI</RELID> <RELID>MI</RELID>

View File

@ -14,8 +14,11 @@ TYPES: BEGIN OF ty_file_signature,
sha1 TYPE ty_sha1, sha1 TYPE ty_sha1,
END OF ty_file_signature. END OF ty_file_signature.
TYPES: ty_file_signatures_tt TYPE STANDARD TABLE OF ty_file_signature WITH DEFAULT KEY. TYPES: ty_file_signatures_tt TYPE STANDARD TABLE OF
TYPES: ty_file_signatures_ts TYPE SORTED TABLE OF ty_file_signature WITH UNIQUE KEY path filename. 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. TYPES: BEGIN OF ty_file.
INCLUDE TYPE ty_file_signature. 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_files_tt TYPE STANDARD TABLE OF ty_file WITH DEFAULT KEY.
TYPES: ty_string_tt TYPE STANDARD TABLE OF string 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, TYPES: BEGIN OF ty_comment,
username TYPE string, 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, TYPES: BEGIN OF ty_metadata,
class TYPE string, class TYPE string,
version TYPE string, version TYPE string,
late_deser TYPE string, late_deser TYPE abap_bool,
delete_tadir TYPE abap_bool, delete_tadir TYPE abap_bool,
ddic TYPE abap_bool,
END OF ty_metadata. END OF ty_metadata.
TYPES: BEGIN OF ty_web_asset, TYPES: BEGIN OF ty_web_asset,
@ -156,7 +159,7 @@ CONSTANTS: BEGIN OF gc_event_state,
END OF gc_event_state. END OF gc_event_state.
CONSTANTS: BEGIN OF gc_html_opt, CONSTANTS: BEGIN OF gc_html_opt,
emphas TYPE c VALUE 'E', strong TYPE c VALUE 'E',
cancel TYPE c VALUE 'C', cancel TYPE c VALUE 'C',
crossout TYPE c VALUE 'X', crossout TYPE c VALUE 'X',
END OF gc_html_opt. END OF gc_html_opt.
@ -224,6 +227,7 @@ CONSTANTS: BEGIN OF gc_action,
go_debuginfo TYPE string VALUE 'go_debuginfo', go_debuginfo TYPE string VALUE 'go_debuginfo',
go_settings TYPE string VALUE 'go_settings', go_settings TYPE string VALUE 'go_settings',
go_tutorial TYPE string VALUE 'go_tutorial', go_tutorial TYPE string VALUE 'go_tutorial',
jump TYPE string VALUE 'jump', jump TYPE string VALUE 'jump',
jump_pkg TYPE string VALUE 'jump_pkg', jump_pkg TYPE string VALUE 'jump_pkg',
END OF gc_action. END OF gc_action.

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_DEFINITIONS</NAME> <NAME>ZABAPGIT_DEFINITIONS</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_DEFINITIONS</ENTRY> <ENTRY>Include ZABAPGIT_DEFINITIONS</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_DOT_ABAPGIT</NAME> <NAME>ZABAPGIT_DOT_ABAPGIT</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_DOT_ABAPGIT</ENTRY> <ENTRY>Include ZABAPGIT_DOT_ABAPGIT</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_EXCEPTIONS</NAME> <NAME>ZABAPGIT_EXCEPTIONS</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_EXCEPTIONS</ENTRY> <ENTRY>Include ZABAPGIT_EXCEPTIONS</ENTRY>
<LENGTH>27</LENGTH> <LENGTH>27</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -21,7 +21,8 @@ CLASS lcl_file_status DEFINITION FINAL
PRIVATE SECTION. PRIVATE SECTION.
CLASS-METHODS calculate_status 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_remote TYPE ty_files_tt
it_cur_state TYPE ty_file_signatures_tt it_cur_state TYPE ty_file_signatures_tt
RETURNING VALUE(rt_results) TYPE ty_results_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 IMPORTING is_local TYPE ty_file_item
RETURNING VALUE(rs_result) TYPE ty_result, RETURNING VALUE(rs_result) TYPE ty_result,
build_new_remote 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_items TYPE ty_items_ts
it_state TYPE ty_file_signatures_ts it_state TYPE ty_file_signatures_ts
RETURNING VALUE(rs_result) TYPE ty_result, RETURNING VALUE(rs_result) TYPE ty_result,
@ -61,7 +63,9 @@ CLASS lcl_file_status IMPLEMENTATION.
rt_results = calculate_status( 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_remote = io_repo->get_files_remote( )
it_cur_state = io_repo->get_local_checksums_per_file( ) ). it_cur_state = io_repo->get_local_checksums_per_file( ) ).
@ -147,7 +151,8 @@ CLASS lcl_file_status IMPLEMENTATION.
" Process new remote files (marked above with empty SHA1) " Process new remote files (marked above with empty SHA1)
LOOP AT lt_remote ASSIGNING <ls_remote> WHERE sha1 IS NOT INITIAL. LOOP AT lt_remote ASSIGNING <ls_remote> WHERE sha1 IS NOT INITIAL.
APPEND INITIAL LINE TO rt_results ASSIGNING <ls_result>. APPEND INITIAL LINE TO rt_results ASSIGNING <ls_result>.
<ls_result> = build_new_remote( is_remote = <ls_remote> <ls_result> = build_new_remote( iv_devclass = iv_devclass
is_remote = <ls_remote>
it_items = lt_items_idx it_items = lt_items_idx
it_state = lt_state_idx ). it_state = lt_state_idx ).
ENDLOOP. ENDLOOP.
@ -170,6 +175,8 @@ CLASS lcl_file_status IMPLEMENTATION.
" Handle namespaces " Handle namespaces
REPLACE ALL OCCURRENCES OF '#' IN lv_name WITH '/'. 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. CLEAR es_item.
es_item-obj_type = lv_type. es_item-obj_type = lv_type.
@ -193,7 +200,8 @@ CLASS lcl_file_status IMPLEMENTATION.
" Match against current state " Match against current state
READ TABLE it_state INTO ls_file_sig 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. BINARY SEARCH.
IF sy-subrc = 0. IF sy-subrc = 0.
@ -203,7 +211,8 @@ CLASS lcl_file_status IMPLEMENTATION.
IF ls_file_sig-sha1 <> is_remote-sha1. IF ls_file_sig-sha1 <> is_remote-sha1.
rs_result-rstate = gc_state-modified. rs_result-rstate = gc_state-modified.
ENDIF. 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. ELSE.
" This is a strange situation. As both local and remote exist " 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. " 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. ENDIF.
" Item is in state and in cache but with no package - it was deleted " 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-match = abap_false.
rs_result-lstate = gc_state-deleted. rs_result-lstate = gc_state-deleted.
ENDIF. ENDIF.

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_FILE_STATUS</NAME> <NAME>ZABAPGIT_FILE_STATUS</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_FILE_STATUS</ENTRY> <ENTRY>Include ZABAPGIT_FILE_STATUS</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -53,7 +53,8 @@ FORM branch_popup TABLES tt_fields TYPE ty_sval_tt
DATA: lv_url TYPE string, DATA: lv_url TYPE string,
lx_error TYPE REF TO lcx_exception, lx_error TYPE REF TO lcx_exception,
ls_package_data TYPE scompkdtln, 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: <ls_furl> LIKE LINE OF tt_fields, FIELD-SYMBOLS: <ls_furl> LIKE LINE OF tt_fields,
<ls_fbranch> LIKE LINE OF tt_fields. <ls_fbranch> LIKE LINE OF tt_fields.
@ -88,24 +89,9 @@ FORM branch_popup TABLES tt_fields TYPE ty_sval_tt
ELSEIF pv_code = 'COD2'. ELSEIF pv_code = 'COD2'.
cv_show_popup = abap_true. cv_show_popup = abap_true.
CALL FUNCTION 'FUNCTION_EXISTS' lcl_popups=>popup_to_create_package( IMPORTING es_package_data = ls_package_data
EXPORTING ev_create = lv_create ).
funcname = 'PB_POPUP_PACKAGE_CREATE' IF lv_create = abap_false.
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.
RETURN. RETURN.
ENDIF. ENDIF.
@ -119,6 +105,38 @@ FORM branch_popup TABLES tt_fields TYPE ty_sval_tt
ENDFORM. "branch_popup 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: <ls_fbranch> 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 <ls_fbranch> WITH KEY tabname = 'TDEVC'.
ASSERT sy-subrc = 0.
<ls_fbranch>-value = ls_package_data-devclass.
ENDIF.
ENDFORM. "package_popup
FORM output. FORM output.
DATA: lt_ucomm TYPE TABLE OF sy-ucomm. DATA: lt_ucomm TYPE TABLE OF sy-ucomm.
PERFORM set_pf_status IN PROGRAM rsdbrunt IF FOUND. PERFORM set_pf_status IN PROGRAM rsdbrunt IF FOUND.

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_FORMS</NAME> <NAME>ZABAPGIT_FORMS</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_FORMS</ENTRY> <ENTRY>Include ZABAPGIT_FORMS</ENTRY>
<LENGTH>22</LENGTH> <LENGTH>22</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -261,6 +261,8 @@ CLASS lcl_git_transport IMPLEMENTATION.
lcx_exception=>raise( 'unpack not ok' ). lcx_exception=>raise( 'unpack not ok' ).
ELSEIF lv_string CP '*pre-receive hook declined*'. ELSEIF lv_string CP '*pre-receive hook declined*'.
lcx_exception=>raise( 'pre-receive hook declined' ). lcx_exception=>raise( 'pre-receive hook declined' ).
ELSEIF lv_string CP '*funny refname*'.
lcx_exception=>raise( 'funny refname' ).
ENDIF. ENDIF.
ENDMETHOD. "receive_pack ENDMETHOD. "receive_pack
@ -337,7 +339,8 @@ CLASS lcl_git_transport IMPLEMENTATION.
LOOP AT lt_branches FROM 1 ASSIGNING <ls_branch>. LOOP AT lt_branches FROM 1 ASSIGNING <ls_branch>.
IF sy-tabix = 1. 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' && ` ` && <ls_branch>-sha1 lv_line = 'want' && ` ` && <ls_branch>-sha1
&& ` ` && lv_capa && gc_newline. "#EC NOTEXT && ` ` && lv_capa && gc_newline. "#EC NOTEXT
ELSE. ELSE.
@ -348,14 +351,16 @@ CLASS lcl_git_transport IMPLEMENTATION.
ENDLOOP. ENDLOOP.
IF iv_deepen = abap_true. 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. ENDIF.
lv_buffer = lv_buffer lv_buffer = lv_buffer
&& '0000' && '0000'
&& '0009done' && gc_newline. && '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 parse( IMPORTING ev_pack = lv_pack
CHANGING cv_data = lv_xstring ). CHANGING cv_data = lv_xstring ).

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_GIT</NAME> <NAME>ZABAPGIT_GIT</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_GIT</ENTRY> <ENTRY>Include ZABAPGIT_GIT</ENTRY>
<LENGTH>20</LENGTH> <LENGTH>20</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -111,7 +111,7 @@ CLASS lcl_git_branch_list DEFINITION FINAL.
tag TYPE ty_git_branch_type VALUE 'TG', tag TYPE ty_git_branch_type VALUE 'TG',
other TYPE ty_git_branch_type VALUE 'ZZ', other TYPE ty_git_branch_type VALUE 'ZZ',
END OF c_type. END OF c_type.
CONSTANTS head_name TYPE string VALUE 'HEAD'. CONSTANTS c_head_name TYPE string VALUE 'HEAD'.
METHODS constructor METHODS constructor
IMPORTING iv_data TYPE string IMPORTING iv_data TYPE string
@ -126,6 +126,9 @@ CLASS lcl_git_branch_list DEFINITION FINAL.
RETURNING VALUE(rs_branch) TYPE ty_git_branch RETURNING VALUE(rs_branch) TYPE ty_git_branch
RAISING lcx_exception. RAISING lcx_exception.
METHODS get_head_symref
RETURNING VALUE(rv_head_symref) TYPE string.
METHODS get_branches_only METHODS get_branches_only
RETURNING VALUE(rt_branches) TYPE ty_git_branch_list_tt RETURNING VALUE(rt_branches) TYPE ty_git_branch_list_tt
RAISING lcx_exception. RAISING lcx_exception.
@ -150,6 +153,10 @@ CLASS lcl_git_branch_list DEFINITION FINAL.
IMPORTING iv_branch_name TYPE clike IMPORTING iv_branch_name TYPE clike
RETURNING VALUE(rv_name) TYPE string. 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. PRIVATE SECTION.
DATA mt_branches TYPE ty_git_branch_list_tt. DATA mt_branches TYPE ty_git_branch_list_tt.
DATA mv_head_symref TYPE string. DATA mv_head_symref TYPE string.
@ -178,6 +185,10 @@ CLASS lcl_git_branch_list IMPLEMENTATION.
ev_head_symref = me->mv_head_symref ). ev_head_symref = me->mv_head_symref ).
ENDMETHOD. "create ENDMETHOD. "create
METHOD get_head_symref.
rv_head_symref = mv_head_symref.
ENDMETHOD. " get_head_symref.
METHOD find_by_name. METHOD find_by_name.
IF iv_branch_name IS INITIAL. IF iv_branch_name IS INITIAL.
@ -197,7 +208,7 @@ CLASS lcl_git_branch_list IMPLEMENTATION.
IF mv_head_symref IS NOT INITIAL. IF mv_head_symref IS NOT INITIAL.
rs_branch = find_by_name( mv_head_symref ). rs_branch = find_by_name( mv_head_symref ).
ELSE. ELSE.
rs_branch = find_by_name( head_name ). rs_branch = find_by_name( c_head_name ).
ENDIF. ENDIF.
ENDMETHOD. "get_head ENDMETHOD. "get_head
@ -246,7 +257,7 @@ CLASS lcl_git_branch_list IMPLEMENTATION.
<ls_branch>-name = lv_name. <ls_branch>-name = lv_name.
<ls_branch>-display_name = get_display_name( lv_name ). <ls_branch>-display_name = get_display_name( lv_name ).
<ls_branch>-type = get_type( lv_name ). <ls_branch>-type = get_type( lv_name ).
IF <ls_branch>-name = head_name OR <ls_branch>-name = ev_head_symref. IF <ls_branch>-name = c_head_name OR <ls_branch>-name = ev_head_symref.
<ls_branch>-is_head = abap_true. <ls_branch>-is_head = abap_true.
ENDIF. ENDIF.
ENDLOOP. ENDLOOP.
@ -295,7 +306,7 @@ CLASS lcl_git_branch_list IMPLEMENTATION.
METHOD get_type. METHOD get_type.
rv_type = c_type-other. 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. rv_type = c_type-branch.
RETURN. RETURN.
ENDIF. ENDIF.
@ -334,4 +345,11 @@ CLASS lcl_git_branch_list IMPLEMENTATION.
ENDLOOP. ENDLOOP.
ENDMETHOD. "get_tags_only ENDMETHOD. "get_tags_only
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 ENDCLASS. "lcl_git_branch_list

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_GIT_HELPERS</NAME> <NAME>ZABAPGIT_GIT_HELPERS</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_GIT_HELPERS</ENTRY> <ENTRY>Include ZABAPGIT_GIT_HELPERS</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -251,9 +251,11 @@ CLASS lcl_gui IMPLEMENTATION.
METHOD render. 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 ). mo_html_viewer->show_url( lv_url ).

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_GUI</NAME> <NAME>ZABAPGIT_GUI</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_GUI</ENTRY> <ENTRY>Include ZABAPGIT_GUI</ENTRY>
<LENGTH>20</LENGTH> <LENGTH>20</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -13,6 +13,9 @@ CLASS lcl_gui_asset_manager DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_gui.
METHODS get_images METHODS get_images
RETURNING VALUE(rt_images) TYPE tt_web_assets. RETURNING VALUE(rt_images) TYPE tt_web_assets.
CLASS-METHODS get_webfont_link
RETURNING VALUE(rv_link) TYPE string.
PRIVATE SECTION. PRIVATE SECTION.
METHODS get_inline_asset METHODS get_inline_asset
@ -108,11 +111,7 @@ CLASS lcl_gui_asset_manager IMPLEMENTATION.
TABLES TABLES
binary_tab = lt_w3mime binary_tab = lt_w3mime
EXCEPTIONS EXCEPTIONS
failed = 1. failed = 1 ##FM_SUBRC_OK.
IF sy-subrc IS NOT INITIAL.
RETURN.
ENDIF.
ENDMETHOD. " get_mime_asset. ENDMETHOD. " get_mime_asset.
@ -145,6 +144,7 @@ CLASS lcl_gui_asset_manager IMPLEMENTATION.
DATA: lt_data TYPE ty_string_tt, DATA: lt_data TYPE ty_string_tt,
lv_str TYPE string. lv_str TYPE string.
CASE iv_asset_name. CASE iv_asset_name.
WHEN 'CSS_COMMON'. WHEN 'CSS_COMMON'.
" @@abapmerge include zabapgit_css_common.w3mi.data.css > _inline '$$'. " @@abapmerge include zabapgit_css_common.w3mi.data.css > _inline '$$'.
@ -255,160 +255,15 @@ CLASS lcl_gui_asset_manager IMPLEMENTATION.
&& 'cpUAAAAASUVORK5CYII='. && 'cpUAAAAASUVORK5CYII='.
APPEND ls_image TO rt_images. 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. ENDMETHOD. " get_inline_images.
METHOD get_webfont_link.
rv_link = '<link rel="stylesheet"'
&& ' type="text/css" href="'
&& 'https://cdnjs.cloudflare.com/ajax/libs/octicons/4.4.0/font/octicons.min.css'
&& '">'. "#EC NOTEXT
ENDMETHOD. " get_webfont_link
ENDCLASS. "lcl_gui_asset_manager ENDCLASS. "lcl_gui_asset_manager

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_GUI_ASSET_MANAGER</NAME> <NAME>ZABAPGIT_GUI_ASSET_MANAGER</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_GUI_ASSET_MANAGER</ENTRY> <ENTRY>Include ZABAPGIT_GUI_ASSET_MANAGER</ENTRY>
<LENGTH>34</LENGTH> <LENGTH>34</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -4,17 +4,18 @@
* All UI pages * All UI pages
* Super class * Super class & common html chunks
INCLUDE zabapgit_html_chunks.
INCLUDE zabapgit_page. INCLUDE zabapgit_page.
* Utils and helpers * Utils and helpers
INCLUDE zabapgit_html_action_utils. INCLUDE zabapgit_html_action_utils.
INCLUDE zabapgit_repo_browser_util. INCLUDE zabapgit_repo_browser_util.
INCLUDE zabapgit_syntax_highlighter.
* Components and templates * Components and templates
INCLUDE zabapgit_view_repo. INCLUDE zabapgit_view_repo.
INCLUDE zabapgit_view_tutorial. INCLUDE zabapgit_view_tutorial.
INCLUDE zabapgit_syntax_highlighter.
* Pages * Pages
INCLUDE zabapgit_page_commit. INCLUDE zabapgit_page_commit.

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_GUI_PAGES</NAME> <NAME>ZABAPGIT_GUI_PAGES</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_GUI_PAGES</ENTRY> <ENTRY>Include ZABAPGIT_GUI_PAGES</ENTRY>
<LENGTH>26</LENGTH> <LENGTH>26</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_GUI_ROUTER</NAME> <NAME>ZABAPGIT_GUI_ROUTER</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_GUI_ROUTER</ENTRY> <ENTRY>Include ZABAPGIT_GUI_ROUTER</ENTRY>
<LENGTH>27</LENGTH> <LENGTH>27</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -7,59 +7,126 @@ DEFINE _add.
END-OF-DEFINITION. 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. PUBLIC SECTION.
CONSTANTS: c_indent_size TYPE i VALUE 2. CONSTANTS: c_indent_size TYPE i VALUE 2.
DATA mv_html TYPE string READ-ONLY. CLASS-METHODS class_constructor.
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.
METHODS reset. 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 METHODS add_a
IMPORTING
iv_txt TYPE string
iv_act TYPE string iv_act TYPE string
iv_opt TYPE clike OPTIONAL
iv_typ TYPE char1 DEFAULT gc_action_type-sapevent iv_typ TYPE char1 DEFAULT gc_action_type-sapevent
iv_opt TYPE clike OPTIONAL
iv_class TYPE string OPTIONAL iv_class TYPE string OPTIONAL
iv_id TYPE string OPTIONAL iv_id TYPE string OPTIONAL
iv_style 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. PRIVATE SECTION.
METHODS _add_str IMPORTING iv_str TYPE csequence. CLASS-DATA go_single_tags_re TYPE REF TO cl_abap_regex.
METHODS _add_htm IMPORTING io_html TYPE REF TO lcl_html_helper. 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. 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. FIELD-SYMBOLS: <tab> TYPE string_table,
WHEN cl_abap_typedescr=>typekind_char <str> LIKE LINE OF <tab>.
OR cl_abap_typedescr=>typekind_string.
IF strlen( iv_chunk ) = 0. DESCRIBE FIELD iv_chunk TYPE lv_type. " Describe is faster than RTTI classes
RETURN.
ENDIF. CASE lv_type.
_add_str( iv_chunk ). WHEN 'C' OR 'g'. " Char or string
WHEN cl_abap_typedescr=>typekind_oref. APPEND iv_chunk TO mt_buffer.
WHEN 'h'. " Table
ASSIGN iv_chunk TO <tab>. " Assuming table of strings ! Will dump otherwise
APPEND LINES OF <tab> TO mt_buffer.
WHEN 'r'. " Object ref
ASSERT iv_chunk IS BOUND. " Dev mistake ASSERT iv_chunk IS BOUND. " Dev mistake
TRY. TRY.
lo_html ?= iv_chunk. lo_html ?= iv_chunk.
CATCH cx_sy_move_cast_error. CATCH cx_sy_move_cast_error.
ASSERT 1 = 0. " Dev mistake ASSERT 1 = 0. " Dev mistake
ENDTRY. ENDTRY.
_add_htm( lo_html ). APPEND LINES OF lo_html->mt_buffer TO mt_buffer.
WHEN OTHERS. WHEN OTHERS.
ASSERT 1 = 0. " Dev mistake ASSERT 1 = 0. " Dev mistake
ENDCASE. ENDCASE.
@ -67,85 +134,158 @@ CLASS lcl_html_helper IMPLEMENTATION.
ENDMETHOD. " add ENDMETHOD. " add
METHOD reset. METHOD reset.
CLEAR: me->mv_html, me->mv_indent. CLEAR me->mt_buffer.
ENDMETHOD. "reset ENDMETHOD. "reset
METHOD _add_str. METHOD is_empty.
CONSTANTS lc_single_tags_re TYPE string " HTML5 singleton tags rv_yes = boolc( lines( mt_buffer ) = 0 ).
VALUE '<(area|base|br|col|command|embed|hr|img|input|link|meta|param|source|!)'. ENDMETHOD. "is_empty
DATA lv_tags TYPE i. METHOD class_constructor.
DATA lv_tags_open TYPE i. CREATE OBJECT go_single_tags_re
DATA lv_tags_close TYPE i. EXPORTING
DATA lv_tags_single TYPE i. pattern = '<(AREA|BASE|BR|COL|COMMAND|EMBED|HR|IMG|INPUT|LINK|META|PARAM|SOURCE|!)'
DATA lv_close_offs TYPE i. ignore_case = abap_false.
DATA lv_shift_back TYPE i. ENDMETHOD. "class_constructor
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.
FIND FIRST OCCURRENCE OF '</' IN iv_str MATCH OFFSET lv_close_offs. METHOD study_line.
IF sy-subrc = 0 AND lv_close_offs = 0 AND mv_indent > 0. " Found close tag @beginning
lv_shift_back = 1. 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) = '</SCRIPT'.
rs_result-script_close = abap_true.
ELSEIF is_context-within_style = abap_true AND lv_len >= 7 AND lv_line(7) = '</STYLE'.
rs_result-style_close = abap_true.
ENDIF. ENDIF.
FIND FIRST OCCURRENCE OF '}' IN iv_str MATCH OFFSET lv_close_offs. " Find close } @beginning IF is_context-no_indent_jscss = abap_false.
IF ( mv_within_style > 0 OR mv_within_js > 0 ) IF lv_len >= 1 AND lv_line(1) = '}'.
AND sy-subrc = 0 AND lv_close_offs = 0 AND mv_indent > 0. rs_result-curly_close = abap_true.
lv_shift_back = 1.
ENDIF. ENDIF.
mv_html = mv_html FIND ALL OCCURRENCES OF '{' IN lv_line MATCH COUNT rs_result-openings.
&& repeat( val = ` ` occ = ( mv_indent - lv_shift_back ) * c_indent_size ) FIND ALL OCCURRENCES OF '}' IN lv_line MATCH COUNT rs_result-closings.
&& 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_tags_close.
FIND ALL OCCURRENCES OF REGEX lc_single_tags_re IN iv_str MATCH COUNT lv_tags_single.
lv_tags_open = lv_tags - lv_tags_close - lv_tags_single.
FIND ALL OCCURRENCES OF '<style' IN iv_str MATCH COUNT lv_style_tag_open IGNORING CASE.
FIND ALL OCCURRENCES OF '</style>' 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 '<script' IN iv_str MATCH COUNT lv_js_tag_open IGNORING CASE.
FIND ALL OCCURRENCES OF '</script>' 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. ENDIF.
ELSE.
IF lv_len >= 7 AND lv_line(7) = '<SCRIPT'.
FIND FIRST OCCURRENCE OF '</SCRIPT' IN lv_line.
IF sy-subrc > 0. " Not found
rs_result-script_open = abap_true.
ENDIF.
ENDIF.
IF lv_len >= 6 AND lv_line(6) = '<STYLE'.
FIND FIRST OCCURRENCE OF '</STYLE' IN lv_line.
IF sy-subrc > 0. " Not found
rs_result-style_open = abap_true.
ENDIF.
ENDIF.
IF lv_len >= 2 AND lv_line(2) = '</'.
rs_result-tag_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.
FIND ALL OCCURRENCES OF REGEX go_single_tags_re IN lv_line MATCH COUNT rs_result-singles.
rs_result-openings = rs_result-openings - rs_result-closings - rs_result-singles.
ENDIF.
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.
" 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 '<a><b>' " More-less logic chosen due to possible double tags in a line '<a><b>'
IF lv_tags_open > lv_tags_close. IF ls_study-openings <> ls_study-closings.
mv_indent = mv_indent + 1. IF ls_study-openings > ls_study-closings.
ELSEIF lv_tags_open < lv_tags_close AND mv_indent > 0. cs_context-indent = cs_context-indent + 1.
mv_indent = mv_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. ENDIF.
ENDMETHOD. "_add_str ENDMETHOD. "indent_line
METHOD _add_htm. METHOD render.
DATA lt_strtab TYPE TABLE OF string. DATA: ls_context TYPE ty_indent_context,
DATA lv_str TYPE string. lt_temp TYPE string_table.
SPLIT io_html->mv_html AT gc_newline INTO TABLE lt_strtab. FIELD-SYMBOLS: <line> LIKE LINE OF lt_temp,
LOOP AT lt_strtab INTO lv_str. <line_c> LIKE LINE OF lt_temp.
SHIFT lv_str LEFT DELETING LEADING space.
_add_str( lv_str ). ls_context-no_indent_jscss = iv_no_indent_jscss.
LOOP AT mt_buffer ASSIGNING <line>.
APPEND <line> TO lt_temp ASSIGNING <line_c>.
indent_line( CHANGING cs_context = ls_context cv_line = <line_c> ).
ENDLOOP. 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, DATA: lv_class TYPE string,
lv_href TYPE string, lv_href TYPE string,
lv_id TYPE string, lv_id TYPE string,
@ -153,7 +293,7 @@ CLASS lcl_html_helper IMPLEMENTATION.
lv_class = iv_class. 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. lv_class = lv_class && ' emphasis' ##NO_TEXT.
ENDIF. ENDIF.
IF iv_opt CA gc_html_opt-cancel. IF iv_opt CA gc_html_opt-cancel.
@ -186,11 +326,43 @@ CLASS lcl_html_helper IMPLEMENTATION.
lv_style = | style="{ iv_style }"|. lv_style = | style="{ iv_style }"|.
ENDIF. ENDIF.
_add_str( |<a{ lv_id }{ lv_class }{ lv_href }{ lv_style }>{ iv_txt }</a>| ). rv_str = |<a{ lv_id }{ lv_class }{ lv_href }{ lv_style }>{ iv_txt }</a>|.
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 = |<i class="octicon octicon-{ lv_name }{ lv_color }{ lv_class }"{ lv_hint }></i>|.
ENDMETHOD. "icon
ENDCLASS. "lcl_html IMPLEMENTATION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* CLASS lcl_html_toolbar DEFINITION * CLASS lcl_html_toolbar DEFINITION
@ -219,7 +391,7 @@ CLASS lcl_html_toolbar DEFINITION FINAL.
iv_with_icons TYPE abap_bool OPTIONAL iv_with_icons TYPE abap_bool OPTIONAL
iv_add_minizone TYPE abap_bool OPTIONAL iv_add_minizone TYPE abap_bool OPTIONAL
RETURNING RETURNING
VALUE(ro_html) TYPE REF TO lcl_html_helper. VALUE(ro_html) TYPE REF TO lcl_html.
PRIVATE SECTION. PRIVATE SECTION.
TYPES: BEGIN OF ty_item, TYPES: BEGIN OF ty_item,
@ -264,8 +436,7 @@ CLASS lcl_html_toolbar IMPLEMENTATION.
METHOD render. "TODO refactor METHOD render. "TODO refactor
DATA: lv_class TYPE string, DATA: lv_class TYPE string,
lv_is_drop TYPE abap_bool, lv_is_drop TYPE abap_bool.
lv_last TYPE abap_bool.
FIELD-SYMBOLS <ls_item> LIKE LINE OF mt_items. FIELD-SYMBOLS <ls_item> LIKE LINE OF mt_items.
@ -291,11 +462,9 @@ CLASS lcl_html_toolbar IMPLEMENTATION.
IF iv_as_angle = abap_true. IF iv_as_angle = abap_true.
ro_html->add( '<div class="dropbtn_angle"></div>' ). ro_html->add( '<div class="dropbtn_angle"></div>' ).
ELSE. ELSE.
lv_class = 'dropbtn'. ro_html->add_a( iv_txt = iv_as_droplist_with_label
IF iv_no_separator = abap_true. iv_class = 'dropbtn'
lv_class = lv_class && ' menu_end' ##NO_TEXT. iv_act = '' ).
ENDIF.
ro_html->add( |<a class="{ lv_class }">{ iv_as_droplist_with_label }</a>| ).
ENDIF. ENDIF.
IF iv_add_minizone = abap_true. IF iv_add_minizone = abap_true.
@ -315,27 +484,19 @@ CLASS lcl_html_toolbar IMPLEMENTATION.
ENDIF. ENDIF.
LOOP AT mt_items ASSIGNING <ls_item>. LOOP AT mt_items ASSIGNING <ls_item>.
lv_last = boolc( sy-tabix = lines( mt_items ) ).
IF <ls_item>-sub IS INITIAL. IF <ls_item>-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. IF iv_with_icons = abap_true.
ro_html->add( '<tr>' ). ro_html->add( '<tr>' ).
ro_html->add( |<td class="icon">{ <ls_item>-ico }</td>| ). ro_html->add( |<td class="icon">{ lcl_html=>icon( <ls_item>-ico ) }</td>| ).
ro_html->add( '<td width="100%">' ). ro_html->add( '<td class="text">' ).
ENDIF. ENDIF.
ro_html->add_anchor( iv_txt = <ls_item>-txt ro_html->add_a( iv_txt = <ls_item>-txt
iv_act = <ls_item>-act iv_act = <ls_item>-act
iv_opt = <ls_item>-opt iv_opt = <ls_item>-opt
iv_typ = <ls_item>-typ iv_typ = <ls_item>-typ ).
iv_class = lv_class ).
IF iv_with_icons = abap_true. IF iv_with_icons = abap_true.
ro_html->add( '</td>' ). ro_html->add( '</td>' ).
@ -343,9 +504,7 @@ CLASS lcl_html_toolbar IMPLEMENTATION.
ENDIF. ENDIF.
ELSE. ELSE.
ro_html->add( <ls_item>-sub->render( ro_html->add( <ls_item>-sub->render( iv_as_droplist_with_label = <ls_item>-txt ) ).
iv_as_droplist_with_label = <ls_item>-txt
iv_no_separator = lv_last ) ).
ENDIF. ENDIF.
ENDLOOP. ENDLOOP.
@ -355,7 +514,8 @@ CLASS lcl_html_toolbar IMPLEMENTATION.
ENDIF. ENDIF.
IF lv_is_drop = abap_true. " Dropdown IF lv_is_drop = abap_true. " Dropdown
ro_html->add( '</div></div>' ). ro_html->add( '</div>' ).
ro_html->add( '</div>' ).
ENDIF. ENDIF.
ro_html->add( '</div>' ). ro_html->add( '</div>' ).

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_HTML</NAME> <NAME>ZABAPGIT_HTML</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_HTML</ENTRY> <ENTRY>Include ZABAPGIT_HTML</ENTRY>
<LENGTH>21</LENGTH> <LENGTH>21</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -271,8 +271,8 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
get_field( EXPORTING name = 'XMLDATA' it = lt_fields CHANGING cv = rs_content-data_str ). 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 ??? IF rs_content-data_str(1) <> '<' AND rs_content-data_str+1(1) = '<'. " Hmmm ???
rs_content-data_str = rs_content-data_str+1. rs_content-data_str = rs_content-data_str+1.
ELSE. * ELSE.
CLEAR rs_content-data_str. * CLEAR rs_content-data_str.
ENDIF. ENDIF.
ENDMETHOD. "dbcontent_decode ENDMETHOD. "dbcontent_decode

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_HTML_ACTION_UTILS</NAME> <NAME>ZABAPGIT_HTML_ACTION_UTILS</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_HTML_ACTION_UTILS</ENTRY> <ENTRY>Include ZABAPGIT_HTML_ACTION_UTILS</ENTRY>
<LENGTH>34</LENGTH> <LENGTH>34</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -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( '<table class="w100"><tr>' ).
ro_html->add( '<td class="repo_name">' ).
ro_html->add_icon( iv_name = lv_icon iv_hint = lv_hint ).
ro_html->add( |<span class="name">{ io_repo->get_name( ) }</span>| ).
IF io_repo->is_offline( ) = abap_false.
lo_repo_online ?= io_repo.
ro_html->add( |<span class="url">{ lo_repo_online->get_url( ) }</span>| ).
ENDIF.
ro_html->add( '</td>' ).
ro_html->add( '<td class="repo_attr right">' ).
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( '<span class="bg_marker" title="background">BG</span>' ).
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( '<span>' ).
ro_html->add_a( iv_txt = io_repo->get_package( )
iv_act = |{ gc_action-jump_pkg }?{ io_repo->get_package( ) }| ).
ro_html->add( '</span>' ).
ENDIF.
ro_html->add( '</td>' ).
ro_html->add( '</tr></table>' ).
ENDMETHOD.
METHOD render_item_state.
DATA: lv_system TYPE string.
FIELD-SYMBOLS <state> TYPE char1.
rv_html = '<span class="state-block">'.
DO 2 TIMES.
CASE sy-index.
WHEN 1.
ASSIGN iv1 TO <state>.
lv_system = 'Local:'.
WHEN 2.
ASSIGN iv2 TO <state>.
lv_system = 'Remote:'.
ENDCASE.
CASE <state>.
WHEN gc_state-unchanged. "None or unchanged
IF iv1 = gc_state-added OR iv2 = gc_state-added.
rv_html = rv_html && |<span class="none" title="{ lv_system } Not exists">X</span>|.
ELSE.
rv_html = rv_html && |<span class="none" title="{ lv_system } No changes">&nbsp;</span>|.
ENDIF.
WHEN gc_state-modified. "Changed
rv_html = rv_html && |<span class="changed" title="{ lv_system } Modified">M</span>|.
WHEN gc_state-added. "Added new
rv_html = rv_html && |<span class="added" title="{ lv_system } Added new">A</span>|.
WHEN gc_state-mixed. "Multiple changes (multifile)
rv_html = rv_html && |<span class="mixed" title="{ lv_system } Multiple changes">&#x25A0;</span>|.
WHEN gc_state-deleted. "Deleted
rv_html = rv_html && |<span class="deleted" title="{ lv_system } Deleted">D</span>|.
ENDCASE.
ENDDO.
rv_html = rv_html && '</span>'.
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( |<span class="{ lv_class }">| ).
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( '</span>' ).
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( '<div class="dummydiv attention">' ).
ro_html->add( |{ lcl_html=>icon( 'alert/red' ) } Error: { lv_error }| ).
ro_html->add( '</div>' ).
ENDMETHOD. "render_error
ENDCLASS. "lcl_gui_chunk_lib

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_HTML_CHUNKS</NAME>
<STATE>A</STATE>
<VARCL>X</VARCL>
<SUBC>I</SUBC>
<RLOAD>E</RLOAD>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>Include ZABAPGIT_HTML_CHUNKS</ENTRY>
<LENGTH>28</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -494,6 +494,14 @@ CLASS lcl_http IMPLEMENTATION.
iv_username = lv_user ). iv_username = lv_user ).
ENDIF. 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' ). rv_scheme = ii_client->response->get_header_field( 'www-authenticate' ).
FIND REGEX '^(\w+)' IN rv_scheme SUBMATCHES rv_scheme. FIND REGEX '^(\w+)' IN rv_scheme SUBMATCHES rv_scheme.

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_HTTP</NAME> <NAME>ZABAPGIT_HTTP</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_HTTP</ENTRY> <ENTRY>Include ZABAPGIT_HTTP</ENTRY>
<LENGTH>21</LENGTH> <LENGTH>21</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_MACROS</NAME> <NAME>ZABAPGIT_MACROS</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_MACROS</ENTRY> <ENTRY>Include ZABAPGIT_MACROS</ENTRY>
<LENGTH>23</LENGTH> <LENGTH>23</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -46,7 +46,7 @@ CLASS lcl_migrations IMPLEMENTATION.
" Ignore empty repos or repos with file checksums " Ignore empty repos or repos with file checksums
IF lines( <repo>->get_local_checksums( ) ) = 0 IF lines( <repo>->get_local_checksums( ) ) = 0
OR lines( <repo>->get_local_checksums_per_file( ) ) > 0 . OR lines( <repo>->get_local_checksums_per_file( ) ) > 0.
DELETE lt_repos INDEX lv_index. DELETE lt_repos INDEX lv_index.
CONTINUE. CONTINUE.
ENDIF. ENDIF.

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_MIGRATIONS</NAME> <NAME>ZABAPGIT_MIGRATIONS</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_MIGRATIONS</ENTRY> <ENTRY>Include ZABAPGIT_MIGRATIONS</ENTRY>
<LENGTH>27</LENGTH> <LENGTH>27</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -71,7 +71,9 @@ CLASS lcl_object_acid IMPLEMENTATION.
lo_aab = create_object( ). 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' io_xml->add( iv_name = 'DESCRIPTION'
ig_data = lv_description ). ig_data = lv_description ).

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_ACID</NAME> <NAME>ZABAPGIT_OBJECT_ACID</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_ACID</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_ACID</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_AUTH</NAME> <NAME>ZABAPGIT_OBJECT_AUTH</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_AUTH</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_AUTH</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

File diff suppressed because it is too large Load Diff

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_CLAS</NAME> <NAME>ZABAPGIT_OBJECT_CLAS</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_CLAS</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_CLAS</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_DOCT</NAME> <NAME>ZABAPGIT_OBJECT_DOCT</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_DOCT</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_DOCT</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_DOCV</NAME> <NAME>ZABAPGIT_OBJECT_DOCV</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_DOCT</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_DOCT</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -80,6 +80,7 @@ CLASS lcl_object_doma IMPLEMENTATION.
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-ddic = abap_true.
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists. METHOD lif_object~exists.
@ -130,6 +131,7 @@ CLASS lcl_object_doma IMPLEMENTATION.
DATA: lv_name TYPE ddobjname, DATA: lv_name TYPE ddobjname,
ls_dd01v TYPE dd01v, ls_dd01v TYPE dd01v,
lv_masklen TYPE c LENGTH 4,
lt_dd07v TYPE TABLE OF dd07v. lt_dd07v TYPE TABLE OF dd07v.
@ -154,6 +156,16 @@ CLASS lcl_object_doma IMPLEMENTATION.
ls_dd01v-as4date, ls_dd01v-as4date,
ls_dd01v-as4time. 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' io_xml->add( iv_name = 'DD01V'
ig_data = ls_dd01v ). ig_data = ls_dd01v ).
io_xml->add( iv_name = 'DD07V_TAB' io_xml->add( iv_name = 'DD07V_TAB'

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_DOMA</NAME> <NAME>ZABAPGIT_OBJECT_DOMA</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_DOMA</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_DOMA</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -73,6 +73,7 @@ CLASS lcl_object_dtel IMPLEMENTATION.
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-ddic = abap_true.
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists. METHOD lif_object~exists.
@ -158,6 +159,14 @@ CLASS lcl_object_dtel IMPLEMENTATION.
ls_dd04v-entitytab. ls_dd04v-entitytab.
ENDIF. 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' io_xml->add( iv_name = 'DD04V'
ig_data = ls_dd04v ). ig_data = ls_dd04v ).
io_xml->add( iv_name = 'TPARA' io_xml->add( iv_name = 'TPARA'

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_DTEL</NAME> <NAME>ZABAPGIT_OBJECT_DTEL</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_DTEL</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_DTEL</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

File diff suppressed because it is too large Load Diff

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_ENHO</NAME> <NAME>ZABAPGIT_OBJECT_ENHO</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_ENHO</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_ENHO</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_ENHS</NAME> <NAME>ZABAPGIT_OBJECT_ENHS</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_ENHS</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_ENHS</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -53,6 +53,7 @@ CLASS lcl_object_enqu IMPLEMENTATION.
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-ddic = abap_true.
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists. METHOD lif_object~exists.

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_ENQU</NAME> <NAME>ZABAPGIT_OBJECT_ENQU</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_ENUQ</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_ENUQ</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_ENSC</NAME> <NAME>ZABAPGIT_OBJECT_ENSC</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_ENSC</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_ENSC</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -30,6 +30,7 @@ CLASS lcl_object_fugr DEFINITION INHERITING FROM lcl_objects_program FINAL.
tables TYPE STANDARD TABLE OF rstbl WITH DEFAULT KEY, tables TYPE STANDARD TABLE OF rstbl WITH DEFAULT KEY,
exception TYPE STANDARD TABLE OF rsexc WITH DEFAULT KEY, exception TYPE STANDARD TABLE OF rsexc WITH DEFAULT KEY,
documentation TYPE STANDARD TABLE OF rsfdo WITH DEFAULT KEY, documentation TYPE STANDARD TABLE OF rsfdo WITH DEFAULT KEY,
exception_classes TYPE abap_bool,
END OF ty_function. END OF ty_function.
TYPES: ty_function_tt TYPE STANDARD TABLE OF ty_function WITH DEFAULT KEY. 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 iv_package TYPE devclass
RAISING lcx_exception. 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 ENDCLASS. "lcl_object_fugr DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -247,6 +253,7 @@ CLASS lcl_object_fugr IMPLEMENTATION.
remote_call = <ls_func>-remote_call remote_call = <ls_func>-remote_call
short_text = <ls_func>-short_text short_text = <ls_func>-short_text
update_task = <ls_func>-update_task update_task = <ls_func>-update_task
exception_class = <ls_func>-exception_classes
* NAMESPACE = ' ' todo * NAMESPACE = ' ' todo
remote_basxml_supported = <ls_func>-remote_basxml remote_basxml_supported = <ls_func>-remote_basxml
IMPORTING IMPORTING
@ -276,10 +283,6 @@ CLASS lcl_object_fugr IMPLEMENTATION.
ENDIF. ENDIF.
INSERT REPORT lv_include FROM lt_source. INSERT REPORT lv_include FROM lt_source.
* lcl_objects_activation=>add( iv_type = 'FUNC'
* iv_name = <ls_func>-funcname ).
ENDLOOP. ENDLOOP.
ENDMETHOD. "deserialize_functions ENDMETHOD. "deserialize_functions
@ -398,10 +401,7 @@ CLASS lcl_object_fugr IMPLEMENTATION.
SELECT SINGLE areat INTO lv_areat SELECT SINGLE areat INTO lv_areat
FROM tlibt FROM tlibt
WHERE spras = mv_language WHERE spras = mv_language
AND area = ms_item-obj_name. "#EC CI_GENBUFF AND area = ms_item-obj_name. "#EC CI_GENBUFF "#EC CI_SUBRC
IF sy-subrc <> 0.
lcx_exception=>raise( 'not found in TLIBT' ).
ENDIF.
lt_functab = functions( ). lt_functab = functions( ).
lt_includes = includes( ). lt_includes = includes( ).
@ -493,6 +493,9 @@ CLASS lcl_object_fugr IMPLEMENTATION.
lcx_exception=>raise( 'Error from RS_FUNCTION_POOL_CONTENTS' ). lcx_exception=>raise( 'Error from RS_FUNCTION_POOL_CONTENTS' ).
ENDIF. ENDIF.
SORT rt_functab BY funcname ASCENDING.
DELETE ADJACENT DUPLICATES FROM rt_functab COMPARING funcname.
ENDMETHOD. "functions ENDMETHOD. "functions
METHOD main_name. METHOD main_name.
@ -536,10 +539,10 @@ CLASS lcl_object_fugr IMPLEMENTATION.
DATA: DATA:
lt_source TYPE TABLE OF rssource, lt_source TYPE TABLE OF rssource,
lt_functab TYPE ty_rs38l_incl_tt, 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: <ls_func> LIKE LINE OF lt_functab, FIELD-SYMBOLS: <ls_func> LIKE LINE OF lt_functab.
<ls_ret> LIKE LINE OF rt_functions.
lt_functab = functions( ). lt_functab = functions( ).
@ -547,8 +550,8 @@ CLASS lcl_object_fugr IMPLEMENTATION.
LOOP AT lt_functab ASSIGNING <ls_func>. LOOP AT lt_functab ASSIGNING <ls_func>.
* fm RPY_FUNCTIONMODULE_READ does not support source code * fm RPY_FUNCTIONMODULE_READ does not support source code
* lines longer than 72 characters * lines longer than 72 characters
APPEND INITIAL LINE TO rt_functions ASSIGNING <ls_ret>. CLEAR ls_function.
MOVE-CORRESPONDING <ls_func> TO <ls_ret>. MOVE-CORRESPONDING <ls_func> TO ls_function.
CLEAR lt_new_source. CLEAR lt_new_source.
CLEAR lt_source. CLEAR lt_source.
@ -557,18 +560,18 @@ CLASS lcl_object_fugr IMPLEMENTATION.
EXPORTING EXPORTING
functionname = <ls_func>-funcname functionname = <ls_func>-funcname
IMPORTING IMPORTING
global_flag = <ls_ret>-global_flag global_flag = ls_function-global_flag
remote_call = <ls_ret>-remote_call remote_call = ls_function-remote_call
update_task = <ls_ret>-update_task update_task = ls_function-update_task
short_text = <ls_ret>-short_text short_text = ls_function-short_text
remote_basxml_supported = <ls_ret>-remote_basxml remote_basxml_supported = ls_function-remote_basxml
TABLES TABLES
import_parameter = <ls_ret>-import import_parameter = ls_function-import
changing_parameter = <ls_ret>-changing changing_parameter = ls_function-changing
export_parameter = <ls_ret>-export export_parameter = ls_function-export
tables_parameter = <ls_ret>-tables tables_parameter = ls_function-tables
exception_list = <ls_ret>-exception exception_list = ls_function-exception
documentation = <ls_ret>-documentation documentation = ls_function-documentation
source = lt_source source = lt_source
CHANGING CHANGING
new_source = lt_new_source new_source = lt_new_source
@ -577,10 +580,16 @@ CLASS lcl_object_fugr IMPLEMENTATION.
function_not_found = 2 function_not_found = 2
invalid_name = 3 invalid_name = 3
OTHERS = 4. OTHERS = 4.
IF sy-subrc <> 0. IF sy-subrc = 2.
CONTINUE.
ELSEIF sy-subrc <> 0.
lcx_exception=>raise( 'Error from RPY_FUNCTIONMODULE_READ_NEW' ). lcx_exception=>raise( 'Error from RPY_FUNCTIONMODULE_READ_NEW' ).
ENDIF. ENDIF.
ls_function-exception_classes = are_exceptions_class_based( <ls_func>-funcname ).
APPEND ls_function TO rt_functions.
IF NOT lt_new_source IS INITIAL. IF NOT lt_new_source IS INITIAL.
mo_files->add_abap( iv_extra = <ls_func>-funcname mo_files->add_abap( iv_extra = <ls_func>-funcname
it_abap = lt_new_source ). it_abap = lt_new_source ).
@ -614,6 +623,35 @@ CLASS lcl_object_fugr IMPLEMENTATION.
ENDMETHOD. "serialize_includes 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. METHOD lif_object~serialize.
DATA: lt_functions TYPE ty_function_tt, DATA: lt_functions TYPE ty_function_tt,

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_FUGR</NAME> <NAME>ZABAPGIT_OBJECT_FUGR</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_FUGR</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_FUGR</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_IARP</NAME> <NAME>ZABAPGIT_OBJECT_IARP</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_IARP</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_IARP</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_IASP</NAME> <NAME>ZABAPGIT_OBJECT_IASP</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_IASP</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_IASP</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_IATU</NAME> <NAME>ZABAPGIT_OBJECT_IATU</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_IATU</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_IATU</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -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.

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_OBJECT_INTF</NAME>
<STATE>A</STATE>
<VARCL>X</VARCL>
<SUBC>I</SUBC>
<RLOAD>E</RLOAD>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>Include ZABAPGIT_OBJECT_INTF</ENTRY>
<LENGTH>28</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_MSAG</NAME> <NAME>ZABAPGIT_OBJECT_MSAG</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_MSAG</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_MSAG</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_NROB</NAME> <NAME>ZABAPGIT_OBJECT_NROB</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_NROB</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_NROB</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -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.

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_OBJECT_OO_FACTORY</NAME>
<STATE>A</STATE>
<VARCL>X</VARCL>
<DBAPL>S</DBAPL>
<DBNA>D$</DBNA>
<SUBC>I</SUBC>
<FIXPT>X</FIXPT>
<LDBNAME>D$S</LDBNAME>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>Include ZABAPGIT_OBJECT_OO_FACTORY</ENTRY>
<LENGTH>34</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -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 '* <SIGNATURE>------------------------------------'
'---------------------------------------------------+'
INTO lv_begin.
CONCATENATE '* +------------------------------------------------'
'--------------------------------------</SIGNATURE>'
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.

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_OBJECT_OO_FUNCTIONS</NAME>
<STATE>A</STATE>
<VARCL>X</VARCL>
<DBAPL>S</DBAPL>
<DBNA>D$</DBNA>
<SUBC>I</SUBC>
<FIXPT>X</FIXPT>
<LDBNAME>D$S</LDBNAME>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>Include ZABAPGIT_OBJECT_OO_FUNCTIONS</ENTRY>
<LENGTH>36</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -60,10 +60,7 @@ CLASS lcl_object_para IMPLEMENTATION.
SELECT SINGLE * FROM tparat INTO ls_tparat SELECT SINGLE * FROM tparat INTO ls_tparat
WHERE paramid = ms_item-obj_name WHERE paramid = ms_item-obj_name
AND sprache = mv_language. "#EC CI_GENBUFF AND sprache = mv_language. "#EC CI_GENBUFF "#EC CI_SUBRC
IF sy-subrc <> 0.
lcx_exception=>raise( 'PARA no english description' ).
ENDIF.
io_xml->add( iv_name = 'TPARA' io_xml->add( iv_name = 'TPARA'
ig_data = ls_tpara ). ig_data = ls_tpara ).

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_PARA</NAME> <NAME>ZABAPGIT_OBJECT_PARA</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_PARA</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_PARA</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -67,13 +67,20 @@ CLASS lcl_object_pinf IMPLEMENTATION.
METHOD lif_object~exists. 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. WHERE intf_name = ms_item-obj_name.
rv_bool = boolc( sy-subrc = 0 ). 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 ENDMETHOD. "lif_object~exists
METHOD lif_object~serialize. METHOD lif_object~serialize.

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_PINF</NAME> <NAME>ZABAPGIT_OBJECT_PINF</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_PINF</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_PINF</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_PROG</NAME> <NAME>ZABAPGIT_OBJECT_PROG</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_PROG</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_PROG</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -6,6 +6,7 @@
INCLUDE zabapgit_object_acid. INCLUDE zabapgit_object_acid.
INCLUDE zabapgit_object_auth. INCLUDE zabapgit_object_auth.
INCLUDE zabapgit_object_oo_functions.
INCLUDE zabapgit_object_clas. INCLUDE zabapgit_object_clas.
INCLUDE zabapgit_object_doct. INCLUDE zabapgit_object_doct.
INCLUDE zabapgit_object_docv. INCLUDE zabapgit_object_docv.
@ -19,6 +20,7 @@ INCLUDE zabapgit_object_fugr.
INCLUDE zabapgit_object_iarp. INCLUDE zabapgit_object_iarp.
INCLUDE zabapgit_object_iasp. INCLUDE zabapgit_object_iasp.
INCLUDE zabapgit_object_iatu. INCLUDE zabapgit_object_iatu.
INCLUDE zabapgit_object_intf.
INCLUDE zabapgit_object_msag. INCLUDE zabapgit_object_msag.
INCLUDE zabapgit_object_nrob. INCLUDE zabapgit_object_nrob.
INCLUDE zabapgit_object_para. INCLUDE zabapgit_object_para.
@ -49,3 +51,4 @@ INCLUDE zabapgit_object_wdya.
INCLUDE zabapgit_object_wdyn. INCLUDE zabapgit_object_wdyn.
INCLUDE zabapgit_object_webi. INCLUDE zabapgit_object_webi.
INCLUDE zabapgit_object_xslt. INCLUDE zabapgit_object_xslt.
INCLUDE zabapgit_object_oo_factory.

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_SERIALIZING</NAME> <NAME>ZABAPGIT_OBJECT_SERIALIZING</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_SERIALIZATION</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_SERIALIZATION</ENTRY>
<LENGTH>37</LENGTH> <LENGTH>37</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -39,6 +39,7 @@ CLASS lcl_object_sfbf IMPLEMENTATION.
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-ddic = abap_true.
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists. METHOD lif_object~exists.

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_SFBF</NAME> <NAME>ZABAPGIT_OBJECT_SFBF</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_SFBF</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_SFBF</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -56,6 +56,7 @@ CLASS lcl_object_sfbs IMPLEMENTATION.
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-ddic = abap_true.
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists. METHOD lif_object~exists.

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_SFBS</NAME> <NAME>ZABAPGIT_OBJECT_SFBS</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_SFBS</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_SFBS</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -39,6 +39,7 @@ CLASS lcl_object_sfsw IMPLEMENTATION.
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-ddic = abap_true.
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists. METHOD lif_object~exists.

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_SFSW</NAME> <NAME>ZABAPGIT_OBJECT_SFSW</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_SFSW</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_SFSW</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -158,6 +158,7 @@ CLASS lcl_object_shi3 IMPLEMENTATION.
lt_texts TYPE TABLE OF hier_texts, lt_texts TYPE TABLE OF hier_texts,
lt_refs TYPE TABLE OF hier_ref. lt_refs TYPE TABLE OF hier_ref.
CALL FUNCTION 'STREE_STRUCTURE_READ' CALL FUNCTION 'STREE_STRUCTURE_READ'
EXPORTING EXPORTING
structure_id = mv_tree_id structure_id = mv_tree_id
@ -167,10 +168,6 @@ CLASS lcl_object_shi3 IMPLEMENTATION.
TABLES TABLES
description = lt_titles. description = lt_titles.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from STREE_STRUCTURE_READ, SHI3' ).
ENDIF.
CALL FUNCTION 'STREE_HIERARCHY_READ' CALL FUNCTION 'STREE_HIERARCHY_READ'
EXPORTING EXPORTING
structure_id = mv_tree_id structure_id = mv_tree_id
@ -182,9 +179,6 @@ CLASS lcl_object_shi3 IMPLEMENTATION.
list_of_nodes = lt_nodes list_of_nodes = lt_nodes
list_of_references = lt_refs list_of_references = lt_refs
list_of_texts = lt_texts. 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 strip_stamps( CHANGING cs_head = ls_head
ct_nodes = lt_nodes ). ct_nodes = lt_nodes ).

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_SHI3</NAME> <NAME>ZABAPGIT_OBJECT_SHI3</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_SHI3</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_SHI3</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -50,6 +50,7 @@ CLASS lcl_object_shlp IMPLEMENTATION.
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-ddic = abap_true.
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists. METHOD lif_object~exists.

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_SHLP</NAME> <NAME>ZABAPGIT_OBJECT_SHLP</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_SHLP</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_SHLP</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -22,6 +22,7 @@ CLASS lcl_object_sicf DEFINITION INHERITING FROM lcl_objects_super FINAL.
END OF ty_sicf_key. END OF ty_sicf_key.
METHODS read METHODS read
IMPORTING iv_clear TYPE abap_bool DEFAULT abap_true
EXPORTING es_icfservice TYPE icfservice EXPORTING es_icfservice TYPE icfservice
es_icfdocu TYPE icfdocu es_icfdocu TYPE icfdocu
et_icfhandler TYPE ty_icfhandler_tt et_icfhandler TYPE ty_icfhandler_tt
@ -71,7 +72,8 @@ CLASS lcl_object_sicf IMPLEMENTATION.
DATA: ls_icfservice TYPE icfservice. 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. rv_user = ls_icfservice-icf_muser.
@ -174,10 +176,12 @@ CLASS lcl_object_sicf IMPLEMENTATION.
ASSERT sy-subrc = 0. ASSERT sy-subrc = 0.
MOVE-CORRESPONDING ls_serv_info-service TO es_icfservice. MOVE-CORRESPONDING ls_serv_info-service TO es_icfservice.
IF iv_clear = abap_true.
CLEAR es_icfservice-icf_cuser. CLEAR es_icfservice-icf_cuser.
CLEAR es_icfservice-icf_cdate. CLEAR es_icfservice-icf_cdate.
CLEAR es_icfservice-icf_muser. CLEAR es_icfservice-icf_muser.
CLEAR es_icfservice-icf_mdate. CLEAR es_icfservice-icf_mdate.
ENDIF.
CLEAR es_icfdocu-icfparguid. CLEAR es_icfdocu-icfparguid.

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_SICF</NAME> <NAME>ZABAPGIT_OBJECT_SICF</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_SICF</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_SICF</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -191,7 +191,7 @@ CLASS lcl_object_smim IMPLEMENTATION.
not_found = 3 not_found = 3
permission_failure = 4 permission_failure = 4
OTHERS = 5 ). 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 ). lcx_exception=>raise( 'error from mime api->get:' && sy-msgv1 ).
ENDIF. ENDIF.

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_SMIM</NAME> <NAME>ZABAPGIT_OBJECT_SMIM</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_SMIM</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_SMIM</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_SPLO</NAME> <NAME>ZABAPGIT_OBJECT_SPLO</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_SPLO</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_SPLO</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_SSFO</NAME> <NAME>ZABAPGIT_OBJECT_SSFO</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_SSFO</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_SSFO</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_SSST</NAME> <NAME>ZABAPGIT_OBJECT_SSST</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_SSST</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_SSST</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -61,9 +61,9 @@ CLASS lcl_object_susc IMPLEMENTATION.
SELECT SINGLE * FROM tobct INTO ls_tobct SELECT SINGLE * FROM tobct INTO ls_tobct
WHERE oclss = ms_item-obj_name WHERE oclss = ms_item-obj_name
AND langu = mv_language. AND langu = mv_language.
IF sy-subrc <> 0. * IF sy-subrc <> 0.
lcx_exception=>raise( 'TOBCT no english description' ). * lcx_exception=>raise( 'TOBCT no english description' ).
ENDIF. * ENDIF.
io_xml->add( iv_name = 'TOBC' io_xml->add( iv_name = 'TOBC'
ig_data = ls_tobc ). ig_data = ls_tobc ).

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_SUSC</NAME> <NAME>ZABAPGIT_OBJECT_SUSC</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_SUSC</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_SUSC</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -5,42 +5,16 @@
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT_SUSO</NAME> <NAME>ZABAPGIT_OBJECT_SUSO</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL> <VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC> <SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD> <RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_OBJECT_SUSO</ENTRY> <ENTRY>Include ZABAPGIT_OBJECT_SUSO</ENTRY>
<LENGTH>28</LENGTH> <LENGTH>28</LENGTH>
<SPLIT/>
</item> </item>
</TPOOL> </TPOOL>
</asx:values> </asx:values>

View File

@ -74,6 +74,7 @@ CLASS lcl_object_tabl IMPLEMENTATION.
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-ddic = abap_true.
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists. METHOD lif_object~exists.
@ -105,7 +106,7 @@ CLASS lcl_object_tabl IMPLEMENTATION.
CALL FUNCTION 'RS_DD_DELETE_OBJ' CALL FUNCTION 'RS_DD_DELETE_OBJ'
EXPORTING EXPORTING
no_ask = abap_false no_ask = abap_true
objname = lv_objname objname = lv_objname
objtype = 'T' objtype = 'T'
EXCEPTIONS EXCEPTIONS
@ -131,6 +132,7 @@ CLASS lcl_object_tabl IMPLEMENTATION.
lt_dd17v TYPE dd17vtab, lt_dd17v TYPE dd17vtab,
lt_dd35v TYPE TABLE OF dd35v, lt_dd35v TYPE TABLE OF dd35v,
lv_index LIKE sy-index, lv_index LIKE sy-index,
lv_masklen TYPE c LENGTH 4,
lt_dd36m TYPE dd36mttyp. lt_dd36m TYPE dd36mttyp.
FIELD-SYMBOLS: <ls_dd12v> LIKE LINE OF lt_dd12v, FIELD-SYMBOLS: <ls_dd12v> LIKE LINE OF lt_dd12v,
@ -180,6 +182,9 @@ CLASS lcl_object_tabl IMPLEMENTATION.
IF ls_dd02v-datmax = ''. IF ls_dd02v-datmax = ''.
CLEAR ls_dd02v-datmax. CLEAR ls_dd02v-datmax.
ENDIF. ENDIF.
IF ls_dd02v-datavg = ''.
CLEAR ls_dd02v-datavg.
ENDIF.
CLEAR: ls_dd09l-as4user, CLEAR: ls_dd09l-as4user,
ls_dd09l-as4date, ls_dd09l-as4date,
@ -206,7 +211,8 @@ CLASS lcl_object_tabl IMPLEMENTATION.
<ls_dd03p>-scrtext_m, <ls_dd03p>-scrtext_m,
<ls_dd03p>-scrtext_l. <ls_dd03p>-scrtext_l.
IF <ls_dd03p>-masklen = '' OR NOT <ls_dd03p>-masklen CO '0123456789'. lv_masklen = <ls_dd03p>-masklen.
IF lv_masklen = '' OR NOT lv_masklen CO '0123456789'.
* make sure the field contains valid data, or the XML will dump * make sure the field contains valid data, or the XML will dump
CLEAR <ls_dd03p>-masklen. CLEAR <ls_dd03p>-masklen.
ENDIF. ENDIF.
@ -229,7 +235,10 @@ CLASS lcl_object_tabl IMPLEMENTATION.
<ls_dd03p>-convexit, <ls_dd03p>-convexit,
<ls_dd03p>-entitytab, <ls_dd03p>-entitytab,
<ls_dd03p>-dommaster, <ls_dd03p>-dommaster,
<ls_dd03p>-domname3l. <ls_dd03p>-domname3l,
<ls_dd03p>-decimals,
<ls_dd03p>-lowercase,
<ls_dd03p>-signflag.
ENDIF. ENDIF.
IF <ls_dd03p>-shlporigin = 'D'. IF <ls_dd03p>-shlporigin = 'D'.

Some files were not shown because too many files have changed in this diff Show More