abapGit/src/env/zcl_abapgit_abap_language_vers.clas.abap
Marc Bernard 294da99e85
Reorg packages (2) (#6699)
Co-authored-by: Lars Hvam <larshp@hotmail.com>
2023-12-14 09:35:49 +01:00

279 lines
9.8 KiB
ABAP

CLASS zcl_abapgit_abap_language_vers DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
CONSTANTS:
c_any_abap_language_version TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version VALUE '*',
c_no_abap_language_version TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version VALUE '-',
c_feature_flag TYPE string VALUE 'ALAV'.
METHODS constructor
IMPORTING
!io_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit.
METHODS get_abap_language_vers_by_objt
IMPORTING
!iv_object_type TYPE trobjtype
!iv_package TYPE devclass
RETURNING
VALUE(rv_allowed_abap_langu_version) TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version.
METHODS get_repo_abap_language_version
RETURNING
VALUE(rv_abap_language_version) TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version.
METHODS is_import_allowed
IMPORTING
!iv_package TYPE devclass
RETURNING
VALUE(rv_allowed) TYPE abap_bool.
CLASS-METHODS check_abap_language_version
IMPORTING
!iv_abap_language_version TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version
!is_item TYPE zif_abapgit_definitions=>ty_item
RAISING
zcx_abapgit_exception.
PROTECTED SECTION.
PRIVATE SECTION.
DATA mo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit.
" Depends on experimental feature flag and repo setting
DATA mv_has_abap_language_vers TYPE abap_bool.
METHODS get_default_abap_language_vers
IMPORTING
!iv_object_type TYPE trobjtype
RETURNING
VALUE(rv_abap_language_version) TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version.
METHODS get_abap_language_vers_by_devc
IMPORTING
!iv_package TYPE devclass
RETURNING
VALUE(rv_abap_language_version) TYPE string.
METHODS get_abap_language_vers_by_repo
RETURNING
VALUE(rv_abap_language_version) TYPE string.
CLASS-METHODS get_description
IMPORTING
!iv_abap_language_version TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version
RETURNING
VALUE(rv_description) TYPE string.
ENDCLASS.
CLASS zcl_abapgit_abap_language_vers IMPLEMENTATION.
METHOD check_abap_language_version.
" Check if ABAP language version matches repository setting
IF is_item-abap_language_version IS NOT INITIAL AND iv_abap_language_version <> is_item-abap_language_version.
zcx_abapgit_exception=>raise(
|Object { is_item-obj_type } { is_item-obj_name } has { get_description( iv_abap_language_version ) }| &&
| but repository is set to { get_description( is_item-abap_language_version ) }| ).
ENDIF.
ENDMETHOD.
METHOD constructor.
mo_dot_abapgit = io_dot_abapgit.
IF zcl_abapgit_feature=>is_enabled( c_feature_flag ) = abap_false.
mv_has_abap_language_vers = abap_undefined.
ELSEIF get_abap_language_vers_by_repo( ) = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
mv_has_abap_language_vers = abap_undefined.
ELSEIF get_abap_language_vers_by_repo( ) = zif_abapgit_dot_abapgit=>c_abap_language_version-ignore.
mv_has_abap_language_vers = abap_false.
ELSE.
mv_has_abap_language_vers = abap_true.
ENDIF.
ENDMETHOD.
METHOD get_abap_language_vers_by_devc.
DATA lv_class TYPE string.
DATA lv_abap_lang_version_devc TYPE string.
DATA lo_abap_language_version_cfg TYPE REF TO object.
lv_class = 'CL_ABAP_LANGUAGE_VERSION_CFG'.
TRY.
CALL METHOD (lv_class)=>('GET_INSTANCE')
RECEIVING
ro_instance = lo_abap_language_version_cfg.
" For non-existing packages, GET_PACKAGE_DEFAULT_VERSION returns "standard"
" but we want to return "undefined" in this case to allow any new packages
IF zcl_abapgit_factory=>get_sap_package( iv_package )->exists( ) = abap_true.
CALL METHOD lo_abap_language_version_cfg->('IF_ABAP_LANGUAGE_VERSION_CFG~GET_PACKAGE_DEFAULT_VERSION')
EXPORTING
iv_package_name = iv_package
RECEIVING
rv_default_language_version = lv_abap_lang_version_devc.
ELSE.
lv_abap_lang_version_devc = '-'.
ENDIF.
CASE lv_abap_lang_version_devc.
WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-standard.
rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-standard.
WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-key_user.
rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-key_user.
WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-cloud_development.
rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-cloud_development.
WHEN OTHERS.
rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
ENDCASE.
CATCH cx_root.
rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
ENDTRY.
ENDMETHOD.
METHOD get_abap_language_vers_by_objt.
DATA lv_class TYPE string.
DATA lo_abap_language_version TYPE REF TO object.
IF mv_has_abap_language_vers = abap_undefined.
rv_allowed_abap_langu_version = c_any_abap_language_version.
ELSEIF mv_has_abap_language_vers = abap_false.
rv_allowed_abap_langu_version = c_no_abap_language_version.
ELSE. " abap_true
lv_class = 'CL_ABAP_LANGUAGE_VERSION'.
TRY.
CALL METHOD (lv_class)=>('GET_INSTANCE')
RECEIVING
ro_version_handler = lo_abap_language_version.
CALL METHOD lo_abap_language_version->('IF_ABAP_LANGUAGE_VERSION~GET_DEFAULT_VERSION')
EXPORTING
iv_object_type = iv_object_type
iv_package = iv_package
RECEIVING
rv_default_version = rv_allowed_abap_langu_version.
CATCH cx_root.
rv_allowed_abap_langu_version = get_default_abap_language_vers( iv_object_type ).
ENDTRY.
ENDIF.
ENDMETHOD.
METHOD get_abap_language_vers_by_repo.
rv_abap_language_version = mo_dot_abapgit->get_abap_language_version( ).
IF rv_abap_language_version IS INITIAL.
rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
ENDIF.
ENDMETHOD.
METHOD get_default_abap_language_vers.
IF zcl_abapgit_factory=>get_environment( )->is_sap_cloud_platform( ) = abap_true.
" On BTP, default to ABAP for Cloud Development
rv_abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version_cloud-cloud_development.
ELSE.
" Differentiate between source code object and non-source code objects
CASE iv_object_type.
WHEN 'BDEF' OR 'CLAS' OR 'FUGR' OR 'FUGS' OR 'INTF' OR 'PROG' OR 'TYPE'.
rv_abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version_src-standard.
WHEN OTHERS.
rv_abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version-standard.
ENDCASE.
ENDIF.
ENDMETHOD.
METHOD get_description.
CASE iv_abap_language_version.
WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-standard
OR zif_abapgit_aff_types_v1=>co_abap_language_version_src-standard.
rv_description = 'Standard ABAP'.
WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-key_user
OR zif_abapgit_aff_types_v1=>co_abap_language_version_src-key_user.
rv_description = 'ABAP for Key Users'.
WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-cloud_development
OR zif_abapgit_aff_types_v1=>co_abap_language_version_src-cloud_development.
rv_description = 'ABAP for Cloud Development'.
WHEN OTHERS.
rv_description = 'Undefined'.
ENDCASE.
rv_description = |ABAP language version "{ rv_description }"|.
ENDMETHOD.
METHOD get_repo_abap_language_version.
DATA lv_abap_language_version TYPE string.
IF mv_has_abap_language_vers <> abap_undefined. " abap_true or abap_false
lv_abap_language_version = mo_dot_abapgit->get_abap_language_version( ).
ENDIF.
CASE lv_abap_language_version.
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-standard.
rv_abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version_src-standard.
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-key_user.
rv_abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version_src-key_user.
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-cloud_development.
rv_abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version_src-cloud_development.
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-ignore.
rv_abap_language_version = c_no_abap_language_version.
WHEN OTHERS. " undefined or feature off
rv_abap_language_version = c_any_abap_language_version.
ENDCASE.
ENDMETHOD.
METHOD is_import_allowed.
DATA lv_package_version TYPE string.
lv_package_version = get_abap_language_vers_by_devc( iv_package ).
CASE get_abap_language_vers_by_repo( ).
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-undefined
OR zif_abapgit_dot_abapgit=>c_abap_language_version-ignore.
rv_allowed = abap_true.
WHEN OTHERS.
IF get_abap_language_vers_by_repo( ) = lv_package_version.
" allow packages that match repo setting
rv_allowed = abap_true.
ELSEIF lv_package_version = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
" always allow new packages
rv_allowed = abap_true.
ELSE.
rv_allowed = abap_false.
ENDIF.
ENDCASE.
ENDMETHOD.
ENDCLASS.